From 6605b606f0251cf007de007a9da8cad6b5574803 Mon Sep 17 00:00:00 2001 From: Wide-Cat <74723656+Wide-Cat@users.noreply.github.com> Date: Fri, 26 May 2023 14:27:34 +0100 Subject: [PATCH 001/357] Mixin extras (#3676) --- build.gradle | 2 + gradle.properties | 5 +- .../meteorclient/mixin/BlockMixin.java | 22 ++++---- .../meteorclient/mixin/ChatHudMixin.java | 9 ++-- .../mixin/ChunkSkyLightProviderMixin.java | 1 - .../mixin/ClientPlayerEntityMixin.java | 13 ++--- .../ClientPlayerInteractionManagerMixin.java | 2 +- ...chantingTableBlockEntityRendererMixin.java | 8 +-- .../meteorclient/mixin/EntityMixin.java | 52 ++++++++----------- .../mixin/EntityRendererMixin.java | 7 +-- .../mixin/FoliageColorsMixin.java | 26 +++++----- .../meteorclient/mixin/GameRendererMixin.java | 9 ++-- .../meteorclient/mixin/InGameHudMixin.java | 10 ++-- .../meteorclient/mixin/ItemStackMixin.java | 19 ++++--- .../meteorclient/mixin/LivingEntityMixin.java | 25 +++++---- .../mixin/LivingEntityRendererMixin.java | 17 +++--- .../meteorclient/mixin/MapRendererMixin.java | 10 ++-- .../mixin/MinecraftClientMixin.java | 15 +++--- .../mixin/PlayerArmorSlotMixin.java | 24 +++++---- .../meteorclient/mixin/PlayerEntityMixin.java | 32 +++++++----- .../mixin/PowderSnowBlockMixin.java | 10 ++-- .../meteorclient/mixin/ScreenMixin.java | 2 - .../mixin/SignBlockEntityRendererMixin.java | 17 +----- .../meteorclient/mixin/TextRendererMixin.java | 9 ++-- .../meteorclient/mixin/TridentItemMixin.java | 15 +++--- .../SodiumBlockOcclusionCacheMixin.java | 11 ++-- src/main/resources/fabric.mod.json | 3 ++ 27 files changed, 185 insertions(+), 190 deletions(-) diff --git a/build.gradle b/build.gradle index 9d86a8923d..9cf6f0ed77 100644 --- a/build.gradle +++ b/build.gradle @@ -68,6 +68,8 @@ dependencies { library "org.reflections:reflections:${project.reflections_version}" library("io.netty:netty-handler-proxy:${project.netty_version}") { transitive = false } library("io.netty:netty-codec-socks:${project.netty_version}") { transitive = false } + library "com.github.LlamaLad7.MixinExtras:mixinextras-fabric:${project.mixin_extras_version}" + annotationProcessor "com.github.LlamaLad7.MixinExtras:mixinextras-fabric:${project.mixin_extras_version}" // Launch sub project shadow project(":launch") diff --git a/gradle.properties b/gradle.properties index a56b458890..0afccc6d6a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -35,4 +35,7 @@ discordipc_version=1.1 reflections_version=0.10.2 # Netty (https://github.com/netty/netty) -netty_version=4.1.79.Final +netty_version=4.1.90.Final + +# Mixin Extras (https://github.com/LlamaLad7/MixinExtras) +mixin_extras_version=0.2.0-beta.8 diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BlockMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BlockMixin.java index b9e5ebd376..b1efd3fd49 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BlockMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BlockMixin.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.mixin; +import com.llamalad7.mixinextras.injector.ModifyReturnValue; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.movement.NoSlow; import meteordevelopment.meteorclient.systems.modules.movement.Slippy; @@ -19,8 +20,6 @@ import net.minecraft.world.BlockView; 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 { @@ -28,27 +27,30 @@ public BlockMixin(Settings settings) { super(settings); } - @Inject(method = "shouldDrawSide", at = @At("RETURN"), cancellable = true) - private static void onShouldDrawSide(BlockState state, BlockView world, BlockPos pos, Direction side, BlockPos blockPos, CallbackInfoReturnable info) { + @ModifyReturnValue(method = "shouldDrawSide", at = @At("RETURN")) + private static boolean onShouldDrawSide(boolean original, BlockState state, BlockView world, BlockPos pos, Direction side, BlockPos blockPos) { Xray xray = Modules.get().get(Xray.class); if (xray.isActive()) { - info.setReturnValue(xray.modifyDrawSide(state, world, pos, side, info.getReturnValueZ())); + return xray.modifyDrawSide(state, world, pos, side, original); } + + return original; } - @Inject(method = "getSlipperiness", at = @At("RETURN"), cancellable = true) - public void getSlipperiness(CallbackInfoReturnable info) { + @ModifyReturnValue(method = "getSlipperiness", at = @At("RETURN")) + public float getSlipperiness(float original) { // For some retarded reason Tweakeroo calls this method before meteor is initialized - if (Modules.get() == null) return; + if (Modules.get() == null) return original; Slippy slippy = Modules.get().get(Slippy.class); Block block = (Block) (Object) this; if (slippy.isActive() && !slippy.ignoredBlocks.get().contains(block)) { - info.setReturnValue(slippy.friction.get().floatValue()); + return slippy.friction.get().floatValue(); } - if (block == Blocks.SLIME_BLOCK && Modules.get().get(NoSlow.class).slimeBlock()) info.setReturnValue(0.6F); + if (block == Blocks.SLIME_BLOCK && Modules.get().get(NoSlow.class).slimeBlock()) return 0.6F; + else return original; } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java index 5e91d136ee..b9758215b1 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.mixin; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.mojang.blaze3d.systems.RenderSystem; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.game.ReceiveMessageEvent; @@ -95,11 +96,11 @@ private void onAddMessage(Text message, @Nullable MessageSignatureData signature } } - @Redirect(method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;ILnet/minecraft/client/gui/hud/MessageIndicator;Z)V", slice = @Slice(from = @At(value = "FIELD", target = "Lnet/minecraft/client/gui/hud/ChatHud;visibleMessages:Ljava/util/List;")), at = @At(value = "INVOKE", target = "Ljava/util/List;size()I")) - private int addMessageListSizeProxy(List list) { + @ModifyExpressionValue(method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;ILnet/minecraft/client/gui/hud/MessageIndicator;Z)V", slice = @Slice(from = @At(value = "FIELD", target = "Lnet/minecraft/client/gui/hud/ChatHud;visibleMessages:Ljava/util/List;")), at = @At(value = "INVOKE", target = "Ljava/util/List;size()I")) + private int addMessageListSizeProxy(int size) { BetterChat betterChat = Modules.get().get(BetterChat.class); - if (betterChat.isLongerChat() && betterChat.getChatLength() >= 100) return list.size() - betterChat.getChatLength(); - return list.size(); + if (betterChat.isLongerChat() && betterChat.getChatLength() >= 100) return size - betterChat.getChatLength(); + return size; } @Inject(method = "render", at = @At("TAIL")) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChunkSkyLightProviderMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChunkSkyLightProviderMixin.java index 26bf7870d0..08d27fbe82 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChunkSkyLightProviderMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChunkSkyLightProviderMixin.java @@ -18,7 +18,6 @@ public class ChunkSkyLightProviderMixin { @Inject(at = @At("HEAD"), method = "recalculateLevel", cancellable = true) private void recalculateLevel(long long_1, long long_2, int int_1, CallbackInfoReturnable ci) { if (Modules.get().get(NoRender.class).noSkylightUpdates()) { - //return; ci.setReturnValue(15); ci.cancel(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityMixin.java index c0d46e92c9..0f35c708ab 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityMixin.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.mixin; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.mojang.authlib.GameProfile; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.entity.DamageEvent; @@ -45,10 +46,10 @@ private Screen updateNauseaGetCurrentScreenProxy(MinecraftClient client) { return client.currentScreen; } - @Redirect(method = "tickMovement", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;isUsingItem()Z")) - private boolean redirectUsingItem(ClientPlayerEntity player) { + @ModifyExpressionValue(method = "tickMovement", 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 player.isUsingItem(); + return isUsingItem; } @Inject(method = "isSneaking", at = @At("HEAD"), cancellable = true) @@ -105,8 +106,8 @@ private void onTickHasVehicleAfterSendPackets(CallbackInfo info) { } // Sneak - @Redirect(method = "sendMovementPackets", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;isSneaking()Z")) - private boolean isSneaking(ClientPlayerEntity clientPlayerEntity) { - return Modules.get().get(Sneak.class).doPacket() || Modules.get().get(NoSlow.class).airStrict() || clientPlayerEntity.isSneaking(); + @ModifyExpressionValue(method = "sendMovementPackets", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;isSneaking()Z")) + private boolean isSneaking(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/ClientPlayerInteractionManagerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerInteractionManagerMixin.java index 42c81ceeba..5aa43ce4eb 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerInteractionManagerMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerInteractionManagerMixin.java @@ -131,7 +131,7 @@ private void creativeBreakDelayChange2(ClientPlayerInteractionManager interactio blockBreakingCooldown = event.cooldown; } - @Redirect(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")) + @Redirect(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 deltaChange(BlockState blockState, PlayerEntity player, BlockView world, BlockPos pos) { float delta = blockState.calcBlockBreakingDelta(player, world, pos); if (Modules.get().get(BreakDelay.class).noInstaBreak.get() && delta >= 1) { diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/EnchantingTableBlockEntityRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/EnchantingTableBlockEntityRendererMixin.java index 695ee129cc..f429468f36 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/EnchantingTableBlockEntityRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/EnchantingTableBlockEntityRendererMixin.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.mixin; +import com.llamalad7.mixinextras.injector.WrapWithCondition; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.NoRender; import net.minecraft.client.render.VertexConsumer; @@ -13,12 +14,11 @@ 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.Redirect; @Mixin(EnchantingTableBlockEntityRenderer.class) public class EnchantingTableBlockEntityRendererMixin { - @Redirect(method = "render(Lnet/minecraft/block/entity/EnchantingTableBlockEntity;FLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;II)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/entity/model/BookModel;renderBook(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumer;IIFFFF)V")) - private void onRenderBookModelRenderProxy(BookModel model, MatrixStack matrixStack, VertexConsumer vertexConsumer, int i, int j, float f, float g, float h, float k) { - if (!Modules.get().get(NoRender.class).noEnchTableBook()) model.renderBook(matrixStack, vertexConsumer, i, j, f, g, h, k); + @WrapWithCondition(method = "render(Lnet/minecraft/block/entity/EnchantingTableBlockEntity;FLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;II)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/entity/model/BookModel;renderBook(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumer;IIFFFF)V")) + private boolean onRenderBookModelRenderProxy(BookModel model, MatrixStack matrixStack, VertexConsumer vertexConsumer, int i, int j, float f, float g, float h, float k) { + return !Modules.get().get(NoRender.class).noEnchTableBook(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/EntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/EntityMixin.java index 6f650dbb63..13991eab93 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/EntityMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/EntityMixin.java @@ -5,6 +5,8 @@ package meteordevelopment.meteorclient.mixin; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import com.llamalad7.mixinextras.injector.ModifyReturnValue; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.entity.LivingEntityMoveEvent; import meteordevelopment.meteorclient.events.entity.player.JumpVelocityMultiplierEvent; @@ -29,13 +31,8 @@ import net.minecraft.entity.LivingEntity; import net.minecraft.entity.MovementType; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.fluid.FluidState; -import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; -import net.minecraft.world.BlockView; -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.ModifyArgs; @@ -48,15 +45,9 @@ @Mixin(Entity.class) public abstract class EntityMixin { - @Shadow public World world; - - @Shadow public abstract BlockPos getBlockPos(); - @Shadow protected abstract BlockPos getVelocityAffectingPos(); - - @Redirect(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(FluidState state, BlockView world, BlockPos pos) { - Vec3d vec = state.getVelocity(world, pos); + @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) { Velocity velocity = Modules.get().get(Velocity.class); if ((Object) this == mc.player && velocity.isActive() && velocity.liquids.get()) { vec = vec.multiply(velocity.getHorizontal(velocity.liquidsHorizontal), velocity.getVertical(velocity.liquidsVertical), velocity.getHorizontal(velocity.liquidsHorizontal)); @@ -75,10 +66,10 @@ private void isInLava(CallbackInfoReturnable info) { if ((Object) this == mc.player && Modules.get().get(NoSlow.class).fluidDrag()) info.setReturnValue(false); } - @Redirect(method = "updateSwimming", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;isSubmergedInWater()Z")) - private boolean isSubmergedInWater(Entity entity) { - if (entity == mc.player && Modules.get().get(NoSlow.class).fluidDrag()) return false; - return entity.isSubmergedInWater(); + @ModifyExpressionValue(method = "updateSwimming", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;isSubmergedInWater()Z")) + private boolean isSubmergedInWater(boolean submerged) { + if ((Object) this == mc.player && Modules.get().get(NoSlow.class).fluidDrag()) return false; + return submerged; } @ModifyArgs(method = "pushAwayFrom(Lnet/minecraft/entity/Entity;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;addVelocity(DDD)V")) @@ -98,16 +89,14 @@ else if (entity instanceof FakePlayerEntity player && player.doNotPush) { } } - @Inject(method = "getJumpVelocityMultiplier", at = @At("HEAD"), cancellable = true) - private void onGetJumpVelocityMultiplier(CallbackInfoReturnable info) { + @ModifyReturnValue(method = "getJumpVelocityMultiplier", at = @At("RETURN")) + private float onGetJumpVelocityMultiplier(float original) { if ((Object) this == mc.player) { - float f = world.getBlockState(getBlockPos()).getBlock().getJumpVelocityMultiplier(); - float g = world.getBlockState(getVelocityAffectingPos()).getBlock().getJumpVelocityMultiplier(); - float a = f == 1.0D ? g : f; - JumpVelocityMultiplierEvent event = MeteorClient.EVENT_BUS.post(JumpVelocityMultiplierEvent.get()); - info.setReturnValue(a * event.multiplier); + return (original * event.multiplier); } + + return original; } @Inject(method = "move", at = @At("HEAD")) @@ -136,11 +125,12 @@ private Block getVelocityMultiplierGetBlockProxy(BlockState blockState) { return blockState.getBlock(); } - @Inject(method = "isInvisibleTo(Lnet/minecraft/entity/player/PlayerEntity;)Z", at = @At("HEAD"), cancellable = true) - private void isInvisibleToCanceller(PlayerEntity player, CallbackInfoReturnable info) { - if (!Utils.canUpdate()) return; + @ModifyReturnValue(method = "isInvisibleTo(Lnet/minecraft/entity/player/PlayerEntity;)Z", 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)) info.setReturnValue(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) @@ -166,8 +156,8 @@ private void getPoseHook(CallbackInfoReturnable info) { } } - @Inject(method = "bypassesLandingEffects", at = @At("RETURN"), cancellable = true) - private void cancelBounce(CallbackInfoReturnable cir) { - cir.setReturnValue(Modules.get().get(NoFall.class).cancelBounce() || cir.getReturnValue()); + @ModifyReturnValue(method = "bypassesLandingEffects", at = @At("RETURN")) + private boolean cancelBounce(boolean original) { + return Modules.get().get(NoFall.class).cancelBounce() || original; } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/EntityRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/EntityRendererMixin.java index 346beb5b6f..b97663704e 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/EntityRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/EntityRendererMixin.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.mixin; +import com.llamalad7.mixinextras.injector.ModifyReturnValue; import meteordevelopment.meteorclient.mixininterface.IEntityRenderer; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.Fullbright; @@ -48,9 +49,9 @@ private void shouldRender(T entity, Frustum frustum, double x, double y, double if (Modules.get().get(NoRender.class).noFallingBlocks() && entity instanceof FallingBlockEntity) cir.cancel(); } - @Inject(method = "getSkyLight", at = @At("RETURN"), cancellable = true) - private void onGetSkyLight(CallbackInfoReturnable info) { - info.setReturnValue(Math.max(Modules.get().get(Fullbright.class).getLuminance(), info.getReturnValueI())); + @ModifyReturnValue(method = "getSkyLight", at = @At("RETURN")) + private int onGetSkyLight(int original) { + return Math.max(Modules.get().get(Fullbright.class).getLuminance(), original); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/FoliageColorsMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/FoliageColorsMixin.java index d2c4660ba9..f27714a9a6 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/FoliageColorsMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/FoliageColorsMixin.java @@ -5,31 +5,33 @@ package meteordevelopment.meteorclient.mixin; +import com.llamalad7.mixinextras.injector.ModifyReturnValue; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.world.Ambience; import net.minecraft.client.color.world.FoliageColors; 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(FoliageColors.class) public class FoliageColorsMixin { - @Inject(method = "getBirchColor", at = @At("HEAD"), cancellable = true) - private static void onGetBirchColor(CallbackInfoReturnable cir) { + + @ModifyReturnValue(method = "getBirchColor", at = @At("RETURN")) + private static int onGetBirchColor(int original) { Ambience ambience = Modules.get().get(Ambience.class); - if(ambience.isActive() && ambience.customFoliageColor.get()) { - cir.setReturnValue(ambience.foliageColor.get().getPacked()); - cir.cancel(); + if (ambience.isActive() && ambience.customFoliageColor.get()) { + return ambience.foliageColor.get().getPacked(); } + + return original; } - @Inject(method = "getSpruceColor", at = @At("HEAD"), cancellable = true) - private static void onGetSpruceColor(CallbackInfoReturnable cir) { + @ModifyReturnValue(method = "getSpruceColor", at = @At("RETURN")) + private static int onGetSpruceColor(int original) { Ambience ambience = Modules.get().get(Ambience.class); - if(ambience.isActive() && ambience.customFoliageColor.get()) { - cir.setReturnValue(ambience.foliageColor.get().getPacked()); - cir.cancel(); + if (ambience.isActive() && ambience.customFoliageColor.get()) { + return ambience.foliageColor.get().getPacked(); } + + return original; } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java index 5075ed0e46..23fe559f8a 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.mixin; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.mojang.blaze3d.systems.RenderSystem; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.render.Render3DEvent; @@ -30,7 +31,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.util.hit.HitResult; -import net.minecraft.util.math.MathHelper; import org.joml.Matrix3f; import org.joml.Matrix4f; import org.spongepowered.asm.mixin.Final; @@ -103,10 +103,9 @@ private void onShowFloatingItem(ItemStack floatingItem, CallbackInfo info) { } } - @Redirect(method = "renderWorld", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/math/MathHelper;lerp(FFF)F")) - private float applyCameraTransformationsMathHelperLerpProxy(float delta, float first, float second) { - if (Modules.get().get(NoRender.class).noNausea()) return 0; - return MathHelper.lerp(delta, first, second); + @ModifyExpressionValue(method = "renderWorld", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/math/MathHelper;lerp(FFF)F")) + private float applyCameraTransformationsMathHelperLerpProxy(float original) { + return Modules.get().get(NoRender.class).noNausea() ? 0 : original; } // Freecam diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/InGameHudMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/InGameHudMixin.java index 1bf8b199f1..56bf3d4e36 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/InGameHudMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/InGameHudMixin.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.mixin; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.mojang.blaze3d.systems.RenderSystem; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.render.Render2DEvent; @@ -15,7 +16,6 @@ import meteordevelopment.meteorclient.utils.Utils; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.hud.InGameHud; -import net.minecraft.client.option.Perspective; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.Entity; import net.minecraft.scoreboard.ScoreboardObjective; @@ -25,7 +25,6 @@ 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.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.invoke.arg.Args; @@ -88,10 +87,9 @@ private void onRenderSpyglassOverlay(MatrixStack matrices, float scale, Callback if (Modules.get().get(NoRender.class).noSpyglassOverlay()) info.cancel(); } - @Redirect(method = "renderCrosshair", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/option/Perspective;isFirstPerson()Z")) - private boolean alwaysRenderCrosshairInFreecam(Perspective perspective) { - if (Modules.get().isActive(Freecam.class)) return true; - return perspective.isFirstPerson(); + @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) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ItemStackMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ItemStackMixin.java index 8833936e73..f48799196e 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ItemStackMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ItemStackMixin.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.mixin; +import com.llamalad7.mixinextras.injector.ModifyReturnValue; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.entity.player.FinishUsingItemEvent; import meteordevelopment.meteorclient.events.entity.player.StoppedUsingItemEvent; @@ -29,12 +30,14 @@ @Mixin(ItemStack.class) public abstract class ItemStackMixin { - @Inject(method = "getTooltip", at = @At("TAIL"), cancellable = true) - private void onGetTooltip(PlayerEntity player, TooltipContext context, CallbackInfoReturnable> info) { + @ModifyReturnValue(method = "getTooltip", at = @At("RETURN")) + private List onGetTooltip(List original, PlayerEntity player, TooltipContext context) { if (Utils.canUpdate()) { - ItemStackTooltipEvent event = MeteorClient.EVENT_BUS.post(ItemStackTooltipEvent.get((ItemStack) (Object) this, info.getReturnValue())); - info.setReturnValue(event.list); + ItemStackTooltipEvent event = MeteorClient.EVENT_BUS.post(ItemStackTooltipEvent.get((ItemStack) (Object) this, original)); + return event.list; } + + return original; } @Inject(method = "finishUsing", at = @At("HEAD")) @@ -51,9 +54,9 @@ private void onStoppedUsing(World world, LivingEntity user, int remainingUseTick } } - @Inject(method = "isSectionVisible", at = @At("RETURN"), cancellable = true) - private static void onSectionVisible(int flags, ItemStack.TooltipSection tooltipSection, CallbackInfoReturnable info) { - SectionVisibleEvent event = MeteorClient.EVENT_BUS.post(SectionVisibleEvent.get(tooltipSection, info.getReturnValueZ())); - info.setReturnValue(event.visible); + @ModifyReturnValue(method = "isSectionVisible", at = @At("RETURN")) + private static boolean onSectionVisible(boolean original, int flags, ItemStack.TooltipSection tooltipSection) { + SectionVisibleEvent event = MeteorClient.EVENT_BUS.post(SectionVisibleEvent.get(tooltipSection, original)); + return event.visible; } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java index eeb32767c1..599daa48ae 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.mixin; +import com.llamalad7.mixinextras.injector.ModifyReturnValue; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.entity.DamageEvent; import meteordevelopment.meteorclient.events.entity.player.CanWalkOnFluidEvent; @@ -54,12 +55,12 @@ private void onDamageHead(DamageSource source, float amount, CallbackInfoReturna MeteorClient.EVENT_BUS.post(DamageEvent.get((LivingEntity) (Object) this, source, amount)); } - @Inject(method = "canWalkOnFluid", at = @At("HEAD"), cancellable = true) - private void onCanWalkOnFluid(FluidState fluidState, CallbackInfoReturnable info) { - if ((Object) this != mc.player) return; + @ModifyReturnValue(method = "canWalkOnFluid", at = @At("RETURN")) + private boolean onCanWalkOnFluid(boolean original, FluidState fluidState) { + if ((Object) this != mc.player) return original; CanWalkOnFluidEvent event = MeteorClient.EVENT_BUS.post(CanWalkOnFluidEvent.get(fluidState)); - info.setReturnValue(event.walkOnFluid); + return event.walkOnFluid; } @Redirect(method = "travel", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;hasNoGravity()Z")) @@ -99,15 +100,19 @@ private int getHandSwingDuration(int constant) { return Modules.get().get(HandView.class).isActive() && mc.options.getPerspective().isFirstPerson() ? Modules.get().get(HandView.class).swingSpeed.get() : constant; } - @Inject(method = "isFallFlying", at = @At("HEAD"), cancellable = true) - private void isFallFlyingHook(CallbackInfoReturnable info) { + @ModifyReturnValue(method = "isFallFlying", at = @At("RETURN")) + private boolean isFallFlyingHook(boolean original) { if ((Object) this == mc.player && Modules.get().get(ElytraFly.class).canPacketEfly()) { - info.setReturnValue(true); + return true; } + + return original; } - @Inject(method = "hasStatusEffect", at = @At("HEAD"), cancellable = true) - private void hasStatusEffect(StatusEffect effect, CallbackInfoReturnable info) { - if (Modules.get().get(PotionSpoof.class).shouldBlock(effect)) info.setReturnValue(false); + @ModifyReturnValue(method = "hasStatusEffect", at = @At("RETURN")) + private boolean hasStatusEffect(boolean original, StatusEffect effect) { + if (Modules.get().get(PotionSpoof.class).shouldBlock(effect)) return false; + + return original; } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityRendererMixin.java index 2bea5af454..21263b00e1 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityRendererMixin.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.mixin; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.Chams; import meteordevelopment.meteorclient.systems.modules.render.Freecam; @@ -12,8 +13,6 @@ import meteordevelopment.meteorclient.utils.player.PlayerUtils; import meteordevelopment.meteorclient.utils.player.Rotations; import meteordevelopment.meteorclient.utils.render.color.Color; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.client.render.RenderLayer; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.entity.LivingEntityRenderer; @@ -40,10 +39,9 @@ public abstract class LivingEntityRendererMixin getIconsProxy(MapState state) { - if (Modules.get().get(NoRender.class).noMapMarkers()) return EmptyIterator::new; - return state.getIcons(); + @ModifyExpressionValue(method = "draw(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;ZI)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/map/MapState;getIcons()Ljava/lang/Iterable;")) + private Iterable getIconsProxy(Iterable original) { + return (Modules.get().get(NoRender.class).noMapMarkers()) ? EmptyIterator::new : original; } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftClientMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftClientMixin.java index fff63c2ee0..46363df5e9 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftClientMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftClientMixin.java @@ -5,6 +5,8 @@ package meteordevelopment.meteorclient.mixin; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import com.llamalad7.mixinextras.injector.ModifyReturnValue; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.entity.player.ItemUseCrosshairTargetEvent; import meteordevelopment.meteorclient.events.game.GameLeftEvent; @@ -38,7 +40,6 @@ 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.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @@ -113,14 +114,14 @@ private void onSetScreen(Screen screen, CallbackInfo info) { if (event.isCancelled()) info.cancel(); } - @Redirect(method = "doItemUse", at = @At(value = "FIELD", target = "Lnet/minecraft/client/MinecraftClient;crosshairTarget:Lnet/minecraft/util/hit/HitResult;", ordinal = 1)) - private HitResult doItemUseMinecraftClientCrosshairTargetProxy(MinecraftClient client) { - return MeteorClient.EVENT_BUS.post(ItemUseCrosshairTargetEvent.get(client.crosshairTarget)).target; + @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; } - @Inject(method = "reloadResources(Z)Ljava/util/concurrent/CompletableFuture;", at = @At("RETURN"), cancellable = true) - private void onReloadResourcesNewCompletableFuture(boolean force, CallbackInfoReturnable> cir) { - cir.setReturnValue(cir.getReturnValue().thenRun(() -> MeteorClient.EVENT_BUS.post(ResourcePacksReloadedEvent.get()))); + @ModifyReturnValue(method = "reloadResources(Z)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")) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerArmorSlotMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerArmorSlotMixin.java index e23fc32ab4..b6233dbbe9 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerArmorSlotMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerArmorSlotMixin.java @@ -5,29 +5,31 @@ package meteordevelopment.meteorclient.mixin; +import com.llamalad7.mixinextras.injector.ModifyReturnValue; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.misc.InventoryTweaks; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(targets = "net/minecraft/screen/PlayerScreenHandler$1") public class PlayerArmorSlotMixin { - @Inject(method = "getMaxItemCount", at = @At("HEAD"), cancellable = true) - private void onGetMaxItemCount(CallbackInfoReturnable cir) { - if (Modules.get().get(InventoryTweaks.class).armorStorage()) cir.setReturnValue(64); + @ModifyReturnValue(method = "getMaxItemCount", at = @At("RETURN")) + private int onGetMaxItemCount(int original) { + if (Modules.get().get(InventoryTweaks.class).armorStorage()) return 64; + return original; } - @Inject(method = "canInsert", at = @At("HEAD"), cancellable = true) - private void onCanInsert(ItemStack stack, CallbackInfoReturnable cir) { - if (Modules.get().get(InventoryTweaks.class).armorStorage()) cir.setReturnValue(true); + @ModifyReturnValue(method = "canInsert", at = @At("RETURN")) + private boolean onCanInsert(boolean original, ItemStack stack) { + if (Modules.get().get(InventoryTweaks.class).armorStorage()) return true; + return original; } - @Inject(method = "canTakeItems", at = @At("HEAD"), cancellable = true) - private void onCanTakeItems(PlayerEntity playerEntity, CallbackInfoReturnable cir) { - if (Modules.get().get(InventoryTweaks.class).armorStorage()) cir.setReturnValue(true); + @ModifyReturnValue(method = "canTakeItems", at = @At("RETURN")) + private boolean onCanTakeItems(boolean original, PlayerEntity playerEntity) { + if (Modules.get().get(InventoryTweaks.class).armorStorage()) return true; + return original; } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityMixin.java index 36325a19bf..acf12edd61 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityMixin.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.mixin; +import com.llamalad7.mixinextras.injector.ModifyReturnValue; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.entity.DropItemsEvent; import meteordevelopment.meteorclient.events.entity.player.ClipAtLedgeEvent; @@ -57,24 +58,25 @@ private void onDropItem(ItemStack stack, boolean bl, boolean bl2, CallbackInfoRe } } - @Inject(method = "getBlockBreakingSpeed", at = @At(value = "RETURN"), cancellable = true) - public void onGetBlockBreakingSpeed(BlockState block, CallbackInfoReturnable cir) { - if (!world.isClient) return; + @ModifyReturnValue(method = "getBlockBreakingSpeed", at = @At(value = "RETURN")) + public float onGetBlockBreakingSpeed(float breakSpeed, BlockState block) { + if (!world.isClient) return breakSpeed; SpeedMine speedMine = Modules.get().get(SpeedMine.class); - if (!speedMine.isActive() || speedMine.mode.get() != SpeedMine.Mode.Normal || !speedMine.filter(block.getBlock())) return; + if (!speedMine.isActive() || speedMine.mode.get() != SpeedMine.Mode.Normal || !speedMine.filter(block.getBlock())) return breakSpeed; - float breakSpeed = cir.getReturnValue(); 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))) { - cir.setReturnValue(breakSpeedMod); + return breakSpeedMod; } else { - cir.setReturnValue(0.9f / BlockUtils.calcBlockBreakingDelta2(pos, 1)); + return 0.9f / BlockUtils.calcBlockBreakingDelta2(pos, 1); } } + + return breakSpeed; } @Inject(method = "jump", at = @At("HEAD"), cancellable = true) @@ -85,17 +87,19 @@ public void dontJump(CallbackInfo info) { if (module.isActive() && module.cancelJump) info.cancel(); } - @Inject(method = "getMovementSpeed", at = @At("RETURN"), cancellable = true) - private void onGetMovementSpeed(CallbackInfoReturnable info) { - if (!world.isClient) return; - if (!Modules.get().get(NoSlow.class).slowness()) return; + @ModifyReturnValue(method = "getMovementSpeed", at = @At("RETURN")) + private float onGetMovementSpeed(float original) { + if (!world.isClient) return original; + if (!Modules.get().get(NoSlow.class).slowness()) return original; float walkSpeed = getAbilities().getWalkSpeed(); - if (info.getReturnValueF() < walkSpeed) { - if (isSprinting()) info.setReturnValue((float) (walkSpeed * 1.30000001192092896)); - else info.setReturnValue(walkSpeed); + if (original < walkSpeed) { + if (isSprinting()) return (float) (walkSpeed * 1.30000001192092896); + else return walkSpeed; } + + return original; } @Inject(method = "getOffGroundSpeed", at = @At("HEAD"), cancellable = true) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PowderSnowBlockMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/PowderSnowBlockMixin.java index 99d1d89ccf..62161b7a3b 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PowderSnowBlockMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/PowderSnowBlockMixin.java @@ -5,21 +5,21 @@ package meteordevelopment.meteorclient.mixin; +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 org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import static meteordevelopment.meteorclient.MeteorClient.mc; @Mixin(PowderSnowBlock.class) public class PowderSnowBlockMixin { - @Inject(method = "canWalkOnPowderSnow", at = @At("HEAD"), cancellable = true) - private static void onCanWalkOnPowderSnow(Entity entity, CallbackInfoReturnable info) { - if (entity == mc.player && Modules.get().get(Jesus.class).canWalkOnPowderSnow()) info.setReturnValue(true); + @ModifyReturnValue(method = "canWalkOnPowderSnow", 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/ScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ScreenMixin.java index 1b5837aad9..f430f06346 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ScreenMixin.java @@ -46,9 +46,7 @@ private void onRunCommand(Style style, CallbackInfoReturnable cir) { if (style.getClickEvent().getValue().startsWith(Config.get().prefix.get())) { try { Commands.dispatch(style.getClickEvent().getValue().substring(Config.get().prefix.get().length())); - cir.setReturnValue(true); - cir.cancel(); } catch (CommandSyntaxException e) { e.printStackTrace(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/SignBlockEntityRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/SignBlockEntityRendererMixin.java index eca164988d..dbc96a9a22 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/SignBlockEntityRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/SignBlockEntityRendererMixin.java @@ -5,29 +5,16 @@ package meteordevelopment.meteorclient.mixin; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.NoRender; -import net.minecraft.block.entity.SignBlockEntity; import net.minecraft.client.render.block.entity.SignBlockEntityRenderer; -import net.minecraft.text.OrderedText; -import net.minecraft.text.Text; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Constant; -import org.spongepowered.asm.mixin.injection.ModifyConstant; -import org.spongepowered.asm.mixin.injection.Redirect; - -import java.util.function.Function; @Mixin(SignBlockEntityRenderer.class) public class SignBlockEntityRendererMixin { - @Redirect(method = "renderText", at = @At(value = "INVOKE", target = "Lnet/minecraft/block/entity/SignBlockEntity;updateSign(ZLjava/util/function/Function;)[Lnet/minecraft/text/OrderedText;")) - private OrderedText[] updateSignProxy(SignBlockEntity sign, boolean filterText, Function textOrderingFunction) { - if (Modules.get().get(NoRender.class).noSignText()) return null; - return sign.updateSign(filterText, textOrderingFunction); - } - - @ModifyConstant(method = "renderText", constant = @Constant(intValue = 4)) + @ModifyExpressionValue(method = "renderText", 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/TextRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/TextRendererMixin.java index d90845dc90..a35c7be184 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/TextRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/TextRendererMixin.java @@ -5,17 +5,16 @@ package meteordevelopment.meteorclient.mixin; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.NoRender; -import net.minecraft.text.Style; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(targets = "net.minecraft.client.font.TextRenderer$Drawer") public class TextRendererMixin { - @Redirect(method = "accept", at = @At(value = "INVOKE", target = "Lnet/minecraft/text/Style;isObfuscated()Z")) - private boolean onRenderObfuscatedStyle(Style instance) { - return !Modules.get().get(NoRender.class).noObfuscation() && instance.isObfuscated(); + @ModifyExpressionValue(method = "accept", at = @At(value = "INVOKE", target = "Lnet/minecraft/text/Style;isObfuscated()Z")) + private boolean onRenderObfuscatedStyle(boolean original) { + return !Modules.get().get(NoRender.class).noObfuscation() && original; } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/TridentItemMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/TridentItemMixin.java index d6e478a637..2af0193ece 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/TridentItemMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/TridentItemMixin.java @@ -5,11 +5,11 @@ package meteordevelopment.meteorclient.mixin; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; 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.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.item.TridentItem; import net.minecraft.world.World; @@ -17,7 +17,6 @@ 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.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.invoke.arg.Args; @@ -44,17 +43,17 @@ private void modifyVelocity(Args args) { args.set(2, (double) args.get(2) * tridentBoost.getMultiplier()); } - @Redirect(method = "use", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;isTouchingWaterOrRain()Z")) - private boolean isInWaterUse(PlayerEntity playerEntity) { + @ModifyExpressionValue(method = "use", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;isTouchingWaterOrRain()Z")) + private boolean isInWaterUse(boolean original) { TridentBoost tridentBoost = Modules.get().get(TridentBoost.class); - return tridentBoost.allowOutOfWater() || mc.player.isTouchingWaterOrRain(); + return tridentBoost.allowOutOfWater() || original; } - @Redirect(method = "onStoppedUsing", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;isTouchingWaterOrRain()Z")) - private boolean isInWaterPostUse(PlayerEntity playerEntity) { + @ModifyExpressionValue(method = "onStoppedUsing", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;isTouchingWaterOrRain()Z")) + private boolean isInWaterPostUse(boolean original) { TridentBoost tridentBoost = Modules.get().get(TridentBoost.class); - return tridentBoost.allowOutOfWater() || mc.player.isTouchingWaterOrRain(); + return tridentBoost.allowOutOfWater() || original; } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBlockOcclusionCacheMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBlockOcclusionCacheMixin.java index 691a70d12d..f5e7ce8728 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBlockOcclusionCacheMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBlockOcclusionCacheMixin.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.mixin.sodium; +import com.llamalad7.mixinextras.injector.ModifyReturnValue; import me.jellysquid.mods.sodium.client.render.occlusion.BlockOcclusionCache; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.Xray; @@ -14,17 +15,17 @@ import net.minecraft.world.BlockView; 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(value = BlockOcclusionCache.class, remap = false) public class SodiumBlockOcclusionCacheMixin { - @Inject(method = "shouldDrawSide", at = @At("RETURN"), cancellable = true) - private void shouldDrawSide(BlockState state, BlockView view, BlockPos pos, Direction facing, CallbackInfoReturnable info) { + @ModifyReturnValue(method = "shouldDrawSide", at = @At("RETURN")) + private boolean shouldDrawSide(boolean original, BlockState state, BlockView view, BlockPos pos, Direction facing) { Xray xray = Modules.get().get(Xray.class); if (xray.isActive()) { - info.setReturnValue(xray.modifyDrawSide(state, view, pos, facing, info.getReturnValueZ())); + return xray.modifyDrawSide(state, view, pos, facing, original); } + + return original; } } diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 6fe4842487..0699075ae9 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -19,6 +19,9 @@ "icon": "assets/meteor-client/icon.png", "environment": "client", "entrypoints": { + "preLaunch": [ + "com.llamalad7.mixinextras.MixinExtrasBootstrap::init" + ], "client": [ "meteordevelopment.meteorclient.MeteorClient" ] From ac892fef3d22177633ce7faa04fb02090d256be7 Mon Sep 17 00:00:00 2001 From: nickcat325 Date: Thu, 25 May 2023 23:13:55 -0500 Subject: [PATCH 002/357] auto log 20 to 19 max --- .../meteorclient/systems/modules/misc/AutoLog.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/AutoLog.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/AutoLog.java index 804aea9388..e6f5349cbf 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/AutoLog.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/AutoLog.java @@ -31,8 +31,8 @@ public class AutoLog extends Module { .name("health") .description("Automatically disconnects when health is lower or equal to this value.") .defaultValue(6) - .range(0, 20) - .sliderMax(20) + .range(0, 19) + .sliderMax(19) .build() ); From 4a72921a6025044bb11fe26a723ac3c4ae320ba2 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Fri, 26 May 2023 09:38:56 -0400 Subject: [PATCH 003/357] Change EntityTypeListSetting value from Object2BooleanOpenHashMap to ObjectOpenHashSet (#3663) --- .../settings/EntityTypeListSettingScreen.java | 14 ++++---- .../settings/EntityTypeListSetting.java | 35 +++++++++---------- .../systems/modules/combat/BowAimbot.java | 7 ++-- .../systems/modules/combat/Hitboxes.java | 7 ++-- .../systems/modules/combat/KillAura.java | 6 ++-- .../systems/modules/misc/Notifier.java | 12 +++---- .../systems/modules/player/NoInteract.java | 14 ++++---- .../systems/modules/render/Chams.java | 7 ++-- .../systems/modules/render/ESP.java | 9 ++--- .../systems/modules/render/Nametags.java | 7 ++-- .../systems/modules/render/NoRender.java | 8 ++--- .../systems/modules/render/Tracers.java | 14 ++------ .../systems/modules/world/AutoBreed.java | 6 ++-- .../systems/modules/world/AutoNametag.java | 7 ++-- .../systems/modules/world/Flamethrower.java | 7 ++-- .../meteorclient/utils/Utils.java | 11 +----- .../utils/render/postprocess/ChamsShader.java | 2 +- 17 files changed, 76 insertions(+), 97 deletions(-) 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 f91ea1965d..1caf20e89a 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EntityTypeListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EntityTypeListSettingScreen.java @@ -65,9 +65,7 @@ public Cell add(W widget) { public void initWidgets() { hasAnimal = hasWaterAnimal = hasMonster = hasAmbient = hasMisc = 0; - for (EntityType entityType : setting.get().keySet()) { - if (!setting.get().getBoolean(entityType)) continue; - + for (EntityType entityType : setting.get()) { if (setting.filter == null || setting.filter.test(entityType)) { switch (entityType.getSpawnGroup()) { case CREATURE -> hasAnimal++; @@ -204,10 +202,10 @@ private void tableChecked(List> entityTypes, boolean checked) { for (EntityType entityType : entityTypes) { if (checked) { - setting.get().put(entityType, true); + setting.get().add(entityType); changed = true; } else { - if (setting.get().removeBoolean(entityType)) { + if (setting.get().remove(entityType)) { changed = true; } } @@ -223,10 +221,10 @@ private void tableChecked(List> entityTypes, boolean checked) { private void addEntityType(WTable table, WCheckbox tableCheckbox, EntityType entityType) { table.add(theme.label(Names.get(entityType))); - WCheckbox a = table.add(theme.checkbox(setting.get().getBoolean(entityType))).expandCellX().right().widget(); + WCheckbox a = table.add(theme.checkbox(setting.get().contains(entityType))).expandCellX().right().widget(); a.action = () -> { if (a.checked) { - setting.get().put(entityType, true); + setting.get().add(entityType); switch (entityType.getSpawnGroup()) { case CREATURE -> { if (hasAnimal == 0) tableCheckbox.checked = true; @@ -250,7 +248,7 @@ private void addEntityType(WTable table, WCheckbox tableCheckbox, EntityType } } } else { - if (setting.get().removeBoolean(entityType)) { + if (setting.get().remove(entityType)) { switch (entityType.getSpawnGroup()) { case CREATURE -> { hasAnimal--; diff --git a/src/main/java/meteordevelopment/meteorclient/settings/EntityTypeListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/EntityTypeListSetting.java index b6a10a0277..c117333718 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/EntityTypeListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/EntityTypeListSetting.java @@ -5,9 +5,7 @@ package meteordevelopment.meteorclient.settings; -import it.unimi.dsi.fastutil.objects.Object2BooleanMap; -import it.unimi.dsi.fastutil.objects.Object2BooleanOpenHashMap; -import meteordevelopment.meteorclient.utils.Utils; +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; import meteordevelopment.meteorclient.utils.entity.EntityUtils; import net.minecraft.entity.EntityType; import net.minecraft.nbt.NbtCompound; @@ -17,13 +15,14 @@ import net.minecraft.registry.Registries; import net.minecraft.util.Identifier; +import java.util.Set; import java.util.function.Consumer; import java.util.function.Predicate; -public class EntityTypeListSetting extends Setting>> { +public class EntityTypeListSetting extends Setting>> { public final Predicate> filter; - public EntityTypeListSetting(String name, String description, Object2BooleanMap> defaultValue, Consumer>> onChanged, Consumer>>> onModuleActivated, IVisible visible, Predicate> filter) { + public EntityTypeListSetting(String name, String description, Set> defaultValue, Consumer>> onChanged, Consumer>>> onModuleActivated, IVisible visible, Predicate> filter) { super(name, description, defaultValue, onChanged, onModuleActivated, visible); this.filter = filter; @@ -31,18 +30,18 @@ public EntityTypeListSetting(String name, String description, Object2BooleanMap< @Override public void resetImpl() { - value = new Object2BooleanOpenHashMap<>(defaultValue); + value = new ObjectOpenHashSet<>(defaultValue); } @Override - protected Object2BooleanMap> parseImpl(String str) { + protected Set> parseImpl(String str) { String[] values = str.split(","); - Object2BooleanMap> entities = new Object2BooleanOpenHashMap<>(values.length); + Set> entities = new ObjectOpenHashSet<>(values.length); try { for (String value : values) { EntityType entity = parseId(Registries.ENTITY_TYPE, value); - if (entity != null) entities.put(entity, true); + if (entity != null) entities.add(entity); } } catch (Exception ignored) {} @@ -50,7 +49,7 @@ protected Object2BooleanMap> parseImpl(String str) { } @Override - protected boolean isValueValid(Object2BooleanMap> value) { + protected boolean isValueValid(Set> value) { return true; } @@ -62,10 +61,8 @@ public Iterable getIdentifierSuggestions() { @Override public NbtCompound save(NbtCompound tag) { NbtList valueTag = new NbtList(); - for (EntityType entityType : get().keySet()) { - if (get().getBoolean(entityType)) { - valueTag.add(NbtString.of(Registries.ENTITY_TYPE.getId(entityType).toString())); - } + for (EntityType entityType : get()) { + valueTag.add(NbtString.of(Registries.ENTITY_TYPE.getId(entityType).toString())); } tag.put("value", valueTag); @@ -73,27 +70,27 @@ public NbtCompound save(NbtCompound tag) { } @Override - public Object2BooleanMap> load(NbtCompound tag) { + public Set> load(NbtCompound tag) { get().clear(); NbtList valueTag = tag.getList("value", 8); for (NbtElement tagI : valueTag) { EntityType type = Registries.ENTITY_TYPE.get(new Identifier(tagI.asString())); - if (filter == null || filter.test(type)) get().put(type, true); + if (filter == null || filter.test(type)) get().add(type); } return get(); } - public static class Builder extends SettingBuilder>, EntityTypeListSetting> { + public static class Builder extends SettingBuilder>, EntityTypeListSetting> { private Predicate> filter; public Builder() { - super(new Object2BooleanOpenHashMap<>(0)); + super(new ObjectOpenHashSet<>(0)); } public Builder defaultValue(EntityType... defaults) { - return defaultValue(defaults != null ? Utils.asO2BMap(defaults) : new Object2BooleanOpenHashMap<>(0)); + return defaultValue(defaults != null ? new ObjectOpenHashSet<>(defaults) : new ObjectOpenHashSet<>(0)); } public Builder onlyAttackable() { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BowAimbot.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BowAimbot.java index 5e30648b77..4f5361fb35 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BowAimbot.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BowAimbot.java @@ -6,7 +6,6 @@ package meteordevelopment.meteorclient.systems.modules.combat; import baritone.api.BaritoneAPI; -import it.unimi.dsi.fastutil.objects.Object2BooleanMap; import meteordevelopment.meteorclient.events.render.Render3DEvent; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.friends.Friends; @@ -28,6 +27,8 @@ import net.minecraft.item.Items; import net.minecraft.util.math.Vec3d; +import java.util.Set; + public class BowAimbot extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); @@ -40,7 +41,7 @@ public class BowAimbot extends Module { .build() ); - private final Setting>> entities = sgGeneral.add(new EntityTypeListSetting.Builder() + private final Setting>> entities = sgGeneral.add(new EntityTypeListSetting.Builder() .name("entities") .description("Entities to attack.") .onlyAttackable() @@ -98,7 +99,7 @@ private void onRender(Render3DEvent event) { if (entity == mc.player || entity == mc.cameraEntity) return false; if ((entity instanceof LivingEntity && ((LivingEntity) entity).isDead()) || !entity.isAlive()) return false; if (!PlayerUtils.isWithin(entity, range.get())) return false; - if (!entities.get().getBoolean(entity.getType())) return false; + if (!entities.get().contains(entity.getType())) return false; if (!nametagged.get() && entity.hasCustomName()) return false; if (!PlayerUtils.canSeeEntity(entity)) return false; if (entity instanceof PlayerEntity) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Hitboxes.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Hitboxes.java index ec90ddea00..c5014295c8 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Hitboxes.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Hitboxes.java @@ -5,7 +5,6 @@ package meteordevelopment.meteorclient.systems.modules.combat; -import it.unimi.dsi.fastutil.objects.Object2BooleanMap; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; @@ -15,10 +14,12 @@ import net.minecraft.item.AxeItem; import net.minecraft.item.SwordItem; +import java.util.Set; + public class Hitboxes extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final Setting>> entities = sgGeneral.add(new EntityTypeListSetting.Builder() + private final Setting>> entities = sgGeneral.add(new EntityTypeListSetting.Builder() .name("entities") .description("Which entities to target.") .defaultValue(EntityType.PLAYER) @@ -45,7 +46,7 @@ public Hitboxes() { public double getEntityValue(Entity entity) { if (!(isActive() && testWeapon())) return 0; - if (entities.get().getBoolean(entity.getType())) return value.get(); + if (entities.get().contains(entity.getType())) return value.get(); return 0; } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java index 26d4fbf260..2b7170b046 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java @@ -6,7 +6,6 @@ package meteordevelopment.meteorclient.systems.modules.combat; import baritone.api.BaritoneAPI; -import it.unimi.dsi.fastutil.objects.Object2BooleanMap; import meteordevelopment.meteorclient.events.packets.PacketEvent; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.settings.*; @@ -45,6 +44,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Set; import java.util.function.Predicate; public class KillAura extends Module { @@ -106,7 +106,7 @@ public class KillAura extends Module { // Targeting - private final Setting>> entities = sgTargeting.add(new EntityTypeListSetting.Builder() + private final Setting>> entities = sgTargeting.add(new EntityTypeListSetting.Builder() .name("entities") .description("Entities to attack.") .onlyAttackable() @@ -337,7 +337,7 @@ private boolean entityCheck(Entity entity) { range.get() )) return false; - if (!entities.get().getBoolean(entity.getType())) return false; + if (!entities.get().contains(entity.getType())) return false; if (ignoreNamed.get() && entity.hasCustomName()) return false; if (!PlayerUtils.canSeeEntity(entity) && !PlayerUtils.isWithin(entity, wallsRange.get())) return false; if (ignoreTamed.get()) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java index cf5c32df0f..adcbcb2825 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java @@ -5,7 +5,6 @@ package meteordevelopment.meteorclient.systems.modules.misc; -import it.unimi.dsi.fastutil.objects.Object2BooleanMap; import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import meteordevelopment.meteorclient.events.entity.EntityAddedEvent; @@ -32,10 +31,7 @@ import net.minecraft.util.Formatting; import net.minecraft.util.math.Vec3d; -import java.util.HashMap; -import java.util.Map; -import java.util.Random; -import java.util.UUID; +import java.util.*; import static meteordevelopment.meteorclient.utils.player.ChatUtils.formatCoords; @@ -90,7 +86,7 @@ public class Notifier extends Module { .build() ); - private final Setting>> entities = sgVisualRange.add(new EntityTypeListSetting.Builder() + private final Setting>> entities = sgVisualRange.add(new EntityTypeListSetting.Builder() .name("entities") .description("Which entities to notify about.") .defaultValue(EntityType.PLAYER) @@ -155,7 +151,7 @@ public Notifier() { @EventHandler private void onEntityAdded(EntityAddedEvent event) { - if (!event.entity.getUuid().equals(mc.player.getUuid()) && entities.get().getBoolean(event.entity.getType()) && visualRange.get() && this.event.get() != Event.Despawn) { + if (!event.entity.getUuid().equals(mc.player.getUuid()) && entities.get().contains(event.entity.getType()) && visualRange.get() && this.event.get() != Event.Despawn) { if (event.entity instanceof PlayerEntity) { if ((!visualRangeIgnoreFriends.get() || !Friends.get().isFriend(((PlayerEntity) event.entity))) && (!visualRangeIgnoreFakes.get() || !(event.entity instanceof FakePlayerEntity))) { ChatUtils.sendMsg(event.entity.getId() + 100, Formatting.GRAY, "(highlight)%s(default) has entered your visual range!", event.entity.getEntityName()); @@ -181,7 +177,7 @@ private void onEntityAdded(EntityAddedEvent event) { @EventHandler private void onEntityRemoved(EntityRemovedEvent event) { - if (!event.entity.getUuid().equals(mc.player.getUuid()) && entities.get().getBoolean(event.entity.getType()) && visualRange.get() && this.event.get() != Event.Spawn) { + if (!event.entity.getUuid().equals(mc.player.getUuid()) && entities.get().contains(event.entity.getType()) && visualRange.get() && this.event.get() != Event.Spawn) { if (event.entity instanceof PlayerEntity) { if ((!visualRangeIgnoreFriends.get() || !Friends.get().isFriend(((PlayerEntity) event.entity))) && (!visualRangeIgnoreFakes.get() || !(event.entity instanceof FakePlayerEntity))) { ChatUtils.sendMsg(event.entity.getId() + 100, Formatting.GRAY, "(highlight)%s(default) has left your visual range!", event.entity.getEntityName()); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/NoInteract.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/NoInteract.java index eddd065e92..4bea37d511 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/NoInteract.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/NoInteract.java @@ -5,7 +5,6 @@ package meteordevelopment.meteorclient.systems.modules.player; -import it.unimi.dsi.fastutil.objects.Object2BooleanMap; import meteordevelopment.meteorclient.events.entity.player.AttackEntityEvent; import meteordevelopment.meteorclient.events.entity.player.InteractBlockEvent; import meteordevelopment.meteorclient.events.entity.player.InteractEntityEvent; @@ -26,6 +25,7 @@ import net.minecraft.util.math.BlockPos; import java.util.List; +import java.util.Set; public class NoInteract extends Module { private final SettingGroup sgBlocks = settings.createGroup("Blocks"); @@ -68,7 +68,7 @@ public class NoInteract extends Module { // Entities - private final Setting>> entityHit = sgEntities.add(new EntityTypeListSetting.Builder() + private final Setting>> entityHit = sgEntities.add(new EntityTypeListSetting.Builder() .name("entity-hit") .description("Cancel entity hitting.") .onlyAttackable() @@ -82,7 +82,7 @@ public class NoInteract extends Module { .build() ); - private final Setting>> entityInteract = sgEntities.add(new EntityTypeListSetting.Builder() + private final Setting>> entityInteract = sgEntities.add(new EntityTypeListSetting.Builder() .name("entity-interact") .description("Cancel entity interaction.") .onlyAttackable() @@ -194,12 +194,12 @@ private boolean shouldAttackEntity(Entity entity) { // Entities if (entityHitMode.get() == ListMode.BlackList && - entityHit.get().getBoolean(entity.getType())) { + entityHit.get().contains(entity.getType())) { return false; } else return entityHitMode.get() != ListMode.WhiteList || - entityHit.get().getBoolean(entity.getType()); + entityHit.get().contains(entity.getType()); } private boolean shouldInteractEntity(Entity entity, Hand hand) { @@ -227,11 +227,11 @@ private boolean shouldInteractEntity(Entity entity, Hand hand) { // Entities if (entityInteractMode.get() == ListMode.BlackList && - entityInteract.get().getBoolean(entity.getType())) { + entityInteract.get().contains(entity.getType())) { return false; } else return entityInteractMode.get() != ListMode.WhiteList || - entityInteract.get().getBoolean(entity.getType()); + entityInteract.get().contains(entity.getType()); } public enum HandMode { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Chams.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Chams.java index 259c441085..c015780748 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Chams.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Chams.java @@ -5,7 +5,6 @@ package meteordevelopment.meteorclient.systems.modules.render; -import it.unimi.dsi.fastutil.objects.Object2BooleanMap; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; @@ -17,6 +16,8 @@ import net.minecraft.entity.EntityType; import net.minecraft.util.Identifier; +import java.util.Set; + public class Chams extends Module { private final SettingGroup sgThroughWalls = settings.createGroup("Through Walls"); private final SettingGroup sgPlayers = settings.createGroup("Players"); @@ -25,7 +26,7 @@ public class Chams extends Module { // Through walls - public final Setting>> entities = sgThroughWalls.add(new EntityTypeListSetting.Builder() + public final Setting>> entities = sgThroughWalls.add(new EntityTypeListSetting.Builder() .name("entities") .description("Select entities to show through walls.") .build() @@ -221,7 +222,7 @@ public Chams() { } public boolean shouldRender(Entity entity) { - return isActive() && !isShader() && entities.get().getBoolean(entity.getType()) && (entity != mc.player || ignoreSelfDepth.get()); + return isActive() && !isShader() && entities.get().contains(entity.getType()) && (entity != mc.player || ignoreSelfDepth.get()); } public boolean isShader() { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ESP.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ESP.java index d1d7792092..b1699e4487 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ESP.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ESP.java @@ -5,7 +5,6 @@ package meteordevelopment.meteorclient.systems.modules.render; -import it.unimi.dsi.fastutil.objects.Object2BooleanMap; import meteordevelopment.meteorclient.events.render.Render2DEvent; import meteordevelopment.meteorclient.events.render.Render3DEvent; import meteordevelopment.meteorclient.renderer.Renderer2D; @@ -29,6 +28,8 @@ import net.minecraft.util.math.MathHelper; import org.joml.Vector3d; +import java.util.Set; + public class ESP extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); private final SettingGroup sgColors = settings.createGroup("Colors"); @@ -96,7 +97,7 @@ public class ESP extends Module { .build() ); - private final Setting>> entities = sgGeneral.add(new EntityTypeListSetting.Builder() + private final Setting>> entities = sgGeneral.add(new EntityTypeListSetting.Builder() .name("entities") .description("Select specific entities.") .defaultValue(EntityType.PLAYER) @@ -296,14 +297,14 @@ private boolean checkCorner(double x, double y, double z, Vector3d min, Vector3d // Utils public boolean shouldSkip(Entity entity) { - if (!entities.get().getBoolean(entity.getType())) return true; + if (!entities.get().contains(entity.getType())) return true; if (entity == mc.player && ignoreSelf.get()) return true; if (entity == mc.cameraEntity && mc.options.getPerspective().isFirstPerson()) return true; return !EntityUtils.isInRenderDistance(entity); } public Color getColor(Entity entity) { - if (!entities.get().getBoolean(entity.getType())) return null; + if (!entities.get().contains(entity.getType())) return null; double alpha = getFadeAlpha(entity); if (alpha == 0) return null; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java index 8fbe41bf73..1ecb5b718b 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java @@ -5,7 +5,6 @@ package meteordevelopment.meteorclient.systems.modules.render; -import it.unimi.dsi.fastutil.objects.Object2BooleanMap; import meteordevelopment.meteorclient.events.render.Render2DEvent; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.renderer.Renderer2D; @@ -47,7 +46,7 @@ public class Nametags extends Module { // General - private final Setting>> entities = sgGeneral.add(new EntityTypeListSetting.Builder() + private final Setting>> entities = sgGeneral.add(new EntityTypeListSetting.Builder() .name("entities") .description("Select entities to draw nametags on.") .defaultValue(EntityType.PLAYER, EntityType.ITEM) @@ -302,7 +301,7 @@ private void onTick(TickEvent.Post event) { for (Entity entity : mc.world.getEntities()) { EntityType type = entity.getType(); - if (!entities.get().containsKey(type)) continue; + if (!entities.get().contains(type)) continue; if (type == EntityType.PLAYER) { if ((ignoreSelf.get() || (freecamNotActive && notThirdPerson)) && entity == mc.player) continue; @@ -664,6 +663,6 @@ public boolean excludeBots() { } public boolean playerNametags() { - return isActive() && entities.get().containsKey(EntityType.PLAYER); + return isActive() && entities.get().contains(EntityType.PLAYER); } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/NoRender.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/NoRender.java index b1eb8a8826..4cfb6379f7 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/NoRender.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/NoRender.java @@ -5,7 +5,6 @@ package meteordevelopment.meteorclient.systems.modules.render; -import it.unimi.dsi.fastutil.objects.Object2BooleanMap; import meteordevelopment.meteorclient.events.world.ChunkOcclusionEvent; import meteordevelopment.meteorclient.events.world.ParticleEvent; import meteordevelopment.meteorclient.settings.*; @@ -18,6 +17,7 @@ import net.minecraft.particle.ParticleTypes; import java.util.List; +import java.util.Set; public class NoRender extends Module { private final SettingGroup sgOverlay = settings.createGroup("Overlay"); @@ -292,7 +292,7 @@ public class NoRender extends Module { // Entity - private final Setting>> entities = sgEntity.add(new EntityTypeListSetting.Builder() + private final Setting>> entities = sgEntity.add(new EntityTypeListSetting.Builder() .name("entities") .description("Disables rendering of selected entities.") .build() @@ -523,11 +523,11 @@ public boolean noBarrierInvis() { // Entity public boolean noEntity(Entity entity) { - return isActive() && entities.get().getBoolean(entity.getType()); + return isActive() && entities.get().contains(entity.getType()); } public boolean noEntity(EntityType entity) { - return isActive() && entities.get().getBoolean(entity); + return isActive() && entities.get().contains(entity); } public boolean getDropSpawnPacket() { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Tracers.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Tracers.java index d0a612a7dc..b98cfccc7b 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Tracers.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Tracers.java @@ -5,21 +5,15 @@ package meteordevelopment.meteorclient.systems.modules.render; -import com.mojang.blaze3d.systems.RenderSystem; -import it.unimi.dsi.fastutil.objects.Object2BooleanMap; -import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.render.Render2DEvent; import meteordevelopment.meteorclient.events.render.Render3DEvent; -import meteordevelopment.meteorclient.gui.renderer.GuiRenderer; import meteordevelopment.meteorclient.renderer.Renderer2D; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.config.Config; import meteordevelopment.meteorclient.systems.friends.Friends; -import meteordevelopment.meteorclient.systems.hud.HudRenderer; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.entity.EntityUtils; import meteordevelopment.meteorclient.utils.entity.Target; import meteordevelopment.meteorclient.utils.player.PlayerUtils; @@ -28,18 +22,16 @@ import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.render.color.SettingColor; import meteordevelopment.orbit.EventHandler; -import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.math.Vec2f; -import net.minecraft.util.math.Vec3d; import org.joml.Vector2f; import org.joml.Vector3d; import java.time.Duration; import java.time.Instant; -import java.util.Timer; +import java.util.Set; public class Tracers extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); @@ -53,7 +45,7 @@ public enum TracerStyle { // General - private final Setting>> entities = sgGeneral.add(new EntityTypeListSetting.Builder() + private final Setting>> entities = sgGeneral.add(new EntityTypeListSetting.Builder() .name("entities") .description("Select specific entities.") .defaultValue(EntityType.PLAYER) @@ -219,7 +211,7 @@ public Tracers() { } private boolean shouldBeIgnored(Entity entity) { - return !PlayerUtils.isWithin(entity, maxDist.get()) || (!Modules.get().isActive(Freecam.class) && entity == mc.player) || !entities.get().getBoolean(entity.getType()) || (ignoreFriends.get() && entity instanceof PlayerEntity && Friends.get().isFriend((PlayerEntity) entity)) || (!showInvis.get() && entity.isInvisible()) | !EntityUtils.isInRenderDistance(entity); + return !PlayerUtils.isWithin(entity, maxDist.get()) || (!Modules.get().isActive(Freecam.class) && entity == mc.player) || !entities.get().contains(entity.getType()) || (ignoreFriends.get() && entity instanceof PlayerEntity && Friends.get().isFriend((PlayerEntity) entity)) || (!showInvis.get() && entity.isInvisible()) | !EntityUtils.isInRenderDistance(entity); } private Color getEntityColor(Entity entity) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoBreed.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoBreed.java index 0f404d348e..224a96eaf2 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoBreed.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoBreed.java @@ -5,7 +5,6 @@ package meteordevelopment.meteorclient.systems.modules.world; -import it.unimi.dsi.fastutil.objects.Object2BooleanMap; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Categories; @@ -20,11 +19,12 @@ import java.util.ArrayList; import java.util.List; +import java.util.Set; public class AutoBreed extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final Setting>> entities = sgGeneral.add(new EntityTypeListSetting.Builder() + private final Setting>> entities = sgGeneral.add(new EntityTypeListSetting.Builder() .name("entities") .description("Entities to breed.") .defaultValue(EntityType.HORSE, EntityType.DONKEY, EntityType.COW, @@ -76,7 +76,7 @@ private void onTick(TickEvent.Pre event) { if (!(entity instanceof AnimalEntity)) continue; else animal = (AnimalEntity) entity; - if (!entities.get().getBoolean(animal.getType()) + if (!entities.get().contains(animal.getType()) || (animal.isBaby() && !ignoreBabies.get()) || animalsFed.contains(animal) || !PlayerUtils.isWithin(animal, range.get()) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoNametag.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoNametag.java index 6834ff5a46..d9e92c68ef 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoNametag.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoNametag.java @@ -5,7 +5,6 @@ package meteordevelopment.meteorclient.systems.modules.world; -import it.unimi.dsi.fastutil.objects.Object2BooleanMap; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Categories; @@ -22,10 +21,12 @@ import net.minecraft.item.Items; import net.minecraft.util.Hand; +import java.util.Set; + public class AutoNametag extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final Setting>> entities = sgGeneral.add(new EntityTypeListSetting.Builder() + private final Setting>> entities = sgGeneral.add(new EntityTypeListSetting.Builder() .name("entities") .description("Which entities to nametag.") .build() @@ -83,7 +84,7 @@ private void onTick(TickEvent.Pre event) { // Target target = TargetUtils.get(entity -> { if (!PlayerUtils.isWithin(entity, range.get())) return false; - if (!entities.get().getBoolean(entity.getType())) return false; + if (!entities.get().contains(entity.getType())) return false; if (entity.hasCustomName()) { return renametag.get() && entity.getCustomName() != mc.player.getInventory().getStack(findNametag.slot()).getName(); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Flamethrower.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Flamethrower.java index df89908553..3d6585f945 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Flamethrower.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Flamethrower.java @@ -5,7 +5,6 @@ package meteordevelopment.meteorclient.systems.modules.world; -import it.unimi.dsi.fastutil.objects.Object2BooleanMap; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Categories; @@ -26,6 +25,8 @@ import net.minecraft.util.math.Direction; import net.minecraft.util.math.Vec3d; +import java.util.Set; + public class Flamethrower extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); @@ -71,7 +72,7 @@ public class Flamethrower extends Module { .build() ); - private final Setting>> entities = sgGeneral.add(new EntityTypeListSetting.Builder() + private final Setting>> entities = sgGeneral.add(new EntityTypeListSetting.Builder() .name("entities") .description("Entities to cook.") .defaultValue( @@ -102,7 +103,7 @@ private void onTick(TickEvent.Pre event) { entity = null; ticks++; for (Entity entity : mc.world.getEntities()) { - if (!entities.get().getBoolean(entity.getType()) || !PlayerUtils.isWithin(entity, distance.get())) continue; + if (!entities.get().contains(entity.getType()) || !PlayerUtils.isWithin(entity, distance.get())) continue; if (entity.isFireImmune()) continue; if (entity == mc.player) continue; if (!targetBabies.get() && entity instanceof LivingEntity && ((LivingEntity)entity).isBaby()) continue; diff --git a/src/main/java/meteordevelopment/meteorclient/utils/Utils.java b/src/main/java/meteordevelopment/meteorclient/utils/Utils.java index 8c33c08a80..8ed7addd20 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/Utils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/Utils.java @@ -6,7 +6,6 @@ package meteordevelopment.meteorclient.utils; import com.mojang.blaze3d.systems.RenderSystem; -import it.unimi.dsi.fastutil.objects.Object2BooleanOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2IntArrayMap; import it.unimi.dsi.fastutil.objects.Object2IntMap; import meteordevelopment.meteorclient.MeteorClient; @@ -100,7 +99,7 @@ public static Vec3d getPlayerSpeed() { tY *= timer.getMultiplier(); tZ *= timer.getMultiplier(); } - + tX *= 20; tY *= 20; tZ *= 20; @@ -554,14 +553,6 @@ public static void removeEnchantment(ItemStack itemStack, Enchantment enchantmen } } - @SafeVarargs - public static Object2BooleanOpenHashMap asO2BMap(T... checked) { - Map map = new HashMap<>(); - for (T item : checked) - map.put(item, true); - return new Object2BooleanOpenHashMap<>(map); - } - public static Color lerp(Color first, Color second, @Range(from = 0, to = 1) float v) { return new Color( (int) (first.r * (1 - v) + second.r * v), diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/ChamsShader.java b/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/ChamsShader.java index 4ffc498e99..1cd3ed1a26 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/ChamsShader.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/ChamsShader.java @@ -97,6 +97,6 @@ protected boolean shouldDraw() { @Override public boolean shouldDraw(Entity entity) { if (!shouldDraw()) return false; - return chams.entities.get().getBoolean(entity.getType()) && (entity != mc.player || !chams.ignoreSelfDepth.get()); + return chams.entities.get().contains(entity.getType()) && (entity != mc.player || !chams.ignoreSelfDepth.get()); } } From 3c5c4ff1cc34ac3f9815b2c9121569245203cd12 Mon Sep 17 00:00:00 2001 From: hellidox <97000871+hellidox@users.noreply.github.com> Date: Tue, 30 May 2023 16:08:03 -0500 Subject: [PATCH 004/357] Slight fix for AntiHunger (#3693) --- .../meteorclient/systems/modules/player/AntiHunger.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AntiHunger.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AntiHunger.java index 7da8ac1bb0..3365d6203f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AntiHunger.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AntiHunger.java @@ -62,7 +62,7 @@ private void onSendPacket(PacketEvent.Send event) { if (event.packet instanceof ClientCommandC2SPacket && sprint.get()) { ClientCommandC2SPacket.Mode mode = ((ClientCommandC2SPacket) event.packet).getMode(); - if (mode == ClientCommandC2SPacket.Mode.START_SPRINTING || mode == ClientCommandC2SPacket.Mode.STOP_SPRINTING) { + if (mode == ClientCommandC2SPacket.Mode.START_SPRINTING) { event.cancel(); } } From 53fae9a05a294123d573e0eb3c5bd252e3968710 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Wed, 31 May 2023 06:03:45 -0400 Subject: [PATCH 005/357] Catch addon initialisation exceptions and log which addon caused it (#3678) --- .../meteorclient/addons/AddonManager.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/addons/AddonManager.java b/src/main/java/meteordevelopment/meteorclient/addons/AddonManager.java index 1e6e4cd25d..212299f186 100644 --- a/src/main/java/meteordevelopment/meteorclient/addons/AddonManager.java +++ b/src/main/java/meteordevelopment/meteorclient/addons/AddonManager.java @@ -63,11 +63,16 @@ public String getCommit() { // Addons for (EntrypointContainer entrypoint : FabricLoader.getInstance().getEntrypointContainers("meteor", MeteorAddon.class)) { ModMetadata metadata = entrypoint.getProvider().getMetadata(); - MeteorAddon addon = entrypoint.getEntrypoint(); + MeteorAddon addon; + try { + addon = entrypoint.getEntrypoint(); + } catch (Exception exception) { + throw new RuntimeException("Exception during addon init \"%s\".".formatted(metadata.getName()), exception); + } addon.name = metadata.getName(); - if (metadata.getAuthors().isEmpty()) throw new RuntimeException("Addon %s requires at least 1 author to be defined in it's fabric.mod.json. See https://fabricmc.net/wiki/documentation:fabric_mod_json_spec".formatted(addon.name)); + if (metadata.getAuthors().isEmpty()) throw new RuntimeException("Addon \"%s\" requires at least 1 author to be defined in it's fabric.mod.json. See https://fabricmc.net/wiki/documentation:fabric_mod_json_spec".formatted(addon.name)); addon.authors = new String[metadata.getAuthors().size()]; if (metadata.containsCustomValue(MeteorClient.MOD_ID + ":color")) { From d62c3359c286c98810e57aaeef32ec60c178309c Mon Sep 17 00:00:00 2001 From: Wide-Cat <74723656+Wide-Cat@users.noreply.github.com> Date: Sun, 28 May 2023 17:56:35 +0100 Subject: [PATCH 006/357] Fix infinity miner not correctly calculating if full --- .../meteorclient/systems/modules/world/InfinityMiner.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/InfinityMiner.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/InfinityMiner.java index f89c25f20d..4a133445ec 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/InfinityMiner.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/InfinityMiner.java @@ -232,10 +232,10 @@ private boolean filterBlocks(Block block) { private boolean isFull() { for (int i = 0; i <= 35; i++) { ItemStack itemStack = mc.player.getInventory().getStack(i); - + if (itemStack.isEmpty()) return false; + for (Item item : targetItems.get()) { - if ((itemStack.getItem() == item && itemStack.getCount() < itemStack.getMaxCount()) - || itemStack.isEmpty()) { + if (itemStack.getItem() == item && itemStack.getCount() < itemStack.getMaxCount()) { return false; } } From c507dcb439df63c37d1b961a26ed90e1d1f22936 Mon Sep 17 00:00:00 2001 From: arlomcwalter Date: Thu, 1 Jun 2023 16:32:17 +0100 Subject: [PATCH 007/357] update readme [skip ci] --- README.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 92292a6032..185c474fa0 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ meteor-client-logo

-

Meteor Client

+

Meteor

A Minecraft Fabric Utility Mod for anarchy servers.

@@ -40,11 +40,9 @@ Bug reports and suggestions should be made in this repo's [issue tracker](https: Please provide as much information as you can to best help us understand your issue and give a better chance of it being resolved. ## Donations -All of our work is completely free and non-profit, therefore we are very grateful for all donations made to help support us in running our community. -All of the money made through donations is used to pay for our servers, none of it is taken for profit. - +All of our work is completely free and non-profit (donations pay only for hosting costs), therefore we are very grateful for all donations made to support us in running our community. Donations can be made via our [website](https://meteorclient.com/donate) and the minimum amount to get donor benefits is €5. -You will be rewarded with a role on our Discord server, an in-game cape, and an extra kit as well as donor status on our [PvP server](https://namemc.com/server/pvp.meteorclient.com). +You will be rewarded with a role on our Discord server and a customisable in-game cape. ⚠️ _Make sure to create a Meteor account and link your Discord and Minecraft accounts to fully experience your rewards._ ⚠️ ## Credits From 29ece160b504946c9ef2efe67f8a692e020cd787 Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Fri, 9 Jun 2023 20:41:22 +0200 Subject: [PATCH 008/357] Future version 0.5.4 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 0afccc6d6a..12e6b01e39 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,7 +7,7 @@ loader_version=0.14.17 fapi_version=0.75.3+1.19.4 # Mod Properties -mod_version=0.5.3 +mod_version=0.5.4 maven_group=meteordevelopment archives_base_name=meteor-client From 7f777109ee6cc88d15a369cbe211fe5fa77bbe0c Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Sat, 10 Jun 2023 12:52:27 -0400 Subject: [PATCH 009/357] Update AddonManager.java --- .../meteordevelopment/meteorclient/addons/AddonManager.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/addons/AddonManager.java b/src/main/java/meteordevelopment/meteorclient/addons/AddonManager.java index 212299f186..1678f86d59 100644 --- a/src/main/java/meteordevelopment/meteorclient/addons/AddonManager.java +++ b/src/main/java/meteordevelopment/meteorclient/addons/AddonManager.java @@ -66,8 +66,8 @@ public String getCommit() { MeteorAddon addon; try { addon = entrypoint.getEntrypoint(); - } catch (Exception exception) { - throw new RuntimeException("Exception during addon init \"%s\".".formatted(metadata.getName()), exception); + } catch (Throwable throwable) { + throw new RuntimeException("Exception during addon init \"%s\".".formatted(metadata.getName()), throwable); } addon.name = metadata.getName(); From 6543c789c27696f5a1c2adedcfcf47d62826ea84 Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Sat, 10 Jun 2023 20:11:08 +0200 Subject: [PATCH 010/357] Brue --- .github/devbuilds/get_number.js | 8 ++- .github/devbuilds/index.js | 88 ++++++++++++++++++--------------- .github/devbuilds/package.json | 5 +- 3 files changed, 52 insertions(+), 49 deletions(-) diff --git a/.github/devbuilds/get_number.js b/.github/devbuilds/get_number.js index b0ffff7a26..3ad37ec7d1 100644 --- a/.github/devbuilds/get_number.js +++ b/.github/devbuilds/get_number.js @@ -1,5 +1,3 @@ -const axios = require("axios").default; - -axios.get("https://meteorclient.com/api/stats").then(res => { - console.log("number=" + (parseInt(res.data.devBuild) + 1)); -}); +fetch("https://meteorclient.com/api/stats") + .then(res => res.json()) + .then(res => console.log("number=" + (parseInt(res.devBuild) + 1))) diff --git a/.github/devbuilds/index.js b/.github/devbuilds/index.js index bd88196b2f..f12c67fe64 100644 --- a/.github/devbuilds/index.js +++ b/.github/devbuilds/index.js @@ -1,5 +1,3 @@ -const axios = require("axios").default; -const FormData = require("form-data"); const fs = require("fs"); const branch = process.argv[2]; @@ -7,41 +5,49 @@ const compareUrl = process.argv[3]; const success = process.argv[4] === "true"; function send(version, number) { - axios.get(compareUrl).then(res => { - let description = ""; + fetch(compareUrl) + .then(res => res.json()) + .then(res => { + let description = ""; - description += "**Branch:** " + branch; - description += "\n**Status:** " + (success ? "success" : "failure"); + description += "**Branch:** " + branch; + description += "\n**Status:** " + (success ? "success" : "failure"); - let changes = "\n\n**Changes:**"; - let hasChanges = false; - for (let i in res.data.commits) { - let commit = res.data.commits[i]; + let changes = "\n\n**Changes:**"; + let hasChanges = false; + for (let i in res.commits) { + let commit = res.commits[i]; - changes += "\n- [`" + commit.sha.substring(0, 7) + "`](https://github.com/MeteorDevelopment/meteor-client/commit/" + commit.sha + ") *" + commit.commit.message + "*"; - hasChanges = true; - } - if (hasChanges) description += changes; + changes += "\n- [`" + commit.sha.substring(0, 7) + "`](https://github.com/MeteorDevelopment/meteor-client/commit/" + commit.sha + ") *" + commit.commit.message + "*"; + hasChanges = true; + } + if (hasChanges) description += changes; - if (success) { - description += "\n\n**Download:** [meteor-client-" + version + "-" + number + "](https://meteorclient.com/download?devBuild=" + number + ")"; - } + if (success) { + description += "\n\n**Download:** [meteor-client-" + version + "-" + number + "](https://meteorclient.com/download?devBuild=" + number + ")"; + } - const webhook = { - username: "Dev Builds", - avatar_url: "https://meteorclient.com/icon.png", - embeds: [ - { - title: "meteor client v" + version + " build #" + number, - description: description, - url: "https://meteorclient.com", - color: success ? 2672680 : 13117480 - } - ] - }; + const webhook = { + username: "Dev Builds", + avatar_url: "https://meteorclient.com/icon.png", + embeds: [ + { + title: "meteor client v" + version + " build #" + number, + description: description, + url: "https://meteorclient.com", + color: success ? 2672680 : 13117480 + } + ] + }; - axios.post(process.env.DISCORD_WEBHOOK, webhook); - }); + fetch(process.env.DISCORD_WEBHOOK, { + method: "POST", + headers: { + "Content-Type": "application/json" + }, + body: JSON.stringify(webhook) + }); + }); } if (success) { @@ -51,19 +57,21 @@ if (success) { }); let form = new FormData(); + form.set("file", new Blob([fs.readFileSync(jar)])) form.append("file", fs.createReadStream(jar)); - axios.post("https://meteorclient.com/api/uploadDevBuild", form, { + fetch("https://meteorclient.com/api/uploadDevBuild", { + method: "POST", headers: { - ...form.getHeaders(), "Authorization": process.env.SERVER_TOKEN - } - }).then(res => { - send(res.data.version, res.data.number) - }); + }, + body: form + }) + .then(res => res.json()) + .then(res => send(res.version, res.number)); } else { - axios.get("https://meteorclient.com/api/stats").then(res => { - send(res.data.dev_build_version, parseInt(res.data.devBuild) + 1) - }); + fetch("https://meteorclient.com/api/stats") + .then(res => res.json()) + .then(res => send(res.dev_build_version, parseInt(res.devBuild) + 1)); } diff --git a/.github/devbuilds/package.json b/.github/devbuilds/package.json index 79eb975b2b..51e3f35de9 100644 --- a/.github/devbuilds/package.json +++ b/.github/devbuilds/package.json @@ -9,8 +9,5 @@ "get_number": "node get_number.js", "start": "node index.js" }, - "dependencies": { - "axios": "^0.27.2", - "form-data": "^4.0.0" - } + "dependencies": {} } From f1d409b200e96394247872e4f61459baa7ab7a00 Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Sat, 10 Jun 2023 20:17:55 +0200 Subject: [PATCH 011/357] PLease --- .github/devbuilds/index.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/devbuilds/index.js b/.github/devbuilds/index.js index f12c67fe64..0e20693b9a 100644 --- a/.github/devbuilds/index.js +++ b/.github/devbuilds/index.js @@ -57,8 +57,7 @@ if (success) { }); let form = new FormData(); - form.set("file", new Blob([fs.readFileSync(jar)])) - form.append("file", fs.createReadStream(jar)); + form.set("file", new Blob([fs.readFileSync(jar)])); fetch("https://meteorclient.com/api/uploadDevBuild", { method: "POST", From 1e961ae090452929455ef35fe422676db3fac307 Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Sat, 10 Jun 2023 20:25:40 +0200 Subject: [PATCH 012/357] Surely its going to work now --- .github/devbuilds/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/devbuilds/index.js b/.github/devbuilds/index.js index 0e20693b9a..24091cfa15 100644 --- a/.github/devbuilds/index.js +++ b/.github/devbuilds/index.js @@ -57,7 +57,7 @@ if (success) { }); let form = new FormData(); - form.set("file", new Blob([fs.readFileSync(jar)])); + form.append("file", fs.createReadStream(jar)); fetch("https://meteorclient.com/api/uploadDevBuild", { method: "POST", From 7bfafe85fb9657372f0e6789fcc81a92943d6537 Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Sat, 10 Jun 2023 20:33:36 +0200 Subject: [PATCH 013/357] A --- .github/devbuilds/index.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/.github/devbuilds/index.js b/.github/devbuilds/index.js index 24091cfa15..e23b6ad27e 100644 --- a/.github/devbuilds/index.js +++ b/.github/devbuilds/index.js @@ -66,8 +66,16 @@ if (success) { }, body: form }) - .then(res => res.json()) - .then(res => send(res.version, res.number)); + .then(async res => { + let data = await res.json(); + + if (res.ok) { + send(data.version, data.number); + } + else { + console.log("Failed to upload dev build: " + data.error); + } + }); } else { fetch("https://meteorclient.com/api/stats") From 4e2a157831f8636718a4a2f80cbfcf2a6dfbb121 Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Sat, 10 Jun 2023 20:47:52 +0200 Subject: [PATCH 014/357] Its going to work now, just watch --- .github/devbuilds/index.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/devbuilds/index.js b/.github/devbuilds/index.js index e23b6ad27e..81c33579cd 100644 --- a/.github/devbuilds/index.js +++ b/.github/devbuilds/index.js @@ -1,4 +1,5 @@ const fs = require("fs"); +const path = require("path"); const branch = process.argv[2]; const compareUrl = process.argv[3]; @@ -57,7 +58,11 @@ if (success) { }); let form = new FormData(); - form.append("file", fs.createReadStream(jar)); + form.set( + "file", + new Blob([readFileSync(jar)], { type: "application/java-archive" }), + path.basename(jar) + ); fetch("https://meteorclient.com/api/uploadDevBuild", { method: "POST", From d29a4b0b4915ec3a3de1eb793ad20496329c3807 Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Sat, 10 Jun 2023 20:52:58 +0200 Subject: [PATCH 015/357] I love dynamically typed languages --- .github/devbuilds/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/devbuilds/index.js b/.github/devbuilds/index.js index 81c33579cd..5f5c85612d 100644 --- a/.github/devbuilds/index.js +++ b/.github/devbuilds/index.js @@ -60,7 +60,7 @@ if (success) { let form = new FormData(); form.set( "file", - new Blob([readFileSync(jar)], { type: "application/java-archive" }), + new Blob([fs.readFileSync(jar)], { type: "application/java-archive" }), path.basename(jar) ); From 531155c2f042ff25363785c48a1425031573af8a Mon Sep 17 00:00:00 2001 From: Big Iron <52252627+Big-Iron-Cheems@users.noreply.github.com> Date: Sat, 10 Jun 2023 23:04:22 +0200 Subject: [PATCH 016/357] Update to 1.20 (#3708) --- build.gradle | 34 ++--- gradle.properties | 14 +- gradle/wrapper/gradle-wrapper.jar | Bin 60756 -> 62076 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 19 ++- gradlew.bat | 1 + .../events/render/Render2DEvent.java | 5 +- .../meteorclient/gui/WidgetScreen.java | 22 +-- .../gui/renderer/GuiRenderer.java | 34 +++-- .../meteorclient/gui/tabs/builtin/HudTab.java | 5 +- .../meteorclient/gui/widgets/WItem.java | 15 +- .../gui/widgets/WItemWithLabel.java | 2 +- .../meteorclient/mixin/BeaconScreenMixin.java | 7 +- .../mixin/BlockCollisionSpliteratorMixin.java | 2 +- .../meteorclient/mixin/ChatHudMixin.java | 39 +++-- .../mixin/ChunkSkyLightProviderMixin.java | 11 +- .../mixin/ClientPlayerEntityMixin.java | 2 +- .../mixin/DisconnectedScreenMixin.java | 41 +++--- .../meteorclient/mixin/DrawContextMixin.java | 38 +++++ .../mixin/HandledScreenMixin.java | 6 +- .../meteorclient/mixin/InGameHudMixin.java | 34 ++--- .../meteorclient/mixin/ItemStackAccessor.java | 3 - .../meteorclient/mixin/LivingEntityMixin.java | 2 +- .../mixin/MinecraftClientAccessor.java | 5 - .../mixin/MultiplayerScreenMixin.java | 30 ++-- .../meteorclient/mixin/PlayerEntityMixin.java | 12 +- .../mixin/PlayerListHudMixin.java | 9 +- .../meteorclient/mixin/ScreenMixin.java | 16 +-- .../SplashTextResourceSupplierMixin.java | 5 +- .../meteorclient/mixin/TitleScreenMixin.java | 10 +- .../systems/accounts/Account.java | 5 +- .../meteorclient/systems/hud/Hud.java | 2 +- .../meteorclient/systems/hud/HudRenderer.java | 19 ++- .../systems/hud/elements/ArmorHud.java | 20 +-- .../systems/hud/elements/CombatHud.java | 7 +- .../systems/hud/elements/HoleHud.java | 3 +- .../systems/hud/elements/InventoryHud.java | 2 +- .../systems/hud/elements/ItemHud.java | 65 ++++----- .../systems/hud/elements/PlayerModelHud.java | 8 +- .../systems/hud/elements/PotionTimersHud.java | 2 +- .../hud/screens/AddHudElementScreen.java | 5 +- .../systems/hud/screens/HudEditorScreen.java | 11 +- .../hud/screens/HudElementPresetsScreen.java | 5 +- .../systems/hud/screens/HudElementScreen.java | 5 +- .../systems/modules/combat/AutoAnvil.java | 2 +- .../systems/modules/combat/BedAura.java | 2 +- .../systems/modules/combat/Burrow.java | 12 +- .../systems/modules/combat/CrystalAura.java | 2 +- .../systems/modules/combat/SelfTrap.java | 16 +-- .../systems/modules/combat/Surround.java | 2 +- .../systems/modules/movement/Flight.java | 2 +- .../systems/modules/movement/Jesus.java | 14 +- .../systems/modules/player/AutoReplenish.java | 4 +- .../modules/render/BetterTooltips.java | 4 +- .../systems/modules/render/ItemPhysics.java | 8 +- .../systems/modules/render/Nametags.java | 10 +- .../systems/modules/world/AirPlace.java | 2 +- .../systems/modules/world/AutoSign.java | 2 +- .../systems/modules/world/EChestFarmer.java | 7 +- .../meteorclient/utils/Utils.java | 136 +++++++++--------- .../utils/entity/EntityUtils.java | 2 +- .../InstrumentDetectMode.java | 4 +- .../meteorclient/utils/player/SlotUtils.java | 52 +++---- .../utils/player/TitleScreenCredits.java | 9 +- .../utils/render/MeteorToast.java | 14 +- .../utils/render/NametagUtils.java | 14 ++ .../meteorclient/utils/render/PeekScreen.java | 15 +- .../utils/render/RenderUtils.java | 24 ++-- .../utils/tooltip/BannerTooltipComponent.java | 15 +- .../utils/tooltip/BookTooltipComponent.java | 11 +- .../tooltip/ContainerTooltipComponent.java | 11 +- .../utils/tooltip/EntityTooltipComponent.java | 17 +-- .../utils/tooltip/MapTooltipComponent.java | 13 +- .../meteorclient/utils/world/BlockUtils.java | 2 +- src/main/resources/fabric.mod.json | 4 +- .../resources/meteor-client.accesswidener | 2 +- src/main/resources/meteor-client.mixins.json | 1 + 77 files changed, 520 insertions(+), 499 deletions(-) create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/DrawContextMixin.java diff --git a/build.gradle b/build.gradle index 9cf6f0ed77..69d62e702e 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id "fabric-loom" version "1.1-SNAPSHOT" + id "fabric-loom" version "1.2-SNAPSHOT" id "maven-publish" id "com.github.johnrengelman.shadow" version "7.1.2" } @@ -12,9 +12,9 @@ group = project.maven_group repositories { maven { - name = "meteor-maven" - url = "https://maven.meteordev.org/releases" - } + name = "meteor-maven" + url = "https://maven.meteordev.org/releases" + } maven { name = "meteor-maven-snapshots" url = "https://maven.meteordev.org/snapshots" @@ -45,20 +45,20 @@ configurations { } dependencies { - // Fabric + // Fabric minecraft "com.mojang:minecraft:${project.minecraft_version}" mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" modInclude fabricApi.module("fabric-resource-loader-v0", project.fapi_version) - // Compat fixes + // Compat fixes modCompileOnly fabricApi.module("fabric-renderer-indigo", project.fapi_version) modCompileOnly("maven.modrinth:sodium:${project.sodium_version}") { transitive = false } modCompileOnly("maven.modrinth:lithium:${project.lithium_version}") { transitive = false } modCompileOnly("maven.modrinth:iris:${project.iris_version}") { transitive = false } //modCompileOnly("io.vram:canvas-fabric-mc119:1.0.+") { transitive = false } // TODO: 1.19.3 - // Baritone (https://github.com/MeteorDevelopment/baritone) + // Baritone (https://github.com/MeteorDevelopment/baritone) modInclude "baritone:fabric:${project.minecraft_version}-SNAPSHOT" // Libraries @@ -86,7 +86,7 @@ afterEvaluate { } shadowJar { - configurations = [ project.configurations.shadow ] + configurations = [project.configurations.shadow] dependencies { exclude { @@ -98,22 +98,22 @@ shadowJar { processResources { filesMatching("fabric.mod.json") { expand "version": project.version, - "devbuild": project.findProperty("devbuild") ?: "", - "commit": project.findProperty("commit") ?: "" + "devbuild": project.findProperty("devbuild") ?: "", + "commit": project.findProperty("commit") ?: "" } } jar { - from "LICENSE" + from "LICENSE" - manifest { - attributes("Main-Class": "meteordevelopment.meteorclient.Main") - } + manifest { + attributes("Main-Class": "meteordevelopment.meteorclient.Main") + } } remapJar { - dependsOn shadowJar - inputFile.set(shadowJar.archiveFile) + dependsOn shadowJar + inputFile.set(shadowJar.archiveFile) } javadoc { @@ -123,7 +123,7 @@ javadoc { task sourcesJar(type: Jar, dependsOn: classes) { archiveClassifier.set("sources") - from sourceSets.main.allSource + from sourceSets.main.allSource } task javadocJar(type: Jar) { diff --git a/gradle.properties b/gradle.properties index 12e6b01e39..ab95ae2bbc 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,10 +1,10 @@ org.gradle.jvmargs=-Xmx2G # Fabric (https://fabricmc.net/develop) -minecraft_version=1.19.4 -yarn_mappings=1.19.4+build.1 -loader_version=0.14.17 -fapi_version=0.75.3+1.19.4 +minecraft_version=1.20 +yarn_mappings=1.20+build.1 +loader_version=0.14.21 +fapi_version=0.83.0+1.20 # Mod Properties mod_version=0.5.4 @@ -14,13 +14,13 @@ archives_base_name=meteor-client # Dependency Versions # Sodium (https://github.com/CaffeineMC/sodium-fabric) -sodium_version=mc1.19.4-0.4.10 +sodium_version=mc1.20-0.4.10 # Lithium (https://github.com/CaffeineMC/lithium-fabric) -lithium_version=mc1.19.4-0.11.1 +lithium_version=mc1.20-0.11.2 # Iris (https://github.com/IrisShaders/Iris) -iris_version=1.6.1+1.19.4 +iris_version=1.6.4+1.20 # Orbit (https://github.com/MeteorDevelopment/orbit) orbit_version=0.2.3 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 249e5832f090a2944b7473328c07c9755baa3196..c1962a79e29d3e0ab67b14947c167a862655af9b 100644 GIT binary patch delta 39834 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 G$^QWPgI3l6 delta 38507 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 { - if (widget instanceof WTextBox textBox) { - - if (textBox.isFocused()) textBox.setFocused(false); - } + if (widget instanceof WTextBox textBox && textBox.isFocused()) textBox.setFocused(false); }); MeteorClient.EVENT_BUS.unsubscribe(this); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/renderer/GuiRenderer.java b/src/main/java/meteordevelopment/meteorclient/gui/renderer/GuiRenderer.java index 4c4f494e59..8d82ad2bc2 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/renderer/GuiRenderer.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/renderer/GuiRenderer.java @@ -18,8 +18,10 @@ import meteordevelopment.meteorclient.utils.misc.MeteorIdentifier; import meteordevelopment.meteorclient.utils.misc.Pool; import meteordevelopment.meteorclient.utils.render.ByteTexture; +import meteordevelopment.meteorclient.utils.render.RenderUtils; import meteordevelopment.meteorclient.utils.render.color.Color; -import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.item.ItemStack; import net.minecraft.util.Identifier; import java.util.ArrayList; @@ -58,7 +60,7 @@ public class GuiRenderer { public WWidget tooltipWidget; private double tooltipAnimProgress; - private MatrixStack matrices; + private DrawContext drawContext; public static GuiTexture addTexture(Identifier id) { return TEXTURE_PACKER.add(id); @@ -76,17 +78,15 @@ public static void init() { TEXTURE = TEXTURE_PACKER.pack(); } - public void begin(MatrixStack matrices) { - this.matrices = matrices; + public void begin(DrawContext drawContext) { + this.drawContext = drawContext; GL.enableBlend(); GL.enableScissorTest(); scissorStart(0, 0, getWindowWidth(), getWindowHeight()); } - public void end(MatrixStack matrices) { - this.matrices = matrices; - + public void end() { scissorEnd(); for (Runnable task : postTasks) task.run(); @@ -104,24 +104,24 @@ public void endRender() { r.end(); rTex.end(); - r.render(matrices); + r.render(drawContext.getMatrices()); GL.bindTexture(TEXTURE.getGlId()); - rTex.render(matrices); + rTex.render(drawContext.getMatrices()); // Normal text theme.textRenderer().begin(theme.scale(1)); for (TextOperation text : texts) { if (!text.title) text.run(textPool); } - theme.textRenderer().end(matrices); + theme.textRenderer().end(drawContext.getMatrices()); // Title text theme.textRenderer().begin(theme.scale(1.25)); for (TextOperation text : texts) { if (text.title) text.run(textPool); } - theme.textRenderer().end(matrices); + theme.textRenderer().end(drawContext.getMatrices()); texts.clear(); } @@ -155,7 +155,7 @@ public void scissorEnd() { scissorPool.free(scissor); } - public boolean renderTooltip(double mouseX, double mouseY, double delta, MatrixStack matrices) { + public boolean renderTooltip(DrawContext drawContext, double mouseX, double mouseY, double delta) { tooltipAnimProgress += (tooltip != null ? 1 : -1) * delta * 14; tooltipAnimProgress = Utils.clamp(tooltipAnimProgress, 0, 1); @@ -171,9 +171,9 @@ public boolean renderTooltip(double mouseX, double mouseY, double delta, MatrixS setAlpha(tooltipAnimProgress); - begin(matrices); + begin(drawContext); tooltipWidget.render(this, mouseX, mouseY, delta); - end(matrices); + end(); setAlpha(1); @@ -231,7 +231,7 @@ public void texture(double x, double y, double width, double height, double rota rTex.end(); texture.bind(); - rTex.render(matrices); + rTex.render(drawContext.getMatrices()); }); } @@ -239,6 +239,10 @@ public void post(Runnable task) { scissorStack.peek().postTasks.add(task); } + public void item(ItemStack itemStack, int x, int y, float scale, boolean overlay) { + RenderUtils.drawItem(drawContext, itemStack, x, y, scale, overlay); + } + public void absolutePost(Runnable task) { postTasks.add(task); } 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 a81bf25855..ed8b4ef123 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/HudTab.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/HudTab.java @@ -16,6 +16,7 @@ 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.nbt.NbtCompound; @@ -72,8 +73,8 @@ public void initWidgets() { } @Override - protected void onRenderBefore(float delta) { - HudEditorScreen.renderElements(); + protected void onRenderBefore(DrawContext drawContext, float delta) { + HudEditorScreen.renderElements(drawContext); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItem.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItem.java index 4a8f4071d7..059d1b90d9 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItem.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItem.java @@ -6,14 +6,9 @@ package meteordevelopment.meteorclient.gui.widgets; import meteordevelopment.meteorclient.gui.renderer.GuiRenderer; -import net.minecraft.client.util.math.MatrixStack; import net.minecraft.item.ItemStack; -import static meteordevelopment.meteorclient.MeteorClient.mc; - public class WItem extends WWidget { - private static final MatrixStack MATRICES = new MatrixStack(); - protected ItemStack itemStack; public WItem(ItemStack itemStack) { @@ -33,15 +28,7 @@ protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, doub if (!itemStack.isEmpty()) { renderer.post(() -> { double s = theme.scale(2); - - MATRICES.push(); - MATRICES.scale((float) s, (float) s, 1); - MATRICES.translate(x / s, y / s, 0); - - mc.getItemRenderer().renderGuiItemIcon(MATRICES, itemStack, 0, 0); - mc.getItemRenderer().renderGuiItemOverlay(MATRICES, mc.textRenderer, itemStack, 0, 0); - - MATRICES.pop(); + renderer.item(itemStack, (int) x, (int) y, (float) s, true); }); } } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItemWithLabel.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItemWithLabel.java index caaeeeed51..26d3c4ce85 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItemWithLabel.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItemWithLabel.java @@ -44,7 +44,7 @@ private String getStringToAppend() { StatusEffectInstance effect = effects.get(0); if (effect.getAmplifier() > 0) str += effect.getAmplifier() + 1 + " "; - str += "(" + StatusEffectUtil.durationToString(effect, 1).getString() + ")"; + str += "(" + StatusEffectUtil.getDurationText(effect, 1).getString() + ")"; } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BeaconScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BeaconScreenMixin.java index 26c340a6f7..0051b9ded8 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BeaconScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BeaconScreenMixin.java @@ -9,11 +9,10 @@ import meteordevelopment.meteorclient.systems.modules.misc.BetterBeacons; import net.minecraft.block.entity.BeaconBlockEntity; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.DrawableHelper; +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.client.util.math.MatrixStack; import net.minecraft.entity.effect.StatusEffect; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.screen.BeaconScreenHandler; @@ -58,9 +57,9 @@ private void changeButtons(CallbackInfo ci) { } @Inject(method = "drawBackground", at = @At("TAIL")) - private void onDrawBackground(MatrixStack matrices, float delta, int mouseX, int mouseY, CallbackInfo ci) { + private void onDrawBackground(DrawContext context, float delta, int mouseX, int mouseY, CallbackInfo ci) { if (!Modules.get().get(BetterBeacons.class).isActive()) return; //this will clear the background from useless pyramid graphics - DrawableHelper.fill(matrices,this.x+10,this.y+7,this.x+220,this.y+98, 0xFF212121); + context.fill(x + 10, y + 7, x + 220, y + 98, 0xFF212121); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BlockCollisionSpliteratorMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BlockCollisionSpliteratorMixin.java index c1c26a9240..026acc0e73 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BlockCollisionSpliteratorMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BlockCollisionSpliteratorMixin.java @@ -20,7 +20,7 @@ @Mixin(BlockCollisionSpliterator.class) public class BlockCollisionSpliteratorMixin { - @Redirect(method = "computeNext()Lnet/minecraft/util/shape/VoxelShape;", at = @At(value = "INVOKE", target = "Lnet/minecraft/block/BlockState;getCollisionShape(Lnet/minecraft/world/BlockView;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/ShapeContext;)Lnet/minecraft/util/shape/VoxelShape;")) + @Redirect(method = "computeNext", at = @At(value = "INVOKE", target = "Lnet/minecraft/block/BlockState;getCollisionShape(Lnet/minecraft/world/BlockView;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/ShapeContext;)Lnet/minecraft/util/shape/VoxelShape;")) private VoxelShape onComputeNextCollisionBox(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { CollisionShapeEvent event = MeteorClient.EVENT_BUS.post(CollisionShapeEvent.get(state, pos, state.getCollisionShape(world, pos, context))); return event.isCancelled() ? VoxelShapes.empty() : event.shape; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java index b9758215b1..d9680f183c 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java @@ -17,7 +17,7 @@ import meteordevelopment.meteorclient.utils.misc.MeteorIdentifier; import meteordevelopment.meteorclient.utils.misc.text.StringCharacterVisitor; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.DrawableHelper; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.hud.ChatHud; import net.minecraft.client.gui.hud.ChatHudLine; import net.minecraft.client.gui.hud.MessageIndicator; @@ -36,7 +36,6 @@ 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.Redirect; import org.spongepowered.asm.mixin.injection.Slice; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @@ -83,8 +82,8 @@ private void onAddMessage(Text message, @Nullable MessageSignatureData signature if (event.isCancelled()) info.cancel(); else { - visibleMessages.removeIf((msg) -> ((IChatHudLine) (Object) msg).getId() == nextId && nextId != 0); - messages.removeIf((msg) -> ((IChatHudLine) (Object) msg).getId() == nextId && nextId != 0); + visibleMessages.removeIf(msg -> ((IChatHudLine) (Object) msg).getId() == nextId && nextId != 0); + messages.removeIf(msg -> ((IChatHudLine) (Object) msg).getId() == nextId && nextId != 0); if (event.isModified()) { info.cancel(); @@ -104,7 +103,7 @@ private int addMessageListSizeProxy(int size) { } @Inject(method = "render", at = @At("TAIL")) - private void onRender(MatrixStack matrices, int currentTick, int mouseX, int mouseY, CallbackInfo info) { + private void onRender(DrawContext context, int currentTick, int mouseX, int mouseY, CallbackInfo ci) { if (!Modules.get().get(BetterChat.class).displayPlayerHeads()) return; if (mc.options.getChatVisibility().getValue() == ChatVisibility.HIDDEN) return; int maxLineCount = mc.inGameHud.getChatHud().getVisibleLineCount(); @@ -113,24 +112,25 @@ private void onRender(MatrixStack matrices, int currentTick, int mouseX, int mou double g = 9.0D * (mc.options.getChatLineSpacing().getValue() + 1.0D); double h = -8.0D * (mc.options.getChatLineSpacing().getValue() + 1.0D) + 4.0D * mc.options.getChatLineSpacing().getValue() + 8.0D; - float chatScale = (float) this.getChatScale(); + float chatScale = (float) getChatScale(); float scaledHeight = mc.getWindow().getScaledHeight(); + MatrixStack matrices = context.getMatrices(); matrices.push(); matrices.scale(chatScale, chatScale, 1.0f); matrices.translate(2.0f, MathHelper.floor((scaledHeight - 40) / chatScale) - g - 0.1f, 10.0f); RenderSystem.enableBlend(); - for(int m = 0; m + this.scrolledLines < this.visibleMessages.size() && m < maxLineCount; ++m) { - ChatHudLine.Visible chatHudLine = this.visibleMessages.get(m + this.scrolledLines); + for (int m = 0; m + scrolledLines < visibleMessages.size() && m < maxLineCount; ++m) { + ChatHudLine.Visible chatHudLine = visibleMessages.get(m + scrolledLines); if (chatHudLine != null) { int x = currentTick - chatHudLine.addedTime(); if (x < 200 || isChatFocused()) { double o = isChatFocused() ? 1.0D : getMessageOpacityMultiplier(x); if (o * d > 0.01D) { - double s = ((double)(-m) * g); + double s = -m * g; StringCharacterVisitor visitor = new StringCharacterVisitor(); chatHudLine.content().accept(visitor); - drawIcon(matrices, visitor.result.toString(), (int)(s + h), (float)(o * d)); + drawIcon(context, matrices, visitor.result.toString(), (int) (s + h), (float) (o * d)); } } } @@ -162,24 +162,22 @@ private static double getMessageOpacityMultiplier(int age) { @Shadow public abstract double getChatScale(); - private void drawIcon(MatrixStack matrices, String line, int y, float opacity) { + private void drawIcon(DrawContext drawContext, MatrixStack matrices, String line, int y, float opacity) { if (METEOR_PREFIX_REGEX.matcher(line).find()) { - RenderSystem.setShaderTexture(0, METEOR_CHAT_ICON); matrices.push(); RenderSystem.setShaderColor(1, 1, 1, opacity); matrices.translate(0, y, 0); matrices.scale(0.125f, 0.125f, 1); - DrawableHelper.drawTexture(matrices, 0, 0, 0f, 0f, 64, 64, 64, 64); + drawContext.drawTexture(METEOR_CHAT_ICON, 0, 0, 0f, 0f, 64, 64, 64, 64); RenderSystem.setShaderColor(1, 1, 1, 1); matrices.pop(); return; } else if (BARITONE_PREFIX_REGEX.matcher(line).find()) { - RenderSystem.setShaderTexture(0, BARITONE_CHAT_ICON); matrices.push(); RenderSystem.setShaderColor(1, 1, 1, opacity); matrices.translate(0, y, 10); matrices.scale(0.125f, 0.125f, 1); - DrawableHelper.drawTexture(matrices, 0, 0, 0f, 0f, 64, 64, 64, 64); + drawContext.drawTexture(BARITONE_CHAT_ICON, 0, 0, 0f, 0f, 64, 64, 64, 64); RenderSystem.setShaderColor(1, 1, 1, 1); matrices.pop(); return; @@ -188,9 +186,8 @@ private void drawIcon(MatrixStack matrices, String line, int y, float opacity) { Identifier skin = getMessageTexture(line); if (skin != null) { RenderSystem.setShaderColor(1, 1, 1, opacity); - RenderSystem.setShaderTexture(0, skin); - DrawableHelper.drawTexture(matrices, 0, y, 8, 8, 8.0F, 8.0F,8, 8, 64, 64); - DrawableHelper.drawTexture(matrices, 0, y, 8, 8, 40.0F, 8.0F,8, 8, 64, 64); + drawContext.drawTexture(skin, 0, y, 8, 8, 8.0F, 8.0F, 8, 8, 64, 64); + drawContext.drawTexture(skin, 0, y, 8, 8, 40.0F, 8.0F, 8, 8, 64, 64); RenderSystem.setShaderColor(1, 1, 1, 1); } } @@ -209,8 +206,8 @@ private static Identifier getMessageTexture(String message) { // No Message Signature Indicator - @Redirect(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/ChatHudLine$Visible;indicator()Lnet/minecraft/client/gui/hud/MessageIndicator;")) - private MessageIndicator onMessageIndicator(ChatHudLine.Visible message) { - return Modules.get().get(NoRender.class).noMessageSignatureIndicator() ? null : message.indicator(); + @ModifyExpressionValue(method = "render", 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) { + return Modules.get().get(NoRender.class).noMessageSignatureIndicator() ? null : indicator; } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChunkSkyLightProviderMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChunkSkyLightProviderMixin.java index 08d27fbe82..fe22f39148 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChunkSkyLightProviderMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChunkSkyLightProviderMixin.java @@ -11,15 +11,12 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(ChunkSkyLightProvider.class) public class ChunkSkyLightProviderMixin { - @Inject(at = @At("HEAD"), method = "recalculateLevel", cancellable = true) - private void recalculateLevel(long long_1, long long_2, int int_1, CallbackInfoReturnable ci) { - if (Modules.get().get(NoRender.class).noSkylightUpdates()) { - ci.setReturnValue(15); - ci.cancel(); - } + @Inject(at = @At("HEAD"), method = "method_51531", cancellable = true) + private void recalculateLevel(long blockPos, long l, int lightLevel, CallbackInfo ci) { + if (Modules.get().get(NoRender.class).noSkylightUpdates()) ci.cancel(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityMixin.java index 0f35c708ab..35bad2d758 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityMixin.java @@ -74,7 +74,7 @@ private void onPushOutOfBlocks(double x, double d, CallbackInfo info) { @Inject(method = "damage", at = @At("HEAD")) private void onDamage(DamageSource source, float amount, CallbackInfoReturnable info) { - if (Utils.canUpdate() && world.isClient && canTakeDamage()) MeteorClient.EVENT_BUS.post(DamageEvent.get(this, source, amount)); + if (Utils.canUpdate() && getWorld().isClient && canTakeDamage()) MeteorClient.EVENT_BUS.post(DamageEvent.get(this, source, amount)); } @ModifyConstant(method = "canSprint", constant = @Constant(floatValue = 6.0f)) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/DisconnectedScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/DisconnectedScreenMixin.java index efba94efe6..321f112374 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/DisconnectedScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/DisconnectedScreenMixin.java @@ -12,22 +12,23 @@ import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.TitleScreen; import net.minecraft.client.gui.widget.ButtonWidget; +import net.minecraft.client.gui.widget.GridWidget; import net.minecraft.client.network.ServerAddress; import net.minecraft.client.network.ServerInfo; import net.minecraft.client.resource.language.I18n; import net.minecraft.text.Text; 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.LocalCapture; import static meteordevelopment.meteorclient.MeteorClient.mc; @Mixin(DisconnectedScreen.class) public abstract class DisconnectedScreenMixin extends Screen { - @Shadow private int reasonHeight; + @Unique private GridWidget grid; @Unique private ButtonWidget reconnectBtn; @Unique private double time = Modules.get().get(AutoReconnect.class).time.get() * 20; @@ -35,33 +36,37 @@ protected DisconnectedScreenMixin(Text title) { super(title); } - @Inject(method = "init", at = @At("TAIL")) - private void onRenderBackground(CallbackInfo info) { + @Inject(method = "init", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/widget/GridWidget;refreshPositions()V", shift = At.Shift.BEFORE), locals = LocalCapture.CAPTURE_FAILHARD) + private void onInit_before(CallbackInfo info, GridWidget.Adder adder) { AutoReconnect autoReconnect = Modules.get().get(AutoReconnect.class); + if (autoReconnect.lastServerConnection != null) { - int x = width / 2 - 100; - int y = Math.min((height / 2 + reasonHeight / 2) + 32, height - 30); + grid = new GridWidget(); + adder.add(grid); - reconnectBtn = addDrawableChild( - new ButtonWidget.Builder(Text.literal(getText()), button -> tryConnecting()) - .position(x, y) - .size(200, 20) - .build() - ); + grid.setRowSpacing(2); + GridWidget.Adder myAdder = grid.createAdder(1); + + reconnectBtn = myAdder.add(new ButtonWidget.Builder(Text.literal(getText()), button -> tryConnecting()).build()); - addDrawableChild( + myAdder.add( new ButtonWidget.Builder(Text.literal("Toggle Auto Reconnect"), button -> { autoReconnect.toggle(); reconnectBtn.setMessage(Text.literal(getText())); time = autoReconnect.time.get() * 20; - }) - .position(x, y + 23) - .size(200, 20) - .build() + }).build() ); } } + @Inject(method = "init", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/widget/GridWidget;refreshPositions()V", shift = At.Shift.AFTER)) + private void onInit_after(CallbackInfo info) { + if (grid != null) { + grid.refreshPositions(); + grid.forEachChild(this::addDrawableChild); + } + } + @Override public void tick() { AutoReconnect autoReconnect = Modules.get().get(AutoReconnect.class); @@ -85,6 +90,6 @@ private void tryConnecting() { var conn = Modules.get().get(AutoReconnect.class).lastServerConnection; var host = conn.getAddress().getHostName(); if (host.contains(":")) host = host.substring(0, host.indexOf(":")); - ConnectScreen.connect(new TitleScreen(), mc, new ServerAddress(host, conn.getPort()), new ServerInfo(I18n.translate("selectServer.defaultName"), host, false)); + ConnectScreen.connect(new TitleScreen(), mc, new ServerAddress(host, conn.getPort()), new ServerInfo(I18n.translate("selectServer.defaultName"), host, false), false); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/DrawContextMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/DrawContextMixin.java new file mode 100644 index 0000000000..52d2aa8e69 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/DrawContextMixin.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.ModifyReceiver; +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.client.item.TooltipData; +import net.minecraft.text.Text; +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.LocalCapture; + +import java.util.List; +import java.util.Optional; +import java.util.function.Consumer; + +@Mixin(value = DrawContext.class) +public class DrawContextMixin { + @Inject(method = "drawTooltip(Lnet/minecraft/client/font/TextRenderer;Ljava/util/List;Ljava/util/Optional;II)V", at = @At(value = "INVOKE", target = "Ljava/util/Optional;ifPresent(Ljava/util/function/Consumer;)V", shift = At.Shift.BEFORE), locals = LocalCapture.CAPTURE_FAILHARD) + private void onDrawTooltip(TextRenderer textRenderer, List text, Optional data, int x, int y, CallbackInfo ci, 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;II)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/HandledScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/HandledScreenMixin.java index 0ddd1638c2..18a7658299 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/HandledScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/HandledScreenMixin.java @@ -10,11 +10,11 @@ import meteordevelopment.meteorclient.systems.modules.render.BetterTooltips; import meteordevelopment.meteorclient.systems.modules.render.ItemHighlight; import meteordevelopment.meteorclient.utils.Utils; +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.widget.ButtonWidget; -import net.minecraft.client.util.math.MatrixStack; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.screen.ScreenHandler; @@ -98,8 +98,8 @@ private void mouseClicked(double mouseX, double mouseY, int button, CallbackInfo // Item Highlight @Inject(method = "drawSlot", at = @At("HEAD")) - private void onDrawSlot(MatrixStack matrices, Slot slot, CallbackInfo info) { + private void onDrawSlot(DrawContext context, Slot slot, CallbackInfo ci) { int color = Modules.get().get(ItemHighlight.class).getColor(slot.getStack()); - if (color != -1) fill(matrices, slot.x, slot.y, slot.x + 16, slot.y + 16, color); + if (color != -1) context.fill(slot.x, slot.y, slot.x + 16, slot.y + 16, color); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/InGameHudMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/InGameHudMixin.java index 56bf3d4e36..c6dc40d4ce 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/InGameHudMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/InGameHudMixin.java @@ -15,8 +15,10 @@ import meteordevelopment.meteorclient.systems.modules.render.NoRender; import meteordevelopment.meteorclient.utils.Utils; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.hud.InGameHud; import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.client.option.Perspective; import net.minecraft.entity.Entity; import net.minecraft.scoreboard.ScoreboardObjective; import org.spongepowered.asm.mixin.Final; @@ -39,12 +41,12 @@ public abstract class InGameHudMixin { @Shadow public abstract void clear(); @Inject(method = "render", at = @At("TAIL")) - private void onRender(MatrixStack matrixStack, float tickDelta, CallbackInfo info) { + private void onRender(DrawContext context, float tickDelta, CallbackInfo ci) { client.getProfiler().push(MeteorClient.MOD_ID + "_render_2d"); Utils.unscaledProjection(); - MeteorClient.EVENT_BUS.post(Render2DEvent.get(scaledWidth, scaledHeight, tickDelta)); + MeteorClient.EVENT_BUS.post(Render2DEvent.get(context, scaledWidth, scaledHeight, tickDelta)); Utils.scaledProjection(); RenderSystem.applyModelViewMatrix(); @@ -58,33 +60,33 @@ private void onRenderStatusEffectOverlay(CallbackInfo info) { } @Inject(method = "renderPortalOverlay", at = @At("HEAD"), cancellable = true) - private void onRenderPortalOverlay(MatrixStack matrices, float f, CallbackInfo info) { - if (Modules.get().get(NoRender.class).noPortalOverlay()) info.cancel(); + private void onRenderPortalOverlay(DrawContext context, float nauseaStrength, CallbackInfo ci) { + if (Modules.get().get(NoRender.class).noPortalOverlay()) ci.cancel(); } - @ModifyArgs(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/InGameHud;renderOverlay(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/util/Identifier;F)V", ordinal = 0)) + @ModifyArgs(method = "render", 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 = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/InGameHud;renderOverlay(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/util/Identifier;F)V", ordinal = 1)) + @ModifyArgs(method = "render", 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(MatrixStack matrices, Entity entity, CallbackInfo info) { - if (Modules.get().get(NoRender.class).noVignette()) info.cancel(); + private void onRenderVignetteOverlay(DrawContext context, Entity entity, CallbackInfo ci) { + if (Modules.get().get(NoRender.class).noVignette()) ci.cancel(); } @Inject(method = "renderScoreboardSidebar", at = @At("HEAD"), cancellable = true) - private void onRenderScoreboardSidebar(MatrixStack matrixStack, ScoreboardObjective scoreboardObjective, CallbackInfo info) { - if (Modules.get().get(NoRender.class).noScoreboard()) info.cancel(); + private void onRenderScoreboardSidebar(DrawContext context, ScoreboardObjective objective, CallbackInfo ci) { + if (Modules.get().get(NoRender.class).noScoreboard()) ci.cancel(); } @Inject(method = "renderSpyglassOverlay", at = @At("HEAD"), cancellable = true) - private void onRenderSpyglassOverlay(MatrixStack matrices, float scale, CallbackInfo info) { - if (Modules.get().get(NoRender.class).noSpyglassOverlay()) info.cancel(); + 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")) @@ -93,13 +95,13 @@ private boolean alwaysRenderCrosshairInFreecam(boolean firstPerson) { } @Inject(method = "renderCrosshair", at = @At("HEAD"), cancellable = true) - private void onRenderCrosshair(MatrixStack matrices, CallbackInfo info) { - if (Modules.get().get(NoRender.class).noCrosshair()) info.cancel(); + private void onRenderCrosshair(DrawContext context, CallbackInfo ci) { + if (Modules.get().get(NoRender.class).noCrosshair()) ci.cancel(); } @Inject(method = "renderHeldItemTooltip", at = @At("HEAD"), cancellable = true) - private void onRenderHeldItemTooltip(MatrixStack matrices, CallbackInfo info) { - if (Modules.get().get(NoRender.class).noHeldItemName()) info.cancel(); + 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) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ItemStackAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/ItemStackAccessor.java index 3b8d827c16..16edf42a58 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ItemStackAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ItemStackAccessor.java @@ -16,7 +16,4 @@ public interface ItemStackAccessor { @Mutable @Accessor("item") void setItem(Item item); - - @Accessor("empty") - void setEmpty(boolean empty); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java index 599daa48ae..7a19694a92 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java @@ -51,7 +51,7 @@ public LivingEntityMixin(EntityType type, World world) { @Inject(method = "damage", at = @At("HEAD")) private void onDamageHead(DamageSource source, float amount, CallbackInfoReturnable info) { - if (Utils.canUpdate() && world.isClient) + if (Utils.canUpdate() && getWorld().isClient) MeteorClient.EVENT_BUS.post(DamageEvent.get((LivingEntity) (Object) this, source, amount)); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftClientAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftClientAccessor.java index b4929a7ff1..9a878dddef 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftClientAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftClientAccessor.java @@ -15,7 +15,6 @@ import net.minecraft.client.texture.PlayerSkinProvider; import net.minecraft.client.util.ProfileKeys; import net.minecraft.client.util.Session; -import net.minecraft.network.encryption.SignatureVerifier; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mutable; import org.spongepowered.asm.mixin.gen.Accessor; @@ -68,10 +67,6 @@ static int getFps() { @Accessor("authenticationService") void setAuthenticationService(YggdrasilAuthenticationService authenticationService); - @Mutable - @Accessor("servicesSignatureVerifier") - void setServicesSignatureVerifier(SignatureVerifier servicesSignatureVerifier); - @Mutable @Accessor("skinProvider") void setSkinProvider(PlayerSkinProvider skinProvider); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MultiplayerScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/MultiplayerScreenMixin.java index c4c1c0deeb..33de30691b 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/MultiplayerScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/MultiplayerScreenMixin.java @@ -11,16 +11,21 @@ import meteordevelopment.meteorclient.systems.proxies.Proxies; import meteordevelopment.meteorclient.systems.proxies.Proxy; import meteordevelopment.meteorclient.utils.render.color.Color; +import net.minecraft.client.font.TextRenderer; +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.client.util.math.MatrixStack; +import net.minecraft.client.render.BufferBuilder; +import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.text.Text; 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(MultiplayerScreen.class) public class MultiplayerScreenMixin extends Screen { private int textColor1; @@ -42,18 +47,14 @@ private void onInit(CallbackInfo info) { loggedInAsLength = textRenderer.getWidth(loggedInAs); addDrawableChild( - new ButtonWidget.Builder(Text.literal("Accounts"), button -> { - client.setScreen(GuiThemes.get().accountsScreen()); - }) + new ButtonWidget.Builder(Text.literal("Accounts"), button -> client.setScreen(GuiThemes.get().accountsScreen())) .position(this.width - 75 - 3, 3) .size(75, 20) .build() ); addDrawableChild( - new ButtonWidget.Builder(Text.literal("Proxies"), button -> { - client.setScreen(GuiThemes.get().proxiesScreen()); - }) + new ButtonWidget.Builder(Text.literal("Proxies"), button -> client.setScreen(GuiThemes.get().proxiesScreen())) .position(this.width - 75 - 3 - 75 - 2, 3) .size(75, 20) .build() @@ -61,13 +62,13 @@ private void onInit(CallbackInfo info) { } @Inject(method = "render", at = @At("TAIL")) - private void onRender(MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo info) { - float x = 3; - float y = 3; + private void onRender(DrawContext context, int mouseX, int mouseY, float delta, CallbackInfo ci) { + int x = 3; + int y = 3; // Logged in as - textRenderer.drawWithShadow(matrices, loggedInAs, x, y, textColor1); - textRenderer.drawWithShadow(matrices, Modules.get().get(NameProtect.class).getName(client.getSession().getUsername()), x + loggedInAsLength, y, textColor2); + 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); y += textRenderer.fontHeight + 2; @@ -77,7 +78,8 @@ private void onRender(MatrixStack matrices, int mouseX, int mouseY, float delta, 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; - textRenderer.drawWithShadow(matrices, left, x, y, textColor1); - if (right != null) textRenderer.drawWithShadow(matrices, right, x + textRenderer.getWidth(left), y, textColor2); + context.drawTextWithShadow(mc.textRenderer, left, x, y, textColor1); + if (right != null) + context.drawTextWithShadow(mc.textRenderer, right, x + textRenderer.getWidth(left), y, textColor2); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityMixin.java index acf12edd61..ca2e96ba8a 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityMixin.java @@ -45,7 +45,7 @@ protected PlayerEntityMixin(EntityType entityType, World @Inject(method = "clipAtLedge", at = @At("HEAD"), cancellable = true) protected void clipAtLedge(CallbackInfoReturnable info) { - if (!world.isClient) return; + if (!getWorld().isClient) return; ClipAtLedgeEvent event = MeteorClient.EVENT_BUS.post(ClipAtLedgeEvent.get()); if (event.isSet()) info.setReturnValue(event.isClip()); @@ -53,14 +53,14 @@ protected void clipAtLedge(CallbackInfoReturnable info) { @Inject(method = "dropItem(Lnet/minecraft/item/ItemStack;ZZ)Lnet/minecraft/entity/ItemEntity;", at = @At("HEAD"), cancellable = true) private void onDropItem(ItemStack stack, boolean bl, boolean bl2, CallbackInfoReturnable info) { - if (world.isClient && !stack.isEmpty()) { + if (getWorld().isClient && !stack.isEmpty()) { if (MeteorClient.EVENT_BUS.post(DropItemsEvent.get(stack)).isCancelled()) info.cancel(); } } @ModifyReturnValue(method = "getBlockBreakingSpeed", at = @At(value = "RETURN")) public float onGetBlockBreakingSpeed(float breakSpeed, BlockState block) { - if (!world.isClient) return breakSpeed; + if (!getWorld().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; @@ -81,7 +81,7 @@ public float onGetBlockBreakingSpeed(float breakSpeed, BlockState block) { @Inject(method = "jump", at = @At("HEAD"), cancellable = true) public void dontJump(CallbackInfo info) { - if (!world.isClient) return; + if (!getWorld().isClient) return; Anchor module = Modules.get().get(Anchor.class); if (module.isActive() && module.cancelJump) info.cancel(); @@ -89,7 +89,7 @@ public void dontJump(CallbackInfo info) { @ModifyReturnValue(method = "getMovementSpeed", at = @At("RETURN")) private float onGetMovementSpeed(float original) { - if (!world.isClient) return original; + if (!getWorld().isClient) return original; if (!Modules.get().get(NoSlow.class).slowness()) return original; float walkSpeed = getAbilities().getWalkSpeed(); @@ -104,7 +104,7 @@ private float onGetMovementSpeed(float original) { @Inject(method = "getOffGroundSpeed", at = @At("HEAD"), cancellable = true) private void onGetOffGroundSpeed(CallbackInfoReturnable info) { - if (!world.isClient) return; + if (!getWorld().isClient) return; float speed = Modules.get().get(Flight.class).getOffGroundSpeed(); if (speed != -1) info.setReturnValue(speed); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerListHudMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerListHudMixin.java index 76cbec2240..67ce3761dc 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerListHudMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerListHudMixin.java @@ -10,9 +10,9 @@ import meteordevelopment.meteorclient.utils.Utils; 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.client.util.math.MatrixStack; import net.minecraft.text.Text; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.*; @@ -43,7 +43,7 @@ private int modifyWidth(int width) { } @Inject(method = "renderLatencyIcon", at = @At("HEAD"), cancellable = true) - private void onRenderLatencyIcon(MatrixStack matrices, int width, int x, int y, PlayerListEntry entry, CallbackInfo info) { + 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()) { @@ -53,9 +53,8 @@ private void onRenderLatencyIcon(MatrixStack matrices, int width, int x, int y, int latency = Utils.clamp(entry.getLatency(), 0, 9999); int color = latency < 150 ? 0x00E970 : latency < 300 ? 0xE7D020 : 0xD74238; String text = latency + "ms"; - textRenderer.drawWithShadow(matrices, text, (float) x + width - textRenderer.getWidth(text), (float) y, color); - - info.cancel(); + context.drawTextWithShadow(textRenderer, text, x + width - textRenderer.getWidth(text), y, color); + ci.cancel(); } } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ScreenMixin.java index f430f06346..b5dd66cd0d 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ScreenMixin.java @@ -11,36 +11,22 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.NoRender; import meteordevelopment.meteorclient.utils.Utils; -import meteordevelopment.meteorclient.utils.tooltip.MeteorTooltipData; import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.tooltip.TooltipComponent; -import net.minecraft.client.item.TooltipData; import net.minecraft.text.Style; 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 org.spongepowered.asm.mixin.injection.callback.LocalCapture; - -import java.util.List; @Mixin(value = Screen.class, priority = 500) // needs to be before baritone public abstract class ScreenMixin { - @Inject(method = "renderBackground(Lnet/minecraft/client/util/math/MatrixStack;)V", at = @At("HEAD"), cancellable = true) + @Inject(method = "renderBackground(Lnet/minecraft/client/gui/DrawContext;)V", at = @At("HEAD"), cancellable = true) private void onRenderBackground(CallbackInfo info) { if (Utils.canUpdate() && Modules.get().get(NoRender.class).noGuiBackground()) info.cancel(); } - @Inject(method = "method_32635", at = @At("HEAD"), cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD, remap = false) - private static void onComponentConstruct(List list, TooltipData data, CallbackInfo info) { - if (data instanceof MeteorTooltipData) { - list.add(((MeteorTooltipData) data).getComponent()); - info.cancel(); - } - } - @Inject(method = "handleTextClick", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;error(Ljava/lang/String;Ljava/lang/Object;)V", ordinal = 1, remap = false), cancellable = true) private void onRunCommand(Style style, CallbackInfoReturnable cir) { if (style.getClickEvent().getValue().startsWith(Config.get().prefix.get())) { diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/SplashTextResourceSupplierMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/SplashTextResourceSupplierMixin.java index faccdac91b..d891196a7e 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/SplashTextResourceSupplierMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/SplashTextResourceSupplierMixin.java @@ -6,6 +6,7 @@ package meteordevelopment.meteorclient.mixin; import meteordevelopment.meteorclient.systems.config.Config; +import net.minecraft.client.gui.screen.SplashTextRenderer; import net.minecraft.client.resource.SplashTextResourceSupplier; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -24,10 +25,10 @@ public class SplashTextResourceSupplierMixin { private final List meteorSplashes = getMeteorSplashes(); @Inject(method = "get", at = @At("HEAD"), cancellable = true) - private void onApply(CallbackInfoReturnable cir) { + private void onApply(CallbackInfoReturnable cir) { if (Config.get() == null || !Config.get().titleScreenSplashes.get()) return; - if (override) cir.setReturnValue(meteorSplashes.get(random.nextInt(meteorSplashes.size()))); + if (override) cir.setReturnValue(new SplashTextRenderer(meteorSplashes.get(random.nextInt(meteorSplashes.size())))); override = !override; } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/TitleScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/TitleScreenMixin.java index 5d6ceaff90..f7dd560e60 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/TitleScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/TitleScreenMixin.java @@ -15,9 +15,9 @@ import meteordevelopment.meteorclient.utils.player.TitleScreenCredits; import meteordevelopment.meteorclient.utils.render.prompts.OkPrompt; import meteordevelopment.meteorclient.utils.render.prompts.YesNoPrompt; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.TitleScreen; -import net.minecraft.client.util.math.MatrixStack; import net.minecraft.text.Text; import net.minecraft.util.Util; import org.lwjgl.glfw.GLFW; @@ -33,8 +33,8 @@ public TitleScreenMixin(Text title) { super(title); } - @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/TitleScreen;drawTextWithShadow(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/font/TextRenderer;Ljava/lang/String;III)V", ordinal = 0)) - private void onRenderIdkDude(MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo info) { + @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;drawTextWithShadow(Lnet/minecraft/client/font/TextRenderer;Ljava/lang/String;III)I", ordinal = 0)) + private void onRenderIdkDude(DrawContext context, int mouseX, int mouseY, float delta, CallbackInfo ci) { if (Utils.firstTimeTitleScreen) { Utils.firstTimeTitleScreen = false; MeteorClient.LOG.info("Checking latest version of Meteor Client"); @@ -68,8 +68,8 @@ private void onRenderIdkDude(MatrixStack matrices, int mouseX, int mouseY, float } @Inject(method = "render", at = @At("TAIL")) - private void onRender(MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo info) { - if (Config.get().titleScreenCredits.get()) TitleScreenCredits.render(matrices); + private void onRender(DrawContext context, int mouseX, int mouseY, float delta, CallbackInfo ci) { + if (Config.get().titleScreenCredits.get()) TitleScreenCredits.render(context); } @Inject(method = "mouseClicked", at = @At("HEAD"), cancellable = true) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/accounts/Account.java b/src/main/java/meteordevelopment/meteorclient/systems/accounts/Account.java index 263895ec17..96132e9d55 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/accounts/Account.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/accounts/Account.java @@ -8,6 +8,7 @@ import com.mojang.authlib.exceptions.AuthenticationException; import com.mojang.authlib.minecraft.MinecraftSessionService; import com.mojang.authlib.minecraft.UserApiService; +import com.mojang.authlib.yggdrasil.ServicesKeyType; import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService; import meteordevelopment.meteorclient.mixin.MinecraftClientAccessor; import meteordevelopment.meteorclient.mixin.PlayerSkinProviderAccessor; @@ -30,7 +31,7 @@ public abstract class Account> implements ISerializable protected final AccountCache cache; - public Account(AccountType type, String name) { + protected Account(AccountType type, String name) { this.type = type; this.name = name; this.cache = new AccountCache(); @@ -77,7 +78,7 @@ public static void setSession(Session session) { public static void applyLoginEnvironment(YggdrasilAuthenticationService authService, MinecraftSessionService sessService) { MinecraftClientAccessor mca = (MinecraftClientAccessor) mc; mca.setAuthenticationService(authService); - mca.setServicesSignatureVerifier(SignatureVerifier.create(authService.getServicesKey())); + SignatureVerifier.create(authService.getServicesKeySet(), ServicesKeyType.PROFILE_KEY); mca.setSessionService(sessService); mca.setSkinProvider(new PlayerSkinProvider(mc.getTextureManager(), ((PlayerSkinProviderAccessor) mc.getSkinProvider()).getSkinCacheDir(), sessService)); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/Hud.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/Hud.java index ec4d4b7f6d..aad026952a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/Hud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/Hud.java @@ -216,7 +216,7 @@ private void onRender(Render2DEvent event) { if (Utils.isLoading()) return; if (!(active && ((!mc.options.hudHidden && !mc.options.debugEnabled) || HudEditorScreen.isOpen()))) return; - HudRenderer.INSTANCE.begin(); + HudRenderer.INSTANCE.begin(event.drawContext); for (HudElement element : elements) { element.updatePos(); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/HudRenderer.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/HudRenderer.java index c3537fb45a..8cd48e50d5 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/HudRenderer.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/HudRenderer.java @@ -17,9 +17,12 @@ import meteordevelopment.meteorclient.renderer.text.Font; import meteordevelopment.meteorclient.renderer.text.VanillaTextRenderer; import meteordevelopment.meteorclient.utils.Utils; +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.util.math.MatrixStack; +import net.minecraft.item.ItemStack; import net.minecraft.util.Identifier; import org.lwjgl.BufferUtils; @@ -47,16 +50,18 @@ public class HudRenderer { }) .build(CacheLoader.from(HudRenderer::loadFont)); + public DrawContext drawContext; public double delta; private HudRenderer() { MeteorClient.EVENT_BUS.subscribe(this); } - public void begin() { + public void begin(DrawContext drawContext) { Renderer2D.COLOR.begin(); - delta = Utils.frameTime; + this.drawContext = drawContext; + this.delta = Utils.frameTime; if (!hud.hasCustomFont()) { VanillaTextRenderer.INSTANCE.scaleIndividually = true; @@ -91,6 +96,8 @@ public void end() { for (Runnable task : postTasks) task.run(); postTasks.clear(); + + this.drawContext = null; } public void line(double x1, double y1, double x2, double y2, Color color) { @@ -192,6 +199,14 @@ public void post(Runnable task) { postTasks.add(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); + } + + public void item(ItemStack itemStack, int x, int y, float scale, boolean overlay) { + RenderUtils.drawItem(drawContext, itemStack, x, y, scale, overlay); + } + private FontHolder getFontHolder(double scale, boolean render) { // Calculate font height if (scale == -1) scale = hud.getTextScale(); 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 7b643b8baa..32dce0b9ed 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/ArmorHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/ArmorHud.java @@ -5,15 +5,12 @@ package meteordevelopment.meteorclient.systems.hud.elements; -import com.mojang.blaze3d.systems.RenderSystem; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.hud.Hud; import meteordevelopment.meteorclient.systems.hud.HudElement; import meteordevelopment.meteorclient.systems.hud.HudElementInfo; import meteordevelopment.meteorclient.systems.hud.HudRenderer; -import meteordevelopment.meteorclient.utils.render.RenderUtils; import meteordevelopment.meteorclient.utils.render.color.SettingColor; -import net.minecraft.client.util.math.MatrixStack; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; @@ -129,25 +126,20 @@ public void render(HudRenderer renderer) { double armorX; double armorY; - MatrixStack matrices = RenderSystem.getModelViewStack(); - - matrices.push(); - matrices.scale(scale.get().floatValue(), scale.get().floatValue(), 1); - int slot = flipOrder.get() ? 3 : 0; for (int position = 0; position < 4; position++) { ItemStack itemStack = getItem(slot); if (orientation.get() == Orientation.Vertical) { - armorX = x / scale.get(); - armorY = y / scale.get() + position * 18; + armorX = x; + armorY = y + position * 18 * scale.get(); } else { - armorX = x / scale.get() + position * 18; - armorY = y / scale.get(); + armorX = x + position * 18 * scale.get(); + armorY = y; } - RenderUtils.drawItem(itemStack, (int) armorX, (int) armorY, (itemStack.isDamageable() && durability.get() == Durability.Bar)); + renderer.item(itemStack, (int) armorX, (int) armorY, scale.get().floatValue(), (itemStack.isDamageable() && durability.get() == Durability.Bar)); if (itemStack.isDamageable() && !isInEditor() && durability.get() != Durability.Bar && durability.get() != Durability.None) { String message = switch (durability.get()) { @@ -173,8 +165,6 @@ public void render(HudRenderer renderer) { else slot++; } - matrices.pop(); - if (background.get()) { renderer.quad(this.x, this.y, getWidth(), getHeight(), backgroundColor.get()); } 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 c86cd5c311..ee31b24347 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/CombatHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/CombatHud.java @@ -20,7 +20,6 @@ import meteordevelopment.meteorclient.utils.entity.SortPriority; import meteordevelopment.meteorclient.utils.entity.TargetUtils; import meteordevelopment.meteorclient.utils.player.PlayerUtils; -import meteordevelopment.meteorclient.utils.render.RenderUtils; import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.render.color.SettingColor; import net.minecraft.client.gui.screen.ingame.InventoryScreen; @@ -50,8 +49,6 @@ public class CombatHud extends HudElement { public static final HudElementInfo INFO = new HudElementInfo<>(Hud.GROUP, "combat", "Displays information about your combat target.", CombatHud::new); - private static final MatrixStack MATRICES = new MatrixStack(); - private final SettingGroup sgGeneral = settings.getDefaultGroup(); private final Setting scale = sgGeneral.add(new DoubleSetting.Builder() @@ -211,7 +208,7 @@ public void render(HudRenderer renderer) { // Player Model InventoryScreen.drawEntity( - MATRICES, + renderer.drawContext, (int) (x + (25 * scale.get())), (int) (y + (66 * scale.get())), (int) (30 * scale.get()), @@ -341,7 +338,7 @@ public void render(HudRenderer renderer) { ItemStack itemStack = getItem(slot); - RenderUtils.drawItem(itemStack, (int) armorX, (int) armorY, true); + renderer.item(itemStack, (int) (armorX * scale.get()), (int) (armorY * scale.get()), scale.get().floatValue(), true); armorY += 18; 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 dcccfe81fa..62b0f3fe25 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/HoleHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/HoleHud.java @@ -11,7 +11,6 @@ import meteordevelopment.meteorclient.systems.hud.HudElement; import meteordevelopment.meteorclient.systems.hud.HudElementInfo; import meteordevelopment.meteorclient.systems.hud.HudRenderer; -import meteordevelopment.meteorclient.utils.render.RenderUtils; import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.render.color.SettingColor; import net.minecraft.block.Block; @@ -117,7 +116,7 @@ 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(); if (!safe.get().contains(block)) return; - RenderUtils.drawItem(block.asItem().getDefaultStack(), (int) x, (int) y, scale.get().floatValue(), false); + renderer.item(block.asItem().getDefaultStack(), (int) x, (int) y, scale.get().floatValue(), false); if (dir == Direction.DOWN) return; 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 7af073c93c..f61d64eb90 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/InventoryHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/InventoryHud.java @@ -93,7 +93,7 @@ public void render(HudRenderer renderer) { int itemX = background.get() == Background.Texture ? (int) (x + (8 + i * 18) * scale.get()) : (int) (x + (1 + i * 18) * scale.get()); int itemY = background.get() == Background.Texture ? (int) (y + (7 + row * 18) * scale.get()) : (int) (y + (1 + row * 18) * scale.get()); - RenderUtils.drawItem(stack, itemX, itemY, scale.get().floatValue(), true); + renderer.item(stack, itemX, itemY, scale.get().floatValue(), true); } } }); 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 da75286de0..a340a4683a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/ItemHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/ItemHud.java @@ -5,7 +5,6 @@ package meteordevelopment.meteorclient.systems.hud.elements; -import com.mojang.blaze3d.systems.RenderSystem; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.hud.Hud; import meteordevelopment.meteorclient.systems.hud.HudElement; @@ -14,17 +13,12 @@ import meteordevelopment.meteorclient.utils.player.InvUtils; import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.render.color.SettingColor; -import net.minecraft.client.util.math.MatrixStack; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; -import static meteordevelopment.meteorclient.MeteorClient.mc; - public class ItemHud extends HudElement { - public static HudElementInfo INFO = new HudElementInfo<>(Hud.GROUP, "item", "Displays the item count.", ItemHud::new); - - private static final MatrixStack MATRICES = new MatrixStack(); + public static final HudElementInfo INFO = new HudElementInfo<>(Hud.GROUP, "item", "Displays the item count.", ItemHud::new); private final SettingGroup sgGeneral = settings.getDefaultGroup(); private final SettingGroup sgBackground = settings.createGroup("Background"); @@ -104,50 +98,39 @@ public void render(HudRenderer renderer) { renderer.line(x, y, x + getWidth(), y + getHeight(), Color.GRAY); renderer.line(x, y + getHeight(), x + getWidth(), y, Color.GRAY); } - } - else { + } else { renderer.post(() -> { - MatrixStack matrices = RenderSystem.getModelViewStack(); - - matrices.push(); - matrices.scale(scale.get().floatValue(), scale.get().floatValue(), 1); - double x = this.x + border.get(); double y = this.y + border.get(); - render(itemStack, (int) (x / scale.get()), (int) (y / scale.get())); - - matrices.pop(); + render(renderer, itemStack, (int) x, (int) y); }); } - if (background.get()) { - renderer.quad(this.x, this.y, getWidth(), getHeight(), backgroundColor.get()); - } + if (background.get()) renderer.quad(x, y, getWidth(), getHeight(), backgroundColor.get()); } - private void render(ItemStack itemStack, int x, int y) { - switch (noneMode.get()) { - case HideItem -> { - mc.getItemRenderer().renderGuiItemIcon(MATRICES, itemStack, x, y); - mc.getItemRenderer().renderGuiItemOverlay(MATRICES, mc.textRenderer, itemStack, x, y, Integer.toString(itemStack.getCount())); - } - case HideCount -> { - if (itemStack.getCount() == 0) itemStack.setCount(Integer.MAX_VALUE); - mc.getItemRenderer().renderGuiItemIcon(MATRICES, itemStack, x, y); - if (itemStack.getCount() == Integer.MAX_VALUE) itemStack.setCount(0); - - if (!itemStack.isEmpty()) { - mc.getItemRenderer().renderGuiItemOverlay(MATRICES, mc.textRenderer, itemStack, x, y, Integer.toString(itemStack.getCount())); - } - } - case ShowCount -> { - if (itemStack.getCount() == 0) itemStack.setCount(Integer.MAX_VALUE); - mc.getItemRenderer().renderGuiItemIcon(MATRICES, itemStack, x, y); - mc.getItemRenderer().renderGuiItemOverlay(MATRICES, mc.textRenderer, itemStack, x, y, Integer.toString(itemStack.getCount() == Integer.MAX_VALUE ? 0 : itemStack.getCount())); - if (itemStack.getCount() == Integer.MAX_VALUE) itemStack.setCount(0); - } + private void render(HudRenderer renderer, ItemStack itemStack, int x, int y) { + if (noneMode.get() == NoneMode.HideItem) { + renderer.item(itemStack, x, y, scale.get().floatValue(), true); + return; + } + + String countOverride = null; + boolean resetToZero = false; + + if (itemStack.isEmpty()) { + if (noneMode.get() == NoneMode.ShowCount) + countOverride = "0"; + + itemStack.setCount(1); + resetToZero = true; } + + renderer.item(itemStack, x, y, scale.get().floatValue(), true, countOverride); + + if (resetToZero) + itemStack.setCount(0); } public enum NoneMode { 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 a1e5bc3c6a..2f3aa7fd4f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PlayerModelHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PlayerModelHud.java @@ -12,7 +12,6 @@ import meteordevelopment.meteorclient.systems.hud.HudRenderer; import meteordevelopment.meteorclient.utils.render.color.SettingColor; import net.minecraft.client.gui.screen.ingame.InventoryScreen; -import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.math.MathHelper; @@ -20,9 +19,6 @@ public class PlayerModelHud extends HudElement { public static final HudElementInfo INFO = new HudElementInfo<>(Hud.GROUP, "player-model", "Displays a model of your player.", PlayerModelHud::new); - - private static final MatrixStack MATRICES = new MatrixStack(); - private final SettingGroup sgGeneral = settings.getDefaultGroup(); private final SettingGroup sgBackground = settings.createGroup("Background"); @@ -103,11 +99,11 @@ public void render(HudRenderer renderer) { float yaw = copyYaw.get() ? MathHelper.wrapDegrees(player.prevYaw + (player.getYaw() - player.prevYaw) * mc.getTickDelta()) : (float) customYaw.get(); float pitch = copyPitch.get() ? player.getPitch() : (float) customPitch.get(); - InventoryScreen.drawEntity(MATRICES, (int) (x + (25 * scale.get())), (int) (y + (66 * scale.get())), (int) (30 * scale.get()), -yaw, -pitch, player); + InventoryScreen.drawEntity(renderer.drawContext, (int) (x + (25 * scale.get())), (int) (y + (66 * scale.get())), (int) (30 * scale.get()), -yaw, -pitch, player); }); if (background.get()) { - renderer.quad(this.x, this.y, getWidth(), getHeight(), backgroundColor.get()); + renderer.quad(x, y, getWidth(), getHeight(), backgroundColor.get()); } } } 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 b4965dabde..5c6a13220a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PotionTimersHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PotionTimersHud.java @@ -147,7 +147,7 @@ public void render(HudRenderer renderer) { } private String getString(StatusEffectInstance statusEffectInstance) { - return String.format("%s %d (%s)", Names.get(statusEffectInstance.getEffectType()), statusEffectInstance.getAmplifier() + 1, StatusEffectUtil.durationToString(statusEffectInstance, 1).getString()); + return String.format("%s %d (%s)", Names.get(statusEffectInstance.getEffectType()), statusEffectInstance.getAmplifier() + 1, StatusEffectUtil.getDurationText(statusEffectInstance, 1).getString()); } private double getScale() { 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 be42d93165..851b44c2ac 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/screens/AddHudElementScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/screens/AddHudElementScreen.java @@ -17,6 +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 java.util.ArrayList; import java.util.HashMap; @@ -124,8 +125,8 @@ private void runObject(Object object) { } @Override - protected void onRenderBefore(float delta) { - HudEditorScreen.renderElements(); + protected void onRenderBefore(DrawContext drawContext, float delta) { + HudEditorScreen.renderElements(drawContext); } 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 5a2f77445f..9af8fd181e 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/screens/HudEditorScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/screens/HudEditorScreen.java @@ -15,6 +15,7 @@ import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.other.Snapper; import meteordevelopment.meteorclient.utils.render.color.Color; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.util.math.MatrixStack; import org.lwjgl.glfw.GLFW; @@ -258,8 +259,8 @@ private void renderElement(HudElement element, Color bgColor, Color olColor) { } @Override - public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { - if (!Utils.canUpdate()) renderBackground(matrices); + public void render(DrawContext context, int mouseX, int mouseY, float delta) { + if (!Utils.canUpdate()) renderBackground(context); double s = mc.getWindow().getScaleFactor(); @@ -270,7 +271,7 @@ public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { boolean renderSplitLines = pressed && !selection.isEmpty() && moved; if (renderSplitLines || splitLinesAnimation > 0) renderSplitLines(renderSplitLines, delta / 20); - renderElements(); + renderElements(context); Renderer2D.COLOR.begin(); onRender(mouseX, mouseY); @@ -280,11 +281,11 @@ public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { runAfterRenderTasks(); } - public static void renderElements() { + public static void renderElements(DrawContext drawContext) { Hud hud = Hud.get(); boolean inactiveOnly = Utils.canUpdate() && hud.active; - HudRenderer.INSTANCE.begin(); + HudRenderer.INSTANCE.begin(drawContext); for (HudElement element : hud) { element.updatePos(); 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 70db7f21f1..3b6882c4c3 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/screens/HudElementPresetsScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/screens/HudElementPresetsScreen.java @@ -13,6 +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; public class HudElementPresetsScreen extends WindowScreen { private final HudElementInfo info; @@ -67,7 +68,7 @@ public void initWidgets() { } @Override - protected void onRenderBefore(float delta) { - HudEditorScreen.renderElements(); + protected void onRenderBefore(DrawContext drawContext, float delta) { + HudEditorScreen.renderElements(drawContext); } } 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 6eaa7854f4..2909f16cd8 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/screens/HudElementScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/screens/HudElementScreen.java @@ -21,6 +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.nbt.NbtCompound; import static meteordevelopment.meteorclient.utils.Utils.getWindowWidth; @@ -129,8 +130,8 @@ public void tick() { } @Override - protected void onRenderBefore(float delta) { - HudEditorScreen.renderElements(); + protected void onRenderBefore(DrawContext drawContext, float delta) { + HudEditorScreen.renderElements(drawContext); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoAnvil.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoAnvil.java index d2234ee3da..80c6769938 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoAnvil.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoAnvil.java @@ -140,7 +140,7 @@ private void onTick(TickEvent.Pre event) { BlockPos blockPos = target.getBlockPos().up().add(0, i, 0); for (int j = 0; j < i; j++) { - if (!mc.world.getBlockState(target.getBlockPos().up(j + 1)).getMaterial().isReplaceable()) { + if (!mc.world.getBlockState(target.getBlockPos().up(j + 1)).isReplaceable()) { break; } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BedAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BedAura.java index ead2645582..4c05f191c3 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BedAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BedAura.java @@ -261,7 +261,7 @@ private BlockPos findPlace(PlayerEntity target) { double headSelfDamage = DamageUtils.bedDamage(mc.player, Utils.vec3d(centerPos)); double offsetSelfDamage = DamageUtils.bedDamage(mc.player, Utils.vec3d(centerPos.offset(dir.toDirection()))); - if (mc.world.getBlockState(centerPos).getMaterial().isReplaceable() + if (mc.world.getBlockState(centerPos).isReplaceable() && BlockUtils.canPlace(centerPos.offset(dir.toDirection())) && DamageUtils.bedDamage(target, Utils.vec3d(centerPos)) >= minDamage.get() && offsetSelfDamage < maxSelfDamage.get() diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Burrow.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Burrow.java index 3d8f6abb4b..f2055b4ba9 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Burrow.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Burrow.java @@ -114,7 +114,7 @@ public Burrow() { @Override public void onActivate() { - if (!mc.world.getBlockState(mc.player.getBlockPos()).getMaterial().isReplaceable()) { + if (!mc.world.getBlockState(mc.player.getBlockPos()).isReplaceable()) { error("Already burrowed, disabling."); toggle(); return; @@ -231,11 +231,11 @@ private boolean checkHead() { BlockState blockState2 = mc.world.getBlockState(blockPos.set(mc.player.getX() + .3, mc.player.getY() + 2.3, mc.player.getZ() - .3)); BlockState blockState3 = mc.world.getBlockState(blockPos.set(mc.player.getX() - .3, mc.player.getY() + 2.3, mc.player.getZ() - .3)); BlockState blockState4 = mc.world.getBlockState(blockPos.set(mc.player.getX() - .3, mc.player.getY() + 2.3, mc.player.getZ() + .3)); - boolean air1 = blockState1.getMaterial().isReplaceable(); - boolean air2 = blockState2.getMaterial().isReplaceable(); - boolean air3 = blockState3.getMaterial().isReplaceable(); - boolean air4 = blockState4.getMaterial().isReplaceable(); - return air1 & air2 & air3 & air4; + boolean air1 = blockState1.isReplaceable(); + boolean air2 = blockState2.isReplaceable(); + boolean air3 = blockState3.isReplaceable(); + boolean air4 = blockState4.isReplaceable(); + return air1 && air2 && air3 && air4; } public enum Block { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/CrystalAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/CrystalAura.java index c6623ebe82..a97a50a22d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/CrystalAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/CrystalAura.java @@ -914,7 +914,7 @@ private void doPlace() { BlockIterator.register((int) Math.ceil(placeRange.get()), (int) Math.ceil(placeRange.get()), (bp, blockState) -> { // Check if its bedrock or obsidian and return if isSupport is false boolean hasBlock = blockState.isOf(Blocks.BEDROCK) || blockState.isOf(Blocks.OBSIDIAN); - if (!hasBlock && (!isSupport.get() || !blockState.getMaterial().isReplaceable())) return; + if (!hasBlock && (!isSupport.get() || !blockState.isReplaceable())) return; // Check if there is air on top blockPos.set(bp.getX(), bp.getY() + 1, bp.getZ()); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/SelfTrap.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/SelfTrap.java index 8cfd47ff4f..d9504f4126 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/SelfTrap.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/SelfTrap.java @@ -182,22 +182,20 @@ private void findPlacePos(Block block) { BlockPos pos = mc.player.getBlockPos(); switch (topPlacement.get()) { - case Full: + case Full -> { add(pos.add(0, 2, 0), block); add(pos.add(1, 1, 0), block); add(pos.add(-1, 1, 0), block); add(pos.add(0, 1, 1), block); add(pos.add(0, 1, -1), block); - break; - case Top: - add(pos.add(0, 2, 0), block); - break; - case AntiFacePlace: + } + case Top -> add(pos.add(0, 2, 0), block); + case AntiFacePlace -> { add(pos.add(1, 1, 0), block); add(pos.add(-1, 1, 0), block); add(pos.add(0, 1, 1), block); add(pos.add(0, 1, -1), block); - + } } if (bottomPlacement.get() == BottomMode.Single) add(pos.add(0, -1, 0), block); @@ -205,6 +203,8 @@ private void findPlacePos(Block block) { private void add(BlockPos blockPos, Block block) { - if (!placePositions.contains(blockPos) && mc.world.getBlockState(blockPos).getMaterial().isReplaceable() && mc.world.canPlace(block.getDefaultState(), blockPos, ShapeContext.absent())) placePositions.add(blockPos); + if (!placePositions.contains(blockPos) && + mc.world.getBlockState(blockPos).isReplaceable() && + mc.world.canPlace(block.getDefaultState(), blockPos, ShapeContext.absent())) placePositions.add(blockPos); } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java index 5d218494c4..cb08019359 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java @@ -365,7 +365,7 @@ private boolean place(CardinalDirection direction, int y) { } } - boolean isThreat = mc.world.getBlockState(placePos).getMaterial().isReplaceable() || beingMined; + boolean isThreat = mc.world.getBlockState(placePos).isReplaceable() || beingMined; // If the block is air or is being mined, destroy nearby crystals to be safe if (protect.get() && !placed && isThreat) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Flight.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Flight.java index ae5fc5f0d5..fd613bd701 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Flight.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Flight.java @@ -229,7 +229,7 @@ private void abilitiesOff() { // Copied from ServerPlayNetworkHandler#isEntityOnAir private boolean isEntityOnAir(Entity entity) { - return entity.world.getStatesInBox(entity.getBoundingBox().expand(0.0625).stretch(0.0, -0.55, 0.0)).allMatch(AbstractBlock.AbstractBlockState::isAir); + return entity.getWorld().getStatesInBox(entity.getBoundingBox().expand(0.0625).stretch(0.0, -0.55, 0.0)).allMatch(AbstractBlock.AbstractBlockState::isAir); } public float getOffGroundSpeed() { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Jesus.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Jesus.java index 8a9772e4b2..e63813b27d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Jesus.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Jesus.java @@ -18,7 +18,7 @@ import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.entity.EntityUtils; import meteordevelopment.orbit.EventHandler; -import net.minecraft.block.Material; +import net.minecraft.block.BlockState; import net.minecraft.enchantment.ProtectionEnchantment; import net.minecraft.entity.effect.StatusEffects; import net.minecraft.fluid.Fluids; @@ -215,10 +215,9 @@ else if ((event.fluidState.getFluid() == Fluids.LAVA || event.fluidState.getFlui private void onFluidCollisionShape(CollisionShapeEvent event) { if (event.state.getFluidState().isEmpty()) return; - if (event.state.getMaterial() == Material.WATER && !mc.player.isTouchingWater() && waterShouldBeSolid()) { + if (event.state.getFluidState().isOf(Fluids.WATER) && !mc.player.isTouchingWater() && waterShouldBeSolid()) { event.shape = VoxelShapes.fullCube(); - } - else if (event.state.getMaterial() == Material.LAVA && !mc.player.isInLava() && lavaShouldBeSolid()) { + } else if (event.state.getFluidState().isOf(Fluids.LAVA) && !mc.player.isInLava() && lavaShouldBeSolid()) { event.shape = VoxelShapes.fullCube(); } } @@ -305,10 +304,11 @@ private boolean isOverLiquid() { for (Box bb : blockCollisions) { blockPos.set(MathHelper.lerp(0.5D, bb.minX, bb.maxX), MathHelper.lerp(0.5D, bb.minY, bb.maxY), MathHelper.lerp(0.5D, bb.minZ, bb.maxZ)); - Material material = mc.world.getBlockState(blockPos).getMaterial(); + BlockState blockState = mc.world.getBlockState(blockPos); - if (material == Material.WATER || material == Material.LAVA) foundLiquid = true; - else if (material != Material.AIR) foundSolid = true; + if (blockState.getFluidState().isOf(Fluids.WATER) || blockState.getFluidState().isOf(Fluids.LAVA)) + foundLiquid = true; + else if (!blockState.isAir()) foundSolid = true; } return foundLiquid && !foundSolid; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoReplenish.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoReplenish.java index 705be4538c..a96403e2f7 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoReplenish.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoReplenish.java @@ -147,7 +147,7 @@ private int findItem(ItemStack itemStack, int excludedSlot, int goodEnoughCount) for (int i = mc.player.getInventory().size() - 2; i >= (searchHotbar.get() ? 0 : 9); i--) { ItemStack stack = mc.player.getInventory().getStack(i); - if (i != excludedSlot && stack.getItem() == itemStack.getItem() && ItemStack.areNbtEqual(itemStack, stack)) { + if (i != excludedSlot && stack.getItem() == itemStack.getItem() && ItemStack.canCombine(itemStack, stack)) { if (stack.getCount() > count) { slot = i; count = stack.getCount(); @@ -185,6 +185,6 @@ private void setItem(int slot, ItemStack stack) { ((ItemStackAccessor) (Object) s).setItem(stack.getItem()); s.setCount(stack.getCount()); s.setNbt(stack.getNbt()); - ((ItemStackAccessor) (Object) s).setEmpty(stack.isEmpty()); + if (stack.isEmpty()) ((ItemStackAccessor) (Object) s).setItem(Items.AIR); } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java index 09272fe507..5ddd6aa3c3 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java @@ -416,10 +416,10 @@ public void applyCompactShulkerTooltip(ItemStack stack, List tooltip) { private MutableText getStatusText(StatusEffectInstance effect) { MutableText text = Text.translatable(effect.getTranslationKey()); if (effect.getAmplifier() != 0) { - text.append(String.format(" %d (%s)", effect.getAmplifier() + 1, StatusEffectUtil.durationToString(effect, 1).getString())); + text.append(String.format(" %d (%s)", effect.getAmplifier() + 1, StatusEffectUtil.getDurationText(effect, 1).getString())); } else { - text.append(String.format(" (%s)", StatusEffectUtil.durationToString(effect, 1).getString())); + text.append(String.format(" (%s)", StatusEffectUtil.getDurationText(effect, 1).getString())); } if (effect.getEffectType().isBeneficial()) return text.formatted(Formatting.BLUE); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ItemPhysics.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ItemPhysics.java index 5647744f2b..72ac4c5958 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ItemPhysics.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ItemPhysics.java @@ -40,7 +40,7 @@ private void onRenderItemEntity(RenderItemEntityEvent event) { event.matrixStack.push(); - BakedModel bakedModel = event.itemRenderer.getModel(itemStack, event.itemEntity.world, null, 0); + BakedModel bakedModel = event.itemRenderer.getModel(itemStack, event.itemEntity.getWorld(), null, 0); boolean hasDepthInGui = bakedModel.hasDepth(); int renderCount = getRenderedAmount(itemStack); IItemEntity rotator = (IItemEntity) event.itemEntity; @@ -48,7 +48,7 @@ private void onRenderItemEntity(RenderItemEntityEvent event) { if (event.itemEntity.getStack().getItem() instanceof BlockItem && !(event.itemEntity.getStack().getItem() instanceof AliasedBlockItem)) { Block b = ((BlockItem) event.itemEntity.getStack().getItem()).getBlock(); - VoxelShape shape = b.getOutlineShape(b.getDefaultState(), event.itemEntity.world, event.itemEntity.getBlockPos(), ShapeContext.absent()); + VoxelShape shape = b.getOutlineShape(b.getDefaultState(), event.itemEntity.getWorld(), event.itemEntity.getBlockPos(), ShapeContext.absent()); if (shape.getMax(Direction.Axis.Y) <= .5) renderBlockFlat = true; } @@ -64,7 +64,7 @@ private void onRenderItemEntity(RenderItemEntityEvent event) { event.matrixStack.translate(0, -.185, -.0); } - boolean isAboveWater = event.itemEntity.world.getBlockState(event.itemEntity.getBlockPos()).getFluidState().getFluid().isIn(FluidTags.WATER); + boolean isAboveWater = event.itemEntity.getWorld().getBlockState(event.itemEntity.getBlockPos()).getFluidState().getFluid().isIn(FluidTags.WATER); if (!event.itemEntity.isOnGround() && (!event.itemEntity.isSubmergedInWater() && !isAboveWater)) { float rotation = ((float) event.itemEntity.getItemAge() + event.tickDelta) / 20.0F + event.itemEntity.uniqueOffset; // calculate rotation based on age and ticks @@ -102,7 +102,7 @@ private void onRenderItemEntity(RenderItemEntityEvent event) { event.matrixStack.translate(0, -.185, .0); } - if (event.itemEntity.world.getBlockState(event.itemEntity.getBlockPos()).getBlock().equals(Blocks.SOUL_SAND)) { + if (event.itemEntity.getWorld().getBlockState(event.itemEntity.getBlockPos()).getBlock().equals(Blocks.SOUL_SAND)) { event.matrixStack.translate(0, 0, -.1); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java index 1ecb5b718b..2b1133b999 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java @@ -331,7 +331,7 @@ private void onRender2D(Render2DEvent event) { EntityType type = entity.getType(); if (NametagUtils.to2D(pos, scale.get())) { - if (type == EntityType.PLAYER) renderNametagPlayer((PlayerEntity) entity, shadow); + if (type == EntityType.PLAYER) renderNametagPlayer(event, (PlayerEntity) entity, shadow); else if (type == EntityType.ITEM) renderNametagItem(((ItemEntity) entity).getStack(), shadow); else if (type == EntityType.ITEM_FRAME) renderNametagItem(((ItemFrameEntity) entity).getHeldItemStack(), shadow); @@ -362,9 +362,9 @@ private double getHeight(Entity entity) { return height; } - private void renderNametagPlayer(PlayerEntity player, boolean shadow) { + private void renderNametagPlayer(Render2DEvent event, PlayerEntity player, boolean shadow) { TextRenderer text = TextRenderer.get(); - NametagUtils.begin(pos); + NametagUtils.begin(pos, event.drawContext); // Gamemode GameMode gm = EntityUtils.getGameMode(player); @@ -489,7 +489,7 @@ private void renderNametagPlayer(PlayerEntity player, boolean shadow) { for (int i = 0; i < 6; i++) { ItemStack stack = getItem(player, i); - RenderUtils.drawItem(stack, (int) x, (int) y, 2, true); + RenderUtils.drawItem(event.drawContext, stack, (int) x, (int) y, 2, true); if (maxEnchantCount > 0 && displayEnchants.get()) { text.begin(0.5 * enchantTextScale.get(), false, true); @@ -536,7 +536,7 @@ private void renderNametagPlayer(PlayerEntity player, boolean shadow) { } } else if (displayEnchants.get()) displayEnchants.set(false); - NametagUtils.end(); + NametagUtils.end(event.drawContext); } private void renderNametagItem(ItemStack stack, boolean shadow) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AirPlace.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AirPlace.java index b882c37b2f..a7e8c9193d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AirPlace.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AirPlace.java @@ -93,7 +93,7 @@ private void onTick(TickEvent.Post event) { @EventHandler private void onRender(Render3DEvent event) { if (!(hitResult instanceof BlockHitResult) - || !mc.world.getBlockState(((BlockHitResult) hitResult).getBlockPos()).getMaterial().isReplaceable() + || !mc.world.getBlockState(((BlockHitResult) hitResult).getBlockPos()).isReplaceable() || !(mc.player.getMainHandStack().getItem() instanceof BlockItem) || !render.get()) return; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSign.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSign.java index eeb39c62fa..436de604e1 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSign.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSign.java @@ -40,7 +40,7 @@ private void onOpenScreen(OpenScreenEvent event) { SignBlockEntity sign = ((AbstractSignEditScreenAccessor) event.screen).getSign(); - mc.player.networkHandler.sendPacket(new UpdateSignC2SPacket(sign.getPos(), text[0], text[1], text[2], text[3])); + mc.player.networkHandler.sendPacket(new UpdateSignC2SPacket(sign.getPos(), true, text[0], text[1], text[2], text[3])); event.cancel(); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/EChestFarmer.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/EChestFarmer.java index a1acc3395d..dc4a2bded9 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/EChestFarmer.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/EChestFarmer.java @@ -127,10 +127,9 @@ private void onTick(TickEvent.Pre event) { BlockPos pos = ((BlockHitResult) mc.crosshairTarget).getBlockPos().up(); BlockState state = mc.world.getBlockState(pos); - if (state.getMaterial().isReplaceable() || state.getBlock() == Blocks.ENDER_CHEST) { + if (state.isReplaceable() || state.getBlock() == Blocks.ENDER_CHEST) { target = ((BlockHitResult) mc.crosshairTarget).getBlockPos().up(); - } - else return; + } else return; } // Disable if the block is too far away @@ -171,7 +170,7 @@ private void onTick(TickEvent.Pre event) { } // Place echest if the target pos is empty - if (mc.world.getBlockState(target).getMaterial().isReplaceable()) { + if (mc.world.getBlockState(target).isReplaceable()) { FindItemResult echest = InvUtils.findInHotbar(Items.ENDER_CHEST); if (!echest.found()) { diff --git a/src/main/java/meteordevelopment/meteorclient/utils/Utils.java b/src/main/java/meteordevelopment/meteorclient/utils/Utils.java index 8ed7addd20..883b56c39a 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/Utils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/Utils.java @@ -6,6 +6,8 @@ package meteordevelopment.meteorclient.utils; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.systems.VertexSorter; +import it.unimi.dsi.fastutil.objects.Object2BooleanOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2IntArrayMap; import it.unimi.dsi.fastutil.objects.Object2IntMap; import meteordevelopment.meteorclient.MeteorClient; @@ -70,6 +72,7 @@ public class Utils { public static boolean rendering3D = true; public static double frameTime; public static Screen screenToOpen; + public static VertexSorter vertexSorter; public static final Pattern FILE_NAME_INVALID_CHARS_PATTERN = Pattern.compile("[\\s\\\\/:*?\"<>|]"); @@ -166,12 +169,13 @@ public static int getWindowHeight() { } public static void unscaledProjection() { - RenderSystem.setProjectionMatrix(new Matrix4f().setOrtho(0, mc.getWindow().getFramebufferWidth(), mc.getWindow().getFramebufferHeight(), 0, 1000, 3000)); + vertexSorter = RenderSystem.getVertexSorting(); + RenderSystem.setProjectionMatrix(new Matrix4f().setOrtho(0, mc.getWindow().getFramebufferWidth(), mc.getWindow().getFramebufferHeight(), 0, 1000, 21000), VertexSorter.BY_Z); rendering3D = false; } public static void scaledProjection() { - RenderSystem.setProjectionMatrix(new Matrix4f().setOrtho(0, (float) (mc.getWindow().getFramebufferWidth() / mc.getWindow().getScaleFactor()), (float) (mc.getWindow().getFramebufferHeight() / mc.getWindow().getScaleFactor()), 0, 1000, 3000)); + RenderSystem.setProjectionMatrix(new Matrix4f().setOrtho(0, (float) (mc.getWindow().getFramebufferWidth() / mc.getWindow().getScaleFactor()), (float) (mc.getWindow().getFramebufferHeight() / mc.getWindow().getScaleFactor()), 0, 1000, 21000), vertexSorter); rendering3D = true; } @@ -348,71 +352,71 @@ public static String titleToName(String title) { } public static String getKeyName(int key) { - switch (key) { - case GLFW_KEY_UNKNOWN: return "Unknown"; - case GLFW_KEY_ESCAPE: return "Esc"; - case GLFW_KEY_GRAVE_ACCENT: return "Grave Accent"; - case GLFW_KEY_WORLD_1: return "World 1"; - case GLFW_KEY_WORLD_2: return "World 2"; - case GLFW_KEY_PRINT_SCREEN: return "Print Screen"; - case GLFW_KEY_PAUSE: return "Pause"; - case GLFW_KEY_INSERT: return "Insert"; - case GLFW_KEY_DELETE: return "Delete"; - case GLFW_KEY_HOME: return "Home"; - case GLFW_KEY_PAGE_UP: return "Page Up"; - case GLFW_KEY_PAGE_DOWN: return "Page Down"; - case GLFW_KEY_END: return "End"; - case GLFW_KEY_TAB: return "Tab"; - case GLFW_KEY_LEFT_CONTROL: return "Left Control"; - case GLFW_KEY_RIGHT_CONTROL: return "Right Control"; - case GLFW_KEY_LEFT_ALT: return "Left Alt"; - case GLFW_KEY_RIGHT_ALT: return "Right Alt"; - case GLFW_KEY_LEFT_SHIFT: return "Left Shift"; - case GLFW_KEY_RIGHT_SHIFT: return "Right Shift"; - case GLFW_KEY_UP: return "Arrow Up"; - case GLFW_KEY_DOWN: return "Arrow Down"; - case GLFW_KEY_LEFT: return "Arrow Left"; - case GLFW_KEY_RIGHT: return "Arrow Right"; - case GLFW_KEY_APOSTROPHE: return "Apostrophe"; - case GLFW_KEY_BACKSPACE: return "Backspace"; - case GLFW_KEY_CAPS_LOCK: return "Caps Lock"; - case GLFW_KEY_MENU: return "Menu"; - case GLFW_KEY_LEFT_SUPER: return "Left Super"; - case GLFW_KEY_RIGHT_SUPER: return "Right Super"; - case GLFW_KEY_ENTER: return "Enter"; - case GLFW_KEY_KP_ENTER: return "Numpad Enter"; - case GLFW_KEY_NUM_LOCK: return "Num Lock"; - case GLFW_KEY_SPACE: return "Space"; - case GLFW_KEY_F1: return "F1"; - case GLFW_KEY_F2: return "F2"; - case GLFW_KEY_F3: return "F3"; - case GLFW_KEY_F4: return "F4"; - case GLFW_KEY_F5: return "F5"; - case GLFW_KEY_F6: return "F6"; - case GLFW_KEY_F7: return "F7"; - case GLFW_KEY_F8: return "F8"; - case GLFW_KEY_F9: return "F9"; - case GLFW_KEY_F10: return "F10"; - case GLFW_KEY_F11: return "F11"; - case GLFW_KEY_F12: return "F12"; - case GLFW_KEY_F13: return "F13"; - case GLFW_KEY_F14: return "F14"; - case GLFW_KEY_F15: return "F15"; - case GLFW_KEY_F16: return "F16"; - case GLFW_KEY_F17: return "F17"; - case GLFW_KEY_F18: return "F18"; - case GLFW_KEY_F19: return "F19"; - case GLFW_KEY_F20: return "F20"; - case GLFW_KEY_F21: return "F21"; - case GLFW_KEY_F22: return "F22"; - case GLFW_KEY_F23: return "F23"; - case GLFW_KEY_F24: return "F24"; - case GLFW_KEY_F25: return "F25"; - default: + return switch (key) { + case GLFW_KEY_UNKNOWN -> "Unknown"; + case GLFW_KEY_ESCAPE -> "Esc"; + case GLFW_KEY_GRAVE_ACCENT -> "Grave Accent"; + case GLFW_KEY_WORLD_1 -> "World 1"; + case GLFW_KEY_WORLD_2 -> "World 2"; + case GLFW_KEY_PRINT_SCREEN -> "Print Screen"; + case GLFW_KEY_PAUSE -> "Pause"; + case GLFW_KEY_INSERT -> "Insert"; + case GLFW_KEY_DELETE -> "Delete"; + case GLFW_KEY_HOME -> "Home"; + case GLFW_KEY_PAGE_UP -> "Page Up"; + case GLFW_KEY_PAGE_DOWN -> "Page Down"; + case GLFW_KEY_END -> "End"; + case GLFW_KEY_TAB -> "Tab"; + case GLFW_KEY_LEFT_CONTROL -> "Left Control"; + case GLFW_KEY_RIGHT_CONTROL -> "Right Control"; + case GLFW_KEY_LEFT_ALT -> "Left Alt"; + case GLFW_KEY_RIGHT_ALT -> "Right Alt"; + case GLFW_KEY_LEFT_SHIFT -> "Left Shift"; + case GLFW_KEY_RIGHT_SHIFT -> "Right Shift"; + case GLFW_KEY_UP -> "Arrow Up"; + case GLFW_KEY_DOWN -> "Arrow Down"; + case GLFW_KEY_LEFT -> "Arrow Left"; + case GLFW_KEY_RIGHT -> "Arrow Right"; + case GLFW_KEY_APOSTROPHE -> "Apostrophe"; + case GLFW_KEY_BACKSPACE -> "Backspace"; + case GLFW_KEY_CAPS_LOCK -> "Caps Lock"; + case GLFW_KEY_MENU -> "Menu"; + case GLFW_KEY_LEFT_SUPER -> "Left Super"; + case GLFW_KEY_RIGHT_SUPER -> "Right Super"; + case GLFW_KEY_ENTER -> "Enter"; + case GLFW_KEY_KP_ENTER -> "Numpad Enter"; + case GLFW_KEY_NUM_LOCK -> "Num Lock"; + case GLFW_KEY_SPACE -> "Space"; + case GLFW_KEY_F1 -> "F1"; + case GLFW_KEY_F2 -> "F2"; + case GLFW_KEY_F3 -> "F3"; + case GLFW_KEY_F4 -> "F4"; + case GLFW_KEY_F5 -> "F5"; + case GLFW_KEY_F6 -> "F6"; + case GLFW_KEY_F7 -> "F7"; + case GLFW_KEY_F8 -> "F8"; + case GLFW_KEY_F9 -> "F9"; + case GLFW_KEY_F10 -> "F10"; + case GLFW_KEY_F11 -> "F11"; + case GLFW_KEY_F12 -> "F12"; + case GLFW_KEY_F13 -> "F13"; + case GLFW_KEY_F14 -> "F14"; + case GLFW_KEY_F15 -> "F15"; + case GLFW_KEY_F16 -> "F16"; + case GLFW_KEY_F17 -> "F17"; + case GLFW_KEY_F18 -> "F18"; + case GLFW_KEY_F19 -> "F19"; + case GLFW_KEY_F20 -> "F20"; + case GLFW_KEY_F21 -> "F21"; + case GLFW_KEY_F22 -> "F22"; + case GLFW_KEY_F23 -> "F23"; + case GLFW_KEY_F24 -> "F24"; + case GLFW_KEY_F25 -> "F25"; + default -> { String keyName = glfwGetKeyName(key, 0); - if (keyName == null) return "Unknown"; - return StringUtils.capitalize(keyName); - } + yield keyName == null ? "Unknown" : StringUtils.capitalize(keyName); + } + }; } public static String getButtonName(int button) { diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityUtils.java index 4014e3e0aa..0736545c4b 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityUtils.java @@ -73,7 +73,7 @@ public static boolean isAboveWater(Entity entity) { for (int i = 0; i < 64; i++) { BlockState state = mc.world.getBlockState(blockPos); - if (state.getMaterial().blocksMovement()) break; + if (state.blocksMovement()) break; Fluid fluid = state.getFluidState().getFluid(); if (fluid == Fluids.WATER || fluid == Fluids.FLOWING_WATER) { diff --git a/src/main/java/meteordevelopment/meteorclient/utils/notebot/instrumentdetect/InstrumentDetectMode.java b/src/main/java/meteordevelopment/meteorclient/utils/notebot/instrumentdetect/InstrumentDetectMode.java index 37d0da24ba..c6a5787f0c 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/notebot/instrumentdetect/InstrumentDetectMode.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/notebot/instrumentdetect/InstrumentDetectMode.java @@ -6,13 +6,11 @@ package meteordevelopment.meteorclient.utils.notebot.instrumentdetect; import net.minecraft.block.NoteBlock; -import net.minecraft.block.enums.Instrument; import net.minecraft.client.MinecraftClient; public enum InstrumentDetectMode { BlockState(((noteBlock, blockPos) -> noteBlock.get(NoteBlock.INSTRUMENT))), - BelowBlock(((noteBlock, blockPos) -> Instrument.fromBelowState(MinecraftClient.getInstance().world.getBlockState(blockPos.down())))) - ; + BelowBlock(((noteBlock, blockPos) -> MinecraftClient.getInstance().world.getBlockState(blockPos.down()).getInstrument())); private final InstrumentDetectFunction instrumentDetectFunction; diff --git a/src/main/java/meteordevelopment/meteorclient/utils/player/SlotUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/player/SlotUtils.java index 82b6c56fcd..a41583964f 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/player/SlotUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/player/SlotUtils.java @@ -15,6 +15,7 @@ import net.minecraft.entity.passive.HorseEntity; import net.minecraft.entity.passive.LlamaEntity; import net.minecraft.item.ItemGroups; +import net.minecraft.registry.Registries; import net.minecraft.screen.*; import static meteordevelopment.meteorclient.MeteorClient.mc; @@ -36,26 +37,26 @@ public static int indexToId(int i) { ScreenHandler handler = mc.player.currentScreenHandler; if (handler instanceof PlayerScreenHandler) return survivalInventory(i); - else if (handler instanceof CreativeInventoryScreen.CreativeScreenHandler) return creativeInventory(i); - else if (handler instanceof GenericContainerScreenHandler) return genericContainer(i, ((GenericContainerScreenHandler) handler).getRows()); - else if (handler instanceof CraftingScreenHandler) return craftingTable(i); - else if (handler instanceof FurnaceScreenHandler) return furnace(i); - else if (handler instanceof BlastFurnaceScreenHandler) return furnace(i); - else if (handler instanceof SmokerScreenHandler) return furnace(i); - else if (handler instanceof Generic3x3ContainerScreenHandler) return generic3x3(i); - else if (handler instanceof EnchantmentScreenHandler) return enchantmentTable(i); - else if (handler instanceof BrewingStandScreenHandler) return brewingStand(i); - else if (handler instanceof MerchantScreenHandler) return villager(i); - else if (handler instanceof BeaconScreenHandler) return beacon(i); - else if (handler instanceof AnvilScreenHandler) return anvil(i); - else if (handler instanceof HopperScreenHandler) return hopper(i); - else if (handler instanceof ShulkerBoxScreenHandler) return genericContainer(i, 3); - else if (handler instanceof HorseScreenHandler) return horse(handler, i); - else if (handler instanceof CartographyTableScreenHandler) return cartographyTable(i); - else if (handler instanceof GrindstoneScreenHandler) return grindstone(i); - else if (handler instanceof LecternScreenHandler) return lectern(); - else if (handler instanceof LoomScreenHandler) return loom(i); - else if (handler instanceof StonecutterScreenHandler) return stonecutter(i); + if (handler instanceof CreativeInventoryScreen.CreativeScreenHandler) return creativeInventory(i); + if (handler instanceof GenericContainerScreenHandler genericContainerScreenHandler) return genericContainer(i, genericContainerScreenHandler.getRows()); + if (handler instanceof CraftingScreenHandler) return craftingTable(i); + if (handler instanceof FurnaceScreenHandler) return furnace(i); + if (handler instanceof BlastFurnaceScreenHandler) return furnace(i); + if (handler instanceof SmokerScreenHandler) return furnace(i); + if (handler instanceof Generic3x3ContainerScreenHandler) return generic3x3(i); + if (handler instanceof EnchantmentScreenHandler) return enchantmentTable(i); + if (handler instanceof BrewingStandScreenHandler) return brewingStand(i); + if (handler instanceof MerchantScreenHandler) return villager(i); + if (handler instanceof BeaconScreenHandler) return beacon(i); + if (handler instanceof AnvilScreenHandler) return anvil(i); + if (handler instanceof HopperScreenHandler) return hopper(i); + if (handler instanceof ShulkerBoxScreenHandler) return genericContainer(i, 3); + if (handler instanceof HorseScreenHandler) return horse(handler, i); + if (handler instanceof CartographyTableScreenHandler) return cartographyTable(i); + if (handler instanceof GrindstoneScreenHandler) return grindstone(i); + if (handler instanceof LecternScreenHandler) return lectern(); + if (handler instanceof LoomScreenHandler) return loom(i); + if (handler instanceof StonecutterScreenHandler) return stonecutter(i); return -1; } @@ -67,7 +68,8 @@ private static int survivalInventory(int i) { } private static int creativeInventory(int i) { - if (!(mc.currentScreen instanceof CreativeInventoryScreen) || CreativeInventoryScreenAccessor.getSelectedTab() != ItemGroups.INVENTORY) return -1; + if (!(mc.currentScreen instanceof CreativeInventoryScreen) || CreativeInventoryScreenAccessor.getSelectedTab() != Registries.ITEM_GROUP.get(ItemGroups.INVENTORY)) + return -1; return survivalInventory(i); } @@ -134,8 +136,8 @@ private static int hopper(int i) { private static int horse(ScreenHandler handler, int i) { AbstractHorseEntity entity = ((HorseScreenHandlerAccessor) handler).getEntity(); - if (entity instanceof LlamaEntity) { - int strength = ((LlamaEntity) entity).getStrength(); + if (entity instanceof LlamaEntity llamaEntity) { + int strength = llamaEntity.getStrength(); if (isHotbar(i)) return (2 + 3 * strength) + 28 + i; if (isMain(i)) return (2 + 3 * strength) + 1 + (i - 9); } @@ -143,8 +145,8 @@ else if (entity instanceof HorseEntity || entity instanceof SkeletonHorseEntity if (isHotbar(i)) return 29 + i; if (isMain(i)) return 2 + (i - 9); } - else if (entity instanceof AbstractDonkeyEntity) { - boolean chest = ((AbstractDonkeyEntity) entity).hasChest(); + else if (entity instanceof AbstractDonkeyEntity abstractDonkeyEntity) { + boolean chest = abstractDonkeyEntity.hasChest(); if (isHotbar(i)) return (chest ? 44 : 29) + i; if (isMain(i)) return (chest ? 17 : 2) + (i - 9); } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/player/TitleScreenCredits.java b/src/main/java/meteordevelopment/meteorclient/utils/player/TitleScreenCredits.java index 7627e7b83e..f0fc734375 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/player/TitleScreenCredits.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/player/TitleScreenCredits.java @@ -14,7 +14,10 @@ import meteordevelopment.meteorclient.utils.network.Http; import meteordevelopment.meteorclient.utils.network.MeteorExecutor; import meteordevelopment.meteorclient.utils.render.color.Color; -import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.render.BufferBuilder; +import net.minecraft.client.render.VertexConsumerProvider; import java.util.ArrayList; import java.util.Comparator; @@ -73,7 +76,7 @@ private static void add(MeteorAddon addon) { credits.add(credit); } - public static void render(MatrixStack matrices) { + public static void render(DrawContext context) { if (credits.isEmpty()) init(); int y = 3; @@ -82,7 +85,7 @@ public static void render(MatrixStack matrices) { synchronized (credit.sections) { for (Section section : credit.sections) { - mc.textRenderer.drawWithShadow(matrices, section.text, x, y, section.color); + context.drawTextWithShadow(mc.textRenderer, section.text, x, y, section.color); x += section.width; } } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/MeteorToast.java b/src/main/java/meteordevelopment/meteorclient/utils/render/MeteorToast.java index e44391f0de..1aec6d3760 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/MeteorToast.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/MeteorToast.java @@ -7,12 +7,12 @@ import com.mojang.blaze3d.systems.RenderSystem; import meteordevelopment.meteorclient.utils.render.color.Color; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.render.GameRenderer; import net.minecraft.client.sound.PositionedSoundInstance; import net.minecraft.client.sound.SoundInstance; import net.minecraft.client.toast.Toast; import net.minecraft.client.toast.ToastManager; -import net.minecraft.client.util.math.MatrixStack; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.sound.SoundEvents; @@ -47,29 +47,29 @@ public MeteorToast(@Nullable Item item, @NotNull String title, @Nullable String this.duration = 6000; } - public Visibility draw(MatrixStack matrices, ToastManager toastManager, long currentTime) { + @Override + public Visibility draw(DrawContext context, ToastManager toastManager, long currentTime) { if (justUpdated) { start = currentTime; justUpdated = false; } RenderSystem.setShader(GameRenderer::getPositionTexProgram); - RenderSystem.setShaderTexture(0, TEXTURE); RenderSystem.setShaderColor(1, 1, 1, 1); - toastManager.drawTexture(matrices, 0, 0, 0, 0, getWidth(), getHeight()); + context.drawTexture(TEXTURE, 0, 0, 0, 0, getWidth(), getHeight()); int x = icon != null ? 28 : 12; int titleY = 12; if (text != null) { - mc.textRenderer.draw(matrices, text, x, 18, TEXT_COLOR); + context.drawText(mc.textRenderer, title, x, 18, TITLE_COLOR, false); titleY = 7; } - mc.textRenderer.draw(matrices, title, x, titleY, TITLE_COLOR); + context.drawText(mc.textRenderer, title, x, titleY, TITLE_COLOR, false); - if (icon != null) mc.getItemRenderer().renderInGui(matrices, icon, 8, 8); + if (icon != null) context.drawItem(icon, 8, 8); if (!playedSound) { mc.getSoundManager().play(getSound()); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/NametagUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/render/NametagUtils.java index 468ed32ba1..8b6d50f0ea 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/NametagUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/NametagUtils.java @@ -7,6 +7,7 @@ import com.mojang.blaze3d.systems.RenderSystem; import meteordevelopment.meteorclient.utils.Utils; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.util.math.MatrixStack; import org.joml.Matrix4f; import org.joml.Vector3d; @@ -77,7 +78,15 @@ public static boolean to2D(Vector3d pos, double scale, boolean distanceScaling, public static void begin(Vector3d pos) { MatrixStack matrices = RenderSystem.getModelViewStack(); + begin(matrices, pos); + } + + public static void begin(Vector3d pos, DrawContext drawContext) { + begin(pos); + begin(drawContext.getMatrices(), pos); + } + private static void begin(MatrixStack matrices, Vector3d pos) { matrices.push(); matrices.translate(pos.x, pos.y, 0); matrices.scale((float) scale, (float) scale, 1); @@ -87,6 +96,11 @@ public static void end() { RenderSystem.getModelViewStack().pop(); } + public static void end(DrawContext drawContext) { + end(); + drawContext.getMatrices().pop(); + } + private static double getScale(Vector3d pos) { double dist = camera.distance(pos); return Utils.clamp(1 - dist * 0.01, 0.5, Integer.MAX_VALUE); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/PeekScreen.java b/src/main/java/meteordevelopment/meteorclient/utils/render/PeekScreen.java index 7f08a193a8..60a439bf66 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/PeekScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/PeekScreen.java @@ -10,9 +10,9 @@ import meteordevelopment.meteorclient.systems.modules.render.BetterTooltips; import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.render.color.Color; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.ingame.ShulkerBoxScreen; import net.minecraft.client.render.GameRenderer; -import net.minecraft.client.util.math.MatrixStack; import net.minecraft.inventory.SimpleInventory; import net.minecraft.item.ItemStack; import net.minecraft.screen.ShulkerBoxScreenHandler; @@ -50,7 +50,7 @@ public boolean mouseReleased(double mouseX, double mouseY, int button) { @Override public boolean keyPressed(int keyCode, int scanCode, int modifiers) { if (keyCode == GLFW.GLFW_KEY_ESCAPE) { - this.close(); + close(); return true; } return false; @@ -59,22 +59,21 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) { @Override public boolean keyReleased(int keyCode, int scanCode, int modifiers) { if (keyCode == GLFW.GLFW_KEY_ESCAPE) { - this.close(); + close(); return true; } return false; } @Override - protected void drawBackground(MatrixStack matrices, float delta, int mouseX, int mouseY) { + protected void drawBackground(DrawContext context, float delta, int mouseX, int mouseY) { Color color = Utils.getShulkerColor(storageBlock); RenderSystem.setShader(GameRenderer::getPositionTexProgram); RenderSystem.setShaderColor(color.r / 255f, color.g / 255f, color.b / 255f, color.a / 255f); - RenderSystem.setShaderTexture(0, TEXTURE); - int i = (this.width - this.backgroundWidth) / 2; - int j = (this.height - this.backgroundHeight) / 2; - drawTexture(matrices, i, j, 0, 0, this.backgroundWidth, this.backgroundHeight); + int i = (width - backgroundWidth) / 2; + int j = (height - backgroundHeight) / 2; + context.drawTexture(TEXTURE, i, j, 0, 0, backgroundWidth, backgroundHeight); RenderSystem.setShaderColor(1, 1, 1, 1); } } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/RenderUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/render/RenderUtils.java index 305512c315..99dfc3c3a5 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/RenderUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/RenderUtils.java @@ -14,6 +14,7 @@ import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.orbit.EventHandler; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.Entity; import net.minecraft.entity.player.PlayerEntity; @@ -31,8 +32,6 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; public class RenderUtils { - private static final MatrixStack MATRICES = new MatrixStack(); - public static Vec3d center; private static final Pool renderBlockPool = new Pool<>(RenderBlock::new); @@ -44,22 +43,23 @@ public static void init() { } // Items - public static void drawItem(ItemStack itemStack, int x, int y, float scale, boolean overlay) { - MATRICES.push(); - MATRICES.scale(scale, scale, 1f); - MATRICES.translate(0, 0, 401); // Thanks Mojang + public static void drawItem(DrawContext drawContext, ItemStack itemStack, int x, int y, float scale, boolean overlay, String countOverride) { + MatrixStack matrices = drawContext.getMatrices(); + matrices.push(); + matrices.scale(scale, scale, 1f); + matrices.translate(0, 0, 401); // Thanks Mojang int scaledX = (int) (x / scale); int scaledY = (int) (y / scale); - mc.getItemRenderer().renderInGuiWithOverrides(MATRICES, itemStack, scaledX, scaledY); - if (overlay) mc.getItemRenderer().renderGuiItemOverlay(MATRICES, mc.textRenderer, itemStack, scaledX, scaledY, null); + drawContext.drawItem(itemStack, scaledX, scaledY); + if (overlay) drawContext.drawItemInSlot(mc.textRenderer, itemStack, scaledX, scaledY, countOverride); - MATRICES.pop(); + matrices.pop(); } - public static void drawItem(ItemStack itemStack, int x, int y, boolean overlay) { - drawItem(itemStack, x, y, 1, overlay); + public static void drawItem(DrawContext drawContext, ItemStack itemStack, int x, int y, float scale, boolean overlay) { + drawItem(drawContext, itemStack, x, y, scale, overlay, null); } public static void updateScreenCenter() { @@ -111,7 +111,7 @@ public static void renderTickingBlock(BlockPos blockPos, Color sideColor, Color @EventHandler private static void onTick(TickEvent.Pre event) { - if (renderBlocks.size() == 0) return; + if (renderBlocks.isEmpty()) return; renderBlocks.forEach(RenderBlock::tick); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/tooltip/BannerTooltipComponent.java b/src/main/java/meteordevelopment/meteorclient/utils/tooltip/BannerTooltipComponent.java index a77c4a48d9..765c4dce0e 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/tooltip/BannerTooltipComponent.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/tooltip/BannerTooltipComponent.java @@ -7,6 +7,7 @@ import net.minecraft.block.entity.BannerBlockEntity; import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.tooltip.TooltipComponent; import net.minecraft.client.model.ModelPart; import net.minecraft.client.render.DiffuseLighting; @@ -14,7 +15,6 @@ import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.block.entity.BannerBlockEntityRenderer; import net.minecraft.client.render.entity.model.EntityModelLayers; -import net.minecraft.client.render.item.ItemRenderer; import net.minecraft.client.render.model.ModelLoader; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.item.BannerItem; @@ -47,8 +47,9 @@ public int getWidth(TextRenderer textRenderer) { } @Override - public void drawItems(TextRenderer textRenderer, int x, int y, MatrixStack matrices, ItemRenderer itemRenderer) { + public void drawItems(TextRenderer textRenderer, int x, int y, DrawContext context) { DiffuseLighting.disableGuiDepthLighting(); + MatrixStack matrices = context.getMatrices(); matrices.push(); matrices.translate(x + 8, y + 8, 0); @@ -60,19 +61,19 @@ public void drawItems(TextRenderer textRenderer, int x, int y, MatrixStack matri matrices.translate(2.5, 8.5, 0); matrices.scale(5, 5, 5); VertexConsumerProvider.Immediate immediate = mc.getBufferBuilders().getEntityVertexConsumers(); - this.bannerField.pitch = 0f; - this.bannerField.pivotY = -32f; + bannerField.pitch = 0f; + bannerField.pivotY = -32f; BannerBlockEntityRenderer.renderCanvas( matrices, immediate, 0xF000F0, OverlayTexture.DEFAULT_UV, - this.bannerField, + bannerField, ModelLoader.BANNER_BASE, true, BannerBlockEntity.getPatternsFromNbt( - ((BannerItem) this.banner.getItem()).getColor(), - BannerBlockEntity.getPatternListNbt(this.banner) + ((BannerItem) banner.getItem()).getColor(), + BannerBlockEntity.getPatternListNbt(banner) ) ); matrices.pop(); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/tooltip/BookTooltipComponent.java b/src/main/java/meteordevelopment/meteorclient/utils/tooltip/BookTooltipComponent.java index 11d66d6ca4..d484e305e9 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/tooltip/BookTooltipComponent.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/tooltip/BookTooltipComponent.java @@ -7,10 +7,9 @@ import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.DrawableHelper; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.tooltip.TooltipComponent; import net.minecraft.client.render.GameRenderer; -import net.minecraft.client.render.item.ItemRenderer; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.text.OrderedText; import net.minecraft.text.Text; @@ -41,19 +40,19 @@ public int getWidth(TextRenderer textRenderer) { } @Override - public void drawItems(TextRenderer textRenderer, int x, int y, MatrixStack matrices, ItemRenderer itemRenderer) { + public void drawItems(TextRenderer textRenderer, int x, int y, DrawContext context) { // Background RenderSystem.setShader(GameRenderer::getPositionTexProgram); - RenderSystem.setShaderTexture(0, TEXTURE_BOOK_BACKGROUND); - DrawableHelper.drawTexture(matrices, x, y, 0, 12, 0, 112, 134, 179, 179); + context.drawTexture(TEXTURE_BOOK_BACKGROUND, x, y, 0, 12, 0, 112, 134, 179, 179); // Content + MatrixStack matrices = context.getMatrices(); matrices.push(); matrices.translate(x + 16, y + 12, 1); matrices.scale(0.7f, 0.7f, 1f); int offset = 0; for (OrderedText line : textRenderer.wrapLines(page, 112)) { - textRenderer.draw(matrices, line, 0, offset, 0x000000); + context.drawText(textRenderer, line, 0, offset, 0x000000, false); offset += 8; } matrices.pop(); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/tooltip/ContainerTooltipComponent.java b/src/main/java/meteordevelopment/meteorclient/utils/tooltip/ContainerTooltipComponent.java index 62081bbbe1..50f2ed65f3 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/tooltip/ContainerTooltipComponent.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/tooltip/ContainerTooltipComponent.java @@ -10,11 +10,9 @@ import meteordevelopment.meteorclient.utils.render.RenderUtils; import meteordevelopment.meteorclient.utils.render.color.Color; import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.DrawableHelper; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.tooltip.TooltipComponent; import net.minecraft.client.render.GameRenderer; -import net.minecraft.client.render.item.ItemRenderer; -import net.minecraft.client.util.math.MatrixStack; import net.minecraft.item.ItemStack; import net.minecraft.util.Identifier; import net.minecraft.util.collection.DefaultedList; @@ -46,20 +44,19 @@ public int getWidth(TextRenderer textRenderer) { } @Override - public void drawItems(TextRenderer textRenderer, int x, int y, MatrixStack matrices, ItemRenderer itemRenderer) { + public void drawItems(TextRenderer textRenderer, int x, int y, DrawContext context) { // Background RenderSystem.setShader(GameRenderer::getPositionTexProgram); RenderSystem.setShaderColor(color.r / 255f, color.g / 255f, color.b / 255f, color.a / 255f); - RenderSystem.setShaderTexture(0, TEXTURE_CONTAINER_BACKGROUND); - DrawableHelper.drawTexture(matrices, x, y, 0, 0, 0, 176, 67, 176, 67); + context.drawTexture(TEXTURE_CONTAINER_BACKGROUND, x, y, 0, 0, 0, 176, 67, 176, 67); RenderSystem.setShaderColor(1, 1, 1, 1); //Contents int row = 0; int i = 0; for (ItemStack itemStack : items) { - RenderUtils.drawItem(itemStack, x + 8 + i * 18, y + 7 + row * 18, true); + RenderUtils.drawItem(context, itemStack, x + 8 + i * 18, y + 7 + row * 18, 1, true); i++; if (i >= 9) { diff --git a/src/main/java/meteordevelopment/meteorclient/utils/tooltip/EntityTooltipComponent.java b/src/main/java/meteordevelopment/meteorclient/utils/tooltip/EntityTooltipComponent.java index 5dc7eb0b29..a980777133 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/tooltip/EntityTooltipComponent.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/tooltip/EntityTooltipComponent.java @@ -6,11 +6,11 @@ package meteordevelopment.meteorclient.utils.tooltip; import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.tooltip.TooltipComponent; import net.minecraft.client.render.DiffuseLighting; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.entity.EntityRenderDispatcher; -import net.minecraft.client.render.item.ItemRenderer; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; @@ -46,11 +46,12 @@ public int getWidth(TextRenderer textRenderer) { } @Override - public void drawItems(TextRenderer textRenderer, int x, int y, MatrixStack matrices, ItemRenderer itemRenderer) { + public void drawItems(TextRenderer textRenderer, int x, int y, DrawContext context) { + MatrixStack matrices = context.getMatrices(); matrices.push(); matrices.translate(15, 2, 0); - this.entity.setVelocity(1.f, 1.f, 1.f); - this.renderEntity(matrices, x, y); + entity.setVelocity(1.f, 1.f, 1.f); + renderEntity(matrices, x, y); matrices.pop(); } @@ -108,13 +109,13 @@ public void hamiltonProduct(Quaternionf q, Quaternionf other) { } protected void setupAngles() { - float yaw = (float) (((System.currentTimeMillis() / 10)) % 360); + float yaw = (((float) System.currentTimeMillis() / 10) % 360); entity.setYaw(yaw); entity.setHeadYaw(yaw); entity.setPitch(0.f); - if (entity instanceof LivingEntity) { - if (entity instanceof GoatEntity) ((LivingEntity) entity).headYaw = yaw; - ((LivingEntity) entity).bodyYaw = yaw; + if (entity instanceof LivingEntity livingEntity) { + if (entity instanceof GoatEntity) livingEntity.headYaw = yaw; + livingEntity.bodyYaw = yaw; } } } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/tooltip/MapTooltipComponent.java b/src/main/java/meteordevelopment/meteorclient/utils/tooltip/MapTooltipComponent.java index bc3173791f..2b1f991f18 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/tooltip/MapTooltipComponent.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/tooltip/MapTooltipComponent.java @@ -9,11 +9,10 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.BetterTooltips; import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.DrawableHelper; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.tooltip.TooltipComponent; import net.minecraft.client.render.GameRenderer; import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.item.ItemRenderer; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.item.FilledMapItem; import net.minecraft.item.map.MapState; @@ -47,28 +46,28 @@ public TooltipComponent getComponent() { } @Override - public void drawItems(TextRenderer textRenderer, int x, int y, MatrixStack matrices, ItemRenderer itemRenderer) { + public void drawItems(TextRenderer textRenderer, int x, int y, DrawContext context) { double scale = Modules.get().get(BetterTooltips.class).mapsScale.get(); // Background + MatrixStack matrices = context.getMatrices(); matrices.push(); matrices.translate(x, y, 0); matrices.scale((float) (scale) * 2, (float) (scale) * 2, 0); matrices.scale((64 + 8) / 64f, (64 + 8) / 64f, 0); RenderSystem.setShader(GameRenderer::getPositionTexProgram); - RenderSystem.setShaderTexture(0, TEXTURE_MAP_BACKGROUND); - DrawableHelper.drawTexture(matrices, 0, 0, 0, 0, 0, 64, 64, 64, 64); + context.drawTexture(TEXTURE_MAP_BACKGROUND, 0, 0, 0, 0, 0, 64, 64, 64, 64); matrices.pop(); // Contents VertexConsumerProvider.Immediate consumer = mc.getBufferBuilders().getEntityVertexConsumers(); - MapState mapState = FilledMapItem.getMapState(this.mapId, mc.world); + MapState mapState = FilledMapItem.getMapState(mapId, mc.world); if (mapState == null) return; matrices.push(); matrices.translate(x, y, 0); matrices.scale((float) scale, (float) scale, 0); matrices.translate(8, 8, 0); - mc.gameRenderer.getMapRenderer().draw(matrices, consumer, this.mapId, mapState, false, 0xF000F0); + mc.gameRenderer.getMapRenderer().draw(matrices, consumer, mapId, mapState, false, 0xF000F0); consumer.draw(); matrices.pop(); } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java index c151027bef..2ebc57c29b 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java @@ -135,7 +135,7 @@ public static boolean canPlace(BlockPos blockPos, boolean checkEntities) { if (!World.isValid(blockPos)) return false; // Check if current block is replaceable - if (!mc.world.getBlockState(blockPos).getMaterial().isReplaceable()) return false; + if (!mc.world.getBlockState(blockPos).isReplaceable()) return false; // Check if intersects entities return !checkEntities || mc.world.canPlace(Blocks.OBSIDIAN.getDefaultState(), blockPos, ShapeContext.absent()); diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 0699075ae9..a2ba3930d3 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -47,8 +47,8 @@ }, "depends": { "java": ">=17", - "minecraft": ">=1.19.4", - "fabricloader": ">=0.14.17" + "minecraft": "1.20", + "fabricloader": ">=0.14.21" }, "breaks": { "optifabric": "*", diff --git a/src/main/resources/meteor-client.accesswidener b/src/main/resources/meteor-client.accesswidener index 39f93577bd..8cb36fe584 100644 --- a/src/main/resources/meteor-client.accesswidener +++ b/src/main/resources/meteor-client.accesswidener @@ -70,4 +70,4 @@ accessible class net/minecraft/client/resource/ResourceReloadLogger$ReloadSt accessible field net/minecraft/block/AbstractBlock collidable Z accessible field net/minecraft/util/math/Direction HORIZONTAL [Lnet/minecraft/util/math/Direction; -accessible field net/minecraft/item/ItemGroups INVENTORY Lnet/minecraft/item/ItemGroup; +accessible field net/minecraft/item/ItemGroups INVENTORY Lnet/minecraft/registry/RegistryKey; diff --git a/src/main/resources/meteor-client.mixins.json b/src/main/resources/meteor-client.mixins.json index 1b35d31dd2..5692e3323a 100644 --- a/src/main/resources/meteor-client.mixins.json +++ b/src/main/resources/meteor-client.mixins.json @@ -65,6 +65,7 @@ "CustomPayloadS2CPacketMixin", "DefaultSkinHelperMixin", "DisconnectedScreenMixin", + "DrawContextMixin", "EnchantingTableBlockEntityRendererMixin", "EndCrystalEntityRendererMixin", "EntityAccessor", From dc4b1698ebb67b5908947c7e419a154fda002a2b Mon Sep 17 00:00:00 2001 From: Lovecrafts-Cat Date: Sun, 11 Jun 2023 13:09:00 +0200 Subject: [PATCH 017/357] Replace Utils.clamp() in favor of MathHelper.clamp() --- .../meteorclient/gui/WidgetScreen.java | 3 ++- .../meteorclient/gui/renderer/GuiRenderer.java | 4 ++-- .../gui/screens/settings/ColorSettingScreen.java | 4 ++-- .../gui/themes/meteor/widgets/WMeteorModule.java | 6 +++--- .../meteor/widgets/input/WMeteorTextBox.java | 4 ++-- .../widgets/pressable/WMeteorCheckbox.java | 4 ++-- .../gui/widgets/containers/WSection.java | 4 ++-- .../gui/widgets/containers/WView.java | 9 +++++---- .../gui/widgets/containers/WWindow.java | 4 ++-- .../gui/widgets/input/WDropdown.java | 4 ++-- .../meteorclient/gui/widgets/input/WSlider.java | 8 ++++---- .../meteorclient/gui/widgets/input/WTextBox.java | 6 +++--- .../meteorclient/mixin/CameraMixin.java | 4 ++-- .../meteorclient/mixin/PlayerListHudMixin.java | 4 ++-- .../systems/hud/screens/HudEditorScreen.java | 7 ++++--- .../systems/modules/movement/Anchor.java | 5 ++--- .../systems/modules/movement/GUIMove.java | 4 ++-- .../modules/movement/elytrafly/ElytraFly.java | 6 +++--- .../systems/modules/render/FreeLook.java | 6 +++--- .../systems/modules/render/Zoom.java | 3 +-- .../meteorclient/utils/Utils.java | 16 ---------------- .../utils/entity/ProjectileEntitySimulator.java | 2 +- .../meteorclient/utils/render/NametagUtils.java | 3 ++- .../meteorclient/utils/world/TickRate.java | 3 ++- 24 files changed, 55 insertions(+), 68 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/gui/WidgetScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/WidgetScreen.java index b418394b96..8ca1698fd6 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/WidgetScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/WidgetScreen.java @@ -22,6 +22,7 @@ import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.text.Text; +import net.minecraft.util.math.MathHelper; import java.util.ArrayList; import java.util.List; @@ -253,7 +254,7 @@ public void render(DrawContext context, int mouseX, int mouseY, float delta) { mouseY *= s; animProgress += delta / 20 * 14; - animProgress = Utils.clamp(animProgress, 0, 1); + animProgress = MathHelper.clamp(animProgress, 0, 1); GuiKeyEvents.canUseKeys = true; diff --git a/src/main/java/meteordevelopment/meteorclient/gui/renderer/GuiRenderer.java b/src/main/java/meteordevelopment/meteorclient/gui/renderer/GuiRenderer.java index 8d82ad2bc2..08c9ff0527 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/renderer/GuiRenderer.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/renderer/GuiRenderer.java @@ -14,7 +14,6 @@ import meteordevelopment.meteorclient.renderer.Renderer2D; import meteordevelopment.meteorclient.renderer.Texture; import meteordevelopment.meteorclient.utils.PostInit; -import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.misc.MeteorIdentifier; import meteordevelopment.meteorclient.utils.misc.Pool; import meteordevelopment.meteorclient.utils.render.ByteTexture; @@ -23,6 +22,7 @@ import net.minecraft.client.gui.DrawContext; import net.minecraft.item.ItemStack; import net.minecraft.util.Identifier; +import net.minecraft.util.math.MathHelper; import java.util.ArrayList; import java.util.List; @@ -157,7 +157,7 @@ public void scissorEnd() { public boolean renderTooltip(DrawContext drawContext, double mouseX, double mouseY, double delta) { tooltipAnimProgress += (tooltip != null ? 1 : -1) * delta * 14; - tooltipAnimProgress = Utils.clamp(tooltipAnimProgress, 0, 1); + tooltipAnimProgress = MathHelper.clamp(tooltipAnimProgress, 0, 1); boolean toReturn = false; 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 e6240aa319..d761c3e10a 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ColorSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ColorSettingScreen.java @@ -16,9 +16,9 @@ import meteordevelopment.meteorclient.gui.widgets.pressable.WButton; import meteordevelopment.meteorclient.gui.widgets.pressable.WCheckbox; import meteordevelopment.meteorclient.settings.Setting; -import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.render.color.SettingColor; +import net.minecraft.util.math.MathHelper; import static meteordevelopment.meteorclient.MeteorClient.mc; @@ -565,7 +565,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 = Utils.clamp(handleX, 0, width); + handleX = MathHelper.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/themes/meteor/widgets/WMeteorModule.java b/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/widgets/WMeteorModule.java index 5ddac55acd..4bdb816e0c 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 meteordevelopment.meteorclient.utils.Utils; +import net.minecraft.util.math.MathHelper; import static meteordevelopment.meteorclient.MeteorClient.mc; import static org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_LEFT; @@ -66,10 +66,10 @@ protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, doub double pad = pad(); animationProgress1 += delta * 4 * ((module.isActive() || mouseOver) ? 1 : -1); - animationProgress1 = Utils.clamp(animationProgress1, 0, 1); + animationProgress1 = MathHelper.clamp(animationProgress1, 0, 1); animationProgress2 += delta * 6 * (module.isActive() ? 1 : -1); - animationProgress2 = Utils.clamp(animationProgress2, 0, 1); + animationProgress2 = MathHelper.clamp(animationProgress2, 0, 1); if (animationProgress1 > 0) { renderer.quad(x, y, width * animationProgress1, height, theme.moduleBackground.get()); 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 c6e75f4572..0e8b59229e 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 @@ -14,8 +14,8 @@ import meteordevelopment.meteorclient.gui.widgets.containers.WContainer; import meteordevelopment.meteorclient.gui.widgets.containers.WVerticalList; import meteordevelopment.meteorclient.gui.widgets.input.WTextBox; -import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.render.color.Color; +import net.minecraft.util.math.MathHelper; public class WMeteorTextBox extends WTextBox implements MeteorWidget { private boolean cursorVisible; @@ -131,7 +131,7 @@ else if (placeholder != null) { // Cursor animProgress += delta * 10 * (focused && cursorVisible ? 1 : -1); - animProgress = Utils.clamp(animProgress, 0, 1); + animProgress = MathHelper.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 c2c21cfee1..1fa104c899 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 meteordevelopment.meteorclient.utils.Utils; +import net.minecraft.util.math.MathHelper; 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 = Utils.clamp(animProgress, 0, 1); + animProgress = MathHelper.clamp(animProgress, 0, 1); renderBackground(renderer, this, pressed, mouseOver); 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 b490a8173b..3c1b163f12 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/containers/WSection.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/containers/WSection.java @@ -8,7 +8,7 @@ import meteordevelopment.meteorclient.gui.renderer.GuiRenderer; import meteordevelopment.meteorclient.gui.utils.Cell; import meteordevelopment.meteorclient.gui.widgets.WWidget; -import meteordevelopment.meteorclient.utils.Utils; +import net.minecraft.util.math.MathHelper; import static org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_LEFT; @@ -88,7 +88,7 @@ public boolean render(GuiRenderer renderer, double mouseX, double mouseY, double double preProgress = animProgress; animProgress += (expanded ? 1 : -1) * delta * 14; - animProgress = Utils.clamp(animProgress, 0, 1); + animProgress = MathHelper.clamp(animProgress, 0, 1); if (animProgress != preProgress) { forcedHeight = (actualHeight - header.height) * animProgress + header.height; 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 74818327d2..8e2ce8ea07 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/containers/WView.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/containers/WView.java @@ -8,6 +8,7 @@ import meteordevelopment.meteorclient.gui.renderer.GuiRenderer; import meteordevelopment.meteorclient.gui.widgets.WWidget; import meteordevelopment.meteorclient.utils.Utils; +import net.minecraft.util.math.MathHelper; import static org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_LEFT; @@ -63,7 +64,7 @@ protected void onCalculateWidgetPositions() { super.onCalculateWidgetPositions(); if (moveAfterPositionWidgets) { - scroll = Utils.clamp(scroll, 0, actualHeight - height); + scroll = MathHelper.clamp(scroll, 0, actualHeight - height); targetScroll = scroll; moveCells(0, -scroll); @@ -109,7 +110,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)); // TODO: Someone improve this - scroll = Utils.clamp(scroll, 0, actualHeight - height); + scroll = MathHelper.clamp(scroll, 0, actualHeight - height); targetScroll = scroll; @@ -122,7 +123,7 @@ public void onMouseMoved(double mouseX, double mouseY, double lastMouseX, double public boolean onMouseScrolled(double amount) { if (!scrollOnlyWhenMouseOver || mouseOver) { targetScroll -= Math.round(theme.scale(amount * 40)); - targetScroll = Utils.clamp(targetScroll, 0, actualHeight - height); + targetScroll = MathHelper.clamp(targetScroll, 0, actualHeight - height); return true; } @@ -154,7 +155,7 @@ else if (targetScroll < scroll) { if (scroll < targetScroll) scroll = targetScroll; } - scroll = Utils.clamp(scroll, 0, max); + scroll = MathHelper.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 c5bd0e5cc0..86a4258b33 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/containers/WWindow.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/containers/WWindow.java @@ -10,7 +10,7 @@ import meteordevelopment.meteorclient.gui.utils.WindowConfig; import meteordevelopment.meteorclient.gui.widgets.WWidget; import meteordevelopment.meteorclient.gui.widgets.pressable.WTriangle; -import meteordevelopment.meteorclient.utils.Utils; +import net.minecraft.util.math.MathHelper; import java.util.function.Consumer; @@ -236,7 +236,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 = Utils.clamp(animProgress, 0, 1); + animProgress = MathHelper.clamp(animProgress, 0, 1); triangle.rotation = (1 - animProgress) * -90; 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 b67882a341..b43476f4f2 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WDropdown.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WDropdown.java @@ -10,7 +10,7 @@ import meteordevelopment.meteorclient.gui.widgets.WRoot; import meteordevelopment.meteorclient.gui.widgets.containers.WVerticalList; import meteordevelopment.meteorclient.gui.widgets.pressable.WPressable; -import meteordevelopment.meteorclient.utils.Utils; +import net.minecraft.util.math.MathHelper; public abstract class WDropdown extends WPressable { public Runnable action; @@ -103,7 +103,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 = Utils.clamp(animProgress, 0, 1); + animProgress = MathHelper.clamp(animProgress, 0, 1); if (!render && animProgress > 0) { renderer.absolutePost(() -> { 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 1dfce1c458..a2384ccd3f 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WSlider.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WSlider.java @@ -6,7 +6,7 @@ package meteordevelopment.meteorclient.gui.widgets.input; import meteordevelopment.meteorclient.gui.widgets.WWidget; -import meteordevelopment.meteorclient.utils.Utils; +import net.minecraft.util.math.MathHelper; public abstract class WSlider extends WWidget { public Runnable action; @@ -24,7 +24,7 @@ public abstract class WSlider extends WWidget { protected double valueAtDragStart; public WSlider(double value, double min, double max) { - this.value = Utils.clamp(value, min, max); + this.value = MathHelper.clamp(value, min, max); this.min = min; this.max = max; } @@ -87,7 +87,7 @@ public void onMouseMoved(double mouseX, double mouseY, double lastMouseX, double if (dragging) { if (mouseOverX) { valueWidth += mouseX - lastMouseX; - valueWidth = Utils.clamp(valueWidth, 0, width - s); + valueWidth = MathHelper.clamp(valueWidth, 0, width - s); set((valueWidth / (width - s)) * (max - min) + min); if (action != null) action.run(); @@ -145,7 +145,7 @@ public boolean onMouseScrolled(double amount) { } public void set(double value) { - this.value = Utils.clamp(value, min, max); + this.value = MathHelper.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 00b147db2a..dd44393eb6 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WTextBox.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WTextBox.java @@ -13,9 +13,9 @@ import meteordevelopment.meteorclient.gui.utils.CharFilter; import meteordevelopment.meteorclient.gui.widgets.WWidget; import meteordevelopment.meteorclient.gui.widgets.containers.WContainer; -import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.render.color.Color; import net.minecraft.client.MinecraftClient; +import net.minecraft.util.math.MathHelper; import org.apache.commons.lang3.SystemUtils; import java.lang.reflect.InvocationTargetException; @@ -606,7 +606,7 @@ private void cursorChanged() { textStart += cursor - (textStart + maxTextWidth()); } - textStart = Utils.clamp(textStart, 0, Math.max(textWidth() - maxTextWidth(), 0)); + textStart = MathHelper.clamp(textStart, 0, Math.max(textWidth() - maxTextWidth(), 0)); onCursorChanged(); @@ -661,7 +661,7 @@ public String get() { public void set(String text) { this.text = text; - cursor = Utils.clamp(cursor, 0, text.length()); + cursor = MathHelper.clamp(cursor, 0, text.length()); selectionStart = cursor; selectionEnd = cursor; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/CameraMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/CameraMixin.java index 07d3753760..71473f2a71 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/CameraMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/CameraMixin.java @@ -12,10 +12,10 @@ import meteordevelopment.meteorclient.systems.modules.render.Freecam; import meteordevelopment.meteorclient.systems.modules.render.NoRender; import meteordevelopment.meteorclient.systems.modules.world.HighwayBuilder; -import meteordevelopment.meteorclient.utils.Utils; import net.minecraft.client.render.Camera; import net.minecraft.client.render.CameraSubmersionType; import net.minecraft.entity.Entity; +import net.minecraft.util.math.MathHelper; import net.minecraft.world.BlockView; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -105,6 +105,6 @@ else if (freeLook.isActive()) { @Override public void setRot(double yaw, double pitch) { - setRotation((float) yaw, (float) Utils.clamp(pitch, -90, 90)); + setRotation((float) yaw, (float) MathHelper.clamp(pitch, -90, 90)); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerListHudMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerListHudMixin.java index 67ce3761dc..137a7fbc66 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerListHudMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerListHudMixin.java @@ -7,13 +7,13 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.misc.BetterTab; -import meteordevelopment.meteorclient.utils.Utils; 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.injection.*; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @@ -50,7 +50,7 @@ private void onRenderLatencyIcon(DrawContext context, int width, int x, int y, P MinecraftClient mc = MinecraftClient.getInstance(); TextRenderer textRenderer = mc.textRenderer; - int latency = Utils.clamp(entry.getLatency(), 0, 9999); + int latency = MathHelper.clamp(entry.getLatency(), 0, 9999); int color = latency < 150 ? 0x00E970 : latency < 300 ? 0xE7D020 : 0xD74238; String text = latency + "ms"; context.drawTextWithShadow(textRenderer, text, x + width - textRenderer.getWidth(text), y, color); 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 9af8fd181e..5b69d1bacb 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/screens/HudEditorScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/screens/HudEditorScreen.java @@ -18,6 +18,7 @@ import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.util.math.MathHelper; import org.lwjgl.glfw.GLFW; import java.util.ArrayList; @@ -302,7 +303,7 @@ public static void renderElements(DrawContext drawContext) { private void renderSplitLines(boolean increment, double delta) { if (increment) splitLinesAnimation += delta * 6; else splitLinesAnimation -= delta * 6; - splitLinesAnimation = Utils.clamp(splitLinesAnimation, 0, 1); + splitLinesAnimation = MathHelper.clamp(splitLinesAnimation, 0, 1); Renderer2D renderer = Renderer2D.COLOR; renderer.begin(); @@ -412,8 +413,8 @@ public void move(int deltaX, int deltaY) { int prevY = y; int border = Hud.get().border.get(); - x = Utils.clamp(x + deltaX, border, Utils.getWindowWidth() - width - border); - y = Utils.clamp(y + deltaY, border, Utils.getWindowHeight() - height - border); + x = MathHelper.clamp(x + deltaX, border, Utils.getWindowWidth() - width - border); + y = MathHelper.clamp(y + deltaY, border, Utils.getWindowHeight() - height - border); for (HudElement element : selection) element.move(x - prevX, y - prevY); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Anchor.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Anchor.java index 6161d59c82..4da86618d4 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Anchor.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Anchor.java @@ -11,7 +11,6 @@ import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; -import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.orbit.EventHandler; import net.minecraft.block.Block; import net.minecraft.block.Blocks; @@ -125,8 +124,8 @@ private void onPostTick(TickEvent.Post event) { if (foundHole) { controlMovement = true; - deltaX = Utils.clamp(holeX - mc.player.getX(), -0.05, 0.05); - deltaZ = Utils.clamp(holeZ - mc.player.getZ(), -0.05, 0.05); + deltaX = MathHelper.clamp(holeX - mc.player.getX(), -0.05, 0.05); + deltaZ = MathHelper.clamp(holeZ - mc.player.getZ(), -0.05, 0.05); ((IVec3d) mc.player.getVelocity()).set(deltaX, mc.player.getVelocity().y - (pull.get() ? pullSpeed.get() : 0), deltaZ); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/GUIMove.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/GUIMove.java index 5258836b91..0c3bc94cca 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/GUIMove.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/GUIMove.java @@ -14,7 +14,6 @@ import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; -import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.misc.input.Input; import meteordevelopment.meteorclient.utils.misc.input.KeyAction; import meteordevelopment.orbit.EventHandler; @@ -23,6 +22,7 @@ import net.minecraft.client.option.KeyBinding; import net.minecraft.client.util.InputUtil; import net.minecraft.item.ItemGroups; +import net.minecraft.util.math.MathHelper; import static org.lwjgl.glfw.GLFW.*; @@ -129,7 +129,7 @@ private void onTick(TickEvent.Pre event) { if (Input.isKeyPressed(GLFW_KEY_DOWN)) pitch += 0.5; } - pitch = Utils.clamp(pitch, -90, 90); + pitch = MathHelper.clamp(pitch, -90, 90); mc.player.setYaw(yaw); mc.player.setPitch(pitch); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFly.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFly.java index 690b51cac9..c0b8dd8889 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFly.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFly.java @@ -19,7 +19,6 @@ import meteordevelopment.meteorclient.systems.modules.movement.elytrafly.modes.Vanilla; import meteordevelopment.meteorclient.systems.modules.player.ChestSwap; import meteordevelopment.meteorclient.systems.modules.render.Freecam; -import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.orbit.EventHandler; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -30,6 +29,7 @@ import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket; import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.hit.HitResult; +import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; import net.minecraft.world.RaycastContext; @@ -361,13 +361,13 @@ private void onPlayerMove(PlayerMoveEvent event) { if (!underCollidable && under2Collidable) { ((IVec3d)event.movement).set(event.movement.x, -0.1f, event.movement.z); - mc.player.setPitch(Utils.clamp(mc.player.getPitch(0), -50.f, 20.f)); // clamp between -50 and 20 (>= 30 will pop you off, but lag makes that threshold lower) + mc.player.setPitch(MathHelper.clamp(mc.player.getPitch(0), -50.f, 20.f)); // clamp between -50 and 20 (>= 30 will pop you off, but lag makes that threshold lower) } if (underCollidable) { ((IVec3d)event.movement).set(event.movement.x, -0.03f, event.movement.z); - mc.player.setPitch(Utils.clamp(mc.player.getPitch(0), -50.f, 20.f)); + mc.player.setPitch(MathHelper.clamp(mc.player.getPitch(0), -50.f, 20.f)); if (mc.player.getPos().y <= mc.player.getBlockPos().down().getY() + 1.34f) { ((IVec3d)event.movement).set(event.movement.x, 0, event.movement.z); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/FreeLook.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/FreeLook.java index 68aa3fc9dd..8e78bba0e8 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/FreeLook.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/FreeLook.java @@ -9,10 +9,10 @@ import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; -import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.misc.input.Input; import meteordevelopment.orbit.EventHandler; import net.minecraft.client.option.Perspective; +import net.minecraft.util.math.MathHelper; import org.lwjgl.glfw.GLFW; public class FreeLook extends Module { @@ -119,8 +119,8 @@ private void onTick(TickEvent.Post event) { } } - mc.player.setPitch(Utils.clamp(mc.player.getPitch(), -90, 90)); - cameraPitch = Utils.clamp(cameraPitch, -90, 90); + mc.player.setPitch(MathHelper.clamp(mc.player.getPitch(), -90, 90)); + cameraPitch = MathHelper.clamp(cameraPitch, -90, 90); } public enum Mode { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Zoom.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Zoom.java index d897f698a3..82453def96 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Zoom.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Zoom.java @@ -16,7 +16,6 @@ import meteordevelopment.meteorclient.settings.SettingGroup; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; -import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.orbit.EventHandler; import net.minecraft.util.math.MathHelper; @@ -129,7 +128,7 @@ private void onRender3D(Render3DEvent event) { if (isActive()) time += event.frameTime * 5; else time -= event.frameTime * 5; - time = Utils.clamp(time, 0, 1); + time = MathHelper.clamp(time, 0, 1); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/utils/Utils.java b/src/main/java/meteordevelopment/meteorclient/utils/Utils.java index 883b56c39a..df8bfa0b4e 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/Utils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/Utils.java @@ -7,7 +7,6 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.VertexSorter; -import it.unimi.dsi.fastutil.objects.Object2BooleanOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2IntArrayMap; import it.unimi.dsi.fastutil.objects.Object2IntMap; import meteordevelopment.meteorclient.MeteorClient; @@ -486,21 +485,6 @@ public static boolean isThrowable(Item item) { return item instanceof ExperienceBottleItem || item instanceof BowItem || item instanceof CrossbowItem || item instanceof SnowballItem || item instanceof EggItem || item instanceof EnderPearlItem || item instanceof SplashPotionItem || item instanceof LingeringPotionItem || item instanceof FishingRodItem || item instanceof TridentItem; } - public static int clamp(int value, int min, int max) { - if (value < min) return min; - return Math.min(value, max); - } - - public static float clamp(float value, float min, float max) { - if (value < min) return min; - return Math.min(value, max); - } - - public static double clamp(double value, double min, double max) { - if (value < min) return min; - return Math.min(value, max); - } - public static void addEnchantment(ItemStack itemStack, Enchantment enchantment, int level) { NbtCompound tag = itemStack.getOrCreateNbt(); NbtList listTag; diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/ProjectileEntitySimulator.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/ProjectileEntitySimulator.java index 2085b2cc9b..9e894a0a5a 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/entity/ProjectileEntitySimulator.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/entity/ProjectileEntitySimulator.java @@ -165,7 +165,7 @@ public void setFishingBobber(Entity user, double tickDelta) { Utils.set(pos, user, tickDelta).sub(i * 0.3, 0, h * 0.3).add(0, user.getEyeHeight(user.getPose()), 0); - velocity.set(-i, Utils.clamp(-(k / j), -5, 5), -h); + velocity.set(-i, MathHelper.clamp(-(k / j), -5, 5), -h); double l = velocity.length(); velocity.mul(0.6 / l + 0.5, 0.6 / l + 0.5, 0.6 / l + 0.5); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/NametagUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/render/NametagUtils.java index 8b6d50f0ea..124c124c6f 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/NametagUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/NametagUtils.java @@ -9,6 +9,7 @@ import meteordevelopment.meteorclient.utils.Utils; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.util.math.MathHelper; import org.joml.Matrix4f; import org.joml.Vector3d; import org.joml.Vector4f; @@ -103,7 +104,7 @@ public static void end(DrawContext drawContext) { private static double getScale(Vector3d pos) { double dist = camera.distance(pos); - return Utils.clamp(1 - dist * 0.01, 0.5, Integer.MAX_VALUE); + return MathHelper.clamp(1 - dist * 0.01, 0.5, Integer.MAX_VALUE); } private static void toScreen(Vector4f vec) { diff --git a/src/main/java/meteordevelopment/meteorclient/utils/world/TickRate.java b/src/main/java/meteordevelopment/meteorclient/utils/world/TickRate.java index 0274d9966d..14a43dbc6c 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/world/TickRate.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/world/TickRate.java @@ -11,6 +11,7 @@ import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.orbit.EventHandler; import net.minecraft.network.packet.s2c.play.WorldTimeUpdateS2CPacket; +import net.minecraft.util.math.MathHelper; import java.util.Arrays; @@ -34,7 +35,7 @@ private void onReceivePacket(PacketEvent.Receive event) { if (event.packet instanceof WorldTimeUpdateS2CPacket) { long now = System.currentTimeMillis(); float timeElapsed = (float) (now - timeLastTimeUpdate) / 1000.0F; - tickRates[nextIndex] = Utils.clamp(20.0f / timeElapsed, 0.0f, 20.0f); + tickRates[nextIndex] = MathHelper.clamp(20.0f / timeElapsed, 0.0f, 20.0f); nextIndex = (nextIndex + 1) % tickRates.length; timeLastTimeUpdate = now; } From 4d65ecaf08ba10d2616d8036e710047388db5830 Mon Sep 17 00:00:00 2001 From: DAM <43420467+DAMcraft@users.noreply.github.com> Date: Sun, 11 Jun 2023 21:15:26 +0200 Subject: [PATCH 018/357] Swarm and TunnelESP having irregular capitalization --- .../meteorclient/systems/modules/misc/swarm/Swarm.java | 2 +- .../meteorclient/systems/modules/render/TunnelESP.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/Swarm.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/Swarm.java index bed153e1fe..0cffa6daac 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/Swarm.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/Swarm.java @@ -50,7 +50,7 @@ public class Swarm extends Module { public SwarmWorker worker; public Swarm() { - super(Categories.Misc, "Swarm", "Allows you to control multiple instances of Meteor from one central host."); + super(Categories.Misc, "swarm", "Allows you to control multiple instances of Meteor from one central host."); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/TunnelESP.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/TunnelESP.java index 99c1afa6b0..7d5cf45b90 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/TunnelESP.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/TunnelESP.java @@ -79,7 +79,7 @@ public class TunnelESP extends Module { private final Long2ObjectMap chunks = new Long2ObjectOpenHashMap<>(); public TunnelESP() { - super(Categories.Render, "tunnel-ESP", "Highlights tunnels."); + super(Categories.Render, "tunnel-esp", "Highlights tunnels."); } @Override From 7c3b3e0b4684a09cc6b4e7df5ba596c48e073c8c Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Sun, 11 Jun 2023 21:42:29 +0200 Subject: [PATCH 019/357] Fix .settings command crashes --- .../commands/arguments/SettingValueArgumentType.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/arguments/SettingValueArgumentType.java b/src/main/java/meteordevelopment/meteorclient/commands/arguments/SettingValueArgumentType.java index a37297f637..b464846c58 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/arguments/SettingValueArgumentType.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/arguments/SettingValueArgumentType.java @@ -40,7 +40,7 @@ public CompletableFuture listSuggestions(CommandContext cont try { setting = SettingArgumentType.get(context); } catch (CommandSyntaxException ignored) { - return null; + return Suggestions.empty(); } Iterable identifiers = setting.getIdentifierSuggestions(); From 3ad8664336d18b973fe9ca32b6828d34bc631dda Mon Sep 17 00:00:00 2001 From: Damian <43420467+DAMcraft@users.noreply.github.com> Date: Mon, 12 Jun 2023 20:28:39 +0200 Subject: [PATCH 020/357] SaveMapCommand scale must be greater than 0. (#3724) --- .../meteorclient/commands/commands/SaveMapCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/SaveMapCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/SaveMapCommand.java index 3358133dad..e1dfdc29ab 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/SaveMapCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/SaveMapCommand.java @@ -63,7 +63,7 @@ public void build(LiteralArgumentBuilder builder) { saveMap(map, state, path, 128); return SINGLE_SUCCESS; - }).then(argument("scale", IntegerArgumentType.integer()).executes(context -> { + }).then(argument("scale", IntegerArgumentType.integer(1)).executes(context -> { int scale = IntegerArgumentType.getInteger(context, "scale"); MapState state = getMapState(); From ca48c3e54e1e12b05ffb604c0e9e8f7518b5208c Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Tue, 13 Jun 2023 17:17:03 +0200 Subject: [PATCH 021/357] Rewrite ItemPhysics --- .../render/ApplyTransformationEvent.java | 28 ++ .../meteorclient/mixin/BakedQuadMixin.java | 32 +++ .../mixin/TransformationMixin.java | 24 ++ .../mixininterface/IBakedQuad.java | 14 + .../systems/modules/render/ItemPhysics.java | 252 ++++++++++-------- .../utils/render/SimpleBlockRenderer.java | 9 +- .../resources/meteor-client.accesswidener | 3 + src/main/resources/meteor-client.mixins.json | 2 + 8 files changed, 250 insertions(+), 114 deletions(-) create mode 100644 src/main/java/meteordevelopment/meteorclient/events/render/ApplyTransformationEvent.java create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/BakedQuadMixin.java create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/TransformationMixin.java create mode 100644 src/main/java/meteordevelopment/meteorclient/mixininterface/IBakedQuad.java diff --git a/src/main/java/meteordevelopment/meteorclient/events/render/ApplyTransformationEvent.java b/src/main/java/meteordevelopment/meteorclient/events/render/ApplyTransformationEvent.java new file mode 100644 index 0000000000..1c7b1044b2 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/events/render/ApplyTransformationEvent.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.events.render; + +import meteordevelopment.meteorclient.events.Cancellable; +import net.minecraft.client.render.model.json.Transformation; +import net.minecraft.client.util.math.MatrixStack; + +public class ApplyTransformationEvent extends Cancellable { + private static final ApplyTransformationEvent INSTANCE = new ApplyTransformationEvent(); + + public Transformation transformation; + public boolean leftHanded; + public MatrixStack matrices; + + public static ApplyTransformationEvent get(Transformation transformation, boolean leftHanded, MatrixStack matrices) { + INSTANCE.setCancelled(false); + + INSTANCE.transformation = transformation; + INSTANCE.leftHanded = leftHanded; + INSTANCE.matrices = matrices; + + return INSTANCE; + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BakedQuadMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BakedQuadMixin.java new file mode 100644 index 0000000000..b474caf293 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BakedQuadMixin.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 meteordevelopment.meteorclient.mixininterface.IBakedQuad; +import net.minecraft.client.render.model.BakedQuad; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(BakedQuad.class) +public class BakedQuadMixin implements IBakedQuad { + @Shadow @Final protected int[] vertexData; + + @Override + public float meteor$getX(int vertexI) { + return Float.intBitsToFloat(vertexData[vertexI * 8]); + } + + @Override + public float meteor$getY(int vertexI) { + return Float.intBitsToFloat(vertexData[vertexI * 8 + 1]); + } + + @Override + public float meteor$getZ(int vertexI) { + return Float.intBitsToFloat(vertexData[vertexI * 8 + 2]); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/TransformationMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/TransformationMixin.java new file mode 100644 index 0000000000..a11a4982f6 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/TransformationMixin.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 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 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 class TransformationMixin { + @Inject(method = "apply", at = @At("HEAD"), cancellable = true) + private void onApply(boolean leftHanded, MatrixStack matrices, CallbackInfo info) { + ApplyTransformationEvent event = MeteorClient.EVENT_BUS.post(ApplyTransformationEvent.get((Transformation) (Object) this, leftHanded, matrices)); + if (event.isCancelled()) info.cancel(); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixininterface/IBakedQuad.java b/src/main/java/meteordevelopment/meteorclient/mixininterface/IBakedQuad.java new file mode 100644 index 0000000000..c9ba107d10 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixininterface/IBakedQuad.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; + +public interface IBakedQuad { + float meteor$getX(int vertexI); + + float meteor$getY(int vertexI); + + float meteor$getZ(int vertexI); +} diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ItemPhysics.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ItemPhysics.java index 72ac4c5958..bb38379122 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ItemPhysics.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ItemPhysics.java @@ -5,156 +5,122 @@ package meteordevelopment.meteorclient.systems.modules.render; +import meteordevelopment.meteorclient.events.render.ApplyTransformationEvent; import meteordevelopment.meteorclient.events.render.RenderItemEntityEvent; -import meteordevelopment.meteorclient.mixininterface.IItemEntity; +import meteordevelopment.meteorclient.mixininterface.IBakedQuad; +import meteordevelopment.meteorclient.settings.BoolSetting; +import meteordevelopment.meteorclient.settings.Setting; +import meteordevelopment.meteorclient.settings.SettingGroup; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.orbit.EventHandler; -import net.minecraft.block.Block; -import net.minecraft.block.Blocks; -import net.minecraft.block.ShapeContext; -import net.minecraft.block.SkullBlock; import net.minecraft.client.render.OverlayTexture; +import net.minecraft.client.render.item.ItemRenderer; import net.minecraft.client.render.model.BakedModel; +import net.minecraft.client.render.model.BakedQuad; import net.minecraft.client.render.model.json.ModelTransformationMode; -import net.minecraft.item.AliasedBlockItem; -import net.minecraft.item.BlockItem; -import net.minecraft.item.Item; +import net.minecraft.client.render.model.json.Transformation; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.entity.ItemEntity; import net.minecraft.item.ItemStack; -import net.minecraft.registry.tag.FluidTags; +import net.minecraft.item.Items; import net.minecraft.util.math.Direction; import net.minecraft.util.math.RotationAxis; -import net.minecraft.util.math.Vec3d; -import net.minecraft.util.shape.VoxelShape; +import net.minecraft.util.math.random.Random; public class ItemPhysics extends Module { + private static final Direction[] FACES = { null, Direction.UP, Direction.DOWN, Direction.EAST, Direction.NORTH, Direction.SOUTH, Direction.WEST }; + private static final float PIXEL_SIZE = 1f / 16f; + + private final SettingGroup sgGeneral = settings.getDefaultGroup(); + + private final Setting randomRotation = sgGeneral.add(new BoolSetting.Builder() + .name("random-rotation") + .description("Adds a random rotation to every item.") + .defaultValue(true) + .build() + ); + + private final Random random = Random.createLocal(); + private boolean renderingItem; + public ItemPhysics() { super(Categories.Render, "item-physics", "Applies physics to items on the ground."); } @EventHandler - private void onRenderItemEntity(RenderItemEntityEvent event) { - ItemStack itemStack = event.itemEntity.getStack(); - int seed = itemStack.isEmpty() ? 187 : Item.getRawId(itemStack.getItem()) + itemStack.getDamage(); - event.random.setSeed(seed); + private void onRenderItemEntityNew(RenderItemEntityEvent event) { + MatrixStack matrices = event.matrixStack; + matrices.push(); - event.matrixStack.push(); + ItemStack itemStack = event.itemEntity.getStack(); + BakedModel model = getModel(event.itemEntity); + ModelInfo info = getInfo(model); - BakedModel bakedModel = event.itemRenderer.getModel(itemStack, event.itemEntity.getWorld(), null, 0); - boolean hasDepthInGui = bakedModel.hasDepth(); - int renderCount = getRenderedAmount(itemStack); - IItemEntity rotator = (IItemEntity) event.itemEntity; - boolean renderBlockFlat = false; + random.setSeed(event.itemEntity.getId() * 2365798L); - if (event.itemEntity.getStack().getItem() instanceof BlockItem && !(event.itemEntity.getStack().getItem() instanceof AliasedBlockItem)) { - Block b = ((BlockItem) event.itemEntity.getStack().getItem()).getBlock(); - VoxelShape shape = b.getOutlineShape(b.getDefaultState(), event.itemEntity.getWorld(), event.itemEntity.getBlockPos(), ShapeContext.absent()); + applyTransformation(matrices, model); + matrices.translate(0, info.offsetY, 0); - if (shape.getMax(Direction.Axis.Y) <= .5) renderBlockFlat = true; + if (info.flat) { + matrices.multiply(RotationAxis.POSITIVE_X.rotationDegrees(90)); + matrices.translate(0, 0, info.offsetZ); } - Item item = event.itemEntity.getStack().getItem(); - if (item instanceof BlockItem && !(item instanceof AliasedBlockItem) && !renderBlockFlat) { - event.matrixStack.translate(0, -0.06, 0); - } + if (randomRotation.get()) { + RotationAxis axis = RotationAxis.POSITIVE_Y; + if (info.flat) axis = RotationAxis.POSITIVE_Z; - if (!renderBlockFlat) { - event.matrixStack.translate(0, .185, .0); - event.matrixStack.multiply(RotationAxis.POSITIVE_X.rotationDegrees(1.571F)); - event.matrixStack.translate(0, -.185, -.0); + float degrees = (random.nextFloat() * 2 - 1) * 90; + matrices.multiply(axis.rotationDegrees(degrees)); } - boolean isAboveWater = event.itemEntity.getWorld().getBlockState(event.itemEntity.getBlockPos()).getFluidState().getFluid().isIn(FluidTags.WATER); - if (!event.itemEntity.isOnGround() && (!event.itemEntity.isSubmergedInWater() && !isAboveWater)) { - float rotation = ((float) event.itemEntity.getItemAge() + event.tickDelta) / 20.0F + event.itemEntity.uniqueOffset; // calculate rotation based on age and ticks - - if (!renderBlockFlat) { - event.matrixStack.translate(0, .185, .0); - event.matrixStack.multiply(RotationAxis.POSITIVE_Z.rotationDegrees(rotation)); - event.matrixStack.translate(0, -.185, .0); - rotator.setRotation(new Vec3d(0, 0, rotation)); - } else { - event.matrixStack.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(rotation)); - rotator.setRotation(new Vec3d(0, rotation, 0)); - event.matrixStack.translate(0, -.065, 0); - } + renderItem(event, matrices, itemStack, model, info); - if (event.itemEntity.getStack().getItem() instanceof AliasedBlockItem) { - event.matrixStack.translate(0, 0, .195); - } else if (!(event.itemEntity.getStack().getItem() instanceof BlockItem)) { - event.matrixStack.translate(0, 0, .195); - } - } else if (event.itemEntity.getStack().getItem() instanceof AliasedBlockItem) { - event.matrixStack.translate(0, .185, .0); - event.matrixStack.multiply(RotationAxis.POSITIVE_Z.rotationDegrees((float) rotator.getRotation().z)); - event.matrixStack.translate(0, -.185, .0); - event.matrixStack.translate(0, 0, .195); - } else if (renderBlockFlat) { - event.matrixStack.multiply(RotationAxis.POSITIVE_Y.rotationDegrees((float) rotator.getRotation().y)); - event.matrixStack.translate(0, -.065, 0); - } else { - if (!(event.itemEntity.getStack().getItem() instanceof BlockItem)) { - event.matrixStack.translate(0, 0, .195); - } + matrices.pop(); + event.cancel(); + } - event.matrixStack.translate(0, .185, .0); - event.matrixStack.multiply(RotationAxis.POSITIVE_Z.rotationDegrees((float) rotator.getRotation().z)); - event.matrixStack.translate(0, -.185, .0); - } + @EventHandler + private void onApplyTransformation(ApplyTransformationEvent event) { + if (renderingItem) event.cancel(); + } - if (event.itemEntity.getWorld().getBlockState(event.itemEntity.getBlockPos()).getBlock().equals(Blocks.SOUL_SAND)) { - event.matrixStack.translate(0, 0, -.1); - } + private void renderItem(RenderItemEntityEvent event, MatrixStack matrices, ItemStack itemStack, BakedModel model, ModelInfo info) { + renderingItem = true; + int count = getRenderedCount(itemStack); + + for (int i = 0; i < count; i++) { + matrices.push(); - if (event.itemEntity.getStack().getItem() instanceof BlockItem) { - if (((BlockItem) event.itemEntity.getStack().getItem()).getBlock() instanceof SkullBlock) { - event.matrixStack.translate(0, .11, 0); + if (i > 0) { + float x = (random.nextFloat() * 2 - 1) * 0.25f; + float z = (random.nextFloat() * 2 - 1) * 0.25f; + translate(matrices, info, x, 0, z); } - } - float scaleX = bakedModel.getTransformation().ground.scale.x; - float scaleY = bakedModel.getTransformation().ground.scale.y; - float scaleZ = bakedModel.getTransformation().ground.scale.z; - - float x; - float y; - if (!hasDepthInGui) { - float r = -0.0F * (float) (renderCount) * 0.5F * scaleX; - x = -0.0F * (float) (renderCount) * 0.5F * scaleY; - y = -0.09375F * (float) (renderCount) * 0.5F * scaleZ; - event.matrixStack.translate(r, x, y); - } + event.itemRenderer.renderItem(itemStack, ModelTransformationMode.GROUND, false, matrices, event.vertexConsumerProvider, event.light, OverlayTexture.DEFAULT_UV, model); - for (int u = 0; u < renderCount; ++u) { - event.matrixStack.push(); - if (u > 0) { - if (hasDepthInGui) { - x = (event.random.nextFloat() * 2.0F - 1.0F) * 0.15F; - y = (event.random.nextFloat() * 2.0F - 1.0F) * 0.15F; - float z = (event.random.nextFloat() * 2.0F - 1.0F) * 0.15F; - event.matrixStack.translate(x, y, z); - } else { - x = (event.random.nextFloat() * 2.0F - 1.0F) * 0.15F * 0.5F; - y = (event.random.nextFloat() * 2.0F - 1.0F) * 0.15F * 0.5F; - event.matrixStack.translate(x, y, 0.0D); - event.matrixStack.multiply(RotationAxis.POSITIVE_Z.rotationDegrees(event.random.nextFloat())); - } - } + matrices.pop(); - event.itemRenderer.renderItem(itemStack, ModelTransformationMode.GROUND, false, event.matrixStack, event.vertexConsumerProvider, event.light, OverlayTexture.DEFAULT_UV, bakedModel); + float y = Math.max(random.nextFloat() * PIXEL_SIZE, PIXEL_SIZE / 2f); + translate(matrices, info, 0, y, 0); + } - event.matrixStack.pop(); + renderingItem = false; + } - if (!hasDepthInGui) { - event.matrixStack.translate(0.0F * scaleX, 0.0F * scaleY, 0.0625F * scaleZ); - } + private void translate(MatrixStack matrices, ModelInfo info, float x, float y, float z) { + if (info.flat) { + float temp = y; + y = z; + z = -temp; } - event.matrixStack.pop(); - event.cancel(); + matrices.translate(x, y, z); } - private int getRenderedAmount(ItemStack stack) { + private int getRenderedCount(ItemStack stack) { int i = 1; if (stack.getCount() > 48) i = 5; @@ -164,4 +130,70 @@ private int getRenderedAmount(ItemStack stack) { return i; } + + private void applyTransformation(MatrixStack matrices, BakedModel model) { + Transformation transformation = model.getTransformation().ground; + + float prevY = transformation.translation.y; + transformation.translation.y = 0; + + transformation.apply(false, matrices); + + transformation.translation.y = prevY; + } + + private BakedModel getModel(ItemEntity entity) { + ItemStack itemStack = entity.getStack(); + + // Mojang be like + if (itemStack.isOf(Items.TRIDENT)) return mc.getItemRenderer().getModels().getModelManager().getModel(ItemRenderer.TRIDENT); + if (itemStack.isOf(Items.SPYGLASS)) return mc.getItemRenderer().getModels().getModelManager().getModel(ItemRenderer.SPYGLASS); + + return mc.getItemRenderer().getModel(itemStack, entity.getWorld(), null, entity.getId()); + } + + private ModelInfo getInfo(BakedModel model) { + Random random = Random.createLocal(); + + float minX = Float.MAX_VALUE, maxX = Float.MIN_VALUE; + float minY = Float.MAX_VALUE, maxY = Float.MIN_VALUE; + float minZ = Float.MAX_VALUE, maxZ = Float.MIN_VALUE; + + for (Direction face : FACES) { + for (BakedQuad _quad : model.getQuads(null, face, random)) { + IBakedQuad quad = (IBakedQuad) _quad; + + for (int i = 0; i < 4; i++) { + switch (_quad.getFace()) { + case DOWN -> minY = Math.min(minY, quad.meteor$getY(i)); + case UP -> maxY = Math.max(maxY, quad.meteor$getY(i)); + case NORTH -> minZ = Math.min(minZ, quad.meteor$getZ(i)); + case SOUTH -> maxZ = Math.max(maxZ, quad.meteor$getZ(i)); + case WEST -> minX = Math.min(minX, quad.meteor$getX(i)); + case EAST -> maxX = Math.max(maxX, quad.meteor$getX(i)); + } + } + } + } + + if (minX == Float.MAX_VALUE) minX = 0; + if (minY == Float.MAX_VALUE) minY = 0; + if (minZ == Float.MAX_VALUE) minZ = 0; + + if (maxX == Float.MIN_VALUE) maxX = 1; + if (maxY == Float.MIN_VALUE) maxY = 1; + if (maxZ == Float.MIN_VALUE) maxZ = 1; + + float x = maxX - minX; + float y = maxY - minY; + float z = maxZ - minZ; + + boolean flat = (x > PIXEL_SIZE && y > PIXEL_SIZE && z <= PIXEL_SIZE); + + // Need to add a slight offset to move the item up so when Minecraft renders the enchantment glint the geometry + // won't intersect with the block below. Or Mojang could just use back face culling but that's probably not happening + return new ModelInfo(flat, 0.5f - minY + 0.0001f, minZ - minY); + } + + record ModelInfo(boolean flat, float offsetY, float offsetZ) {} } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/SimpleBlockRenderer.java b/src/main/java/meteordevelopment/meteorclient/utils/render/SimpleBlockRenderer.java index fcb5d064a5..607203ec84 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/SimpleBlockRenderer.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/SimpleBlockRenderer.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.utils.render; +import meteordevelopment.meteorclient.mixininterface.IBakedQuad; import net.minecraft.block.BlockRenderType; import net.minecraft.block.BlockState; import net.minecraft.block.entity.BlockEntity; @@ -60,12 +61,12 @@ public static void render(BlockPos pos, BlockState state, VertexConsumerProvider private static void renderQuads(List quads, double offsetX, double offsetY, double offsetZ, VertexConsumer consumer) { //noinspection ForLoopReplaceableByForEach for (int i = 0; i < quads.size(); i++) { - int[] vertexData = quads.get(i).getVertexData(); + IBakedQuad quad = (IBakedQuad) quads.get(i); for (int j = 0; j < 4; j++) { - float x = Float.intBitsToFloat(vertexData[j * 8]); - float y = Float.intBitsToFloat(vertexData[j * 8 + 1]); - float z = Float.intBitsToFloat(vertexData[j * 8 + 2]); + float x = quad.meteor$getX(j); + float y = quad.meteor$getY(j); + float z = quad.meteor$getZ(j); consumer.vertex(offsetX + x, offsetY + y, offsetZ + z).next(); } diff --git a/src/main/resources/meteor-client.accesswidener b/src/main/resources/meteor-client.accesswidener index 8cb36fe584..5632e6397b 100644 --- a/src/main/resources/meteor-client.accesswidener +++ b/src/main/resources/meteor-client.accesswidener @@ -71,3 +71,6 @@ accessible field net/minecraft/block/AbstractBlock collidable Z accessible field net/minecraft/util/math/Direction HORIZONTAL [Lnet/minecraft/util/math/Direction; accessible field net/minecraft/item/ItemGroups INVENTORY Lnet/minecraft/registry/RegistryKey; + +accessible field net/minecraft/client/render/item/ItemRenderer TRIDENT Lnet/minecraft/client/util/ModelIdentifier; +accessible field net/minecraft/client/render/item/ItemRenderer SPYGLASS Lnet/minecraft/client/util/ModelIdentifier; diff --git a/src/main/resources/meteor-client.mixins.json b/src/main/resources/meteor-client.mixins.json index 5692e3323a..d30557565b 100644 --- a/src/main/resources/meteor-client.mixins.json +++ b/src/main/resources/meteor-client.mixins.json @@ -12,6 +12,7 @@ "AbstractSignEditScreenAccessor", "ArmorFeatureRendererMixin", "BackgroundRendererMixin", + "BakedQuadMixin", "BannerBlockEntityRendererMixin", "BeaconBlockEntityRendererMixin", "BeaconScreenMixin", @@ -155,6 +156,7 @@ "TextRendererMixin", "TextVisitFactoryMixin", "TitleScreenMixin", + "TransformationMixin", "TridentItemMixin", "Vec3dMixin", "VertexBufferMixin", From de7bc4821a8b03fab79a096df14ca78777a1ee71 Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Tue, 13 Jun 2023 17:49:01 +0200 Subject: [PATCH 022/357] Small fixes for ItemPhysics --- .../systems/modules/render/ItemPhysics.java | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ItemPhysics.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ItemPhysics.java index bb38379122..d4e96dfc00 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ItemPhysics.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ItemPhysics.java @@ -49,7 +49,7 @@ public ItemPhysics() { } @EventHandler - private void onRenderItemEntityNew(RenderItemEntityEvent event) { + private void onRenderItemEntity(RenderItemEntityEvent event) { MatrixStack matrices = event.matrixStack; matrices.push(); @@ -61,6 +61,8 @@ private void onRenderItemEntityNew(RenderItemEntityEvent event) { applyTransformation(matrices, model); matrices.translate(0, info.offsetY, 0); + offsetInWater(matrices, event.itemEntity); + preventZFighting(matrices, event.itemEntity); if (info.flat) { matrices.multiply(RotationAxis.POSITIVE_X.rotationDegrees(90)); @@ -142,6 +144,21 @@ private void applyTransformation(MatrixStack matrices, BakedModel model) { transformation.translation.y = prevY; } + private void offsetInWater(MatrixStack matrices, ItemEntity entity) { + if (entity.isTouchingWater()) { + matrices.translate(0, 0.333f, 0); + } + } + + private void preventZFighting(MatrixStack matrices, ItemEntity entity) { + float offset = 0.0001f; + + float distance = (float) mc.gameRenderer.getCamera().getPos().distanceTo(entity.getPos()); + offset = Math.min(offset * Math.max(1, distance), 0.01f); // Ensure distance is at least 1 and that final offset is not bigger than 0.01 + + matrices.translate(0, offset, 0); + } + private BakedModel getModel(ItemEntity entity) { ItemStack itemStack = entity.getStack(); @@ -190,9 +207,7 @@ private ModelInfo getInfo(BakedModel model) { boolean flat = (x > PIXEL_SIZE && y > PIXEL_SIZE && z <= PIXEL_SIZE); - // Need to add a slight offset to move the item up so when Minecraft renders the enchantment glint the geometry - // won't intersect with the block below. Or Mojang could just use back face culling but that's probably not happening - return new ModelInfo(flat, 0.5f - minY + 0.0001f, minZ - minY); + return new ModelInfo(flat, 0.5f - minY, minZ - minY); } record ModelInfo(boolean flat, float offsetY, float offsetZ) {} From 01c77b7ccc75fb6f0d94c26ec028b5283e82fdfd Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Tue, 13 Jun 2023 22:57:01 +0200 Subject: [PATCH 023/357] Small fix for running through IntelliJ and not Gradle --- .../meteorclient/MeteorClient.java | 3 ++ .../meteorclient/mixin/TitleScreenMixin.java | 51 ++++++++++--------- .../meteorclient/utils/misc/Version.java | 4 ++ 3 files changed, 34 insertions(+), 24 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/MeteorClient.java b/src/main/java/meteordevelopment/meteorclient/MeteorClient.java index e814c99b9b..519c61767b 100644 --- a/src/main/java/meteordevelopment/meteorclient/MeteorClient.java +++ b/src/main/java/meteordevelopment/meteorclient/MeteorClient.java @@ -66,6 +66,9 @@ public class MeteorClient implements ClientModInitializer { String versionString = MOD_META.getVersion().getFriendlyString(); if (versionString.contains("-")) versionString = versionString.split("-")[0]; + // When building and running through IntelliJ and not Gradle it doesn't replace the version so just use a dummy + if (versionString.equals("${version}")) versionString = "0.0.0"; + VERSION = new Version(versionString); DEV_BUILD = MOD_META.getCustomValue(MeteorClient.MOD_ID + ":devbuild").getAsString(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/TitleScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/TitleScreenMixin.java index f7dd560e60..48b61f097e 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/TitleScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/TitleScreenMixin.java @@ -37,33 +37,36 @@ public TitleScreenMixin(Text title) { private void onRenderIdkDude(DrawContext context, int mouseX, int mouseY, float delta, CallbackInfo ci) { if (Utils.firstTimeTitleScreen) { Utils.firstTimeTitleScreen = false; - MeteorClient.LOG.info("Checking latest version of Meteor Client"); - MeteorExecutor.execute(() -> { - String res = Http.get("https://meteorclient.com/api/stats").sendString(); - if (res == null) return; + if (!MeteorClient.VERSION.isZero()) { + MeteorClient.LOG.info("Checking latest version of Meteor Client"); - Version latestVer = new Version(JsonParser.parseString(res).getAsJsonObject().get("version").getAsString()); + MeteorExecutor.execute(() -> { + String res = Http.get("https://meteorclient.com/api/stats").sendString(); + if (res == null) return; - if (latestVer.isHigherThan(MeteorClient.VERSION)) { - YesNoPrompt.create() - .title("New Update") - .message("A new version of Meteor has been released.") - .message("Your version: %s", MeteorClient.VERSION) - .message("Latest version: %s", latestVer) - .message("Do you want to update?") - .onYes(() -> Util.getOperatingSystem().open("https://meteorclient.com/")) - .onNo(() -> OkPrompt.create() - .title("Are you sure?") - .message("Using old versions of Meteor is not recommended") - .message("and could report in issues.") - .id("new-update-no") - .onOk(this::close) - .show()) - .id("new-update") - .show(); - } - }); + Version latestVer = new Version(JsonParser.parseString(res).getAsJsonObject().get("version").getAsString()); + + if (latestVer.isHigherThan(MeteorClient.VERSION)) { + YesNoPrompt.create() + .title("New Update") + .message("A new version of Meteor has been released.") + .message("Your version: %s", MeteorClient.VERSION) + .message("Latest version: %s", latestVer) + .message("Do you want to update?") + .onYes(() -> Util.getOperatingSystem().open("https://meteorclient.com/")) + .onNo(() -> OkPrompt.create() + .title("Are you sure?") + .message("Using old versions of Meteor is not recommended") + .message("and could report in issues.") + .id("new-update-no") + .onOk(this::close) + .show()) + .id("new-update") + .show(); + } + }); + } } } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/Version.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/Version.java index ea0ec7998f..214580e20e 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/Version.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/Version.java @@ -25,6 +25,10 @@ public Version(String string) { } } + public boolean isZero() { + return numbers[0] == 0 && numbers[1] == 0 && numbers[2] == 0; + } + public boolean isHigherThan(Version version) { for (int i = 0; i < 3; i++) { if (numbers[i] > version.numbers[i]) return true; From 1417031c9cc7bee10a5db32eb0bde94627ba7fff Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Wed, 14 Jun 2023 14:58:41 +0200 Subject: [PATCH 024/357] Allow launching on both 1.20 and 1.20.1 --- gradle.properties | 6 +++--- src/main/resources/fabric.mod.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/gradle.properties b/gradle.properties index ab95ae2bbc..e1532cd69b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,10 +1,10 @@ org.gradle.jvmargs=-Xmx2G # Fabric (https://fabricmc.net/develop) -minecraft_version=1.20 -yarn_mappings=1.20+build.1 +minecraft_version=1.20.1 +yarn_mappings=1.20.1+build.1 loader_version=0.14.21 -fapi_version=0.83.0+1.20 +fapi_version=0.83.1+1.20.1 # Mod Properties mod_version=0.5.4 diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index a2ba3930d3..04daf4e44d 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -47,7 +47,7 @@ }, "depends": { "java": ">=17", - "minecraft": "1.20", + "minecraft": [ "1.20", "1.20.1" ], "fabricloader": ">=0.14.21" }, "breaks": { From f9904723052fcda13ab3edc2da0c75b217f45c79 Mon Sep 17 00:00:00 2001 From: Wide-Cat <74723656+Wide-Cat@users.noreply.github.com> Date: Tue, 27 Jun 2023 15:06:27 +0100 Subject: [PATCH 025/357] Make autosign work with hanging signs --- .../meteorclient/systems/modules/world/AutoSign.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSign.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSign.java index 436de604e1..169c168d58 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSign.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSign.java @@ -12,7 +12,7 @@ import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.orbit.EventHandler; import net.minecraft.block.entity.SignBlockEntity; -import net.minecraft.client.gui.screen.ingame.SignEditScreen; +import net.minecraft.client.gui.screen.ingame.AbstractSignEditScreen; import net.minecraft.network.packet.c2s.play.UpdateSignC2SPacket; public class AutoSign extends Module { @@ -36,7 +36,7 @@ private void onSendPacket(PacketEvent.Send event) { @EventHandler private void onOpenScreen(OpenScreenEvent event) { - if (!(event.screen instanceof SignEditScreen) || text == null) return; + if (!(event.screen instanceof AbstractSignEditScreen) || text == null) return; SignBlockEntity sign = ((AbstractSignEditScreenAccessor) event.screen).getSign(); From e2854ceb11c621c45d481680af8559c14b992baa Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Wed, 28 Jun 2023 23:59:27 +0200 Subject: [PATCH 026/357] Fix random sneaking and collisions --- .../events/world/CollisionShapeEvent.java | 18 +++++++++++++----- .../mixin/BlockCollisionSpliteratorMixin.java | 8 +++++++- .../ChunkAwareBlockCollisionSweeperMixin.java | 8 +++++++- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/events/world/CollisionShapeEvent.java b/src/main/java/meteordevelopment/meteorclient/events/world/CollisionShapeEvent.java index c4aaea97eb..b759780555 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/world/CollisionShapeEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/world/CollisionShapeEvent.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.events.world; +import com.mojang.blaze3d.systems.RenderSystem; import meteordevelopment.meteorclient.events.Cancellable; import net.minecraft.block.BlockState; import net.minecraft.util.math.BlockPos; @@ -18,10 +19,17 @@ public class CollisionShapeEvent extends Cancellable { public VoxelShape shape; public static CollisionShapeEvent get(BlockState state, BlockPos pos, VoxelShape shape) { - INSTANCE.setCancelled(false); - INSTANCE.state = state; - INSTANCE.pos = pos; - INSTANCE.shape = shape; - return INSTANCE; + CollisionShapeEvent event = INSTANCE; + + if (!RenderSystem.isOnRenderThread()) { + event = new CollisionShapeEvent(); + } + + event.setCancelled(false); + event.state = state; + event.pos = pos; + event.shape = shape; + + return event; } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BlockCollisionSpliteratorMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BlockCollisionSpliteratorMixin.java index 026acc0e73..f51dc897b0 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BlockCollisionSpliteratorMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BlockCollisionSpliteratorMixin.java @@ -9,6 +9,7 @@ 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; @@ -22,7 +23,12 @@ public class BlockCollisionSpliteratorMixin { @Redirect(method = "computeNext", at = @At(value = "INVOKE", target = "Lnet/minecraft/block/BlockState;getCollisionShape(Lnet/minecraft/world/BlockView;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/ShapeContext;)Lnet/minecraft/util/shape/VoxelShape;")) private VoxelShape onComputeNextCollisionBox(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { - CollisionShapeEvent event = MeteorClient.EVENT_BUS.post(CollisionShapeEvent.get(state, pos, state.getCollisionShape(world, pos, context))); + VoxelShape shape = state.getCollisionShape(world, pos, context); + + if (world != MinecraftClient.getInstance().world) + return shape; + + CollisionShapeEvent event = MeteorClient.EVENT_BUS.post(CollisionShapeEvent.get(state, pos, shape)); return event.isCancelled() ? VoxelShapes.empty() : event.shape; } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/lithium/ChunkAwareBlockCollisionSweeperMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/lithium/ChunkAwareBlockCollisionSweeperMixin.java index 1ada66b788..eb15d0e2b1 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/lithium/ChunkAwareBlockCollisionSweeperMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/lithium/ChunkAwareBlockCollisionSweeperMixin.java @@ -10,6 +10,7 @@ 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; @@ -22,7 +23,12 @@ public abstract class ChunkAwareBlockCollisionSweeperMixin { @Redirect(method = "computeNext", at = @At(value = "INVOKE", target = "Lnet/minecraft/block/BlockState;getCollisionShape(Lnet/minecraft/world/BlockView;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/ShapeContext;)Lnet/minecraft/util/shape/VoxelShape;")) private VoxelShape onComputeNextCollisionBox(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { - CollisionShapeEvent event = MeteorClient.EVENT_BUS.post(CollisionShapeEvent.get(state, pos, state.getCollisionShape(world, pos, context))); + VoxelShape shape = state.getCollisionShape(world, pos, context); + + if (world != MinecraftClient.getInstance().world) + return shape; + + CollisionShapeEvent event = MeteorClient.EVENT_BUS.post(CollisionShapeEvent.get(state, pos, shape)); return event.isCancelled() ? VoxelShapes.empty() : event.shape; } } From 0ea98e5db69ff44ad162e1b688611323e1d52205 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Thu, 29 Jun 2023 21:20:11 +0100 Subject: [PATCH 027/357] updated xray to work with latest fabric api --- gradle.properties | 2 +- .../AbstractBlockRenderContextMixin.java | 44 +++++++++++ .../indigo/AbstractQuadRendererMixin.java | 79 ------------------- .../meteor-client-indigo.mixins.json | 2 +- 4 files changed, 46 insertions(+), 81 deletions(-) create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/indigo/AbstractBlockRenderContextMixin.java delete mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/indigo/AbstractQuadRendererMixin.java diff --git a/gradle.properties b/gradle.properties index e1532cd69b..0f2585ee74 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ org.gradle.jvmargs=-Xmx2G minecraft_version=1.20.1 yarn_mappings=1.20.1+build.1 loader_version=0.14.21 -fapi_version=0.83.1+1.20.1 +fapi_version=0.84.0+1.20.1 # Mod Properties mod_version=0.5.4 diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/indigo/AbstractBlockRenderContextMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/indigo/AbstractBlockRenderContextMixin.java new file mode 100644 index 0000000000..81de5ceb1b --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/indigo/AbstractBlockRenderContextMixin.java @@ -0,0 +1,44 @@ +/* + * 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.AbstractBlockRenderContext; +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.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(AbstractBlockRenderContext.class) +public class AbstractBlockRenderContextMixin { + @Final + @Shadow + protected BlockRenderInfo blockInfo; + + @Inject(method = "renderQuad", at = @At(value = "INVOKE", target = "Lnet/fabricmc/fabric/impl/client/indigo/renderer/render/AbstractBlockRenderContext;bufferQuad(Lnet/fabricmc/fabric/impl/client/indigo/renderer/mesh/MutableQuadViewImpl;Lnet/minecraft/client/render/VertexConsumer;)V"), cancellable = true) + private void onBufferQuad(MutableQuadViewImpl quad, boolean isVanilla, 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)); + } + } + } + + private int rewriteQuadAlpha(int color, int alpha) { + int red = ((color >>> 16) & 0xFF); + int green = ((color >>> 8) & 0xFF); + int blue = (color & 0xFF); + + return ((alpha & 0xFF) << 24) | (red << 16) | (green << 8) | blue; + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/indigo/AbstractQuadRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/indigo/AbstractQuadRendererMixin.java deleted file mode 100644 index 10c4e924bf..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/indigo/AbstractQuadRendererMixin.java +++ /dev/null @@ -1,79 +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.AbstractQuadRenderer; -import net.fabricmc.fabric.impl.client.indigo.renderer.render.BlockRenderInfo; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import org.joml.Matrix3f; -import org.joml.Matrix4f; -import org.joml.Vector3f; -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.function.Function; - -@Mixin(value = AbstractQuadRenderer.class, remap = false) -public abstract class AbstractQuadRendererMixin { - @Final @Shadow protected BlockRenderInfo blockInfo; - @Final @Shadow protected Function bufferFunc; - @Final @Shadow protected Vector3f normalVec; - - @Shadow protected abstract Matrix3f normalMatrix(); - @Shadow protected abstract Matrix4f matrix(); - @Shadow protected abstract int overlay(); - - @Inject(method = "bufferQuad(Lnet/fabricmc/fabric/impl/client/indigo/renderer/mesh/MutableQuadViewImpl;Lnet/minecraft/client/render/RenderLayer;)V", at = @At("HEAD"), cancellable = true, remap = true) - private void onBufferQuad(MutableQuadViewImpl quad, RenderLayer renderLayer, CallbackInfo info) { - int alpha = Xray.getAlpha(blockInfo.blockState, blockInfo.blockPos); - - if (alpha == 0) info.cancel(); - else if (alpha != -1) { - whBufferQuad(bufferFunc.apply(renderLayer), quad, matrix(), overlay(), normalMatrix(), normalVec, alpha); - info.cancel(); - } - } - - //https://github.com/FabricMC/fabric/blob/351679a7decdd3044d778e74001de67463bee205/fabric-renderer-indigo/src/main/java/net/fabricmc/fabric/impl/client/indigo/renderer/render/AbstractQuadRenderer.java#L86 - //Again, nasty problem with mixins and for loops, hopefully I can fix this at a later date - Wala - @Unique - private void whBufferQuad(VertexConsumer buff, MutableQuadViewImpl quad, Matrix4f matrix, int overlay, Matrix3f normalMatrix, Vector3f normalVec, int alpha) { - final boolean useNormals = quad.hasVertexNormals(); - - if (useNormals) { - quad.populateMissingNormals(); - } else { - final Vector3f faceNormal = quad.faceNormal(); - normalVec.set(faceNormal.x, faceNormal.y, faceNormal.z); - normalVec.mul(normalMatrix); - } - - for (int i = 0; i < 4; i++) { - buff.vertex(matrix, quad.x(i), quad.y(i), quad.z(i)); - final int color = quad.spriteColor(i, 0); - buff.color(color & 0xFF, (color >> 8) & 0xFF, (color >> 16) & 0xFF, alpha); - buff.texture(quad.spriteU(i, 0), quad.spriteV(i, 0)); - buff.overlay(overlay); - buff.light(quad.lightmap(i)); - - if (useNormals) { - normalVec.set(quad.normalX(i), quad.normalY(i), quad.normalZ(i)); - normalVec.mul(normalMatrix); - } - - buff.normal(normalVec.x, normalVec.y, normalVec.z); - buff.next(); - } - } -} diff --git a/src/main/resources/meteor-client-indigo.mixins.json b/src/main/resources/meteor-client-indigo.mixins.json index 8a7f2a6389..7dc33a1a5e 100644 --- a/src/main/resources/meteor-client-indigo.mixins.json +++ b/src/main/resources/meteor-client-indigo.mixins.json @@ -4,7 +4,7 @@ "compatibilityLevel": "JAVA_17", "plugin": "meteordevelopment.meteorclient.MixinPlugin", "client": [ - "AbstractQuadRendererMixin" + "AbstractBlockRenderContextMixin" ], "injectors": { "defaultRequire": 1 From 12b4b412fe9e4670792775995c1d9e80bcc60401 Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Thu, 29 Jun 2023 23:28:22 +0200 Subject: [PATCH 028/357] Simplify color modification from previous commit --- .../mixin/indigo/AbstractBlockRenderContextMixin.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/indigo/AbstractBlockRenderContextMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/indigo/AbstractBlockRenderContextMixin.java index 81de5ceb1b..05f5f99d12 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/indigo/AbstractBlockRenderContextMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/indigo/AbstractBlockRenderContextMixin.java @@ -35,10 +35,6 @@ else if (alpha != -1) { } private int rewriteQuadAlpha(int color, int alpha) { - int red = ((color >>> 16) & 0xFF); - int green = ((color >>> 8) & 0xFF); - int blue = (color & 0xFF); - - return ((alpha & 0xFF) << 24) | (red << 16) | (green << 8) | blue; + return ((alpha & 0xFF) << 24) | (color & 0x00FFFFFF); } } From 66e0b889a7ddd2c5e88242f6320c7a1f80618bbc Mon Sep 17 00:00:00 2001 From: Wide-Cat <74723656+Wide-Cat@users.noreply.github.com> Date: Fri, 30 Jun 2023 11:45:11 +0100 Subject: [PATCH 029/357] Fix anti spam (#3794) --- .../meteorclient/mixin/ChatHudMixin.java | 43 +++++++++- .../systems/modules/misc/BetterChat.java | 83 ++++++++++--------- 2 files changed, 85 insertions(+), 41 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java index d9680f183c..f8268e978a 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java @@ -26,6 +26,7 @@ import net.minecraft.client.option.ChatVisibility; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.network.message.MessageSignatureData; +import net.minecraft.text.OrderedText; import net.minecraft.text.Text; import net.minecraft.util.Identifier; import net.minecraft.util.math.MathHelper; @@ -38,6 +39,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Slice; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; import java.util.List; import java.util.regex.Pattern; @@ -83,7 +85,13 @@ private void onAddMessage(Text message, @Nullable MessageSignatureData signature if (event.isCancelled()) info.cancel(); else { visibleMessages.removeIf(msg -> ((IChatHudLine) (Object) msg).getId() == nextId && nextId != 0); - messages.removeIf(msg -> ((IChatHudLine) (Object) msg).getId() == nextId && nextId != 0); + + for (int i = messages.size() - 1; i > -1 ; i--) { + if (((IChatHudLine) (Object) messages.get(i)).getId() == nextId && nextId != 0) { + messages.remove(i); + Modules.get().get(BetterChat.class).lines.remove(i); + } + } if (event.isModified()) { info.cancel(); @@ -95,7 +103,8 @@ private void onAddMessage(Text message, @Nullable MessageSignatureData signature } } - @ModifyExpressionValue(method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;ILnet/minecraft/client/gui/hud/MessageIndicator;Z)V", slice = @Slice(from = @At(value = "FIELD", target = "Lnet/minecraft/client/gui/hud/ChatHud;visibleMessages:Ljava/util/List;")), at = @At(value = "INVOKE", target = "Ljava/util/List;size()I")) + @ModifyExpressionValue(method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;ILnet/minecraft/client/gui/hud/MessageIndicator;Z)V", + slice = @Slice(from = @At(value = "FIELD", target = "Lnet/minecraft/client/gui/hud/ChatHud;visibleMessages:Ljava/util/List;")), at = @At(value = "INVOKE", target = "Ljava/util/List;size()I")) private int addMessageListSizeProxy(int size) { BetterChat betterChat = Modules.get().get(BetterChat.class); if (betterChat.isLongerChat() && betterChat.getChatLength() >= 100) return size - betterChat.getChatLength(); @@ -210,4 +219,34 @@ private static Identifier getMessageTexture(String message) { private MessageIndicator onRender_modifyIndicator(MessageIndicator indicator) { return Modules.get().get(NoRender.class).noMessageSignatureIndicator() ? null : indicator; } + + // Anti spam + + @Inject(method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;ILnet/minecraft/client/gui/hud/MessageIndicator;Z)V", + at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/ChatHud;isChatFocused()Z"), locals = LocalCapture.CAPTURE_FAILSOFT) + private void onBreakChatMessageLines(Text message, MessageSignatureData signature, int ticks, MessageIndicator indicator, boolean refresh, CallbackInfo ci, int i, List list) { + Modules.get().get(BetterChat.class).lines.add(0, list.size()); + } + + @Inject(method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;ILnet/minecraft/client/gui/hud/MessageIndicator;Z)V", + slice = @Slice(from = @At(value = "FIELD", target = "Lnet/minecraft/client/gui/hud/ChatHud;messages:Ljava/util/List;")), at = @At(value = "INVOKE", target = "Ljava/util/List;remove(I)Ljava/lang/Object;")) + private void onRemoveMessage(Text message, MessageSignatureData signature, int ticks, MessageIndicator indicator, boolean refresh, CallbackInfo ci) { + BetterChat betterChat = Modules.get().get(BetterChat.class); + int size = betterChat.lines.size() - (betterChat.isLongerChat() && betterChat.getChatLength() >= 100 ? betterChat.getChatLength() : 0); + + while (size > 100) { + betterChat.lines.remove(size - 1); + size--; + } + } + + @Inject(method = "clear", at = @At("HEAD")) + private void onClear(boolean clearHistory, CallbackInfo ci) { + Modules.get().get(BetterChat.class).lines.clear(); + } + + @Inject(method = "refresh", at = @At("HEAD")) + private void onRefresh(CallbackInfo ci) { + Modules.get().get(BetterChat.class).lines.clear(); + } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java index 4fb3db1673..16ad357c1f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java @@ -7,6 +7,8 @@ import it.unimi.dsi.fastutil.chars.Char2CharMap; import it.unimi.dsi.fastutil.chars.Char2CharOpenHashMap; +import it.unimi.dsi.fastutil.ints.IntArrayList; +import it.unimi.dsi.fastutil.ints.IntList; import meteordevelopment.meteorclient.commands.Commands; import meteordevelopment.meteorclient.events.game.ReceiveMessageEvent; import meteordevelopment.meteorclient.events.game.SendMessageEvent; @@ -18,10 +20,11 @@ import meteordevelopment.meteorclient.utils.player.ChatUtils; import meteordevelopment.orbit.EventHandler; import net.minecraft.client.gui.hud.ChatHudLine; -import net.minecraft.client.util.ChatMessages; -import net.minecraft.text.*; +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.util.math.MathHelper; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -210,6 +213,7 @@ public class BetterChat extends Module { private final Char2CharMap SMALL_CAPS = new Char2CharOpenHashMap(); private final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm"); + public final IntList lines = new IntArrayList(); public BetterChat() { super(Categories.Misc, "better-chat", "Improves your chat experience in various ways."); @@ -233,15 +237,6 @@ private void onMessageReceive(ReceiveMessageEvent event) { } } - if (timestamps.get()) { - Matcher matcher = timestampRegex.matcher(message.getString()); - if (matcher.matches()) message.getSiblings().subList(0, 8).clear(); - - Text timestamp = Text.literal("<" + dateFormat.format(new Date()) + "> ").formatted(Formatting.GRAY); - - message = Text.literal("").append(timestamp).append(message); - } - if (playerHeads.get()) { message = Text.literal(" ").append(message); } @@ -254,62 +249,72 @@ private void onMessageReceive(ReceiveMessageEvent event) { } } + if (timestamps.get()) { + Matcher matcher = timestampRegex.matcher(message.getString()); + if (matcher.matches()) message.getSiblings().subList(0, 8).clear(); + + Text timestamp = Text.literal("<" + dateFormat.format(new Date()) + "> ").formatted(Formatting.GRAY); + + message = Text.literal("").append(timestamp).append(message); + } + event.setMessage(message); } - /** - * @author Crosby - * Adding author tag because this is spaghetti code - */ + private Text appendAntiSpam(Text text) { Text returnText = null; int messageIndex = -1; - MutableText originalMessage = null; - for (int i = 0; i < antiSpamDepth.get(); i++) { - List messages = ((ChatHudAccessor) mc.inGameHud.getChatHud()).getMessages(); - if (messages.isEmpty() || i > messages.size() - 1) return null; + List messages = ((ChatHudAccessor) mc.inGameHud.getChatHud()).getMessages(); + if (messages.isEmpty()) return null; + + for (int i = 0; i < Math.min(antiSpamDepth.get(), messages.size()); i++) { + String stringToCheck = messages.get(i).content().copy().getString(); - MutableText message = messages.get(i).content().copy(); - String oldMessage = message.getString(); - String newMessage = text.getString(); + Matcher timestampMatcher = timestampRegex.matcher(stringToCheck); + if (timestampMatcher.find()) { + stringToCheck = stringToCheck.substring(8); + } - if (oldMessage.equals(newMessage)) { - originalMessage = message.copy(); + if (text.getString().equals(stringToCheck)) { messageIndex = i; - returnText = message.append(Text.literal(" (2)").formatted(Formatting.GRAY)); + returnText = text.copy().append(Text.literal(" (2)").formatted(Formatting.GRAY)); break; } else { - Matcher matcher = antiSpamRegex.matcher(oldMessage); - - if (!matcher.matches()) continue; + Matcher matcher = antiSpamRegex.matcher(stringToCheck); + if (!matcher.matches() && !matcher.find()) continue; String group = matcher.group(matcher.groupCount()); int number = Integer.parseInt(group.substring(1, group.length() - 1)); String counter = " (" + number + ")"; - if (oldMessage.substring(0, oldMessage.length() - counter.length()).equals(newMessage)) { - message.getSiblings().remove(message.getSiblings().size() - 1); - originalMessage = message.copy(); + if (stringToCheck.substring(0, stringToCheck.length() - counter.length()).equals(text.getString())) { messageIndex = i; - returnText = message.append(Text.literal(" (" + (number + 1) + ")").formatted(Formatting.GRAY)); + returnText = text.copy().append(Text.literal(" (" + (number + 1) + ")").formatted(Formatting.GRAY)); break; } } } if (returnText != null) { - ((ChatHudAccessor) mc.inGameHud.getChatHud()).getMessages().remove(messageIndex); + List visible = ((ChatHudAccessor) mc.inGameHud.getChatHud()).getVisibleMessages(); - List list = ChatMessages.breakRenderedChatMessageLines(originalMessage, MathHelper.floor((double)mc.inGameHud.getChatHud().getWidth() / mc.inGameHud.getChatHud().getChatScale()), mc.textRenderer); - List visibleMessages = ((ChatHudAccessor) mc.inGameHud.getChatHud()).getVisibleMessages(); - int lines = Math.min(list.size(), visibleMessages.size()); + int start = -1; + for (int i = 0; i < messageIndex; i++) { + start += lines.get(i); + } - for (int i = 0; i < lines; i++) { - visibleMessages.remove(messageIndex); + int i = lines.get(messageIndex); + while (i > 0) { + visible.remove(start + 1); + i--; } + + messages.remove(messageIndex); + lines.remove(messageIndex); } return returnText; From c6e276474d32f19f63f80a1fde4860519891d234 Mon Sep 17 00:00:00 2001 From: tyrannus <60930117+tyrannus00@users.noreply.github.com> Date: Tue, 11 Jul 2023 00:52:38 +0200 Subject: [PATCH 030/357] Fixed anchor below y 0 (#3824) Co-authored-by: tyrannus00 --- .../meteorclient/systems/modules/movement/Anchor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Anchor.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Anchor.java index 4da86618d4..eb9124a3a3 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Anchor.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Anchor.java @@ -112,7 +112,7 @@ private void onPostTick(TickEvent.Post event) { for (int i = 0; i < maxHeight.get(); i++) { y--; - if (y <= 0 || !isAir(x, y, z)) break; + if (y <= mc.world.getBottomY() || !isAir(x, y, z)) break; if (isHole(x, y, z)) { foundHole = true; From 9a36f0a37f7787c8fe23dff1ef3b6a655bcb2f86 Mon Sep 17 00:00:00 2001 From: xNasuni <62818119+xNasuni@users.noreply.github.com> Date: Wed, 12 Jul 2023 16:20:24 -0400 Subject: [PATCH 031/357] no gravity entities with correct trajectory and accurate multishot crossbow trajectories (#3818) --- .../meteorclient/systems/modules/render/Trajectories.java | 6 ++++-- .../utils/entity/ProjectileEntitySimulator.java | 7 +++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java index 5ca4ee2cda..86cc51c39e 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java @@ -103,6 +103,8 @@ public class Trajectories extends Module { private final Pool vec3s = new Pool<>(Vector3d::new); private final List paths = new ArrayList<>(); + private static final double MULTISHOT_OFFSET = Math.toRadians(10); // accurate-ish offset of crossbow multishot in radians (10° degrees) + public Trajectories() { super(Categories.Render, "trajectories", "Predicts the trajectory of throwable items."); } @@ -146,10 +148,10 @@ private void calculatePath(PlayerEntity player, double tickDelta) { getEmptyPath().calculate(); if (itemStack.getItem() instanceof CrossbowItem && EnchantmentHelper.getLevel(Enchantments.MULTISHOT, itemStack) > 0) { - if (!simulator.set(player, itemStack, -10, accurate.get(), tickDelta)) return; + if (!simulator.set(player, itemStack, MULTISHOT_OFFSET, accurate.get(), tickDelta)) return; // left multishot arrow getEmptyPath().calculate(); - if (!simulator.set(player, itemStack, 10, accurate.get(), tickDelta)) return; + if (!simulator.set(player, itemStack, -MULTISHOT_OFFSET, accurate.get(), tickDelta)) return; // right multishot arrow getEmptyPath().calculate(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/ProjectileEntitySimulator.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/ProjectileEntitySimulator.java index 9e894a0a5a..555c6628ad 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/entity/ProjectileEntitySimulator.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/entity/ProjectileEntitySimulator.java @@ -131,11 +131,14 @@ public boolean set(Entity entity, boolean accurate, double tickDelta) { set(entity, 0.5, 0.05, 0.8, accurate, tickDelta); } else if (entity instanceof WitherSkullEntity || entity instanceof FireballEntity || entity instanceof DragonFireballEntity) { set(entity, 0.95, 0, 0.8, accurate, tickDelta); - } - else { + } else { return false; } + if (entity.hasNoGravity()) { + this.gravity = 0; + } + return true; } From 5e294295834722834d126c323c095decad5c612b Mon Sep 17 00:00:00 2001 From: OnlyRain233 Date: Thu, 13 Jul 2023 04:27:40 +0800 Subject: [PATCH 032/357] Fix Reach not working in creative (#3826) --- .../mixin/ClientPlayerInteractionManagerMixin.java | 5 +++++ .../mixin/indigo/AbstractBlockRenderContextMixin.java | 4 +--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerInteractionManagerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerInteractionManagerMixin.java index 5aa43ce4eb..caf96eba86 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerInteractionManagerMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerInteractionManagerMixin.java @@ -113,6 +113,11 @@ private void onGetReachDistance(CallbackInfoReturnable info) { info.setReturnValue(Modules.get().get(Reach.class).blockReach()); } + @Inject(method = "hasExtendedReach", at = @At("HEAD"), cancellable = true) + private void onHasExtendedReach(CallbackInfoReturnable info) { + if (Modules.get().isActive(Reach.class)) info.setReturnValue(false); + } + @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)); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/indigo/AbstractBlockRenderContextMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/indigo/AbstractBlockRenderContextMixin.java index 05f5f99d12..a4c5837f2f 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/indigo/AbstractBlockRenderContextMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/indigo/AbstractBlockRenderContextMixin.java @@ -18,9 +18,7 @@ @Mixin(AbstractBlockRenderContext.class) public class AbstractBlockRenderContextMixin { - @Final - @Shadow - protected BlockRenderInfo blockInfo; + @Final @Shadow(remap = false) protected BlockRenderInfo blockInfo; @Inject(method = "renderQuad", at = @At(value = "INVOKE", target = "Lnet/fabricmc/fabric/impl/client/indigo/renderer/render/AbstractBlockRenderContext;bufferQuad(Lnet/fabricmc/fabric/impl/client/indigo/renderer/mesh/MutableQuadViewImpl;Lnet/minecraft/client/render/VertexConsumer;)V"), cancellable = true) private void onBufferQuad(MutableQuadViewImpl quad, boolean isVanilla, CallbackInfo ci) { From dd0f6d2f5a389ab8423e0e63e692edd1e8bf6597 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Mon, 17 Jul 2023 15:54:14 +0100 Subject: [PATCH 033/357] fix better tooltip crash --- .../meteorclient/systems/modules/render/BetterTooltips.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java index 5ddd6aa3c3..ba593fb806 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java @@ -5,7 +5,7 @@ package meteordevelopment.meteorclient.systems.modules.render; -import com.google.gson.JsonSyntaxException; +import com.google.gson.JsonParseException; import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import meteordevelopment.meteorclient.events.game.ItemStackTooltipEvent; @@ -436,7 +436,7 @@ private Text getFirstPage(ItemStack stack) { try { return Text.Serializer.fromLenientJson(pages.getString(0)); - } catch (JsonSyntaxException e) { + } catch (JsonParseException e) { return Text.literal("Invalid book data"); } } From 5c3d7a0435b6a4cc2c293c3369a2a861c8bd606b Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Sat, 22 Jul 2023 16:27:19 +0100 Subject: [PATCH 034/357] fix compatibility with camera utils --- .../meteorclient/mixin/CameraMixin.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/CameraMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/CameraMixin.java index 71473f2a71..c883d82570 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/CameraMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/CameraMixin.java @@ -23,6 +23,7 @@ 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.ModifyVariable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.invoke.arg.Args; @@ -31,8 +32,6 @@ public abstract class CameraMixin implements ICamera { @Shadow private boolean thirdPerson; - @Shadow protected abstract double clipToSpace(double desiredCameraDistance); - @Shadow private float yaw; @Shadow private float pitch; @@ -46,12 +45,9 @@ private void getSubmergedFluidState(CallbackInfoReturnable if (Modules.get().get(NoRender.class).noLiquidOverlay()) ci.setReturnValue(CameraSubmersionType.NONE); } - @ModifyArgs(method = "update", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/Camera;moveBy(DDD)V", ordinal = 0)) - private void modifyCameraDistance(Args args) { - args.set(0, -clipToSpace(Modules.get().get(CameraTweaks.class).getDistance())); - if (Modules.get().isActive(Freecam.class)) { - args.set(0, -clipToSpace(0)); - } + @ModifyVariable(method = "clipToSpace", at = @At("HEAD"), ordinal = 0, argsOnly = true) + private double modifyClipToSpace(double d) { + return (Modules.get().get(Freecam.class).isActive() ? 0 : Modules.get().get(CameraTweaks.class).getDistance()); } @Inject(method = "clipToSpace", at = @At("HEAD"), cancellable = true) From a52b91a6605063b622d913fa712ec53db1378bf2 Mon Sep 17 00:00:00 2001 From: Wide-Cat <74723656+Wide-Cat@users.noreply.github.com> Date: Sat, 22 Jul 2023 23:10:06 +0100 Subject: [PATCH 035/357] Add texture rotations to no render (#3869) --- .../mixin/AbstractBlockMixin.java | 11 +++++++ .../mixin/AbstractBlockStateMixin.java | 29 +++++++++++++++++++ .../systems/modules/render/NoRender.java | 12 ++++++++ src/main/resources/meteor-client.mixins.json | 1 + 4 files changed, 53 insertions(+) create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/AbstractBlockStateMixin.java diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/AbstractBlockMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractBlockMixin.java index acea24a485..45fed77b49 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/AbstractBlockMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractBlockMixin.java @@ -7,6 +7,8 @@ import meteordevelopment.meteorclient.MeteorClient; 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; @@ -16,12 +18,21 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import java.util.Random; + @Mixin(AbstractBlock.class) public class AbstractBlockMixin { + private static final Random RANDOM = new Random(); + @Inject(method = "getAmbientOcclusionLightLevel", at = @At("HEAD"), cancellable = true) private void onGetAmbientOcclusionLightLevel(BlockState state, BlockView world, BlockPos pos, CallbackInfoReturnable info) { AmbientOcclusionEvent event = MeteorClient.EVENT_BUS.post(AmbientOcclusionEvent.get()); if (event.lightLevel != -1) info.setReturnValue(event.lightLevel); } + + @Inject(method = "getRenderingSeed", at = @At("HEAD"), cancellable = true) + private void onRenderingSeed(BlockState state, BlockPos pos, CallbackInfoReturnable cir) { + if (Modules.get().get(NoRender.class).noTextureRotations()) cir.setReturnValue(RANDOM.nextLong()); + } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/AbstractBlockStateMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractBlockStateMixin.java new file mode 100644 index 0000000000..ff19c95594 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractBlockStateMixin.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.render.NoRender; +import net.minecraft.block.AbstractBlock; +import net.minecraft.util.math.BlockPos; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyVariable; + +import java.util.Random; + +@Mixin(AbstractBlock.AbstractBlockState.class) +public class AbstractBlockStateMixin { + private static final Random RANDOM = new Random(); + + @ModifyVariable(method = "getModelOffset", at = @At("HEAD"), argsOnly = true) + private BlockPos modifyPos(BlockPos pos) { + if (Modules.get() == null) return pos; + + if (Modules.get().get(NoRender.class).noTextureRotations()) return pos.multiply(RANDOM.nextInt()); + return pos; + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/NoRender.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/NoRender.java index 4cfb6379f7..8692934f8a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/NoRender.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/NoRender.java @@ -290,6 +290,14 @@ public class NoRender extends Module { .build() ); + private final Setting noTextureRotations = sgWorld.add(new BoolSetting.Builder() + .name("texture-rotations") + .description("Changes texture rotations and model offsets to use a random value instead of the block position.") + .defaultValue(false) + .onChanged(b -> mc.worldRenderer.reload()) + .build() + ); + // Entity private final Setting>> entities = sgEntity.add(new EntityTypeListSetting.Builder() @@ -520,6 +528,10 @@ public boolean noBarrierInvis() { return isActive() && noBarrierInvis.get(); } + public boolean noTextureRotations() { + return isActive() && noTextureRotations.get(); + } + // Entity public boolean noEntity(Entity entity) { diff --git a/src/main/resources/meteor-client.mixins.json b/src/main/resources/meteor-client.mixins.json index d30557565b..7818d92b8d 100644 --- a/src/main/resources/meteor-client.mixins.json +++ b/src/main/resources/meteor-client.mixins.json @@ -6,6 +6,7 @@ "client": [ "AbstractBlockAccessor", "AbstractBlockMixin", + "AbstractBlockStateMixin", "AbstractClientPlayerEntityMixin", "AbstractFurnaceScreenHandlerMixin", "AbstractFurnaceScreenMixin", From 45863154aa9bea2a0b3dbcbae02b601ef26f0cfa Mon Sep 17 00:00:00 2001 From: Wide-Cat <74723656+Wide-Cat@users.noreply.github.com> Date: Sun, 23 Jul 2023 17:59:10 +0100 Subject: [PATCH 036/357] Add an option to hide the hud while in guis (#3875) --- .../meteorclient/systems/hud/Hud.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/Hud.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/Hud.java index aad026952a..04d89ec506 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/Hud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/Hud.java @@ -8,6 +8,7 @@ import meteordevelopment.meteorclient.events.meteor.CustomFontChangedEvent; import meteordevelopment.meteorclient.events.render.Render2DEvent; import meteordevelopment.meteorclient.events.world.TickEvent; +import meteordevelopment.meteorclient.gui.WidgetScreen; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.System; import meteordevelopment.meteorclient.systems.Systems; @@ -51,6 +52,13 @@ public class Hud extends System implements Iterable { .build() ); + private final Setting hideInMenus = sgGeneral.add(new BoolSetting.Builder() + .name("hide-in-menus") + .description("Hides the meteor hud when in inventory screens or game menus.") + .defaultValue(false) + .build() + ); + private final Setting textScale = sgGeneral.add(new DoubleSetting.Builder() .name("text-scale") .description("Scale of text if not overridden by the element.") @@ -214,7 +222,9 @@ private void onTick(TickEvent.Post event) { @EventHandler private void onRender(Render2DEvent event) { if (Utils.isLoading()) return; - if (!(active && ((!mc.options.hudHidden && !mc.options.debugEnabled) || HudEditorScreen.isOpen()))) return; + + if (!active || shouldHideHud()) return; + if ((mc.options.hudHidden || mc.options.debugEnabled) && !HudEditorScreen.isOpen()) return; HudRenderer.INSTANCE.begin(event.drawContext); @@ -227,6 +237,10 @@ private void onRender(Render2DEvent event) { HudRenderer.INSTANCE.end(); } + private boolean shouldHideHud() { + return hideInMenus.get() && mc.currentScreen != null && !(mc.currentScreen instanceof WidgetScreen); + } + @EventHandler private void onCustomFontChanged(CustomFontChangedEvent event) { if (customFont.get()) { From 77a9e1412d9fe54f025a3180f270f09ed3f44f37 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Fri, 28 Jul 2023 11:14:27 -0400 Subject: [PATCH 037/357] Update GameOptionsMixin.java --- .../meteordevelopment/meteorclient/mixin/GameOptionsMixin.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/GameOptionsMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/GameOptionsMixin.java index b5211b44b5..632785a171 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/GameOptionsMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/GameOptionsMixin.java @@ -36,6 +36,8 @@ private void onInitAfterKeysAll(MinecraftClient client, File optionsFile, Callba @Inject(method = "setPerspective", at = @At("HEAD"), cancellable = true) private void setPerspective(Perspective perspective, CallbackInfo info) { + if (Modules.get() == null) return; // nothing is loaded yet, shouldersurfing compat + ChangePerspectiveEvent event = MeteorClient.EVENT_BUS.post(ChangePerspectiveEvent.get(perspective)); if (event.isCancelled()) info.cancel(); From e2a3dc4c6847709691eac765d1fb63b7cb5639e4 Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Sun, 6 Aug 2023 14:03:22 +0200 Subject: [PATCH 038/357] Updated to Sodium 0.5.0 --- gradle.properties | 4 +- .../meteorclient/MixinPlugin.java | 2 +- .../mixin/sodium/MeshVertexConsumerMixin.java | 11 ++--- .../sodium/SodiumBiomeColorCacheMixin.java | 42 +++++++++++++++++++ .../SodiumBlockOcclusionCacheMixin.java | 15 +++++-- .../sodium/SodiumBlockRendererMixin.java | 28 ++++++------- .../sodium/SodiumFluidRendererMixin.java | 39 ++++++++++------- ...n.java => SodiumLightDataAccessMixin.java} | 14 ++++--- .../systems/modules/render/WallHack.java | 5 ++- .../systems/modules/render/Xray.java | 9 ++-- .../meteor-client-sodium.mixins.json | 5 ++- 11 files changed, 122 insertions(+), 52 deletions(-) create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBiomeColorCacheMixin.java rename src/main/java/meteordevelopment/meteorclient/mixin/sodium/{LightDataAccessMixin.java => SodiumLightDataAccessMixin.java} (84%) diff --git a/gradle.properties b/gradle.properties index 0f2585ee74..67c205ad26 100644 --- a/gradle.properties +++ b/gradle.properties @@ -14,13 +14,13 @@ archives_base_name=meteor-client # Dependency Versions # Sodium (https://github.com/CaffeineMC/sodium-fabric) -sodium_version=mc1.20-0.4.10 +sodium_version=mc1.20.1-0.5.0 # Lithium (https://github.com/CaffeineMC/lithium-fabric) lithium_version=mc1.20-0.11.2 # Iris (https://github.com/IrisShaders/Iris) -iris_version=1.6.4+1.20 +iris_version=1.6.5+1.20.1 # Orbit (https://github.com/MeteorDevelopment/orbit) orbit_version=0.2.3 diff --git a/src/main/java/meteordevelopment/meteorclient/MixinPlugin.java b/src/main/java/meteordevelopment/meteorclient/MixinPlugin.java index a188f106e8..eee2133334 100644 --- a/src/main/java/meteordevelopment/meteorclient/MixinPlugin.java +++ b/src/main/java/meteordevelopment/meteorclient/MixinPlugin.java @@ -24,7 +24,7 @@ public class MixinPlugin implements IMixinConfigPlugin { private static boolean isOriginsPresent; private static boolean isIndigoPresent; - private static boolean isSodiumPresent; + public static boolean isSodiumPresent; private static boolean isCanvasPresent; private static boolean isLithiumPresent; public static boolean isIrisPresent; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/MeshVertexConsumerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/MeshVertexConsumerMixin.java index 7c361703a2..1812f6bd77 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/MeshVertexConsumerMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/MeshVertexConsumerMixin.java @@ -5,10 +5,10 @@ package meteordevelopment.meteorclient.mixin.sodium; -import me.jellysquid.mods.sodium.client.render.vertex.VertexBufferWriter; -import me.jellysquid.mods.sodium.client.render.vertex.VertexFormatDescription; -import me.jellysquid.mods.sodium.client.render.vertex.transform.CommonVertexElement; import meteordevelopment.meteorclient.utils.render.MeshVertexConsumerProvider; +import net.caffeinemc.mods.sodium.api.vertex.attributes.CommonVertexAttribute; +import net.caffeinemc.mods.sodium.api.vertex.buffer.VertexBufferWriter; +import net.caffeinemc.mods.sodium.api.vertex.format.VertexFormatDescription; import net.minecraft.client.render.VertexConsumer; import org.lwjgl.system.MemoryStack; import org.lwjgl.system.MemoryUtil; @@ -18,11 +18,12 @@ public abstract class MeshVertexConsumerMixin implements VertexConsumer, VertexBufferWriter { @Override public void push(MemoryStack stack, long ptr, int count, VertexFormatDescription format) { - int positionOffset = format.elementOffsets[CommonVertexElement.POSITION.ordinal()]; + int positionOffset = format.getElementOffset(CommonVertexAttribute.POSITION); + if (positionOffset == -1) return; for (int i = 0; i < count; i++) { - long positionPtr = ptr + (long) format.stride * i + positionOffset; + long positionPtr = ptr + (long) format.stride() * i + positionOffset; float x = MemoryUtil.memGetFloat(positionPtr); float y = MemoryUtil.memGetFloat(positionPtr + 4); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBiomeColorCacheMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBiomeColorCacheMixin.java new file mode 100644 index 0000000000..78a982bec5 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBiomeColorCacheMixin.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.sodium; + +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import me.jellysquid.mods.sodium.client.world.biome.BiomeColorCache; +import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.world.Ambience; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(value = BiomeColorCache.class, remap = false) +public class SodiumBiomeColorCacheMixin { + @Unique + private Ambience ambience; + + @Inject(method = "", at = @At("TAIL")) + private void onInit(CallbackInfo info) { + ambience = Modules.get().get(Ambience.class); + } + + @ModifyExpressionValue(method = "updateColorBuffers", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/biome/Biome;getGrassColorAt(DD)I")) + private int modify_getGrassColorAt(int color) { + return ambience.isActive() && ambience.customGrassColor.get() ? ambience.grassColor.get().getPacked() : color; + } + + @ModifyExpressionValue(method = "updateColorBuffers", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/biome/Biome;getFoliageColor()I")) + private int modify_getFoliageColor(int color) { + return ambience.isActive() && ambience.customFoliageColor.get() ? ambience.foliageColor.get().getPacked() : color; + } + + @ModifyExpressionValue(method = "updateColorBuffers", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/biome/Biome;getWaterColor()I")) + private int modify_getWaterColor(int color) { + return ambience.isActive() && ambience.customWaterColor.get() ? ambience.waterColor.get().getPacked() : color; + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBlockOcclusionCacheMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBlockOcclusionCacheMixin.java index f5e7ce8728..fc3473eee9 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBlockOcclusionCacheMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBlockOcclusionCacheMixin.java @@ -6,7 +6,7 @@ package meteordevelopment.meteorclient.mixin.sodium; import com.llamalad7.mixinextras.injector.ModifyReturnValue; -import me.jellysquid.mods.sodium.client.render.occlusion.BlockOcclusionCache; +import me.jellysquid.mods.sodium.client.render.chunk.compile.pipeline.BlockOcclusionCache; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.Xray; import net.minecraft.block.BlockState; @@ -14,14 +14,23 @@ import net.minecraft.util.math.Direction; import net.minecraft.world.BlockView; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(value = BlockOcclusionCache.class, remap = false) public class SodiumBlockOcclusionCacheMixin { + @Unique + private Xray xray; + + @Inject(method = "", at = @At("TAIL")) + private void onInit(CallbackInfo info) { + xray = Modules.get().get(Xray.class); + } + @ModifyReturnValue(method = "shouldDrawSide", at = @At("RETURN")) private boolean shouldDrawSide(boolean original, BlockState state, BlockView view, BlockPos pos, Direction facing) { - Xray xray = Modules.get().get(Xray.class); - if (xray.isActive()) { return xray.modifyDrawSide(state, view, pos, facing, original); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBlockRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBlockRendererMixin.java index 04d5ba84ab..7822f25f15 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBlockRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBlockRendererMixin.java @@ -5,15 +5,18 @@ package meteordevelopment.meteorclient.mixin.sodium; -import me.jellysquid.mods.sodium.client.model.IndexBufferBuilder; -import me.jellysquid.mods.sodium.client.model.quad.ModelQuadView; +import me.jellysquid.mods.sodium.client.model.light.data.QuadLightData; +import me.jellysquid.mods.sodium.client.model.quad.BakedQuadView; +import me.jellysquid.mods.sodium.client.model.quad.properties.ModelQuadFacing; import me.jellysquid.mods.sodium.client.model.quad.properties.ModelQuadOrientation; +import me.jellysquid.mods.sodium.client.render.chunk.compile.ChunkBuildBuffers; import me.jellysquid.mods.sodium.client.render.chunk.compile.buffers.ChunkModelBuilder; import me.jellysquid.mods.sodium.client.render.chunk.compile.pipeline.BlockRenderContext; import me.jellysquid.mods.sodium.client.render.chunk.compile.pipeline.BlockRenderer; -import me.jellysquid.mods.sodium.client.render.vertex.type.ChunkVertexBufferBuilder; -import me.jellysquid.mods.sodium.client.render.vertex.type.ChunkVertexEncoder; +import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.Material; +import me.jellysquid.mods.sodium.client.render.chunk.vertex.format.ChunkVertexEncoder; import meteordevelopment.meteorclient.systems.modules.render.Xray; +import net.caffeinemc.mods.sodium.api.util.ColorABGR; import net.minecraft.util.math.Vec3d; import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Mixin; @@ -21,30 +24,27 @@ 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 org.spongepowered.asm.mixin.injection.callback.LocalCapture; @Mixin(value = BlockRenderer.class, remap = false) public class SodiumBlockRendererMixin { - @Unique private final ThreadLocal alphas = new ThreadLocal<>(); + @Unique + private final ThreadLocal alphas = new ThreadLocal<>(); @Inject(method = "renderModel", at = @At("HEAD"), cancellable = true) - private void onRenderModel(BlockRenderContext ctx, ChunkModelBuilder buffers, CallbackInfoReturnable info) { + private void onRenderModel(BlockRenderContext ctx, ChunkBuildBuffers buffers, CallbackInfo info) { int alpha = Xray.getAlpha(ctx.state(), ctx.pos()); - if (alpha == 0) info.setReturnValue(false); + if (alpha == 0) info.cancel(); else alphas.set(alpha); } - @Inject(method = "writeGeometry", at = @At(value = "FIELD", target = "Lme/jellysquid/mods/sodium/client/render/vertex/type/ChunkVertexEncoder$Vertex;color:I", opcode = Opcodes.PUTFIELD, shift = At.Shift.AFTER), locals = LocalCapture.CAPTURE_FAILSOFT, cancellable = true) - private void setColor(BlockRenderContext ctx, ChunkVertexBufferBuilder vertexBuffer, IndexBufferBuilder indexBuffer, Vec3d offset, ModelQuadView quad, int[] colors, float[] brightness, int[] lightmap, CallbackInfo info, ModelQuadOrientation orientation, ChunkVertexEncoder.Vertex[] vertices, int dstIndex, int srcIndex, ChunkVertexEncoder.Vertex out) { + @Inject(method = "writeGeometry", at = @At(value = "FIELD", target = "Lme/jellysquid/mods/sodium/client/render/chunk/vertex/format/ChunkVertexEncoder$Vertex;color:I", opcode = Opcodes.PUTFIELD, shift = At.Shift.AFTER), locals = LocalCapture.CAPTURE_FAILSOFT, cancellable = true) + private void setColor(BlockRenderContext ctx, ChunkModelBuilder builder, Vec3d offset, Material material, BakedQuadView quad, int[] colors, QuadLightData light, CallbackInfo info, ModelQuadOrientation orientation, ChunkVertexEncoder.Vertex[] vertices, ModelQuadFacing normalFace, int dstIndex, int srcIndex, ChunkVertexEncoder.Vertex out) { int alpha = alphas.get(); if (alpha == 0) info.cancel(); - else if (alpha != -1) { - out.color &= 0xFFFFFF; - out.color |= alpha << 24; - } + else if (alpha != -1) out.color = ColorABGR.withAlpha(out.color, alpha); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumFluidRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumFluidRendererMixin.java index 83ff077142..9e9653dbac 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumFluidRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumFluidRendererMixin.java @@ -5,21 +5,20 @@ package meteordevelopment.meteorclient.mixin.sodium; +import me.jellysquid.mods.sodium.client.model.color.ColorProvider; import me.jellysquid.mods.sodium.client.model.light.LightPipeline; import me.jellysquid.mods.sodium.client.model.quad.ModelQuadView; -import me.jellysquid.mods.sodium.client.model.quad.blender.ColorSampler; -import me.jellysquid.mods.sodium.client.render.chunk.compile.buffers.ChunkModelBuilder; +import me.jellysquid.mods.sodium.client.render.chunk.compile.ChunkBuildBuffers; import me.jellysquid.mods.sodium.client.render.chunk.compile.pipeline.FluidRenderer; -import me.jellysquid.mods.sodium.client.util.color.ColorABGR; -import me.jellysquid.mods.sodium.client.util.color.ColorARGB; +import me.jellysquid.mods.sodium.client.world.WorldSlice; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.Xray; import meteordevelopment.meteorclient.systems.modules.world.Ambience; +import net.caffeinemc.mods.sodium.api.util.ColorABGR; import net.minecraft.fluid.FluidState; import net.minecraft.registry.tag.FluidTags; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; -import net.minecraft.world.BlockRenderView; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -27,32 +26,40 @@ 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.util.Arrays; @Mixin(value = FluidRenderer.class, remap = false) public class SodiumFluidRendererMixin { - @Final @Shadow private int[] quadColors; + @Final @Shadow + private int[] quadColors; - @Unique private final ThreadLocal alphas = new ThreadLocal<>(); + @Unique + private Ambience ambience; + + @Unique + private final ThreadLocal alphas = new ThreadLocal<>(); + + @Inject(method = "", at = @At("TAIL")) + private void onInit(CallbackInfo info) { + ambience = Modules.get().get(Ambience.class); + } @Inject(method = "render", at = @At("HEAD"), cancellable = true) - private void onRender(BlockRenderView world, FluidState fluidState, BlockPos pos, BlockPos offset, ChunkModelBuilder buffers, CallbackInfoReturnable info) { - int alpha = Xray.getAlpha(fluidState.getBlockState(), pos); + private void onRender(WorldSlice world, FluidState fluidState, BlockPos blockPos, BlockPos offset, ChunkBuildBuffers buffers, CallbackInfo info) { + int alpha = Xray.getAlpha(fluidState.getBlockState(), blockPos); - if (alpha == 0) info.setReturnValue(false); + if (alpha == 0) info.cancel(); else alphas.set(alpha); } @Inject(method = "updateQuad", at = @At("TAIL")) - private void onUpdateQuad(ModelQuadView quad, BlockRenderView world, BlockPos pos, LightPipeline lighter, Direction dir, float brightness, ColorSampler colorSampler, FluidState fluidState, CallbackInfo info) { + private void onUpdateQuad(ModelQuadView quad, WorldSlice world, BlockPos pos, LightPipeline lighter, Direction dir, float brightness, ColorProvider colorProvider, FluidState fluidState, CallbackInfo info) { // Ambience - Ambience ambience = Modules.get().get(Ambience.class); - if (ambience.isActive() && ambience.customLavaColor.get() && fluidState.isIn(FluidTags.LAVA)) { - Arrays.fill(quadColors, ColorARGB.toABGR(ambience.lavaColor.get().getPacked())); - } else { + Arrays.fill(quadColors, ColorABGR.withAlpha(ambience.lavaColor.get().getPacked(), 255)); + } + else { // XRay and Wallhack int alpha = alphas.get(); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/LightDataAccessMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumLightDataAccessMixin.java similarity index 84% rename from src/main/java/meteordevelopment/meteorclient/mixin/sodium/LightDataAccessMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumLightDataAccessMixin.java index 7cc61b7a0c..33efad5aff 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/LightDataAccessMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumLightDataAccessMixin.java @@ -21,20 +21,24 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(value = LightDataAccess.class, remap = false) -public class LightDataAccessMixin { +public class SodiumLightDataAccessMixin { + @Unique private static final int FULL_LIGHT = 15 << 20 | 15 << 4; - @Shadow protected BlockRenderView world; - @Shadow @Final private BlockPos.Mutable pos; + @Shadow + protected BlockRenderView world; + @Shadow @Final + private BlockPos.Mutable pos; - @Unique private Xray xray; + @Unique + private Xray xray; @Inject(method = "", at = @At("TAIL")) private void onInit(CallbackInfo info) { xray = Modules.get().get(Xray.class); } - @ModifyVariable(method = "compute", at = @At(value = "STORE"), name = "lm") + @ModifyVariable(method = "compute", at = @At(value = "TAIL"), name = "bl") private int compute_modifyAO(int light) { if (xray.isActive()) { BlockState state = world.getBlockState(pos); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WallHack.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WallHack.java index 4f8e3a6d07..be042352c5 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WallHack.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WallHack.java @@ -68,7 +68,10 @@ public void onDeactivate() { @Override public WWidget getWidget(GuiTheme theme) { - return (MixinPlugin.isIrisPresent && IrisApi.getInstance().isShaderPackInUse()) ? theme.label("Warning: Due to shaders in use, opacity is overridden to 0.") : null; + if (MixinPlugin.isSodiumPresent) return theme.label("Warning: Due to Sodium in use, opacity is overridden to 0."); + if (MixinPlugin.isIrisPresent && IrisApi.getInstance().isShaderPackInUse()) return theme.label("Warning: Due to shaders in use, opacity is overridden to 0."); + + return null; } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Xray.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Xray.java index fccda621a9..4a83972073 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Xray.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Xray.java @@ -98,7 +98,10 @@ public void onDeactivate() { @Override public WWidget getWidget(GuiTheme theme) { - return (MixinPlugin.isIrisPresent && IrisApi.getInstance().isShaderPackInUse()) ? theme.label("Warning: Due to shaders in use, opacity is overridden to 0.") : null; + if (MixinPlugin.isSodiumPresent) return theme.label("Warning: Due to Sodium in use, opacity is overridden to 0."); + if (MixinPlugin.isIrisPresent && IrisApi.getInstance().isShaderPackInUse()) return theme.label("Warning: Due to shaders in use, opacity is overridden to 0."); + + return null; } @EventHandler @@ -135,7 +138,7 @@ public static int getAlpha(BlockState state, BlockPos pos) { Xray xray = Modules.get().get(Xray.class); if (wallHack.isActive() && wallHack.blocks.get().contains(state.getBlock())) { - if (MixinPlugin.isIrisPresent && IrisApi.getInstance().isShaderPackInUse()) return 0; + if (MixinPlugin.isSodiumPresent || (MixinPlugin.isIrisPresent && IrisApi.getInstance().isShaderPackInUse())) return 0; int alpha; @@ -145,7 +148,7 @@ public static int getAlpha(BlockState state, BlockPos pos) { return alpha; } else if (xray.isActive() && !wallHack.isActive() && xray.isBlocked(state.getBlock(), pos)) { - return (MixinPlugin.isIrisPresent && IrisApi.getInstance().isShaderPackInUse()) ? 0 : xray.opacity.get(); + return (MixinPlugin.isSodiumPresent || (MixinPlugin.isIrisPresent && IrisApi.getInstance().isShaderPackInUse())) ? 0 : xray.opacity.get(); } return -1; diff --git a/src/main/resources/meteor-client-sodium.mixins.json b/src/main/resources/meteor-client-sodium.mixins.json index f02e2d97cf..6e78228a3d 100644 --- a/src/main/resources/meteor-client-sodium.mixins.json +++ b/src/main/resources/meteor-client-sodium.mixins.json @@ -4,11 +4,12 @@ "compatibilityLevel": "JAVA_17", "plugin": "meteordevelopment.meteorclient.MixinPlugin", "client": [ - "LightDataAccessMixin", + "SodiumLightDataAccessMixin", "MeshVertexConsumerMixin", "SodiumBlockOcclusionCacheMixin", "SodiumBlockRendererMixin", - "SodiumFluidRendererMixin" + "SodiumFluidRendererMixin", + "SodiumBiomeColorCacheMixin" ], "injectors": { "defaultRequire": 1 From bb14113568059b3dace4fb8a755a6ecb8acde5cd Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Sun, 6 Aug 2023 14:40:06 +0200 Subject: [PATCH 039/357] Actually fixed now --- .../sodium/SodiumBiomeColorCacheMixin.java | 6 ++--- .../sodium/SodiumBlockRendererMixin.java | 25 ------------------- .../sodium/SodiumFluidRendererMixin.java | 12 --------- 3 files changed, 3 insertions(+), 40 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBiomeColorCacheMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBiomeColorCacheMixin.java index 78a982bec5..3f147c8e58 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBiomeColorCacheMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBiomeColorCacheMixin.java @@ -25,17 +25,17 @@ private void onInit(CallbackInfo info) { ambience = Modules.get().get(Ambience.class); } - @ModifyExpressionValue(method = "updateColorBuffers", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/biome/Biome;getGrassColorAt(DD)I")) + @ModifyExpressionValue(method = "updateColorBuffers", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/biome/Biome;getGrassColorAt(DD)I", remap = true)) private int modify_getGrassColorAt(int color) { return ambience.isActive() && ambience.customGrassColor.get() ? ambience.grassColor.get().getPacked() : color; } - @ModifyExpressionValue(method = "updateColorBuffers", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/biome/Biome;getFoliageColor()I")) + @ModifyExpressionValue(method = "updateColorBuffers", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/biome/Biome;getFoliageColor()I", remap = true)) private int modify_getFoliageColor(int color) { return ambience.isActive() && ambience.customFoliageColor.get() ? ambience.foliageColor.get().getPacked() : color; } - @ModifyExpressionValue(method = "updateColorBuffers", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/biome/Biome;getWaterColor()I")) + @ModifyExpressionValue(method = "updateColorBuffers", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/biome/Biome;getWaterColor()I", remap = true)) private int modify_getWaterColor(int color) { return ambience.isActive() && ambience.customWaterColor.get() ? ambience.waterColor.get().getPacked() : color; } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBlockRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBlockRendererMixin.java index 7822f25f15..370de60cc2 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBlockRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBlockRendererMixin.java @@ -5,46 +5,21 @@ package meteordevelopment.meteorclient.mixin.sodium; -import me.jellysquid.mods.sodium.client.model.light.data.QuadLightData; -import me.jellysquid.mods.sodium.client.model.quad.BakedQuadView; -import me.jellysquid.mods.sodium.client.model.quad.properties.ModelQuadFacing; -import me.jellysquid.mods.sodium.client.model.quad.properties.ModelQuadOrientation; import me.jellysquid.mods.sodium.client.render.chunk.compile.ChunkBuildBuffers; -import me.jellysquid.mods.sodium.client.render.chunk.compile.buffers.ChunkModelBuilder; import me.jellysquid.mods.sodium.client.render.chunk.compile.pipeline.BlockRenderContext; import me.jellysquid.mods.sodium.client.render.chunk.compile.pipeline.BlockRenderer; -import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.Material; -import me.jellysquid.mods.sodium.client.render.chunk.vertex.format.ChunkVertexEncoder; import meteordevelopment.meteorclient.systems.modules.render.Xray; -import net.caffeinemc.mods.sodium.api.util.ColorABGR; -import net.minecraft.util.math.Vec3d; -import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; @Mixin(value = BlockRenderer.class, remap = false) public class SodiumBlockRendererMixin { - @Unique - private final ThreadLocal alphas = new ThreadLocal<>(); - @Inject(method = "renderModel", at = @At("HEAD"), cancellable = true) private void onRenderModel(BlockRenderContext ctx, ChunkBuildBuffers buffers, CallbackInfo info) { int alpha = Xray.getAlpha(ctx.state(), ctx.pos()); if (alpha == 0) info.cancel(); - else alphas.set(alpha); - } - - - @Inject(method = "writeGeometry", at = @At(value = "FIELD", target = "Lme/jellysquid/mods/sodium/client/render/chunk/vertex/format/ChunkVertexEncoder$Vertex;color:I", opcode = Opcodes.PUTFIELD, shift = At.Shift.AFTER), locals = LocalCapture.CAPTURE_FAILSOFT, cancellable = true) - private void setColor(BlockRenderContext ctx, ChunkModelBuilder builder, Vec3d offset, Material material, BakedQuadView quad, int[] colors, QuadLightData light, CallbackInfo info, ModelQuadOrientation orientation, ChunkVertexEncoder.Vertex[] vertices, ModelQuadFacing normalFace, int dstIndex, int srcIndex, ChunkVertexEncoder.Vertex out) { - int alpha = alphas.get(); - - if (alpha == 0) info.cancel(); - else if (alpha != -1) out.color = ColorABGR.withAlpha(out.color, alpha); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumFluidRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumFluidRendererMixin.java index 9e9653dbac..1eb4dbc141 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumFluidRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumFluidRendererMixin.java @@ -37,9 +37,6 @@ public class SodiumFluidRendererMixin { @Unique private Ambience ambience; - @Unique - private final ThreadLocal alphas = new ThreadLocal<>(); - @Inject(method = "", at = @At("TAIL")) private void onInit(CallbackInfo info) { ambience = Modules.get().get(Ambience.class); @@ -50,7 +47,6 @@ private void onRender(WorldSlice world, FluidState fluidState, BlockPos blockPos int alpha = Xray.getAlpha(fluidState.getBlockState(), blockPos); if (alpha == 0) info.cancel(); - else alphas.set(alpha); } @Inject(method = "updateQuad", at = @At("TAIL")) @@ -59,13 +55,5 @@ private void onUpdateQuad(ModelQuadView quad, WorldSlice world, BlockPos pos, Li if (ambience.isActive() && ambience.customLavaColor.get() && fluidState.isIn(FluidTags.LAVA)) { Arrays.fill(quadColors, ColorABGR.withAlpha(ambience.lavaColor.get().getPacked(), 255)); } - else { - // XRay and Wallhack - int alpha = alphas.get(); - - for (int i = 0; i < quadColors.length; i++) { - quadColors[i] = ColorABGR.withAlpha(quadColors[i], alpha / 255f); - } - } } } From 0c28f3768e98b7807272d5b098d7d508cd12940c Mon Sep 17 00:00:00 2001 From: OnlyRain233 Date: Mon, 7 Aug 2023 01:32:12 +0800 Subject: [PATCH 040/357] Fix Luminous in FullBright and weird lighting when xray enabled (#3920) --- .../mixin/sodium/SodiumLightDataAccessMixin.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumLightDataAccessMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumLightDataAccessMixin.java index 33efad5aff..e70755b1f8 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumLightDataAccessMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumLightDataAccessMixin.java @@ -7,6 +7,7 @@ import me.jellysquid.mods.sodium.client.model.light.data.LightDataAccess; import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.render.Fullbright; import meteordevelopment.meteorclient.systems.modules.render.Xray; import net.minecraft.block.BlockState; import net.minecraft.util.math.BlockPos; @@ -23,7 +24,7 @@ @Mixin(value = LightDataAccess.class, remap = false) public class SodiumLightDataAccessMixin { @Unique - private static final int FULL_LIGHT = 15 << 20 | 15 << 4; + private static final int FULL_LIGHT = 15 | 15 << 4 | 15 << 8; @Shadow protected BlockRenderView world; @@ -39,7 +40,7 @@ private void onInit(CallbackInfo info) { } @ModifyVariable(method = "compute", at = @At(value = "TAIL"), name = "bl") - private int compute_modifyAO(int light) { + private int compute_modifyBL(int light) { if (xray.isActive()) { BlockState state = world.getBlockState(pos); if (!xray.isBlocked(state.getBlock(), pos)) return FULL_LIGHT; @@ -47,4 +48,9 @@ private int compute_modifyAO(int light) { return light; } + + @ModifyVariable(method = "compute", at = @At(value = "TAIL"), name = "sl") + private int compute_modifySL(int light) { + return Math.max(Modules.get().get(Fullbright.class).getLuminance(), light); + } } From 081b97c05caaa96996239938636f1f24b3cbe448 Mon Sep 17 00:00:00 2001 From: thebest9178 <76120883+thebest9178@users.noreply.github.com> Date: Mon, 17 Jul 2023 09:42:11 +0000 Subject: [PATCH 041/357] Fix typo in StashFinder --- .../meteorclient/systems/modules/world/StashFinder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/StashFinder.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/StashFinder.java index 5c8ae85e55..b79aa52617 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/StashFinder.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/StashFinder.java @@ -48,7 +48,7 @@ public class StashFinder extends Module { ); private final Setting minimumStorageCount = sgGeneral.add(new IntSetting.Builder() - .name("minimum-storage-cont") + .name("minimum-storage-count") .description("The minimum amount of storage blocks in a chunk to record the chunk.") .defaultValue(4) .min(1) From 2507af64b58e539048287abb3ec66cad7b026016 Mon Sep 17 00:00:00 2001 From: thebest9178 <76120883+thebest9178@users.noreply.github.com> Date: Wed, 9 Aug 2023 12:30:03 +0000 Subject: [PATCH 042/357] Added ignoreSelf to tracers (#3913) Co-authored-by: thebest9178 --- .../meteorclient/systems/modules/render/Tracers.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Tracers.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Tracers.java index b98cfccc7b..d2c751ada8 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Tracers.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Tracers.java @@ -52,6 +52,13 @@ public enum TracerStyle { .build() ); + private final Setting ignoreSelf = sgGeneral.add(new BoolSetting.Builder() + .name("ignore-self") + .description("Doesn't draw tracers to yourself when in third person or freecam.") + .defaultValue(false) + .build() + ); + public final Setting ignoreFriends = sgGeneral.add(new BoolSetting.Builder() .name("ignore-friends") .description("Doesn't draw tracers to friends.") @@ -211,7 +218,7 @@ public Tracers() { } private boolean shouldBeIgnored(Entity entity) { - return !PlayerUtils.isWithin(entity, maxDist.get()) || (!Modules.get().isActive(Freecam.class) && entity == mc.player) || !entities.get().contains(entity.getType()) || (ignoreFriends.get() && entity instanceof PlayerEntity && Friends.get().isFriend((PlayerEntity) entity)) || (!showInvis.get() && entity.isInvisible()) | !EntityUtils.isInRenderDistance(entity); + return !PlayerUtils.isWithin(entity, maxDist.get()) || (!Modules.get().isActive(Freecam.class) && entity == mc.player) || !entities.get().contains(entity.getType()) || (ignoreSelf.get() && entity == mc.player) || (ignoreFriends.get() && entity instanceof PlayerEntity && Friends.get().isFriend((PlayerEntity) entity)) || (!showInvis.get() && entity.isInvisible()) | !EntityUtils.isInRenderDistance(entity); } private Color getEntityColor(Entity entity) { From 6b430c05aab2238bccbeb6f145586e20166b4028 Mon Sep 17 00:00:00 2001 From: thebest9178 Date: Fri, 4 Aug 2023 01:00:03 -0700 Subject: [PATCH 043/357] Fixed trail pause when stationary --- .../meteorclient/systems/modules/render/Trail.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trail.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trail.java index f0dd8f90e5..a7015c5c75 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trail.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trail.java @@ -43,9 +43,9 @@ public Trail() { @EventHandler private void onTick(TickEvent.Post event) { if (pause.get() - && mc.player.getVelocity().x == 0 - && mc.player.getVelocity().y == 0 - && mc.player.getVelocity().z == 0) return; + && mc.player.getX() == mc.player.prevX + && mc.player.getY() == mc.player.prevY + && mc.player.getZ() == mc.player.prevZ) return; for (ParticleType particleType : particles.get()) { mc.world.addParticle((ParticleEffect) particleType, mc.player.getX(), mc.player.getY(), mc.player.getZ(), 0, 0, 0); From e517a9aefe93f2ae7b4f720c8724c9533602c4c2 Mon Sep 17 00:00:00 2001 From: Fiz-Victor Date: Fri, 4 Aug 2023 19:07:46 +0800 Subject: [PATCH 044/357] Small fix for game crashing when authme is installed and getting kicked --- .../mixin/DisconnectedScreenMixin.java | 21 +++---------------- 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/DisconnectedScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/DisconnectedScreenMixin.java index 321f112374..58800bdbfe 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/DisconnectedScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/DisconnectedScreenMixin.java @@ -28,7 +28,6 @@ @Mixin(DisconnectedScreen.class) public abstract class DisconnectedScreenMixin extends Screen { - @Unique private GridWidget grid; @Unique private ButtonWidget reconnectBtn; @Unique private double time = Modules.get().get(AutoReconnect.class).time.get() * 20; @@ -37,19 +36,13 @@ protected DisconnectedScreenMixin(Text title) { } @Inject(method = "init", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/widget/GridWidget;refreshPositions()V", shift = At.Shift.BEFORE), locals = LocalCapture.CAPTURE_FAILHARD) - private void onInit_before(CallbackInfo info, GridWidget.Adder adder) { + private void addButtons(CallbackInfo info, GridWidget.Adder adder) { AutoReconnect autoReconnect = Modules.get().get(AutoReconnect.class); if (autoReconnect.lastServerConnection != null) { - grid = new GridWidget(); - adder.add(grid); + reconnectBtn = adder.add(new ButtonWidget.Builder(Text.literal(getText()), button -> tryConnecting()).build()); - grid.setRowSpacing(2); - GridWidget.Adder myAdder = grid.createAdder(1); - - reconnectBtn = myAdder.add(new ButtonWidget.Builder(Text.literal(getText()), button -> tryConnecting()).build()); - - myAdder.add( + adder.add( new ButtonWidget.Builder(Text.literal("Toggle Auto Reconnect"), button -> { autoReconnect.toggle(); reconnectBtn.setMessage(Text.literal(getText())); @@ -59,14 +52,6 @@ private void onInit_before(CallbackInfo info, GridWidget.Adder adder) { } } - @Inject(method = "init", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/widget/GridWidget;refreshPositions()V", shift = At.Shift.AFTER)) - private void onInit_after(CallbackInfo info) { - if (grid != null) { - grid.refreshPositions(); - grid.forEachChild(this::addDrawableChild); - } - } - @Override public void tick() { AutoReconnect autoReconnect = Modules.get().get(AutoReconnect.class); From 3e3f2964da06addf50f1b654041a78e7182a8110 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Sun, 6 Aug 2023 15:07:25 -0400 Subject: [PATCH 045/357] reconnect desync patch --- .../events/world/ServerConnectBeginEvent.java | 21 ++++++++++++++++ ...rEvent.java => ServerConnectEndEvent.java} | 6 ++--- .../mixin/ClientConnectionMixin.java | 9 ++++--- .../mixin/ConnectScreenMixin.java | 25 +++++++++++++++++++ .../mixin/DisconnectedScreenMixin.java | 6 ++--- .../systems/modules/misc/AutoReconnect.java | 14 ++++++----- src/main/resources/meteor-client.mixins.json | 1 + 7 files changed, 65 insertions(+), 17 deletions(-) create mode 100644 src/main/java/meteordevelopment/meteorclient/events/world/ServerConnectBeginEvent.java rename src/main/java/meteordevelopment/meteorclient/events/world/{ConnectToServerEvent.java => ServerConnectEndEvent.java} (64%) create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/ConnectScreenMixin.java diff --git a/src/main/java/meteordevelopment/meteorclient/events/world/ServerConnectBeginEvent.java b/src/main/java/meteordevelopment/meteorclient/events/world/ServerConnectBeginEvent.java new file mode 100644 index 0000000000..cc7a2333e1 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/events/world/ServerConnectBeginEvent.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.events.world; + +import net.minecraft.client.network.ServerAddress; +import net.minecraft.client.network.ServerInfo; + +public class ServerConnectBeginEvent { + private static final ServerConnectBeginEvent INSTANCE = new ServerConnectBeginEvent(); + public ServerAddress address; + public ServerInfo info; + + public static ServerConnectBeginEvent get(ServerAddress address, ServerInfo info) { + INSTANCE.address = address; + INSTANCE.info = info; + return INSTANCE; + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/events/world/ConnectToServerEvent.java b/src/main/java/meteordevelopment/meteorclient/events/world/ServerConnectEndEvent.java similarity index 64% rename from src/main/java/meteordevelopment/meteorclient/events/world/ConnectToServerEvent.java rename to src/main/java/meteordevelopment/meteorclient/events/world/ServerConnectEndEvent.java index 0ea17c35b1..08294a1615 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/world/ConnectToServerEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/world/ServerConnectEndEvent.java @@ -7,11 +7,11 @@ import java.net.InetSocketAddress; -public class ConnectToServerEvent { - private static final ConnectToServerEvent INSTANCE = new ConnectToServerEvent(); +public class ServerConnectEndEvent { + private static final ServerConnectEndEvent INSTANCE = new ServerConnectEndEvent(); public InetSocketAddress address; - public static ConnectToServerEvent get(InetSocketAddress address) { + public static ServerConnectEndEvent get(InetSocketAddress address) { INSTANCE.address = address; return INSTANCE; } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java index 63a555f481..5277f18f73 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.mixin; +import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelPipeline; import io.netty.handler.proxy.Socks4ProxyHandler; @@ -12,7 +13,7 @@ import io.netty.handler.timeout.TimeoutException; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.packets.PacketEvent; -import meteordevelopment.meteorclient.events.world.ConnectToServerEvent; +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; @@ -51,9 +52,9 @@ private void disconnect(Text disconnectReason, CallbackInfo ci) { } } - @Inject(method = "connect", at = @At("HEAD")) - private static void onConnect(InetSocketAddress address, boolean useEpoll, CallbackInfoReturnable info) { - MeteorClient.EVENT_BUS.post(ConnectToServerEvent.get(address)); + @Inject(method = "connect(Ljava/net/InetSocketAddress;ZLnet/minecraft/network/ClientConnection;)Lio/netty/channel/ChannelFuture;", at = @At("HEAD")) + private static void onConnect(InetSocketAddress address, boolean useEpoll, ClientConnection connection, CallbackInfoReturnable cir) { + MeteorClient.EVENT_BUS.post(ServerConnectEndEvent.get(address)); } @Inject(at = @At("HEAD"), method = "send(Lnet/minecraft/network/packet/Packet;)V", cancellable = true) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ConnectScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ConnectScreenMixin.java new file mode 100644 index 0000000000..2fd47394c5 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ConnectScreenMixin.java @@ -0,0 +1,25 @@ +/* + * 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.ServerConnectBeginEvent; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.screen.ConnectScreen; +import net.minecraft.client.network.ServerAddress; +import net.minecraft.client.network.ServerInfo; +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(ConnectScreen.class) +public class ConnectScreenMixin { + @Inject(method = "connect(Lnet/minecraft/client/MinecraftClient;Lnet/minecraft/client/network/ServerAddress;Lnet/minecraft/client/network/ServerInfo;)V", at = @At("HEAD")) + private void tryConnectEvent(MinecraftClient client, ServerAddress address, ServerInfo info, CallbackInfo ci) { + MeteorClient.EVENT_BUS.post(ServerConnectBeginEvent.get(address, info)); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/DisconnectedScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/DisconnectedScreenMixin.java index 58800bdbfe..7e93545d24 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/DisconnectedScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/DisconnectedScreenMixin.java @@ -72,9 +72,7 @@ private String getText() { } private void tryConnecting() { - var conn = Modules.get().get(AutoReconnect.class).lastServerConnection; - var host = conn.getAddress().getHostName(); - if (host.contains(":")) host = host.substring(0, host.indexOf(":")); - ConnectScreen.connect(new TitleScreen(), mc, new ServerAddress(host, conn.getPort()), new ServerInfo(I18n.translate("selectServer.defaultName"), host, false), false); + var lastServer = Modules.get().get(AutoReconnect.class).lastServerConnection; + ConnectScreen.connect(new TitleScreen(), mc, lastServer.left(), lastServer.right(), false); } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/AutoReconnect.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/AutoReconnect.java index 43fa9ef3a0..e5e3e893ea 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/AutoReconnect.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/AutoReconnect.java @@ -5,16 +5,18 @@ package meteordevelopment.meteorclient.systems.modules.misc; +import it.unimi.dsi.fastutil.Pair; +import it.unimi.dsi.fastutil.objects.ObjectObjectImmutablePair; import meteordevelopment.meteorclient.MeteorClient; -import meteordevelopment.meteorclient.events.world.ConnectToServerEvent; +import meteordevelopment.meteorclient.events.world.ServerConnectBeginEvent; import meteordevelopment.meteorclient.settings.DoubleSetting; import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.settings.SettingGroup; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.orbit.EventHandler; - -import java.net.InetSocketAddress; +import net.minecraft.client.network.ServerAddress; +import net.minecraft.client.network.ServerInfo; public class AutoReconnect extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); @@ -28,7 +30,7 @@ public class AutoReconnect extends Module { .build() ); - public InetSocketAddress lastServerConnection; + public Pair lastServerConnection; public AutoReconnect() { super(Categories.Misc, "auto-reconnect", "Automatically reconnects when disconnected from a server."); @@ -37,8 +39,8 @@ public AutoReconnect() { private class StaticListener { @EventHandler - private void onGameJoined(ConnectToServerEvent event) { - lastServerConnection = event.address; + private void onGameJoined(ServerConnectBeginEvent event) { + lastServerConnection = new ObjectObjectImmutablePair<>(event.address, event.info); } } } diff --git a/src/main/resources/meteor-client.mixins.json b/src/main/resources/meteor-client.mixins.json index 7818d92b8d..6e1ecc50eb 100644 --- a/src/main/resources/meteor-client.mixins.json +++ b/src/main/resources/meteor-client.mixins.json @@ -59,6 +59,7 @@ "CloseHandledScreenC2SPacketAccessor", "CobwebBlockMixin", "CompassAnglePredicateProviderMixin", + "ConnectScreenMixin", "CrashReportMixin", "CreativeInventoryScreenAccessor", "CreativeSlotMixin", From 5736f9df389c360018bd104c7b1092da1f7659c9 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Wed, 9 Aug 2023 10:40:47 -0400 Subject: [PATCH 046/357] make health optional for nametags (#3898) --- .../systems/modules/render/Nametags.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java index 2b1133b999..c343ce6bdc 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java @@ -111,6 +111,13 @@ public class Nametags extends Module { //Players + private final Setting displayHealth = sgPlayers.add(new BoolSetting.Builder() + .name("health") + .description("Shows the player's health.") + .defaultValue(true) + .build() + ); + private final Setting displayGameMode = sgPlayers.add(new BoolSetting.Builder() .name("gamemode") .description("Shows the player's GameMode.") @@ -387,14 +394,12 @@ private void renderNametagPlayer(Render2DEvent event, PlayerEntity player, boole if (player == mc.player) name = Modules.get().get(NameProtect.class).getName(player.getEntityName()); else name = player.getEntityName(); - name = name + " "; - // Health float absorption = player.getAbsorptionAmount(); int health = Math.round(player.getHealth() + absorption); double healthPercentage = health / (player.getMaxHealth() + absorption); - String healthText = String.valueOf(health); + String healthText = " " + health; Color healthColor; if (healthPercentage <= 0.333) healthColor = RED; @@ -415,10 +420,12 @@ private void renderNametagPlayer(Render2DEvent event, PlayerEntity player, boole double healthWidth = text.getWidth(healthText, shadow); double pingWidth = text.getWidth(pingText, shadow); double distWidth = text.getWidth(distText, shadow); - double width = nameWidth + healthWidth; + + double width = nameWidth; boolean renderPlayerDistance = player != mc.cameraEntity || Modules.get().isActive(Freecam.class); + if (displayHealth.get()) width += healthWidth; if (displayGameMode.get()) width += gmWidth; if (displayPing.get()) width += pingWidth; if (displayDistance.get() && renderPlayerDistance) width += distWidth; @@ -436,7 +443,7 @@ private void renderNametagPlayer(Render2DEvent event, PlayerEntity player, boole if (displayGameMode.get()) hX = text.render(gmText, hX, hY, gamemodeColor.get(), shadow); hX = text.render(name, hX, hY, nameColor, shadow); - hX = text.render(healthText, hX, hY, healthColor, shadow); + if (displayHealth.get()) hX = text.render(healthText, hX, hY, healthColor, shadow); if (displayPing.get()) hX = text.render(pingText, hX, hY, pingColor.get(), shadow); if (displayDistance.get() && renderPlayerDistance) { switch (distanceColorMode.get()) { From f2fa1126404205384ac2e35f05f46d57f8d458da Mon Sep 17 00:00:00 2001 From: thebest9178 <76120883+thebest9178@users.noreply.github.com> Date: Wed, 9 Aug 2023 14:50:51 +0000 Subject: [PATCH 047/357] Add ignoreFriends to Hitboxes (#3914) --- .../meteorclient/systems/modules/combat/Hitboxes.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Hitboxes.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Hitboxes.java index c5014295c8..1f9634d92f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Hitboxes.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Hitboxes.java @@ -6,11 +6,13 @@ package meteordevelopment.meteorclient.systems.modules.combat; import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.systems.friends.Friends; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.player.InvUtils; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.AxeItem; import net.minecraft.item.SwordItem; @@ -33,6 +35,13 @@ public class Hitboxes extends Module { .build() ); + private final Setting ignoreFriends = sgGeneral.add(new BoolSetting.Builder() + .name("ignore-friends") + .description("Doesn't expand the hitboxes of friends.") + .defaultValue(true) + .build() + ); + private final Setting onlyOnWeapon = sgGeneral.add(new BoolSetting.Builder() .name("only-on-weapon") .description("Only modifies hitbox when holding a weapon in hand.") @@ -45,7 +54,7 @@ public Hitboxes() { } public double getEntityValue(Entity entity) { - if (!(isActive() && testWeapon())) return 0; + if (!(isActive() && testWeapon()) || (ignoreFriends.get() && entity instanceof PlayerEntity && Friends.get().isFriend((PlayerEntity) entity))) return 0; if (entities.get().contains(entity.getType())) return value.get(); return 0; } From aa0f33ee8b6a711d6fa59a547d2a51041b409871 Mon Sep 17 00:00:00 2001 From: o0sh4d0w0o Date: Sat, 22 Jul 2023 23:39:58 +0200 Subject: [PATCH 048/357] Fixed slider double decimalPlaces (currently not supported) --- .../meteorclient/gui/widgets/input/WDoubleEdit.java | 1 + 1 file changed, 1 insertion(+) 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 10581f0da9..885363ceb8 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WDoubleEdit.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WDoubleEdit.java @@ -29,6 +29,7 @@ public WDoubleEdit(double value, double min, double max, double sliderMin, doubl this.value = value; this.min = min; this.max = max; + this.decimalPlaces = decimalPlaces; this.sliderMin = sliderMin; this.sliderMax = sliderMax; From ea89e35c3683ebcca1595013356513f5dd88d971 Mon Sep 17 00:00:00 2001 From: Patrick <73178245+Paddyk45@users.noreply.github.com> Date: Wed, 9 Aug 2023 17:14:13 +0200 Subject: [PATCH 049/357] Add whitelist to Slippy (#3902) --- .../meteorclient/mixin/BlockMixin.java | 2 +- .../systems/modules/movement/Slippy.java | 25 ++++++++++++++++--- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BlockMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BlockMixin.java index b1efd3fd49..f16a371560 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BlockMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BlockMixin.java @@ -46,7 +46,7 @@ public float getSlipperiness(float original) { Slippy slippy = Modules.get().get(Slippy.class); Block block = (Block) (Object) this; - if (slippy.isActive() && !slippy.ignoredBlocks.get().contains(block)) { + if (slippy.isActive() && (slippy.listMode.get() == Slippy.ListMode.Whitelist ? slippy.allowedBlocks.get().contains(block) : !slippy.ignoredBlocks.get().contains(block))) { return slippy.friction.get().floatValue(); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Slippy.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Slippy.java index 7336664f28..18ee10e8d7 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Slippy.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Slippy.java @@ -5,10 +5,7 @@ package meteordevelopment.meteorclient.systems.modules.movement; -import meteordevelopment.meteorclient.settings.BlockListSetting; -import meteordevelopment.meteorclient.settings.DoubleSetting; -import meteordevelopment.meteorclient.settings.Setting; -import meteordevelopment.meteorclient.settings.SettingGroup; +import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import net.minecraft.block.Block; @@ -27,13 +24,33 @@ public class Slippy extends Module { .build() ); + public final Setting listMode = sgGeneral.add(new EnumSetting.Builder() + .name("list-mode") + .description("The mode to select blocks.") + .defaultValue(ListMode.Blacklist) + .build() + ); + public final Setting> ignoredBlocks = sgGeneral.add(new BlockListSetting.Builder() .name("ignored-blocks") .description("Decide which blocks not to slip on") + .visible(() -> listMode.get() == ListMode.Blacklist) + .build() + ); + + public final Setting> allowedBlocks = sgGeneral.add(new BlockListSetting.Builder() + .name("allowed-blocks") + .description("Decide which blocks to slip on") + .visible(() -> listMode.get() == ListMode.Whitelist) .build() ); public Slippy() { super(Categories.Movement, "slippy", "Changes the base friction level of blocks."); } + + public enum ListMode { + Whitelist, + Blacklist + } } From bad942ff091b6ee0e5a9e7fc7d1e3649dd70a566 Mon Sep 17 00:00:00 2001 From: Wide-Cat <74723656+Wide-Cat@users.noreply.github.com> Date: Wed, 9 Aug 2023 22:42:42 +0100 Subject: [PATCH 050/357] Fix bedaura not breaking beds MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This has been broken for over a year 💀 --- .../meteorclient/systems/modules/combat/BedAura.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BedAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BedAura.java index 4c05f191c3..522bde5d40 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BedAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BedAura.java @@ -324,7 +324,7 @@ private void breakBed(BlockPos pos) { boolean wasSneaking = mc.player.isSneaking(); if (wasSneaking) mc.player.setSneaking(false); - mc.interactionManager.interactBlock(mc.player, Hand.OFF_HAND, new BlockHitResult(mc.player.getPos(), Direction.UP, pos, false)); + mc.interactionManager.interactBlock(mc.player, Hand.OFF_HAND, new BlockHitResult(Vec3d.ofCenter(pos), Direction.UP, pos, false)); mc.player.setSneaking(wasSneaking); } From 101542b862cba0fd1e4f0eba0e0b6d9db1d9703d Mon Sep 17 00:00:00 2001 From: Big Iron <52252627+Big-Iron-Cheems@users.noreply.github.com> Date: Thu, 10 Aug 2023 00:06:23 +0200 Subject: [PATCH 051/357] Add excavator module (#3873) --- .../meteorclient/systems/modules/Modules.java | 1 + .../systems/modules/world/Excavator.java | 143 ++++++++++++++++++ 2 files changed, 144 insertions(+) create mode 100644 src/main/java/meteordevelopment/meteorclient/systems/modules/world/Excavator.java diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java index baf104c181..6a10a6f29b 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java @@ -529,6 +529,7 @@ private void initWorld() { add(new BuildHeight()); add(new EChestFarmer()); add(new EndermanLook()); + add(new Excavator()); add(new Flamethrower()); add(new InfinityMiner()); add(new LiquidFiller()); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Excavator.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Excavator.java new file mode 100644 index 0000000000..5f2f38a312 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Excavator.java @@ -0,0 +1,143 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.systems.modules.world; + +import baritone.api.BaritoneAPI; +import baritone.api.IBaritone; +import baritone.api.utils.BetterBlockPos; +import meteordevelopment.meteorclient.events.meteor.KeyEvent; +import meteordevelopment.meteorclient.events.meteor.MouseButtonEvent; +import meteordevelopment.meteorclient.events.render.Render3DEvent; +import meteordevelopment.meteorclient.renderer.ShapeMode; +import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.systems.modules.Categories; +import meteordevelopment.meteorclient.systems.modules.Module; +import meteordevelopment.meteorclient.utils.misc.Keybind; +import meteordevelopment.meteorclient.utils.misc.input.KeyAction; +import meteordevelopment.meteorclient.utils.render.color.SettingColor; +import meteordevelopment.orbit.EventHandler; +import net.minecraft.util.hit.BlockHitResult; +import org.lwjgl.glfw.GLFW; + +public class Excavator extends Module { + private final IBaritone baritone = BaritoneAPI.getProvider().getPrimaryBaritone(); + private final SettingGroup sgGeneral = settings.getDefaultGroup(); + private final SettingGroup sgRendering = settings.createGroup("Rendering"); + + // Keybindings + private final Setting selectionKey = sgGeneral.add(new KeybindSetting.Builder() + .name("selection-key") + .description("Key to draw the selection.") + .defaultValue(Keybind.fromButton(GLFW.GLFW_MOUSE_BUTTON_RIGHT)) + .build() + ); + + // Logging + private final Setting logSelection = sgGeneral.add(new BoolSetting.Builder() + .name("log-selection") + .description("Logs the selection coordinates to the chat.") + .defaultValue(true) + .build() + ); + + private final Setting keepActive = sgGeneral.add(new BoolSetting.Builder() + .name("keep-active") + .description("Keep the module active after finishing the excavation.") + .defaultValue(false) + .build() + ); + + // Rendering + private final Setting shapeMode = sgRendering.add(new EnumSetting.Builder() + .name("shape-mode") + .description("How the shapes are rendered.") + .defaultValue(ShapeMode.Both) + .build() + ); + + private final Setting sideColor = sgRendering.add(new ColorSetting.Builder() + .name("side-color") + .description("The side color.") + .defaultValue(new SettingColor(255, 255, 255, 50)) + .build() + ); + + private final Setting lineColor = sgRendering.add(new ColorSetting.Builder() + .name("line-color") + .description("The line color.") + .defaultValue(new SettingColor(255, 255, 255, 255)) + .build() + ); + + private enum Status { + SEL_START, + SEL_END, + WORKING + } + + private Status status = Status.SEL_START; + private BetterBlockPos start, end; + + public Excavator() { + super(Categories.World, "excavator", "Excavate a selection area."); + } + + @Override + public void onDeactivate() { + baritone.getSelectionManager().removeSelection(baritone.getSelectionManager().getLastSelection()); + if (baritone.getBuilderProcess().isActive()) baritone.getCommandManager().execute("stop"); + status = Status.SEL_START; + } + + @EventHandler + private void onMouseButton(MouseButtonEvent event) { + if (event.action != KeyAction.Press || event.button != selectionKey.get().getValue() || mc.currentScreen != null) { + return; + } + selectCorners(); + } + + @EventHandler + private void onKey(KeyEvent event) { + if (event.action != KeyAction.Press || event.key != selectionKey.get().getValue() || mc.currentScreen != null) { + return; + } + selectCorners(); + } + + private void selectCorners() { + if (!(mc.crosshairTarget instanceof BlockHitResult result)) return; + + if (status == Status.SEL_START) { + start = BetterBlockPos.from(result.getBlockPos()); + status = Status.SEL_END; + if (logSelection.get()) { + info("Start corner set: (%d, %d, %d)".formatted(start.getX(), start.getY(), start.getZ())); + } + } else if (status == Status.SEL_END) { + end = BetterBlockPos.from(result.getBlockPos()); + status = Status.WORKING; + if (logSelection.get()) { + info("End corner set: (%d, %d, %d)".formatted(end.getX(), end.getY(), end.getZ())); + } + baritone.getSelectionManager().addSelection(start, end); + baritone.getBuilderProcess().clearArea(start, end); + } + } + + @EventHandler + private void onRender3D(Render3DEvent event) { + if (status == Status.SEL_START || status == Status.SEL_END) { + if (!(mc.crosshairTarget instanceof BlockHitResult result)) return; + event.renderer.box(result.getBlockPos(), sideColor.get(), lineColor.get(), shapeMode.get(), 0); + } else if (status == Status.WORKING && !baritone.getBuilderProcess().isActive()) { + if (keepActive.get()) { + baritone.getSelectionManager().removeSelection(baritone.getSelectionManager().getLastSelection()); + status = Status.SEL_START; + } else toggle(); + } + } +} From d72c41c1d24ab2784ab0b6aa6f3c768055e1cd85 Mon Sep 17 00:00:00 2001 From: hellidox <97000871+hellidox@users.noreply.github.com> Date: Wed, 9 Aug 2023 17:08:04 -0500 Subject: [PATCH 052/357] Update Swarm default port (#3796) --- .../meteorclient/systems/modules/misc/swarm/Swarm.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/Swarm.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/Swarm.java index 0cffa6daac..ce046432e4 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/Swarm.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/Swarm.java @@ -40,7 +40,7 @@ public class Swarm extends Module { private final Setting serverPort = sgGeneral.add(new IntSetting.Builder() .name("port") .description("The port used for connections.") - .defaultValue(420) + .defaultValue(6969) .range(1, 65535) .noSlider() .build() From 65509bb6c76e6bed9ebca0a9e782cccbb6dc1dee Mon Sep 17 00:00:00 2001 From: auto Date: Wed, 9 Aug 2023 18:28:27 -0400 Subject: [PATCH 053/357] Update BuildHeight to new height limit --- .../meteorclient/systems/modules/world/BuildHeight.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/BuildHeight.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/BuildHeight.java index ae0b86c889..78e5ce6e37 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/BuildHeight.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/BuildHeight.java @@ -21,8 +21,8 @@ public BuildHeight() { @EventHandler private void onSendPacket(PacketEvent.Send event) { if (!(event.packet instanceof PlayerInteractBlockC2SPacket p)) return; - - if (p.getBlockHitResult().getPos().y >= 255 && p.getBlockHitResult().getSide() == Direction.UP) { + if (mc.world == null) return; + if (p.getBlockHitResult().getPos().y >= mc.world.getTopY() && p.getBlockHitResult().getSide() == Direction.UP) { ((BlockHitResultAccessor) p.getBlockHitResult()).setSide(Direction.DOWN); } } From f66f53e09ea1714acdf6a12b507a4bfa46ad9f97 Mon Sep 17 00:00:00 2001 From: Wikinger8 <85295145+Wikinger8@users.noreply.github.com> Date: Thu, 10 Aug 2023 02:37:32 +0200 Subject: [PATCH 054/357] Fixed InventoryTweaks crash (#3928) --- .../mixin/ClientPlayerInteractionManagerMixin.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerInteractionManagerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerInteractionManagerMixin.java index caf96eba86..3f316accf5 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerInteractionManagerMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerInteractionManagerMixin.java @@ -76,8 +76,13 @@ public void onClickArmorSlot(int syncId, int slotId, int button, SlotActionType clickSlot(syncId, 17, armorSlot, SlotActionType.SWAP, player); //armor slot <-> inv slot ci.cancel(); } else if (actionType == SlotActionType.SWAP) { - clickSlot(syncId, 36 + button, armorSlot, SlotActionType.SWAP, player); //invert swap - ci.cancel(); + if (button >= 10) { + clickSlot(syncId, 45, armorSlot, SlotActionType.SWAP, player); + ci.cancel(); + } else { + clickSlot(syncId, 36 + button, armorSlot, SlotActionType.SWAP, player); //invert swap + ci.cancel(); + } } } } From 6799f8ed602a8ad4f862d366cb2bbdddc81c53f2 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Thu, 10 Aug 2023 15:43:27 -0400 Subject: [PATCH 055/357] patch 1.20 compat --- .../meteorclient/mixin/ClientConnectionMixin.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java index 5277f18f73..953ba498c3 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java @@ -52,8 +52,8 @@ private void disconnect(Text disconnectReason, CallbackInfo ci) { } } - @Inject(method = "connect(Ljava/net/InetSocketAddress;ZLnet/minecraft/network/ClientConnection;)Lio/netty/channel/ChannelFuture;", at = @At("HEAD")) - private static void onConnect(InetSocketAddress address, boolean useEpoll, ClientConnection connection, CallbackInfoReturnable cir) { + @Inject(method = "connect", at = @At("HEAD")) + private static void onConnect(InetSocketAddress address, boolean useEpoll, CallbackInfoReturnable cir) { MeteorClient.EVENT_BUS.post(ServerConnectEndEvent.get(address)); } From 7da4a4f31261f52d41d1baa8de5b7aa1c85b154a Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Fri, 11 Aug 2023 08:00:24 -0400 Subject: [PATCH 056/357] Optimise anti spam (#3932) the J --- .../meteorclient/mixin/ChatHudMixin.java | 4 ++-- .../meteorclient/systems/modules/misc/BetterChat.java | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java index f8268e978a..3d221a4c0b 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java @@ -89,7 +89,7 @@ private void onAddMessage(Text message, @Nullable MessageSignatureData signature for (int i = messages.size() - 1; i > -1 ; i--) { if (((IChatHudLine) (Object) messages.get(i)).getId() == nextId && nextId != 0) { messages.remove(i); - Modules.get().get(BetterChat.class).lines.remove(i); + Modules.get().get(BetterChat.class).lines.removeInt(i); } } @@ -235,7 +235,7 @@ private void onRemoveMessage(Text message, MessageSignatureData signature, int t int size = betterChat.lines.size() - (betterChat.isLongerChat() && betterChat.getChatLength() >= 100 ? betterChat.getChatLength() : 0); while (size > 100) { - betterChat.lines.remove(size - 1); + betterChat.lines.removeInt(size - 1); size--; } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java index 16ad357c1f..7cf9815e3c 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java @@ -270,7 +270,7 @@ private Text appendAntiSpam(Text text) { if (messages.isEmpty()) return null; for (int i = 0; i < Math.min(antiSpamDepth.get(), messages.size()); i++) { - String stringToCheck = messages.get(i).content().copy().getString(); + String stringToCheck = messages.get(i).content().getString(); Matcher timestampMatcher = timestampRegex.matcher(stringToCheck); if (timestampMatcher.find()) { @@ -304,17 +304,17 @@ private Text appendAntiSpam(Text text) { int start = -1; for (int i = 0; i < messageIndex; i++) { - start += lines.get(i); + start += lines.getInt(i); } - int i = lines.get(messageIndex); + int i = lines.getInt(messageIndex); while (i > 0) { visible.remove(start + 1); i--; } messages.remove(messageIndex); - lines.remove(messageIndex); + lines.removeInt(messageIndex); } return returnText; From 953c07107caadaa849314c9f4c41ae4a0c5ed876 Mon Sep 17 00:00:00 2001 From: thebest9178 <76120883+thebest9178@users.noreply.github.com> Date: Fri, 11 Aug 2023 03:25:50 -0700 Subject: [PATCH 057/357] Added options for flat and rainbow colours. Made the default potion timers text not appear when the player has any effects. --- .../systems/hud/elements/PotionTimersHud.java | 107 ++++++++++++++++-- 1 file changed, 95 insertions(+), 12 deletions(-) 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 5c6a13220a..8f4d2573a9 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PotionTimersHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PotionTimersHud.java @@ -10,7 +10,6 @@ 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; @@ -25,6 +24,61 @@ public class PotionTimersHud extends HudElement { // General + private final Setting colorMode = sgGeneral.add(new EnumSetting.Builder() + .name("color-mode") + .description("What color to use for effects.") + .defaultValue(ColorMode.Effect) + .build() + ); + + private final Setting flatColor = sgGeneral.add(new ColorSetting.Builder() + .name("flat-color") + .description("Color for flat color mode.") + .defaultValue(new SettingColor(225, 25, 25)) + .visible(() -> colorMode.get() == ColorMode.Flat) + .build() + ); + + private final Setting rainbowSpeed = sgGeneral.add(new DoubleSetting.Builder() + .name("rainbow-speed") + .description("Rainbow speed of rainbow color mode.") + .defaultValue(0.05) + .sliderMin(0.01) + .sliderMax(0.2) + .decimalPlaces(4) + .visible(() -> colorMode.get() == ColorMode.Rainbow) + .build() + ); + + private final Setting rainbowSpread = sgGeneral.add(new DoubleSetting.Builder() + .name("rainbow-spread") + .description("Rainbow spread of rainbow color mode.") + .defaultValue(0.01) + .sliderMin(0.001) + .sliderMax(0.05) + .decimalPlaces(4) + .visible(() -> colorMode.get() == ColorMode.Rainbow) + .build() + ); + + private final Setting rainbowSaturation = sgGeneral.add(new DoubleSetting.Builder() + .name("rainbow-saturation") + .description("Saturation of rainbow color mode.") + .defaultValue(1.0d) + .sliderRange(0.0d, 1.0d) + .visible(() -> colorMode.get() == ColorMode.Rainbow) + .build() + ); + + private final Setting rainbowBrightness = sgGeneral.add(new DoubleSetting.Builder() + .name("rainbow-brightness") + .description("Brightness of rainbow color mode.") + .defaultValue(1.0d) + .sliderRange(0.0d, 1.0d) + .visible(() -> colorMode.get() == ColorMode.Rainbow) + .build() + ); + private final Setting shadow = sgGeneral.add(new BoolSetting.Builder() .name("shadow") .description("Renders shadow behind text.") @@ -82,7 +136,9 @@ public class PotionTimersHud extends HudElement { .build() ); - private final Color color = new Color(); + private final Color rainbow = new Color(255, 255, 255); + private double rainbowHue1; + private double rainbowHue2; public PotionTimersHud() { super(INFO); @@ -100,7 +156,7 @@ protected double alignX(double width, Alignment alignment) { @Override public void tick(HudRenderer renderer) { - if (mc.player == null || isInEditor()) { + if (mc.player == null || (isInEditor() && mc.player.getStatusEffects().isEmpty())) { setSize(renderer.textWidth("Potion Timers 0:00", shadow.get(), getScale()), renderer.textHeight(shadow.get(), getScale())); return; } @@ -125,23 +181,44 @@ public void render(HudRenderer renderer) { renderer.quad(this.x, this.y, getWidth(), getHeight(), backgroundColor.get()); } - if (mc.player == null || isInEditor()) { - renderer.text("Potion Timers 0:00", x, y, color, shadow.get(), getScale()); + if (mc.player == null || (isInEditor() && mc.player.getStatusEffects().isEmpty())) { + renderer.text("Potion Timers 0:00", x, y, Color.WHITE, shadow.get(), getScale()); return; } - for (StatusEffectInstance statusEffectInstance : mc.player.getStatusEffects()) { - StatusEffect statusEffect = statusEffectInstance.getEffectType(); + rainbowHue1 += rainbowSpeed.get() * renderer.delta; + if (rainbowHue1 > 1) rainbowHue1 -= 1; + else if (rainbowHue1 < -1) rainbowHue1 += 1; + + rainbowHue2 = rainbowHue1; - int c = statusEffect.getColor(); - color.r = Color.toRGBAR(c); - color.g = Color.toRGBAG(c); - color.b = Color.toRGBAB(c); + for (StatusEffectInstance statusEffectInstance : mc.player.getStatusEffects()) { + Color color = new Color(255, 255, 255); + + switch (colorMode.get()) { + case Effect -> { + int c = statusEffectInstance.getEffectType().getColor(); + color.r = Color.toRGBAR(c); + color.g = Color.toRGBAG(c); + color.b = Color.toRGBAB(c); + } + case Flat -> { + color = flatColor.get(); + flatColor.get().update(); + } + case Rainbow -> { + rainbowHue2 += rainbowSpread.get(); + int c = java.awt.Color.HSBtoRGB((float) rainbowHue2, rainbowSaturation.get().floatValue(), rainbowBrightness.get().floatValue()); + rainbow.r = Color.toRGBAR(c); + rainbow.g = Color.toRGBAG(c); + rainbow.b = Color.toRGBAB(c); + color = rainbow; + } + } String text = getString(statusEffectInstance); renderer.text(text, x + alignX(renderer.textWidth(text, shadow.get(), getScale()), alignment.get()), y, color, shadow.get(), getScale()); - color.r = color.g = color.b = 255; y += renderer.textHeight(shadow.get(), getScale()); } } @@ -153,4 +230,10 @@ private String getString(StatusEffectInstance statusEffectInstance) { private double getScale() { return customScale.get() ? scale.get() : -1; } + + public enum ColorMode { + Effect, + Flat, + Rainbow + } } From 7191d38e36bb59e7f884a2843ddb0a90befcf235 Mon Sep 17 00:00:00 2001 From: thebest9178 <76120883+thebest9178@users.noreply.github.com> Date: Fri, 11 Aug 2023 03:52:02 -0700 Subject: [PATCH 058/357] Added Hidden Effects Added Show Ambient --- .../systems/hud/elements/PotionTimersHud.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) 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 8f4d2573a9..1aec30b857 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PotionTimersHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PotionTimersHud.java @@ -10,9 +10,12 @@ 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 java.util.List; + import static meteordevelopment.meteorclient.MeteorClient.mc; public class PotionTimersHud extends HudElement { @@ -24,6 +27,19 @@ public class PotionTimersHud extends HudElement { // General + private final Setting> hiddenEffects = sgGeneral.add(new StatusEffectListSetting.Builder() + .name("hidden-effects") + .description("Which effects not to show in the list.") + .build() + ); + + private final Setting showAmbient = sgGeneral.add(new BoolSetting.Builder() + .name("show-ambient") + .description("Whether to show ambient effects like from beacons and conduits.") + .defaultValue(true) + .build() + ); + private final Setting colorMode = sgGeneral.add(new EnumSetting.Builder() .name("color-mode") .description("What color to use for effects.") @@ -165,6 +181,8 @@ public void tick(HudRenderer renderer) { double height = 0; for (StatusEffectInstance statusEffectInstance : mc.player.getStatusEffects()) { + if (hiddenEffects.get().contains(statusEffectInstance.getEffectType())) continue; + if (!showAmbient.get() && statusEffectInstance.isAmbient()) continue; width = Math.max(width, renderer.textWidth(getString(statusEffectInstance), shadow.get(), getScale())); height += renderer.textHeight(shadow.get(), getScale()); } @@ -193,6 +211,8 @@ public void render(HudRenderer renderer) { rainbowHue2 = rainbowHue1; for (StatusEffectInstance statusEffectInstance : mc.player.getStatusEffects()) { + if (hiddenEffects.get().contains(statusEffectInstance.getEffectType())) continue; + if (!showAmbient.get() && statusEffectInstance.isAmbient()) continue; Color color = new Color(255, 255, 255); switch (colorMode.get()) { From 790c858219b66ad9a3914d59d3816a29fe494ec7 Mon Sep 17 00:00:00 2001 From: etianl <115842502+etianl@users.noreply.github.com> Date: Sat, 1 Jul 2023 15:34:44 -0700 Subject: [PATCH 059/357] Fixed Jesus On Blocks Other Than Liquid Source Jesus was murdering me when I was walking on any lava other than source blocks, by causing the character to dip into it. This smol change fixes that --- .../meteorclient/systems/modules/movement/Jesus.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Jesus.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Jesus.java index e63813b27d..25d00501c3 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Jesus.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Jesus.java @@ -215,9 +215,9 @@ else if ((event.fluidState.getFluid() == Fluids.LAVA || event.fluidState.getFlui private void onFluidCollisionShape(CollisionShapeEvent event) { if (event.state.getFluidState().isEmpty()) return; - if (event.state.getFluidState().isOf(Fluids.WATER) && !mc.player.isTouchingWater() && waterShouldBeSolid()) { + if (event.state.getBlock() == Blocks.WATER && !mc.player.isTouchingWater() && waterShouldBeSolid()) { event.shape = VoxelShapes.fullCube(); - } else if (event.state.getFluidState().isOf(Fluids.LAVA) && !mc.player.isInLava() && lavaShouldBeSolid()) { + } else if (event.state.getBlock() == Blocks.LAVA && !mc.player.isInLava() && lavaShouldBeSolid()) { event.shape = VoxelShapes.fullCube(); } } @@ -306,7 +306,7 @@ private boolean isOverLiquid() { blockPos.set(MathHelper.lerp(0.5D, bb.minX, bb.maxX), MathHelper.lerp(0.5D, bb.minY, bb.maxY), MathHelper.lerp(0.5D, bb.minZ, bb.maxZ)); BlockState blockState = mc.world.getBlockState(blockPos); - if (blockState.getFluidState().isOf(Fluids.WATER) || blockState.getFluidState().isOf(Fluids.LAVA)) + if (blockState.getBlock() == Blocks.WATER || blockState.getBlock() == Blocks.LAVA) foundLiquid = true; else if (!blockState.isAir()) foundSolid = true; } From 899cffd7a60594e78e59a12929ffc628b858b73b Mon Sep 17 00:00:00 2001 From: etianl <115842502+etianl@users.noreply.github.com> Date: Sun, 9 Jul 2023 00:34:36 -0700 Subject: [PATCH 060/357] Make Jesus work on Blocks Other than Source This edit makes the Jesus work on blocks other than the source as well as waterlogged blocks. --- .../meteorclient/systems/modules/movement/Jesus.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Jesus.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Jesus.java index 25d00501c3..3b7a6b68c2 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Jesus.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Jesus.java @@ -19,6 +19,7 @@ import meteordevelopment.meteorclient.utils.entity.EntityUtils; import meteordevelopment.orbit.EventHandler; import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; import net.minecraft.enchantment.ProtectionEnchantment; import net.minecraft.entity.effect.StatusEffects; import net.minecraft.fluid.Fluids; @@ -215,7 +216,7 @@ else if ((event.fluidState.getFluid() == Fluids.LAVA || event.fluidState.getFlui private void onFluidCollisionShape(CollisionShapeEvent event) { if (event.state.getFluidState().isEmpty()) return; - if (event.state.getBlock() == Blocks.WATER && !mc.player.isTouchingWater() && waterShouldBeSolid()) { + if ((event.state.getBlock() == Blocks.WATER | event.state.getFluidState().getFluid() == Fluids.WATER) && !mc.player.isTouchingWater() && waterShouldBeSolid()) { event.shape = VoxelShapes.fullCube(); } else if (event.state.getBlock() == Blocks.LAVA && !mc.player.isInLava() && lavaShouldBeSolid()) { event.shape = VoxelShapes.fullCube(); @@ -306,7 +307,7 @@ private boolean isOverLiquid() { blockPos.set(MathHelper.lerp(0.5D, bb.minX, bb.maxX), MathHelper.lerp(0.5D, bb.minY, bb.maxY), MathHelper.lerp(0.5D, bb.minZ, bb.maxZ)); BlockState blockState = mc.world.getBlockState(blockPos); - if (blockState.getBlock() == Blocks.WATER || blockState.getBlock() == Blocks.LAVA) + if ((blockState.getBlock() == Blocks.WATER | blockState.getFluidState().getFluid() == Fluids.WATER) || blockState.getBlock() == Blocks.LAVA) foundLiquid = true; else if (!blockState.isAir()) foundSolid = true; } From bee3569c2c921936c75786787bd50c1a05b813d4 Mon Sep 17 00:00:00 2001 From: Trolman <105076612+Cabbasca@users.noreply.github.com> Date: Wed, 21 Jun 2023 15:39:02 +0200 Subject: [PATCH 061/357] Spawn eggs can be placed in the air --- .../meteorclient/systems/modules/world/AirPlace.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AirPlace.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AirPlace.java index a7e8c9193d..16df2177f2 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AirPlace.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AirPlace.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.systems.modules.world; +import net.minecraft.item.SpawnEggItem; import meteordevelopment.meteorclient.events.render.Render3DEvent; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.renderer.ShapeMode; @@ -83,7 +84,7 @@ private void onTick(TickEvent.Post event) { double r = customRange.get() ? range.get() : mc.interactionManager.getReachDistance(); hitResult = mc.getCameraEntity().raycast(r, 0, false); - if (!(hitResult instanceof BlockHitResult) || !(mc.player.getMainHandStack().getItem() instanceof BlockItem)) return; + if (!(hitResult instanceof BlockHitResult) || !(mc.player.getMainHandStack().getItem() instanceof BlockItem) && !(mc.player.getMainHandStack().getItem() instanceof SpawnEggItem)) return; if (mc.options.useKey.isPressed()) { BlockUtils.place(((BlockHitResult) hitResult).getBlockPos(), Hand.MAIN_HAND, mc.player.getInventory().selectedSlot, false, 0, true, true, false); @@ -94,7 +95,7 @@ private void onTick(TickEvent.Post event) { private void onRender(Render3DEvent event) { if (!(hitResult instanceof BlockHitResult) || !mc.world.getBlockState(((BlockHitResult) hitResult).getBlockPos()).isReplaceable() - || !(mc.player.getMainHandStack().getItem() instanceof BlockItem) + || !(mc.player.getMainHandStack().getItem() instanceof BlockItem) && !(mc.player.getMainHandStack().getItem() instanceof SpawnEggItem) || !render.get()) return; event.renderer.box(((BlockHitResult) hitResult).getBlockPos(), sideColor.get(), lineColor.get(), shapeMode.get(), 0); From f0dafbe213e65148b4e5c90e2ae360c825918fb5 Mon Sep 17 00:00:00 2001 From: Mersid Date: Sat, 12 Aug 2023 07:04:04 -0700 Subject: [PATCH 062/357] Fix rainbow colour not working for friends (#3741) --- .../meteorclient/systems/Systems.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/Systems.java b/src/main/java/meteordevelopment/meteorclient/systems/Systems.java index c1c5d6549d..5dae1e4eda 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/Systems.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/Systems.java @@ -34,9 +34,13 @@ public static void addPreLoadTask(Runnable task) { } public static void init() { - System config = add(new Config()); - config.init(); - config.load(); + Config config = new Config(); + System configSystem = add(config); + configSystem.init(); + configSystem.load(); + + // Registers the colors from config tab. This allows rainbow colours to work for friends. + config.settings.registerColorSettings(null); add(new Modules()); add(new Macros()); From 4a5b958705277c0875a899defc2cbbd2cb39c7c7 Mon Sep 17 00:00:00 2001 From: DAM <43420467+DAMcraft@users.noreply.github.com> Date: Mon, 12 Jun 2023 19:36:53 +0200 Subject: [PATCH 063/357] VClip normal tp if distance > 200 --- .../meteorclient/commands/commands/VClipCommand.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/VClipCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/VClipCommand.java index 500fb7f5cb..19da05bab3 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/VClipCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/VClipCommand.java @@ -31,6 +31,14 @@ public void build(LiteralArgumentBuilder builder) { // Paper allows you to teleport 10 blocks for each move packet you send in that tick // Video explanation by LiveOverflow: https://www.youtube.com/watch?v=3HSnDsfkJT8 int packetsRequired = (int) Math.ceil(Math.abs(blocks / 10)); + + if (packetsRequired > 20) { + // Wouldn't work on paper anyway. + // Some servers don't have a vertical limit, so if it is more than 200 blocks, just use a "normal" tp + // This makes it, so you don't get kicked for sending too many packets + packetsRequired = 1; + } + if (mc.player.hasVehicle()) { // Vehicle version // For each 10 blocks, send a vehicle move packet with no delta From 96ba7daffa6ecf93dae71e0f9802c39c1b7f8cf3 Mon Sep 17 00:00:00 2001 From: Fiz-Victor Date: Sun, 16 Jul 2023 13:56:37 +0800 Subject: [PATCH 064/357] Added bundle packet support Regenerated PacketUtil --- .../commands/commands/LocateCommand.java | 2 +- .../mixin/ClientConnectionMixin.java | 9 +- .../utils/network/PacketUtils.java | 125 +++++++++--------- .../utils/network/PacketUtilsUtil.java | 2 + 4 files changed, 77 insertions(+), 61 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/LocateCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/LocateCommand.java index 2855c91581..241bc6cad9 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/LocateCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/LocateCommand.java @@ -271,6 +271,7 @@ private void lastPosition(double x, double y, double z) { } private void findStronghold() { + BaritoneAPI.getProvider().getPrimaryBaritone().getCommandManager().execute("stop"); if (this.firstStart == null || this.firstEnd == null || this.secondStart == null || this.secondEnd == null) { error("Missing position data"); cancel(); @@ -284,7 +285,6 @@ private void findStronghold() { cancel(); return; } - BaritoneAPI.getProvider().getPrimaryBaritone().getCommandManager().execute("stop"); MeteorClient.EVENT_BUS.unsubscribe(this); Vec3d coords = new Vec3d(intersection[0], 0, intersection[1]); MutableText text = Text.literal("Stronghold roughly located at "); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java index 953ba498c3..47592eca6a 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java @@ -22,8 +22,10 @@ import net.minecraft.network.ClientConnection; import net.minecraft.network.NetworkSide; import net.minecraft.network.PacketEncoderException; +import net.minecraft.network.listener.ClientPlayPacketListener; import net.minecraft.network.listener.PacketListener; 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; @@ -34,12 +36,17 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import java.net.InetSocketAddress; +import java.util.Iterator; @Mixin(ClientConnection.class) public class ClientConnectionMixin { @Inject(method = "handlePacket", at = @At("HEAD"), cancellable = true) private static void onHandlePacket(Packet packet, PacketListener listener, CallbackInfo info) { - if (MeteorClient.EVENT_BUS.post(PacketEvent.Receive.get(packet)).isCancelled()) info.cancel(); + if (packet instanceof BundleS2CPacket bundle) { + for (Iterator> it = bundle.getPackets().iterator(); it.hasNext(); ) { + if (MeteorClient.EVENT_BUS.post(PacketEvent.Receive.get(it.next())).isCancelled()) it.remove(); + } + } else if (MeteorClient.EVENT_BUS.post(PacketEvent.Receive.get(packet)).isCancelled()) info.cancel(); } @Inject(method = "disconnect", at = @At("HEAD")) diff --git a/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtils.java index 289a6ebe17..6e5cbc6123 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtils.java @@ -19,7 +19,6 @@ import net.minecraft.util.Identifier; import net.minecraft.util.math.random.Random; import org.jetbrains.annotations.NotNull; - import java.util.*; import java.util.stream.Stream; @@ -37,10 +36,10 @@ public class PacketUtils { C2S_PACKETS_R.put("ClientStatusC2SPacket", net.minecraft.network.packet.c2s.play.ClientStatusC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.PlayerInteractItemC2SPacket.class, "PlayerInteractItemC2SPacket"); C2S_PACKETS_R.put("PlayerInteractItemC2SPacket", net.minecraft.network.packet.c2s.play.PlayerInteractItemC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.SelectMerchantTradeC2SPacket.class, "SelectMerchantTradeC2SPacket"); - C2S_PACKETS_R.put("SelectMerchantTradeC2SPacket", net.minecraft.network.packet.c2s.play.SelectMerchantTradeC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket.class, "PlayerActionC2SPacket"); C2S_PACKETS_R.put("PlayerActionC2SPacket", net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.SelectMerchantTradeC2SPacket.class, "SelectMerchantTradeC2SPacket"); + C2S_PACKETS_R.put("SelectMerchantTradeC2SPacket", net.minecraft.network.packet.c2s.play.SelectMerchantTradeC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.CommandExecutionC2SPacket.class, "CommandExecutionC2SPacket"); C2S_PACKETS_R.put("CommandExecutionC2SPacket", net.minecraft.network.packet.c2s.play.CommandExecutionC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.RenameItemC2SPacket.class, "RenameItemC2SPacket"); @@ -53,30 +52,30 @@ public class PacketUtils { C2S_PACKETS_R.put("QueryBlockNbtC2SPacket", net.minecraft.network.packet.c2s.play.QueryBlockNbtC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.PlayerInteractEntityC2SPacket.class, "PlayerInteractEntityC2SPacket"); C2S_PACKETS_R.put("PlayerInteractEntityC2SPacket", net.minecraft.network.packet.c2s.play.PlayerInteractEntityC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdatePlayerAbilitiesC2SPacket.class, "UpdatePlayerAbilitiesC2SPacket"); - C2S_PACKETS_R.put("UpdatePlayerAbilitiesC2SPacket", net.minecraft.network.packet.c2s.play.UpdatePlayerAbilitiesC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.RequestCommandCompletionsC2SPacket.class, "RequestCommandCompletionsC2SPacket"); C2S_PACKETS_R.put("RequestCommandCompletionsC2SPacket", net.minecraft.network.packet.c2s.play.RequestCommandCompletionsC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdatePlayerAbilitiesC2SPacket.class, "UpdatePlayerAbilitiesC2SPacket"); + C2S_PACKETS_R.put("UpdatePlayerAbilitiesC2SPacket", net.minecraft.network.packet.c2s.play.UpdatePlayerAbilitiesC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.query.QueryRequestC2SPacket.class, "QueryRequestC2SPacket"); C2S_PACKETS_R.put("QueryRequestC2SPacket", net.minecraft.network.packet.c2s.query.QueryRequestC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdateCommandBlockC2SPacket.class, "UpdateCommandBlockC2SPacket"); - C2S_PACKETS_R.put("UpdateCommandBlockC2SPacket", net.minecraft.network.packet.c2s.play.UpdateCommandBlockC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.CustomPayloadC2SPacket.class, "CustomPayloadC2SPacket"); C2S_PACKETS_R.put("CustomPayloadC2SPacket", net.minecraft.network.packet.c2s.play.CustomPayloadC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdateCommandBlockC2SPacket.class, "UpdateCommandBlockC2SPacket"); + C2S_PACKETS_R.put("UpdateCommandBlockC2SPacket", net.minecraft.network.packet.c2s.play.UpdateCommandBlockC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.HandSwingC2SPacket.class, "HandSwingC2SPacket"); C2S_PACKETS_R.put("HandSwingC2SPacket", net.minecraft.network.packet.c2s.play.HandSwingC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.AdvancementTabC2SPacket.class, "AdvancementTabC2SPacket"); - C2S_PACKETS_R.put("AdvancementTabC2SPacket", net.minecraft.network.packet.c2s.play.AdvancementTabC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.ClickSlotC2SPacket.class, "ClickSlotC2SPacket"); C2S_PACKETS_R.put("ClickSlotC2SPacket", net.minecraft.network.packet.c2s.play.ClickSlotC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.AdvancementTabC2SPacket.class, "AdvancementTabC2SPacket"); + C2S_PACKETS_R.put("AdvancementTabC2SPacket", net.minecraft.network.packet.c2s.play.AdvancementTabC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.ClientSettingsC2SPacket.class, "ClientSettingsC2SPacket"); C2S_PACKETS_R.put("ClientSettingsC2SPacket", net.minecraft.network.packet.c2s.play.ClientSettingsC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.SpectatorTeleportC2SPacket.class, "SpectatorTeleportC2SPacket"); C2S_PACKETS_R.put("SpectatorTeleportC2SPacket", net.minecraft.network.packet.c2s.play.SpectatorTeleportC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.login.LoginKeyC2SPacket.class, "LoginKeyC2SPacket"); - C2S_PACKETS_R.put("LoginKeyC2SPacket", net.minecraft.network.packet.c2s.login.LoginKeyC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdateDifficultyLockC2SPacket.class, "UpdateDifficultyLockC2SPacket"); C2S_PACKETS_R.put("UpdateDifficultyLockC2SPacket", net.minecraft.network.packet.c2s.play.UpdateDifficultyLockC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.login.LoginKeyC2SPacket.class, "LoginKeyC2SPacket"); + C2S_PACKETS_R.put("LoginKeyC2SPacket", net.minecraft.network.packet.c2s.login.LoginKeyC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.JigsawGeneratingC2SPacket.class, "JigsawGeneratingC2SPacket"); C2S_PACKETS_R.put("JigsawGeneratingC2SPacket", net.minecraft.network.packet.c2s.play.JigsawGeneratingC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.QueryEntityNbtC2SPacket.class, "QueryEntityNbtC2SPacket"); @@ -101,10 +100,10 @@ public class PacketUtils { C2S_PACKETS_R.put("ChatMessageC2SPacket", net.minecraft.network.packet.c2s.play.ChatMessageC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdateBeaconC2SPacket.class, "UpdateBeaconC2SPacket"); C2S_PACKETS_R.put("UpdateBeaconC2SPacket", net.minecraft.network.packet.c2s.play.UpdateBeaconC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdateSignC2SPacket.class, "UpdateSignC2SPacket"); - C2S_PACKETS_R.put("UpdateSignC2SPacket", net.minecraft.network.packet.c2s.play.UpdateSignC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.TeleportConfirmC2SPacket.class, "TeleportConfirmC2SPacket"); C2S_PACKETS_R.put("TeleportConfirmC2SPacket", net.minecraft.network.packet.c2s.play.TeleportConfirmC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdateSignC2SPacket.class, "UpdateSignC2SPacket"); + C2S_PACKETS_R.put("UpdateSignC2SPacket", net.minecraft.network.packet.c2s.play.UpdateSignC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdateStructureBlockC2SPacket.class, "UpdateStructureBlockC2SPacket"); C2S_PACKETS_R.put("UpdateStructureBlockC2SPacket", net.minecraft.network.packet.c2s.play.UpdateStructureBlockC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdateCommandBlockMinecartC2SPacket.class, "UpdateCommandBlockMinecartC2SPacket"); @@ -119,24 +118,24 @@ public class PacketUtils { C2S_PACKETS_R.put("UpdateJigsawC2SPacket", net.minecraft.network.packet.c2s.play.UpdateJigsawC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.query.QueryPingC2SPacket.class, "QueryPingC2SPacket"); C2S_PACKETS_R.put("QueryPingC2SPacket", net.minecraft.network.packet.c2s.query.QueryPingC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.PlayPongC2SPacket.class, "PlayPongC2SPacket"); - C2S_PACKETS_R.put("PlayPongC2SPacket", net.minecraft.network.packet.c2s.play.PlayPongC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.ResourcePackStatusC2SPacket.class, "ResourcePackStatusC2SPacket"); C2S_PACKETS_R.put("ResourcePackStatusC2SPacket", net.minecraft.network.packet.c2s.play.ResourcePackStatusC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.PlayPongC2SPacket.class, "PlayPongC2SPacket"); + C2S_PACKETS_R.put("PlayPongC2SPacket", net.minecraft.network.packet.c2s.play.PlayPongC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.MessageAcknowledgmentC2SPacket.class, "MessageAcknowledgmentC2SPacket"); C2S_PACKETS_R.put("MessageAcknowledgmentC2SPacket", net.minecraft.network.packet.c2s.play.MessageAcknowledgmentC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.CreativeInventoryActionC2SPacket.class, "CreativeInventoryActionC2SPacket"); - C2S_PACKETS_R.put("CreativeInventoryActionC2SPacket", net.minecraft.network.packet.c2s.play.CreativeInventoryActionC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.VehicleMoveC2SPacket.class, "VehicleMoveC2SPacket"); C2S_PACKETS_R.put("VehicleMoveC2SPacket", net.minecraft.network.packet.c2s.play.VehicleMoveC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.CreativeInventoryActionC2SPacket.class, "CreativeInventoryActionC2SPacket"); + C2S_PACKETS_R.put("CreativeInventoryActionC2SPacket", net.minecraft.network.packet.c2s.play.CreativeInventoryActionC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.BookUpdateC2SPacket.class, "BookUpdateC2SPacket"); C2S_PACKETS_R.put("BookUpdateC2SPacket", net.minecraft.network.packet.c2s.play.BookUpdateC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.RecipeBookDataC2SPacket.class, "RecipeBookDataC2SPacket"); C2S_PACKETS_R.put("RecipeBookDataC2SPacket", net.minecraft.network.packet.c2s.play.RecipeBookDataC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.login.LoginQueryResponseC2SPacket.class, "LoginQueryResponseC2SPacket"); - C2S_PACKETS_R.put("LoginQueryResponseC2SPacket", net.minecraft.network.packet.c2s.login.LoginQueryResponseC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.handshake.HandshakeC2SPacket.class, "HandshakeC2SPacket"); C2S_PACKETS_R.put("HandshakeC2SPacket", net.minecraft.network.packet.c2s.handshake.HandshakeC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.login.LoginQueryResponseC2SPacket.class, "LoginQueryResponseC2SPacket"); + C2S_PACKETS_R.put("LoginQueryResponseC2SPacket", net.minecraft.network.packet.c2s.login.LoginQueryResponseC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdateDifficultyC2SPacket.class, "UpdateDifficultyC2SPacket"); C2S_PACKETS_R.put("UpdateDifficultyC2SPacket", net.minecraft.network.packet.c2s.play.UpdateDifficultyC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.CraftRequestC2SPacket.class, "CraftRequestC2SPacket"); @@ -154,10 +153,10 @@ public class PacketUtils { S2C_PACKETS_R.put("WorldBorderSizeChangedS2CPacket", net.minecraft.network.packet.s2c.play.WorldBorderSizeChangedS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.AdvancementUpdateS2CPacket.class, "AdvancementUpdateS2CPacket"); S2C_PACKETS_R.put("AdvancementUpdateS2CPacket", net.minecraft.network.packet.s2c.play.AdvancementUpdateS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.FeaturesS2CPacket.class, "FeaturesS2CPacket"); - S2C_PACKETS_R.put("FeaturesS2CPacket", net.minecraft.network.packet.s2c.play.FeaturesS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.CustomPayloadS2CPacket.class, "CustomPayloadS2CPacket"); S2C_PACKETS_R.put("CustomPayloadS2CPacket", net.minecraft.network.packet.s2c.play.CustomPayloadS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.FeaturesS2CPacket.class, "FeaturesS2CPacket"); + S2C_PACKETS_R.put("FeaturesS2CPacket", net.minecraft.network.packet.s2c.play.FeaturesS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.WorldBorderInterpolateSizeS2CPacket.class, "WorldBorderInterpolateSizeS2CPacket"); S2C_PACKETS_R.put("WorldBorderInterpolateSizeS2CPacket", net.minecraft.network.packet.s2c.play.WorldBorderInterpolateSizeS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ChunkLoadDistanceS2CPacket.class, "ChunkLoadDistanceS2CPacket"); @@ -174,10 +173,12 @@ public class PacketUtils { S2C_PACKETS_R.put("RemoveMessageS2CPacket", net.minecraft.network.packet.s2c.play.RemoveMessageS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.SetCameraEntityS2CPacket.class, "SetCameraEntityS2CPacket"); S2C_PACKETS_R.put("SetCameraEntityS2CPacket", net.minecraft.network.packet.s2c.play.SetCameraEntityS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.CraftFailedResponseS2CPacket.class, "CraftFailedResponseS2CPacket"); - S2C_PACKETS_R.put("CraftFailedResponseS2CPacket", net.minecraft.network.packet.s2c.play.CraftFailedResponseS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.DamageTiltS2CPacket.class, "DamageTiltS2CPacket"); + S2C_PACKETS_R.put("DamageTiltS2CPacket", net.minecraft.network.packet.s2c.play.DamageTiltS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.StatisticsS2CPacket.class, "StatisticsS2CPacket"); S2C_PACKETS_R.put("StatisticsS2CPacket", net.minecraft.network.packet.s2c.play.StatisticsS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.CraftFailedResponseS2CPacket.class, "CraftFailedResponseS2CPacket"); + S2C_PACKETS_R.put("CraftFailedResponseS2CPacket", net.minecraft.network.packet.s2c.play.CraftFailedResponseS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.login.LoginQueryRequestS2CPacket.class, "LoginQueryRequestS2CPacket"); S2C_PACKETS_R.put("LoginQueryRequestS2CPacket", net.minecraft.network.packet.s2c.login.LoginQueryRequestS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.VehicleMoveS2CPacket.class, "VehicleMoveS2CPacket"); @@ -192,18 +193,18 @@ public class PacketUtils { S2C_PACKETS_R.put("EntitySetHeadYawS2CPacket", net.minecraft.network.packet.s2c.play.EntitySetHeadYawS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.KeepAliveS2CPacket.class, "KeepAliveS2CPacket"); S2C_PACKETS_R.put("KeepAliveS2CPacket", net.minecraft.network.packet.s2c.play.KeepAliveS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.SelectAdvancementTabS2CPacket.class, "SelectAdvancementTabS2CPacket"); - S2C_PACKETS_R.put("SelectAdvancementTabS2CPacket", net.minecraft.network.packet.s2c.play.SelectAdvancementTabS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.SetTradeOffersS2CPacket.class, "SetTradeOffersS2CPacket"); S2C_PACKETS_R.put("SetTradeOffersS2CPacket", net.minecraft.network.packet.s2c.play.SetTradeOffersS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.SelectAdvancementTabS2CPacket.class, "SelectAdvancementTabS2CPacket"); + S2C_PACKETS_R.put("SelectAdvancementTabS2CPacket", net.minecraft.network.packet.s2c.play.SelectAdvancementTabS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlaySoundS2CPacket.class, "PlaySoundS2CPacket"); S2C_PACKETS_R.put("PlaySoundS2CPacket", net.minecraft.network.packet.s2c.play.PlaySoundS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.BlockEventS2CPacket.class, "BlockEventS2CPacket"); S2C_PACKETS_R.put("BlockEventS2CPacket", net.minecraft.network.packet.s2c.play.BlockEventS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.HealthUpdateS2CPacket.class, "HealthUpdateS2CPacket"); - S2C_PACKETS_R.put("HealthUpdateS2CPacket", net.minecraft.network.packet.s2c.play.HealthUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlayerPositionLookS2CPacket.class, "PlayerPositionLookS2CPacket"); S2C_PACKETS_R.put("PlayerPositionLookS2CPacket", net.minecraft.network.packet.s2c.play.PlayerPositionLookS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.HealthUpdateS2CPacket.class, "HealthUpdateS2CPacket"); + S2C_PACKETS_R.put("HealthUpdateS2CPacket", net.minecraft.network.packet.s2c.play.HealthUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlayPingS2CPacket.class, "PlayPingS2CPacket"); S2C_PACKETS_R.put("PlayPingS2CPacket", net.minecraft.network.packet.s2c.play.PlayPingS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.WorldEventS2CPacket.class, "WorldEventS2CPacket"); @@ -216,16 +217,16 @@ public class PacketUtils { S2C_PACKETS_R.put("ChunkDeltaUpdateS2CPacket", net.minecraft.network.packet.s2c.play.ChunkDeltaUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.query.QueryResponseS2CPacket.class, "QueryResponseS2CPacket"); S2C_PACKETS_R.put("QueryResponseS2CPacket", net.minecraft.network.packet.s2c.query.QueryResponseS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.TeamS2CPacket.class, "TeamS2CPacket"); - S2C_PACKETS_R.put("TeamS2CPacket", net.minecraft.network.packet.s2c.play.TeamS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.CooldownUpdateS2CPacket.class, "CooldownUpdateS2CPacket"); S2C_PACKETS_R.put("CooldownUpdateS2CPacket", net.minecraft.network.packet.s2c.play.CooldownUpdateS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.OpenScreenS2CPacket.class, "OpenScreenS2CPacket"); - S2C_PACKETS_R.put("OpenScreenS2CPacket", net.minecraft.network.packet.s2c.play.OpenScreenS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.TeamS2CPacket.class, "TeamS2CPacket"); + S2C_PACKETS_R.put("TeamS2CPacket", net.minecraft.network.packet.s2c.play.TeamS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityAnimationS2CPacket.class, "EntityAnimationS2CPacket"); S2C_PACKETS_R.put("EntityAnimationS2CPacket", net.minecraft.network.packet.s2c.play.EntityAnimationS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ExperienceOrbSpawnS2CPacket.class, "ExperienceOrbSpawnS2CPacket"); S2C_PACKETS_R.put("ExperienceOrbSpawnS2CPacket", net.minecraft.network.packet.s2c.play.ExperienceOrbSpawnS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.OpenScreenS2CPacket.class, "OpenScreenS2CPacket"); + S2C_PACKETS_R.put("OpenScreenS2CPacket", net.minecraft.network.packet.s2c.play.OpenScreenS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlayerAbilitiesS2CPacket.class, "PlayerAbilitiesS2CPacket"); S2C_PACKETS_R.put("PlayerAbilitiesS2CPacket", net.minecraft.network.packet.s2c.play.PlayerAbilitiesS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.WorldBorderWarningBlocksChangedS2CPacket.class, "WorldBorderWarningBlocksChangedS2CPacket"); @@ -238,68 +239,72 @@ public class PacketUtils { S2C_PACKETS_R.put("UnlockRecipesS2CPacket", net.minecraft.network.packet.s2c.play.UnlockRecipesS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.LightUpdateS2CPacket.class, "LightUpdateS2CPacket"); S2C_PACKETS_R.put("LightUpdateS2CPacket", net.minecraft.network.packet.s2c.play.LightUpdateS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.OverlayMessageS2CPacket.class, "OverlayMessageS2CPacket"); - S2C_PACKETS_R.put("OverlayMessageS2CPacket", net.minecraft.network.packet.s2c.play.OverlayMessageS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.WorldBorderInitializeS2CPacket.class, "WorldBorderInitializeS2CPacket"); S2C_PACKETS_R.put("WorldBorderInitializeS2CPacket", net.minecraft.network.packet.s2c.play.WorldBorderInitializeS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.OverlayMessageS2CPacket.class, "OverlayMessageS2CPacket"); + S2C_PACKETS_R.put("OverlayMessageS2CPacket", net.minecraft.network.packet.s2c.play.OverlayMessageS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.WorldBorderCenterChangedS2CPacket.class, "WorldBorderCenterChangedS2CPacket"); S2C_PACKETS_R.put("WorldBorderCenterChangedS2CPacket", net.minecraft.network.packet.s2c.play.WorldBorderCenterChangedS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityVelocityUpdateS2CPacket.class, "EntityVelocityUpdateS2CPacket"); - S2C_PACKETS_R.put("EntityVelocityUpdateS2CPacket", net.minecraft.network.packet.s2c.play.EntityVelocityUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.DifficultyS2CPacket.class, "DifficultyS2CPacket"); S2C_PACKETS_R.put("DifficultyS2CPacket", net.minecraft.network.packet.s2c.play.DifficultyS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityVelocityUpdateS2CPacket.class, "EntityVelocityUpdateS2CPacket"); + S2C_PACKETS_R.put("EntityVelocityUpdateS2CPacket", net.minecraft.network.packet.s2c.play.EntityVelocityUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.LookAtS2CPacket.class, "LookAtS2CPacket"); S2C_PACKETS_R.put("LookAtS2CPacket", net.minecraft.network.packet.s2c.play.LookAtS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.TitleS2CPacket.class, "TitleS2CPacket"); - S2C_PACKETS_R.put("TitleS2CPacket", net.minecraft.network.packet.s2c.play.TitleS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.OpenHorseScreenS2CPacket.class, "OpenHorseScreenS2CPacket"); - S2C_PACKETS_R.put("OpenHorseScreenS2CPacket", net.minecraft.network.packet.s2c.play.OpenHorseScreenS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ScreenHandlerPropertyUpdateS2CPacket.class, "ScreenHandlerPropertyUpdateS2CPacket"); S2C_PACKETS_R.put("ScreenHandlerPropertyUpdateS2CPacket", net.minecraft.network.packet.s2c.play.ScreenHandlerPropertyUpdateS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.OpenHorseScreenS2CPacket.class, "OpenHorseScreenS2CPacket"); + S2C_PACKETS_R.put("OpenHorseScreenS2CPacket", net.minecraft.network.packet.s2c.play.OpenHorseScreenS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.TitleS2CPacket.class, "TitleS2CPacket"); + S2C_PACKETS_R.put("TitleS2CPacket", net.minecraft.network.packet.s2c.play.TitleS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.SimulationDistanceS2CPacket.class, "SimulationDistanceS2CPacket"); S2C_PACKETS_R.put("SimulationDistanceS2CPacket", net.minecraft.network.packet.s2c.play.SimulationDistanceS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ChatSuggestionsS2CPacket.class, "ChatSuggestionsS2CPacket"); S2C_PACKETS_R.put("ChatSuggestionsS2CPacket", net.minecraft.network.packet.s2c.play.ChatSuggestionsS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EnterCombatS2CPacket.class, "EnterCombatS2CPacket"); S2C_PACKETS_R.put("EnterCombatS2CPacket", net.minecraft.network.packet.s2c.play.EnterCombatS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.DeathMessageS2CPacket.class, "DeathMessageS2CPacket"); - S2C_PACKETS_R.put("DeathMessageS2CPacket", net.minecraft.network.packet.s2c.play.DeathMessageS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ProfilelessChatMessageS2CPacket.class, "ProfilelessChatMessageS2CPacket"); S2C_PACKETS_R.put("ProfilelessChatMessageS2CPacket", net.minecraft.network.packet.s2c.play.ProfilelessChatMessageS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.DeathMessageS2CPacket.class, "DeathMessageS2CPacket"); + S2C_PACKETS_R.put("DeathMessageS2CPacket", net.minecraft.network.packet.s2c.play.DeathMessageS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.MapUpdateS2CPacket.class, "MapUpdateS2CPacket"); S2C_PACKETS_R.put("MapUpdateS2CPacket", net.minecraft.network.packet.s2c.play.MapUpdateS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ScreenHandlerSlotUpdateS2CPacket.class, "ScreenHandlerSlotUpdateS2CPacket"); - S2C_PACKETS_R.put("ScreenHandlerSlotUpdateS2CPacket", net.minecraft.network.packet.s2c.play.ScreenHandlerSlotUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.BlockEntityUpdateS2CPacket.class, "BlockEntityUpdateS2CPacket"); S2C_PACKETS_R.put("BlockEntityUpdateS2CPacket", net.minecraft.network.packet.s2c.play.BlockEntityUpdateS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ScreenHandlerSlotUpdateS2CPacket.class, "ScreenHandlerSlotUpdateS2CPacket"); + S2C_PACKETS_R.put("ScreenHandlerSlotUpdateS2CPacket", net.minecraft.network.packet.s2c.play.ScreenHandlerSlotUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.SynchronizeTagsS2CPacket.class, "SynchronizeTagsS2CPacket"); S2C_PACKETS_R.put("SynchronizeTagsS2CPacket", net.minecraft.network.packet.s2c.play.SynchronizeTagsS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlayerSpawnPositionS2CPacket.class, "PlayerSpawnPositionS2CPacket"); S2C_PACKETS_R.put("PlayerSpawnPositionS2CPacket", net.minecraft.network.packet.s2c.play.PlayerSpawnPositionS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityStatusEffectS2CPacket.class, "EntityStatusEffectS2CPacket"); S2C_PACKETS_R.put("EntityStatusEffectS2CPacket", net.minecraft.network.packet.s2c.play.EntityStatusEffectS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.login.LoginCompressionS2CPacket.class, "LoginCompressionS2CPacket"); - S2C_PACKETS_R.put("LoginCompressionS2CPacket", net.minecraft.network.packet.s2c.login.LoginCompressionS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.CommandTreeS2CPacket.class, "CommandTreeS2CPacket"); - S2C_PACKETS_R.put("CommandTreeS2CPacket", net.minecraft.network.packet.s2c.play.CommandTreeS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ClearTitleS2CPacket.class, "ClearTitleS2CPacket"); S2C_PACKETS_R.put("ClearTitleS2CPacket", net.minecraft.network.packet.s2c.play.ClearTitleS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.CommandTreeS2CPacket.class, "CommandTreeS2CPacket"); + S2C_PACKETS_R.put("CommandTreeS2CPacket", net.minecraft.network.packet.s2c.play.CommandTreeS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.login.LoginCompressionS2CPacket.class, "LoginCompressionS2CPacket"); + S2C_PACKETS_R.put("LoginCompressionS2CPacket", net.minecraft.network.packet.s2c.login.LoginCompressionS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.TitleFadeS2CPacket.class, "TitleFadeS2CPacket"); S2C_PACKETS_R.put("TitleFadeS2CPacket", net.minecraft.network.packet.s2c.play.TitleFadeS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlayerSpawnS2CPacket.class, "PlayerSpawnS2CPacket"); S2C_PACKETS_R.put("PlayerSpawnS2CPacket", net.minecraft.network.packet.s2c.play.PlayerSpawnS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.InventoryS2CPacket.class, "InventoryS2CPacket"); - S2C_PACKETS_R.put("InventoryS2CPacket", net.minecraft.network.packet.s2c.play.InventoryS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlayerActionResponseS2CPacket.class, "PlayerActionResponseS2CPacket"); S2C_PACKETS_R.put("PlayerActionResponseS2CPacket", net.minecraft.network.packet.s2c.play.PlayerActionResponseS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.InventoryS2CPacket.class, "InventoryS2CPacket"); + S2C_PACKETS_R.put("InventoryS2CPacket", net.minecraft.network.packet.s2c.play.InventoryS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ResourcePackSendS2CPacket.class, "ResourcePackSendS2CPacket"); S2C_PACKETS_R.put("ResourcePackSendS2CPacket", net.minecraft.network.packet.s2c.play.ResourcePackSendS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ChunkBiomeDataS2CPacket.class, "ChunkBiomeDataS2CPacket"); + S2C_PACKETS_R.put("ChunkBiomeDataS2CPacket", net.minecraft.network.packet.s2c.play.ChunkBiomeDataS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.WorldBorderWarningTimeChangedS2CPacket.class, "WorldBorderWarningTimeChangedS2CPacket"); S2C_PACKETS_R.put("WorldBorderWarningTimeChangedS2CPacket", net.minecraft.network.packet.s2c.play.WorldBorderWarningTimeChangedS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ScoreboardPlayerUpdateS2CPacket.class, "ScoreboardPlayerUpdateS2CPacket"); S2C_PACKETS_R.put("ScoreboardPlayerUpdateS2CPacket", net.minecraft.network.packet.s2c.play.ScoreboardPlayerUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.query.QueryPongS2CPacket.class, "QueryPongS2CPacket"); S2C_PACKETS_R.put("QueryPongS2CPacket", net.minecraft.network.packet.s2c.query.QueryPongS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityDamageS2CPacket.class, "EntityDamageS2CPacket"); + S2C_PACKETS_R.put("EntityDamageS2CPacket", net.minecraft.network.packet.s2c.play.EntityDamageS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ChatMessageS2CPacket.class, "ChatMessageS2CPacket"); S2C_PACKETS_R.put("ChatMessageS2CPacket", net.minecraft.network.packet.s2c.play.ChatMessageS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.OpenWrittenBookS2CPacket.class, "OpenWrittenBookS2CPacket"); @@ -312,10 +317,10 @@ public class PacketUtils { S2C_PACKETS_R.put("SignEditorOpenS2CPacket", net.minecraft.network.packet.s2c.play.SignEditorOpenS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ExplosionS2CPacket.class, "ExplosionS2CPacket"); S2C_PACKETS_R.put("ExplosionS2CPacket", net.minecraft.network.packet.s2c.play.ExplosionS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.login.LoginDisconnectS2CPacket.class, "LoginDisconnectS2CPacket"); - S2C_PACKETS_R.put("LoginDisconnectS2CPacket", net.minecraft.network.packet.s2c.login.LoginDisconnectS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.RemoveEntityStatusEffectS2CPacket.class, "RemoveEntityStatusEffectS2CPacket"); S2C_PACKETS_R.put("RemoveEntityStatusEffectS2CPacket", net.minecraft.network.packet.s2c.play.RemoveEntityStatusEffectS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.login.LoginDisconnectS2CPacket.class, "LoginDisconnectS2CPacket"); + S2C_PACKETS_R.put("LoginDisconnectS2CPacket", net.minecraft.network.packet.s2c.login.LoginDisconnectS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EndCombatS2CPacket.class, "EndCombatS2CPacket"); S2C_PACKETS_R.put("EndCombatS2CPacket", net.minecraft.network.packet.s2c.play.EndCombatS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlayerListS2CPacket.class, "PlayerListS2CPacket"); @@ -338,10 +343,10 @@ public class PacketUtils { S2C_PACKETS_R.put("ScoreboardDisplayS2CPacket", net.minecraft.network.packet.s2c.play.ScoreboardDisplayS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.login.LoginSuccessS2CPacket.class, "LoginSuccessS2CPacket"); S2C_PACKETS_R.put("LoginSuccessS2CPacket", net.minecraft.network.packet.s2c.login.LoginSuccessS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.GameMessageS2CPacket.class, "GameMessageS2CPacket"); - S2C_PACKETS_R.put("GameMessageS2CPacket", net.minecraft.network.packet.s2c.play.GameMessageS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.BlockBreakingProgressS2CPacket.class, "BlockBreakingProgressS2CPacket"); S2C_PACKETS_R.put("BlockBreakingProgressS2CPacket", net.minecraft.network.packet.s2c.play.BlockBreakingProgressS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.GameMessageS2CPacket.class, "GameMessageS2CPacket"); + S2C_PACKETS_R.put("GameMessageS2CPacket", net.minecraft.network.packet.s2c.play.GameMessageS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityPassengersSetS2CPacket.class, "EntityPassengersSetS2CPacket"); S2C_PACKETS_R.put("EntityPassengersSetS2CPacket", net.minecraft.network.packet.s2c.play.EntityPassengersSetS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.login.LoginHelloS2CPacket.class, "LoginHelloS2CPacket"); @@ -352,28 +357,30 @@ public class PacketUtils { S2C_PACKETS_R.put("SynchronizeRecipesS2CPacket", net.minecraft.network.packet.s2c.play.SynchronizeRecipesS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityS2CPacket.class, "EntityS2CPacket"); S2C_PACKETS_R.put("EntityS2CPacket", net.minecraft.network.packet.s2c.play.EntityS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityTrackerUpdateS2CPacket.class, "EntityTrackerUpdateS2CPacket"); - S2C_PACKETS_R.put("EntityTrackerUpdateS2CPacket", net.minecraft.network.packet.s2c.play.EntityTrackerUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityStatusS2CPacket.class, "EntityStatusS2CPacket"); S2C_PACKETS_R.put("EntityStatusS2CPacket", net.minecraft.network.packet.s2c.play.EntityStatusS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityTrackerUpdateS2CPacket.class, "EntityTrackerUpdateS2CPacket"); + S2C_PACKETS_R.put("EntityTrackerUpdateS2CPacket", net.minecraft.network.packet.s2c.play.EntityTrackerUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.SubtitleS2CPacket.class, "SubtitleS2CPacket"); S2C_PACKETS_R.put("SubtitleS2CPacket", net.minecraft.network.packet.s2c.play.SubtitleS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.NbtQueryResponseS2CPacket.class, "NbtQueryResponseS2CPacket"); S2C_PACKETS_R.put("NbtQueryResponseS2CPacket", net.minecraft.network.packet.s2c.play.NbtQueryResponseS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityEquipmentUpdateS2CPacket.class, "EntityEquipmentUpdateS2CPacket"); - S2C_PACKETS_R.put("EntityEquipmentUpdateS2CPacket", net.minecraft.network.packet.s2c.play.EntityEquipmentUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.UnloadChunkS2CPacket.class, "UnloadChunkS2CPacket"); S2C_PACKETS_R.put("UnloadChunkS2CPacket", net.minecraft.network.packet.s2c.play.UnloadChunkS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityAttachS2CPacket.class, "EntityAttachS2CPacket"); - S2C_PACKETS_R.put("EntityAttachS2CPacket", net.minecraft.network.packet.s2c.play.EntityAttachS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityEquipmentUpdateS2CPacket.class, "EntityEquipmentUpdateS2CPacket"); + S2C_PACKETS_R.put("EntityEquipmentUpdateS2CPacket", net.minecraft.network.packet.s2c.play.EntityEquipmentUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.BossBarS2CPacket.class, "BossBarS2CPacket"); S2C_PACKETS_R.put("BossBarS2CPacket", net.minecraft.network.packet.s2c.play.BossBarS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityAttachS2CPacket.class, "EntityAttachS2CPacket"); + S2C_PACKETS_R.put("EntityAttachS2CPacket", net.minecraft.network.packet.s2c.play.EntityAttachS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityPositionS2CPacket.class, "EntityPositionS2CPacket"); S2C_PACKETS_R.put("EntityPositionS2CPacket", net.minecraft.network.packet.s2c.play.EntityPositionS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ChunkDataS2CPacket.class, "ChunkDataS2CPacket"); S2C_PACKETS_R.put("ChunkDataS2CPacket", net.minecraft.network.packet.s2c.play.ChunkDataS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.GameStateChangeS2CPacket.class, "GameStateChangeS2CPacket"); S2C_PACKETS_R.put("GameStateChangeS2CPacket", net.minecraft.network.packet.s2c.play.GameStateChangeS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.BundleS2CPacket.class, "BundleS2CPacket"); + S2C_PACKETS_R.put("BundleS2CPacket", net.minecraft.network.packet.s2c.play.BundleS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityS2CPacket.RotateAndMoveRelative.class, "EntityS2CPacket.RotateAndMoveRelative"); S2C_PACKETS_R.put("EntityS2CPacket.RotateAndMoveRelative", net.minecraft.network.packet.s2c.play.EntityS2CPacket.RotateAndMoveRelative.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityS2CPacket.Rotate.class, "EntityS2CPacket.Rotate"); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtilsUtil.java b/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtilsUtil.java index 3e01148d1b..c56cd6a02b 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtilsUtil.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtilsUtil.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.utils.network; +import net.minecraft.network.packet.BundlePacket; import net.minecraft.network.packet.Packet; import org.reflections.Reflections; import org.reflections.scanners.Scanners; @@ -234,6 +235,7 @@ public static void init() throws IOException { Set> s2cPackets = s2c.getSubTypesOf(Packet.class); for (Class s2cPacket : s2cPackets) { + if (s2cPacket == BundlePacket.class) continue; String name = s2cPacket.getName(); String className = name.substring(name.lastIndexOf('.') + 1).replace('$', '.'); String fullName = name.replace('$', '.'); From 17f634c486e16ca47927bf735f57f9f9de6f5191 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Sat, 12 Aug 2023 14:14:45 -0400 Subject: [PATCH 065/357] Better Chat optimisations (#3942) --- .../systems/modules/misc/BetterChat.java | 24 ++++++++----------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java index 7cf9815e3c..46c0dc533b 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java @@ -208,7 +208,7 @@ public class BetterChat extends Module { .build() ); - private static final Pattern antiSpamRegex = Pattern.compile(".*(\\([0-9]+\\)$)"); + private static final Pattern antiSpamRegex = Pattern.compile(" \\(([0-9]+)\\)$"); private static final Pattern timestampRegex = Pattern.compile("^(<[0-9]{2}:[0-9]{2}>\\s)"); private final Char2CharMap SMALL_CAPS = new Char2CharOpenHashMap(); @@ -229,8 +229,9 @@ private void onMessageReceive(ReceiveMessageEvent event) { Text message = event.getMessage(); if (filterRegex.get()) { + String messageString = message.getString(); for (Pattern pattern : filterRegexList) { - if (pattern.matcher(message.getString()).find()) { + if (pattern.matcher(messageString).find()) { event.cancel(); return; } @@ -250,12 +251,9 @@ private void onMessageReceive(ReceiveMessageEvent event) { } if (timestamps.get()) { - Matcher matcher = timestampRegex.matcher(message.getString()); - if (matcher.matches()) message.getSiblings().subList(0, 8).clear(); - Text timestamp = Text.literal("<" + dateFormat.format(new Date()) + "> ").formatted(Formatting.GRAY); - message = Text.literal("").append(timestamp).append(message); + message = Text.empty().append(timestamp).append(message); } event.setMessage(message); @@ -263,6 +261,7 @@ private void onMessageReceive(ReceiveMessageEvent event) { private Text appendAntiSpam(Text text) { + String textString = text.getString(); Text returnText = null; int messageIndex = -1; @@ -277,21 +276,18 @@ private Text appendAntiSpam(Text text) { stringToCheck = stringToCheck.substring(8); } - if (text.getString().equals(stringToCheck)) { + if (textString.equals(stringToCheck)) { messageIndex = i; returnText = text.copy().append(Text.literal(" (2)").formatted(Formatting.GRAY)); break; - } - else { + } else { Matcher matcher = antiSpamRegex.matcher(stringToCheck); - if (!matcher.matches() && !matcher.find()) continue; + if (!matcher.find()) continue; String group = matcher.group(matcher.groupCount()); - int number = Integer.parseInt(group.substring(1, group.length() - 1)); - - String counter = " (" + number + ")"; + int number = Integer.parseInt(group); - if (stringToCheck.substring(0, stringToCheck.length() - counter.length()).equals(text.getString())) { + if (stringToCheck.substring(0, matcher.start()).equals(textString)) { messageIndex = i; returnText = text.copy().append(Text.literal(" (" + (number + 1) + ")").formatted(Formatting.GRAY)); break; From ffb62c410b81ef9d4701a53a461a66b805df5541 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Sat, 12 Aug 2023 17:36:53 -0400 Subject: [PATCH 066/357] Mark sodium <0.5.0 incompatible (#3945) --- src/main/resources/fabric.mod.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 04daf4e44d..95d3c99762 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -54,6 +54,7 @@ "optifabric": "*", "feather": "*", "origins": "*", - "wurst": "*" + "wurst": "*", + "sodium": "<0.5.0" } } From a3e1271ae1c5fc9ac1f3f60a729ebc5a0acad4da Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Mon, 15 May 2023 23:22:29 -0400 Subject: [PATCH 067/357] Update MeteorExecutor.java --- .../meteorclient/utils/network/MeteorExecutor.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/utils/network/MeteorExecutor.java b/src/main/java/meteordevelopment/meteorclient/utils/network/MeteorExecutor.java index adcddfd021..d1ec0d8071 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/network/MeteorExecutor.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/network/MeteorExecutor.java @@ -9,13 +9,21 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.atomic.AtomicInteger; public class MeteorExecutor { public static ExecutorService executor; @PreInit public static void init() { - executor = Executors.newSingleThreadExecutor(); + AtomicInteger threadNumber = new AtomicInteger(1); + + executor = Executors.newCachedThreadPool((task) -> { + Thread thread = new Thread(task); + thread.setDaemon(true); + thread.setName("Meteor-Executor-" + threadNumber.getAndIncrement()); + return thread; + }); } public static void execute(Runnable task) { From b74432e4af000316f786f32528f298f37eb3da63 Mon Sep 17 00:00:00 2001 From: Jaranamo1 <91566571+Jaranamo1@users.noreply.github.com> Date: Sun, 13 Aug 2023 11:48:26 +0100 Subject: [PATCH 068/357] Improve AnchorAura (#3677) --- .../meteorclient/systems/modules/combat/AnchorAura.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java index c272a4ba7d..38b1a947da 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java @@ -322,6 +322,12 @@ private BlockPos findPlacePos(BlockPos targetPlacePos) { if (isValidPlace(targetPlacePos.down())) return targetPlacePos.down(); else if (isValidPlace(targetPlacePos.up(2))) return targetPlacePos.up(2); break; + case Around: + if (isValidPlace(targetPlacePos.north())) return targetPlacePos.north(); + else if (isValidPlace(targetPlacePos.east())) return targetPlacePos.east(); + else if (isValidPlace(targetPlacePos.west())) return targetPlacePos.west(); + else if (isValidPlace(targetPlacePos.south())) return targetPlacePos.south(); + break; } return null; } @@ -349,7 +355,7 @@ private boolean getDamageBreak(BlockPos pos) { } private boolean isValidPlace(BlockPos pos) { - return (mc.world.getBlockState(pos).isAir() || mc.world.getBlockState(pos).getFluidState().getFluid() instanceof FlowableFluid) && Math.sqrt(mc.player.getBlockPos().getSquaredDistance(pos)) <= placeRange.get() && getDamagePlace(pos); + return Math.sqrt(mc.player.getBlockPos().getSquaredDistance(pos)) <= placeRange.get() && getDamagePlace(pos) && BlockUtils.canPlace(pos, true); } private boolean isValidBreak(BlockPos pos) { @@ -385,6 +391,7 @@ public String getInfoString() { public enum PlaceMode { Above, + Around, AboveAndBelow, All } From a712a30247a3014e6d8ac6eeceef7e66b6e23f13 Mon Sep 17 00:00:00 2001 From: thebest9178 <76120883+thebest9178@users.noreply.github.com> Date: Sat, 12 Aug 2023 20:07:30 -0700 Subject: [PATCH 069/357] Fixed PotionTimers getting stuck invisible in the hud editor if all effects are hidden. --- .../systems/hud/elements/PotionTimersHud.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) 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 1aec30b857..554d12d46e 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PotionTimersHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PotionTimersHud.java @@ -172,7 +172,7 @@ protected double alignX(double width, Alignment alignment) { @Override public void tick(HudRenderer renderer) { - if (mc.player == null || (isInEditor() && mc.player.getStatusEffects().isEmpty())) { + if (mc.player == null || (isInEditor() && hasNoVisibleEffects())) { setSize(renderer.textWidth("Potion Timers 0:00", shadow.get(), getScale()), renderer.textHeight(shadow.get(), getScale())); return; } @@ -199,7 +199,7 @@ public void render(HudRenderer renderer) { renderer.quad(this.x, this.y, getWidth(), getHeight(), backgroundColor.get()); } - if (mc.player == null || (isInEditor() && mc.player.getStatusEffects().isEmpty())) { + if (mc.player == null || (isInEditor() && hasNoVisibleEffects())) { renderer.text("Potion Timers 0:00", x, y, Color.WHITE, shadow.get(), getScale()); return; } @@ -251,6 +251,16 @@ private double getScale() { return customScale.get() ? scale.get() : -1; } + private boolean hasNoVisibleEffects() { + for (StatusEffectInstance statusEffectInstance : mc.player.getStatusEffects()) { + if (hiddenEffects.get().contains(statusEffectInstance.getEffectType())) continue; + if (!showAmbient.get() && statusEffectInstance.isAmbient()) continue; + return false; + } + + return true; + } + public enum ColorMode { Effect, Flat, From 135dade60e7fd4afc62935f7005af757dcd1f813 Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Mon, 14 Aug 2023 13:02:52 +0200 Subject: [PATCH 070/357] Rewrite Better Chat Player Heads, now with a way for addons to register custom prefix heads --- .../meteorclient/mixin/ChatHudLineMixin.java | 27 ++- .../mixin/ChatHudLineVisibleMixin.java | 65 ++++++ .../meteorclient/mixin/ChatHudMixin.java | 186 ++++++------------ .../mixin/MessageHandlerMixin.java | 41 ++++ .../meteorclient/mixininterface/IChatHud.java | 2 +- .../mixininterface/IChatHudLine.java | 10 +- .../mixininterface/IChatHudLineVisible.java | 11 ++ .../mixininterface/IMessageHandler.java | 16 ++ .../systems/modules/misc/BetterChat.java | 106 +++++++++- .../meteorclient/utils/player/ChatUtils.java | 2 +- src/main/resources/meteor-client.mixins.json | 4 +- 11 files changed, 331 insertions(+), 139 deletions(-) create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/ChatHudLineVisibleMixin.java create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/MessageHandlerMixin.java create mode 100644 src/main/java/meteordevelopment/meteorclient/mixininterface/IChatHudLineVisible.java create mode 100644 src/main/java/meteordevelopment/meteorclient/mixininterface/IMessageHandler.java diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudLineMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudLineMixin.java index c8cb0b6b30..77a94679a0 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudLineMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudLineMixin.java @@ -5,22 +5,43 @@ 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 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, ChatHudLine.Visible.class }) +@Mixin(value = ChatHudLine.class) public class ChatHudLineMixin implements IChatHudLine { + @Shadow @Final private Text content; @Unique private int id; + @Unique private GameProfile sender; @Override - public int getId() { + public String meteor$getText() { + return content.getString(); + } + + @Override + public int meteor$getId() { return id; } @Override - public void setId(int id) { + public void meteor$setId(int id) { this.id = id; } + + @Override + public GameProfile meteor$getSender() { + return sender; + } + + @Override + public void meteor$setSender(GameProfile profile) { + sender = profile; + } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudLineVisibleMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudLineVisibleMixin.java new file mode 100644 index 0000000000..f797b6401b --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudLineVisibleMixin.java @@ -0,0 +1,65 @@ +/* + * 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.IChatHudLineVisible; +import net.minecraft.client.gui.hud.ChatHudLine; +import net.minecraft.text.OrderedText; +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 class ChatHudLineVisibleMixin implements IChatHudLineVisible { + @Shadow @Final private OrderedText content; + @Unique private int id; + @Unique private GameProfile sender; + @Unique private boolean startOfEntry; + + @Override + public String meteor$getText() { + StringBuilder sb = new StringBuilder(); + + content.accept((index, style, codePoint) -> { + sb.appendCodePoint(codePoint); + return true; + }); + + return sb.toString(); + } + + @Override + public int meteor$getId() { + return id; + } + + @Override + public void meteor$setId(int id) { + this.id = id; + } + + @Override + public GameProfile meteor$getSender() { + return sender; + } + + @Override + public void meteor$setSender(GameProfile profile) { + sender = profile; + } + + @Override + public boolean meteor$isStartOfEntry() { + return startOfEntry; + } + + @Override + public void meteor$setStartOfEntry(boolean start) { + startOfEntry = start; + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java index 3d221a4c0b..ec91daed4a 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java @@ -6,30 +6,26 @@ package meteordevelopment.meteorclient.mixin; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; -import com.mojang.blaze3d.systems.RenderSystem; +import com.llamalad7.mixinextras.injector.ModifyReceiver; +import com.llamalad7.mixinextras.sugar.Local; 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 meteordevelopment.meteorclient.systems.modules.render.NoRender; -import meteordevelopment.meteorclient.utils.misc.MeteorIdentifier; -import meteordevelopment.meteorclient.utils.misc.text.StringCharacterVisitor; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.hud.ChatHud; import net.minecraft.client.gui.hud.ChatHudLine; import net.minecraft.client.gui.hud.MessageIndicator; -import net.minecraft.client.gui.screen.ChatScreen; -import net.minecraft.client.network.PlayerListEntry; -import net.minecraft.client.option.ChatVisibility; -import net.minecraft.client.util.math.MatrixStack; import net.minecraft.network.message.MessageSignatureData; import net.minecraft.text.OrderedText; import net.minecraft.text.Text; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.MathHelper; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -42,25 +38,25 @@ import org.spongepowered.asm.mixin.injection.callback.LocalCapture; import java.util.List; -import java.util.regex.Pattern; @Mixin(ChatHud.class) public abstract class ChatHudMixin implements IChatHud { - private static final MinecraftClient mc = MinecraftClient.getInstance(); - - private static final Pattern METEOR_PREFIX_REGEX = Pattern.compile("^\\s{0,2}(<[0-9]{1,2}:[0-9]{1,2}>\\s)?\\[Meteor]"); - private static final Pattern BARITONE_PREFIX_REGEX = Pattern.compile("^\\s{0,2}(<[0-9]{1,2}:[0-9]{1,2}>\\s)?\\[Baritone]"); - private static final Identifier METEOR_CHAT_ICON = new MeteorIdentifier("textures/icons/chat/meteor.png"); - private static final Identifier BARITONE_CHAT_ICON = new MeteorIdentifier("textures/icons/chat/baritone.png"); - + @Shadow @Final private MinecraftClient client; @Shadow @Final private List visibleMessages; - @Shadow private int scrolledLines; + @Shadow @Final private List messages; + @Unique private BetterChat betterChat; @Unique private int nextId; @Unique private boolean skipOnAddMessage; + @Shadow + protected abstract void addMessage(Text message, @Nullable MessageSignatureData signature, int ticks, @Nullable MessageIndicator indicator, boolean refresh); + + @Shadow + public abstract void addMessage(Text message); + @Override - public void add(Text message, int id) { + public void meteor$add(Text message, int id) { nextId = id; addMessage(message); nextId = 0; @@ -68,12 +64,31 @@ public void add(Text message, int id) { @Inject(method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;ILnet/minecraft/client/gui/hud/MessageIndicator;Z)V", at = @At(value = "INVOKE", target = "Ljava/util/List;add(ILjava/lang/Object;)V", ordinal = 0, shift = At.Shift.AFTER)) private void onAddMessageAfterNewChatHudLineVisible(Text message, MessageSignatureData signature, int ticks, MessageIndicator indicator, boolean refresh, CallbackInfo info) { - ((IChatHudLine) (Object) visibleMessages.get(0)).setId(nextId); + ((IChatHudLine) (Object) visibleMessages.get(0)).meteor$setId(nextId); } @Inject(method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;ILnet/minecraft/client/gui/hud/MessageIndicator;Z)V", at = @At(value = "INVOKE", target = "Ljava/util/List;add(ILjava/lang/Object;)V", ordinal = 1, shift = At.Shift.AFTER)) private void onAddMessageAfterNewChatHudLine(Text message, MessageSignatureData signature, int ticks, MessageIndicator indicator, boolean refresh, CallbackInfo info) { - ((IChatHudLine) (Object) messages.get(0)).setId(nextId); + ((IChatHudLine) (Object) messages.get(0)).meteor$setId(nextId); + } + + @SuppressWarnings("DataFlowIssue") + @ModifyExpressionValue(method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;ILnet/minecraft/client/gui/hud/MessageIndicator;Z)V", 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, @Local(ordinal = 2) int j) { + IMessageHandler handler = (IMessageHandler) client.getMessageHandler(); + 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;ILnet/minecraft/client/gui/hud/MessageIndicator;Z)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(); + ((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;ILnet/minecraft/client/gui/hud/MessageIndicator;Z)V", cancellable = true) @@ -84,10 +99,10 @@ private void onAddMessage(Text message, @Nullable MessageSignatureData signature if (event.isCancelled()) info.cancel(); else { - visibleMessages.removeIf(msg -> ((IChatHudLine) (Object) msg).getId() == nextId && nextId != 0); + 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)).getId() == nextId && nextId != 0) { + if (((IChatHudLine) (Object) messages.get(i)).meteor$getId() == nextId && nextId != 0) { messages.remove(i); Modules.get().get(BetterChat.class).lines.removeInt(i); } @@ -106,111 +121,22 @@ private void onAddMessage(Text message, @Nullable MessageSignatureData signature @ModifyExpressionValue(method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;ILnet/minecraft/client/gui/hud/MessageIndicator;Z)V", slice = @Slice(from = @At(value = "FIELD", target = "Lnet/minecraft/client/gui/hud/ChatHud;visibleMessages:Ljava/util/List;")), at = @At(value = "INVOKE", target = "Ljava/util/List;size()I")) private int addMessageListSizeProxy(int size) { - BetterChat betterChat = Modules.get().get(BetterChat.class); + BetterChat betterChat = getBetterChat(); if (betterChat.isLongerChat() && betterChat.getChatLength() >= 100) return size - betterChat.getChatLength(); return size; } - @Inject(method = "render", at = @At("TAIL")) - private void onRender(DrawContext context, int currentTick, int mouseX, int mouseY, CallbackInfo ci) { - if (!Modules.get().get(BetterChat.class).displayPlayerHeads()) return; - if (mc.options.getChatVisibility().getValue() == ChatVisibility.HIDDEN) return; - int maxLineCount = mc.inGameHud.getChatHud().getVisibleLineCount(); - - double d = mc.options.getChatOpacity().getValue() * 0.8999999761581421D + 0.10000000149011612D; - double g = 9.0D * (mc.options.getChatLineSpacing().getValue() + 1.0D); - double h = -8.0D * (mc.options.getChatLineSpacing().getValue() + 1.0D) + 4.0D * mc.options.getChatLineSpacing().getValue() + 8.0D; - - float chatScale = (float) getChatScale(); - float scaledHeight = mc.getWindow().getScaledHeight(); - - MatrixStack matrices = context.getMatrices(); - matrices.push(); - matrices.scale(chatScale, chatScale, 1.0f); - matrices.translate(2.0f, MathHelper.floor((scaledHeight - 40) / chatScale) - g - 0.1f, 10.0f); - RenderSystem.enableBlend(); - for (int m = 0; m + scrolledLines < visibleMessages.size() && m < maxLineCount; ++m) { - ChatHudLine.Visible chatHudLine = visibleMessages.get(m + scrolledLines); - if (chatHudLine != null) { - int x = currentTick - chatHudLine.addedTime(); - if (x < 200 || isChatFocused()) { - double o = isChatFocused() ? 1.0D : getMessageOpacityMultiplier(x); - if (o * d > 0.01D) { - double s = -m * g; - StringCharacterVisitor visitor = new StringCharacterVisitor(); - chatHudLine.content().accept(visitor); - drawIcon(context, matrices, visitor.result.toString(), (int) (s + h), (float) (o * d)); - } - } - } - } - RenderSystem.disableBlend(); - matrices.pop(); - - } - - private boolean isChatFocused() { - return mc.currentScreen instanceof ChatScreen; - } - - @Shadow - private static double getMessageOpacityMultiplier(int age) { - throw new AssertionError(); - } - - @Shadow - protected abstract void addMessage(Text message, @Nullable MessageSignatureData signature, int ticks, @Nullable MessageIndicator indicator, boolean refresh); - - @Shadow - public abstract void addMessage(Text message); - - @Shadow - @Final - private List messages; + // Player Heads - @Shadow - public abstract double getChatScale(); - - private void drawIcon(DrawContext drawContext, MatrixStack matrices, String line, int y, float opacity) { - if (METEOR_PREFIX_REGEX.matcher(line).find()) { - matrices.push(); - RenderSystem.setShaderColor(1, 1, 1, opacity); - matrices.translate(0, y, 0); - matrices.scale(0.125f, 0.125f, 1); - drawContext.drawTexture(METEOR_CHAT_ICON, 0, 0, 0f, 0f, 64, 64, 64, 64); - RenderSystem.setShaderColor(1, 1, 1, 1); - matrices.pop(); - return; - } else if (BARITONE_PREFIX_REGEX.matcher(line).find()) { - matrices.push(); - RenderSystem.setShaderColor(1, 1, 1, opacity); - matrices.translate(0, y, 10); - matrices.scale(0.125f, 0.125f, 1); - drawContext.drawTexture(BARITONE_CHAT_ICON, 0, 0, 0f, 0f, 64, 64, 64, 64); - RenderSystem.setShaderColor(1, 1, 1, 1); - matrices.pop(); - return; - } - - Identifier skin = getMessageTexture(line); - if (skin != null) { - RenderSystem.setShaderColor(1, 1, 1, opacity); - drawContext.drawTexture(skin, 0, y, 8, 8, 8.0F, 8.0F, 8, 8, 64, 64); - drawContext.drawTexture(skin, 0, y, 8, 8, 40.0F, 8.0F, 8, 8, 64, 64); - RenderSystem.setShaderColor(1, 1, 1, 1); - } + @ModifyExpressionValue(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/math/MathHelper;ceil(F)I")) + private int onRender_modifyWidth(int width) { + return betterChat.modifyChatWidth(width); } - private static Identifier getMessageTexture(String message) { - if (mc.getNetworkHandler() == null) return null; - for (String part : message.split("(§.)|[^\\w]")) { - if (part.isBlank()) continue; - PlayerListEntry p = mc.getNetworkHandler().getPlayerListEntry(part); - if (p != null) { - return p.getSkinTexture(); - } - } - return null; + @ModifyReceiver(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;drawTextWithShadow(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/text/OrderedText;III)I")) + private DrawContext onRender_beforeDrawTextWithShadow(DrawContext context, TextRenderer textRenderer, OrderedText text, int x, int y, int color, @Local ChatHudLine.Visible line) { + getBetterChat().drawPlayerHead(context, line, y, color); + return context; } // No Message Signature Indicator @@ -225,13 +151,13 @@ private MessageIndicator onRender_modifyIndicator(MessageIndicator indicator) { @Inject(method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;ILnet/minecraft/client/gui/hud/MessageIndicator;Z)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/ChatHud;isChatFocused()Z"), locals = LocalCapture.CAPTURE_FAILSOFT) private void onBreakChatMessageLines(Text message, MessageSignatureData signature, int ticks, MessageIndicator indicator, boolean refresh, CallbackInfo ci, int i, List list) { - Modules.get().get(BetterChat.class).lines.add(0, list.size()); + getBetterChat().lines.add(0, list.size()); } @Inject(method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;ILnet/minecraft/client/gui/hud/MessageIndicator;Z)V", slice = @Slice(from = @At(value = "FIELD", target = "Lnet/minecraft/client/gui/hud/ChatHud;messages:Ljava/util/List;")), at = @At(value = "INVOKE", target = "Ljava/util/List;remove(I)Ljava/lang/Object;")) private void onRemoveMessage(Text message, MessageSignatureData signature, int ticks, MessageIndicator indicator, boolean refresh, CallbackInfo ci) { - BetterChat betterChat = Modules.get().get(BetterChat.class); + BetterChat betterChat = getBetterChat(); int size = betterChat.lines.size() - (betterChat.isLongerChat() && betterChat.getChatLength() >= 100 ? betterChat.getChatLength() : 0); while (size > 100) { @@ -242,11 +168,21 @@ private void onRemoveMessage(Text message, MessageSignatureData signature, int t @Inject(method = "clear", at = @At("HEAD")) private void onClear(boolean clearHistory, CallbackInfo ci) { - Modules.get().get(BetterChat.class).lines.clear(); + getBetterChat().lines.clear(); } @Inject(method = "refresh", at = @At("HEAD")) private void onRefresh(CallbackInfo ci) { - Modules.get().get(BetterChat.class).lines.clear(); + 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/MessageHandlerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/MessageHandlerMixin.java new file mode 100644 index 0000000000..ef2ef3f283 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/MessageHandlerMixin.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.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 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/mixininterface/IChatHud.java b/src/main/java/meteordevelopment/meteorclient/mixininterface/IChatHud.java index cf26dcd19d..548489286c 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixininterface/IChatHud.java +++ b/src/main/java/meteordevelopment/meteorclient/mixininterface/IChatHud.java @@ -8,5 +8,5 @@ import net.minecraft.text.Text; public interface IChatHud { - void add(Text message, int id); + void meteor$add(Text message, int id); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixininterface/IChatHudLine.java b/src/main/java/meteordevelopment/meteorclient/mixininterface/IChatHudLine.java index 273e1f43d6..de081990db 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixininterface/IChatHudLine.java +++ b/src/main/java/meteordevelopment/meteorclient/mixininterface/IChatHudLine.java @@ -5,8 +5,14 @@ package meteordevelopment.meteorclient.mixininterface; +import com.mojang.authlib.GameProfile; + public interface IChatHudLine { - int getId(); + String meteor$getText(); + + int meteor$getId(); + void meteor$setId(int id); - void setId(int id); + GameProfile meteor$getSender(); + void meteor$setSender(GameProfile profile); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixininterface/IChatHudLineVisible.java b/src/main/java/meteordevelopment/meteorclient/mixininterface/IChatHudLineVisible.java new file mode 100644 index 0000000000..74a908e96e --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixininterface/IChatHudLineVisible.java @@ -0,0 +1,11 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixininterface; + +public interface IChatHudLineVisible extends IChatHudLine { + boolean meteor$isStartOfEntry(); + void meteor$setStartOfEntry(boolean start); +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixininterface/IMessageHandler.java b/src/main/java/meteordevelopment/meteorclient/mixininterface/IMessageHandler.java new file mode 100644 index 0000000000..57a5793337 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixininterface/IMessageHandler.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.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/systems/modules/misc/BetterChat.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java index 46c0dc533b..10cb04ca81 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java @@ -5,6 +5,8 @@ package meteordevelopment.meteorclient.systems.modules.misc; +import com.mojang.authlib.GameProfile; +import com.mojang.blaze3d.systems.RenderSystem; import it.unimi.dsi.fastutil.chars.Char2CharMap; import it.unimi.dsi.fastutil.chars.Char2CharOpenHashMap; import it.unimi.dsi.fastutil.ints.IntArrayList; @@ -13,18 +15,25 @@ import meteordevelopment.meteorclient.events.game.ReceiveMessageEvent; import meteordevelopment.meteorclient.events.game.SendMessageEvent; import meteordevelopment.meteorclient.mixin.ChatHudAccessor; +import meteordevelopment.meteorclient.mixininterface.IChatHudLine; +import meteordevelopment.meteorclient.mixininterface.IChatHudLineVisible; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.Utils; +import meteordevelopment.meteorclient.utils.misc.MeteorIdentifier; import meteordevelopment.meteorclient.utils.player.ChatUtils; +import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.orbit.EventHandler; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.hud.ChatHudLine; +import net.minecraft.client.network.PlayerListEntry; 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.util.Identifier; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -238,10 +247,6 @@ private void onMessageReceive(ReceiveMessageEvent event) { } } - if (playerHeads.get()) { - message = Text.literal(" ").append(message); - } - if (antiSpam.get()) { Text antiSpammed = appendAntiSpam(message); @@ -341,6 +346,97 @@ private void onMessageSend(SendMessageEvent event) { event.message = message; } + // Player Heads + + private record CustomHeadEntry(String prefix, Identifier texture) {} + + private static final List CUSTOM_HEAD_ENTRIES = new ArrayList<>(); + + private static final Pattern TIMESTAMP_REGEX = Pattern.compile("^<\\d{1,2}:\\d{1,2}>"); + + /** Registers a custom player head to render based on a message prefix */ + public static void registerCustomHead(String prefix, Identifier texture) { + CUSTOM_HEAD_ENTRIES.add(new CustomHeadEntry(prefix, texture)); + } + + static { + registerCustomHead("[Meteor]", new MeteorIdentifier("textures/icons/chat/meteor.png")); + registerCustomHead("[Baritone]", new MeteorIdentifier("textures/icons/chat/baritone.png")); + } + + public int modifyChatWidth(int width) { + if (isActive() && playerHeads.get()) return width + 10; + return width; + } + + public void drawPlayerHead(DrawContext context, ChatHudLine.Visible line, int y, int color) { + if (!isActive() || !playerHeads.get()) return; + + // Only draw the first line of multiple line messages + if (((IChatHudLineVisible) (Object) line).meteor$isStartOfEntry()) { + RenderSystem.enableBlend(); + RenderSystem.setShaderColor(1, 1, 1, Color.toRGBAA(color) / 255f); + + drawTexture(context, (IChatHudLine) (Object) line, y); + + RenderSystem.setShaderColor(1, 1, 1, 1); + RenderSystem.disableBlend(); + } + + // Offset + context.getMatrices().translate(10, 0, 0); + } + + private void drawTexture(DrawContext context, IChatHudLine line, int y) { + String text = line.meteor$getText().trim(); + + // Custom + int startOffset = 0; + + try { + startOffset = TIMESTAMP_REGEX.matcher(text).end(); + } + catch (IllegalStateException ignored) {} + + for (CustomHeadEntry entry : CUSTOM_HEAD_ENTRIES) { + // Check prefix + if (text.startsWith(entry.prefix(), startOffset)) { + context.drawTexture(entry.texture(), 0, y, 8, 8, 0, 0, 64, 64, 64, 64); + } + } + + // Player + GameProfile sender = getSender(line, text); + if (sender == null) return; + + PlayerListEntry entry = mc.getNetworkHandler().getPlayerListEntry(sender.getId()); + if (entry == null) return; + + Identifier skin = entry.getSkinTexture(); + + context.drawTexture(skin, 0, y, 8, 8, 8, 8, 8, 8, 64, 64); + context.drawTexture(skin, 0, y, 8, 8, 40, 8, 8, 8, 64, 64); + } + + private GameProfile getSender(IChatHudLine line, String text) { + GameProfile sender = line.meteor$getSender(); + + // If the packet did not contain a sender field then try to get the sender from the message + if (sender == null) { + int openingI = text.indexOf('<'); + int closingI = text.indexOf('>'); + + if (openingI != -1 && closingI != -1 && closingI > openingI) { + String username = text.substring(openingI + 1, closingI); + + PlayerListEntry entry = mc.getNetworkHandler().getPlayerListEntry(username); + if (entry != null) sender = entry.getProfile(); + } + } + + return sender; + } + // Annoy private String applyAnnoy(String message) { @@ -441,8 +537,6 @@ public boolean isLongerChat() { return isActive() && longerChatHistory.get(); } - public boolean displayPlayerHeads() { return isActive() && playerHeads.get(); } - public boolean keepHistory() { return isActive() && keepHistory.get(); } public int getChatLength() { diff --git a/src/main/java/meteordevelopment/meteorclient/utils/player/ChatUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/player/ChatUtils.java index ad1fef9c71..b46da53a06 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/player/ChatUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/player/ChatUtils.java @@ -140,7 +140,7 @@ public static void sendMsg(int id, @Nullable String prefixTitle, @Nullable Forma if (!Config.get().deleteChatFeedback.get()) id = 0; - ((IChatHud) mc.inGameHud.getChatHud()).add(message, id); + ((IChatHud) mc.inGameHud.getChatHud()).meteor$add(message, id); } private static MutableText getCustomPrefix(String prefixTitle, Formatting prefixColor) { diff --git a/src/main/resources/meteor-client.mixins.json b/src/main/resources/meteor-client.mixins.json index 6e1ecc50eb..711924c05c 100644 --- a/src/main/resources/meteor-client.mixins.json +++ b/src/main/resources/meteor-client.mixins.json @@ -167,7 +167,9 @@ "WorldChunkMixin", "WorldRendererAccessor", "WorldRendererMixin", - "YggdrasilMinecraftSessionServiceAccessor" + "YggdrasilMinecraftSessionServiceAccessor", + "MessageHandlerMixin", + "ChatHudLineVisibleMixin" ], "injectors": { "defaultRequire": 1 From 74478bcb3ff8e61e0d42c2623e7038a8ae467d18 Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Mon, 14 Aug 2023 13:06:42 +0200 Subject: [PATCH 071/357] cope --- .../meteorclient/systems/modules/misc/BetterChat.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java index 10cb04ca81..b260d10588 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java @@ -372,7 +372,7 @@ public int modifyChatWidth(int width) { public void drawPlayerHead(DrawContext context, ChatHudLine.Visible line, int y, int color) { if (!isActive() || !playerHeads.get()) return; - // Only draw the first line of multiple line messages + // Only draw the first line of multi line messages if (((IChatHudLineVisible) (Object) line).meteor$isStartOfEntry()) { RenderSystem.enableBlend(); RenderSystem.setShaderColor(1, 1, 1, Color.toRGBAA(color) / 255f); @@ -402,6 +402,7 @@ private void drawTexture(DrawContext context, IChatHudLine line, int y) { // Check prefix if (text.startsWith(entry.prefix(), startOffset)) { context.drawTexture(entry.texture(), 0, y, 8, 8, 0, 0, 64, 64, 64, 64); + return; } } From 712d9483a38c5fc61f0054c56825d014fb166bee Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Mon, 14 Aug 2023 16:08:49 +0100 Subject: [PATCH 072/357] Improve block placing --- .../meteorclient/utils/world/BlockUtils.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java index 2ebc57c29b..0185036d73 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java @@ -88,11 +88,11 @@ public static boolean place(BlockPos blockPos, Hand hand, int slot, boolean rota side = Direction.UP; neighbour = blockPos; } else { - neighbour = blockPos.offset(side.getOpposite()); - hitPos.add(side.getOffsetX() * 0.5, side.getOffsetY() * 0.5, side.getOffsetZ() * 0.5); + neighbour = blockPos.offset(side); + hitPos = hitPos.add(side.getOffsetX() * 0.5, side.getOffsetY() * 0.5, side.getOffsetZ() * 0.5); } - BlockHitResult bhr = new BlockHitResult(hitPos, side, neighbour, false); + BlockHitResult bhr = new BlockHitResult(hitPos, side.getOpposite(), neighbour, false); if (rotate) { Rotations.rotate(Rotations.getYaw(hitPos), Rotations.getPitch(hitPos), rotationPriority, () -> { @@ -148,8 +148,6 @@ public static boolean canPlace(BlockPos blockPos) { public static Direction getPlaceSide(BlockPos blockPos) { for (Direction side : Direction.values()) { BlockPos neighbor = blockPos.offset(side); - Direction side2 = side.getOpposite(); - BlockState state = mc.world.getBlockState(neighbor); // Check if neighbour isn't empty @@ -158,7 +156,7 @@ public static Direction getPlaceSide(BlockPos blockPos) { // Check if neighbour is a fluid if (!state.getFluidState().isEmpty()) continue; - return side2; + return side; } return null; From f7c14c66620bc1e3ad47984fa9b5a8fb491b5bde Mon Sep 17 00:00:00 2001 From: Wide-Cat <74723656+Wide-Cat@users.noreply.github.com> Date: Tue, 15 Aug 2023 17:57:30 +0100 Subject: [PATCH 073/357] Hopefully fix compatibility with future --- .../meteorclient/mixin/PacketInflaterMixin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PacketInflaterMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/PacketInflaterMixin.java index 049bb87cd0..9d2c502d92 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PacketInflaterMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/PacketInflaterMixin.java @@ -14,7 +14,7 @@ @Mixin(PacketInflater.class) public class PacketInflaterMixin { - @ModifyConstant(method = "decode", constant = @Constant(intValue = 8388608)) + @ModifyConstant(method = "decode", constant = @Constant(intValue = 8388608), require = 0) private int maxValue(int value) { return Modules.get().isActive(AntiPacketKick.class) ? Integer.MAX_VALUE : value; } From 8cabb2ad5fe6539ded5274a655c317fc823f1b40 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Tue, 15 Aug 2023 19:47:57 +0100 Subject: [PATCH 074/357] Improve speed mine --- ...lientPlayerInteractionManagerAccessor.java | 3 ++ .../ClientPlayerInteractionManagerMixin.java | 23 ++++++++ .../systems/modules/player/SpeedMine.java | 52 +++++++++++++++---- 3 files changed, 68 insertions(+), 10 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerInteractionManagerAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerInteractionManagerAccessor.java index 7df6e86e59..5fa0a26f4a 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerInteractionManagerAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerInteractionManagerAccessor.java @@ -15,6 +15,9 @@ public interface ClientPlayerInteractionManagerAccessor { @Accessor("currentBreakingProgress") float getBreakingProgress(); + @Accessor("currentBreakingProgress") + void setCurrentBreakingProgress(float progress); + @Accessor("currentBreakingPos") BlockPos getCurrentBreakingBlockPos(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerInteractionManagerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerInteractionManagerMixin.java index 3f316accf5..582f8d62a2 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerInteractionManagerMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerInteractionManagerMixin.java @@ -13,14 +13,17 @@ import meteordevelopment.meteorclient.systems.modules.misc.InventoryTweaks; import meteordevelopment.meteorclient.systems.modules.player.BreakDelay; import meteordevelopment.meteorclient.systems.modules.player.Reach; +import meteordevelopment.meteorclient.systems.modules.player.SpeedMine; import meteordevelopment.meteorclient.utils.player.Rotations; import meteordevelopment.meteorclient.utils.world.BlockUtils; import net.minecraft.block.BlockState; +import net.minecraft.client.network.ClientPlayNetworkHandler; import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.client.network.ClientPlayerInteractionManager; 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.PlayerScreenHandler; import net.minecraft.screen.ScreenHandler; import net.minecraft.screen.slot.SlotActionType; @@ -31,6 +34,7 @@ import net.minecraft.util.math.Direction; import net.minecraft.world.BlockView; 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.injection.At; @@ -41,6 +45,8 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.invoke.arg.Args; +import static meteordevelopment.meteorclient.MeteorClient.mc; + @Mixin(ClientPlayerInteractionManager.class) public abstract class ClientPlayerInteractionManagerMixin implements IClientPlayerInteractionManager { @Shadow private int blockBreakingCooldown; @@ -50,6 +56,10 @@ public abstract class ClientPlayerInteractionManagerMixin implements IClientPlay @Shadow public abstract void clickSlot(int syncId, int slotId, int button, SlotActionType actionType, PlayerEntity player); + @Shadow + @Final + private ClientPlayNetworkHandler networkHandler; + @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()) { @@ -91,6 +101,19 @@ public void onClickArmorSlot(int syncId, int slotId, int button, SlotActionType @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) { + mc.world.breakBlock(blockPos, true, mc.player); + networkHandler.sendPacket(new PlayerActionC2SPacket(PlayerActionC2SPacket.Action.START_DESTROY_BLOCK, blockPos, direction)); + networkHandler.sendPacket(new PlayerActionC2SPacket(PlayerActionC2SPacket.Action.STOP_DESTROY_BLOCK, blockPos, direction)); + info.setReturnValue(true); + } + } } @Inject(method = "interactBlock", at = @At("HEAD"), cancellable = true) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/SpeedMine.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/SpeedMine.java index a200916203..fe5ae7271f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/SpeedMine.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/SpeedMine.java @@ -6,6 +6,7 @@ package meteordevelopment.meteorclient.systems.modules.player; import meteordevelopment.meteorclient.events.world.TickEvent; +import meteordevelopment.meteorclient.mixin.ClientPlayerInteractionManagerAccessor; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; @@ -13,6 +14,7 @@ import meteordevelopment.orbit.EventHandler; import net.minecraft.block.Block; import net.minecraft.entity.effect.StatusEffectInstance; +import net.minecraft.util.math.BlockPos; import java.util.List; @@ -32,7 +34,7 @@ public class SpeedMine extends Module { .name("blocks") .description("Selected blocks.") .filter(block -> block.getHardness() > 0) - .visible(() -> mode.get() == Mode.Normal) + .visible(() -> mode.get() != Mode.Haste) .build() ); @@ -40,7 +42,7 @@ public class SpeedMine extends Module { .name("blocks-filter") .description("How to use the blocks setting.") .defaultValue(ListMode.Blacklist) - .visible(() -> mode.get() == Mode.Normal) + .visible(() -> mode.get() != Mode.Haste) .build() ); @@ -53,6 +55,24 @@ public class SpeedMine extends Module { .build() ); + private final Setting hasteAmplifier = sgGeneral.add(new IntSetting.Builder() + .name("haste-amplifier") + .description("What value of haste to give you. Above 2 not recommended.") + .defaultValue(2) + .min(1) + .visible(() -> mode.get() == Mode.Haste) + .onChanged(i -> removeHaste()) + .build() + ); + + private final Setting instamine = sgGeneral.add(new BoolSetting.Builder() + .name("instamine") + .description("Whether or not to instantly mine blocks under certain conditions.") + .defaultValue(true) + .visible(() -> mode.get() == Mode.Damage) + .build() + ); + public SpeedMine() { super(Categories.Player, "speed-mine", "Allows you to quickly mine blocks."); } @@ -65,14 +85,22 @@ public void onDeactivate() { @EventHandler private void onTick(TickEvent.Pre event) { if (!Utils.canUpdate()) return; - if (mode.get() == Mode.Normal) return; - - int amplifier = mode.get() == Mode.Haste2 ? 1 : 0; - StatusEffectInstance haste = mc.player.getStatusEffect(HASTE); + if (mode.get() == Mode.Haste) { + StatusEffectInstance haste = mc.player.getStatusEffect(HASTE); - if (haste == null || haste.getAmplifier() <= amplifier) { - mc.player.setStatusEffect(new StatusEffectInstance(HASTE, -1, amplifier, false, false, false), null); + if (haste == null || haste.getAmplifier() <= hasteAmplifier.get() - 1) { + mc.player.setStatusEffect(new StatusEffectInstance(HASTE, -1, hasteAmplifier.get() - 1, false, false, false), null); + } + } + else if (mode.get() == Mode.Damage) { + ClientPlayerInteractionManagerAccessor im = (ClientPlayerInteractionManagerAccessor) mc.interactionManager; + float progress = im.getBreakingProgress(); + BlockPos pos = im.getCurrentBreakingBlockPos(); + + if (pos == null || progress <= 0) return; + if (progress + mc.world.getBlockState(pos).calcBlockBreakingDelta(mc.player, mc.world, pos) >= 0.7f) + im.setCurrentBreakingProgress(1f); } } @@ -88,10 +116,14 @@ public boolean filter(Block block) { return blocksFilter.get() == ListMode.Whitelist && blocks.get().contains(block); } + public boolean instamine() { + return isActive() && mode.get() == Mode.Damage && instamine.get(); + } + public enum Mode { Normal, - Haste1, - Haste2 + Haste, + Damage } public enum ListMode { From b1643d7026277c3777d32c1c7b3732b2e7095966 Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Wed, 16 Aug 2023 00:18:52 +0200 Subject: [PATCH 075/357] Improve Future compatibility --- .../meteorclient/asm/Asm.java | 2 + .../meteorclient/asm/AsmTransformer.java | 5 ++ .../transformers/GameRendererTransformer.java | 5 +- .../PacketInflaterTransformer.java | 62 +++++++++++++++++++ .../mixin/PacketInflaterMixin.java | 21 ------- src/main/resources/meteor-client.mixins.json | 1 - 6 files changed, 72 insertions(+), 24 deletions(-) create mode 100644 src/main/java/meteordevelopment/meteorclient/asm/transformers/PacketInflaterTransformer.java delete mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/PacketInflaterMixin.java diff --git a/src/main/java/meteordevelopment/meteorclient/asm/Asm.java b/src/main/java/meteordevelopment/meteorclient/asm/Asm.java index ee8b8a4376..78c7ac0ca8 100644 --- a/src/main/java/meteordevelopment/meteorclient/asm/Asm.java +++ b/src/main/java/meteordevelopment/meteorclient/asm/Asm.java @@ -7,6 +7,7 @@ import meteordevelopment.meteorclient.asm.transformers.CanvasWorldRendererTransformer; import meteordevelopment.meteorclient.asm.transformers.GameRendererTransformer; +import meteordevelopment.meteorclient.asm.transformers.PacketInflaterTransformer; import net.fabricmc.loader.api.FabricLoader; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassWriter; @@ -41,6 +42,7 @@ public static void init() { INSTANCE = new Asm(System.getProperty("meteor.asm.export") != null); INSTANCE.add(new GameRendererTransformer()); INSTANCE.add(new CanvasWorldRendererTransformer()); + INSTANCE.add(new PacketInflaterTransformer()); } private void add(AsmTransformer transformer) { diff --git a/src/main/java/meteordevelopment/meteorclient/asm/AsmTransformer.java b/src/main/java/meteordevelopment/meteorclient/asm/AsmTransformer.java index e0020c2bf9..573da6f774 100644 --- a/src/main/java/meteordevelopment/meteorclient/asm/AsmTransformer.java +++ b/src/main/java/meteordevelopment/meteorclient/asm/AsmTransformer.java @@ -26,6 +26,11 @@ protected MethodNode getMethod(ClassNode klass, MethodInfo methodInfo) { return null; } + protected static void error(String message) { + System.err.println(message); + throw new RuntimeException(message); + } + protected static String mapClassName(String name) { return FabricLoader.getInstance().getMappingResolver().mapClassName("intermediary", name.replace('/', '.')); } diff --git a/src/main/java/meteordevelopment/meteorclient/asm/transformers/GameRendererTransformer.java b/src/main/java/meteordevelopment/meteorclient/asm/transformers/GameRendererTransformer.java index 459d063cfe..c8c5ea1fb2 100644 --- a/src/main/java/meteordevelopment/meteorclient/asm/transformers/GameRendererTransformer.java +++ b/src/main/java/meteordevelopment/meteorclient/asm/transformers/GameRendererTransformer.java @@ -24,10 +24,11 @@ public GameRendererTransformer() { public void transform(ClassNode klass) { // Modify GameRenderer.getFov() MethodNode method = getMethod(klass, getFovMethod); - if (method == null) throw new RuntimeException("[Meteor Client] Could not find method GameRenderer.getFov()"); + if (method == null) error("[Meteor Client] Could not find method GameRenderer.getFov()"); int injectionCount = 0; + //noinspection DataFlowIssue for (AbstractInsnNode insn : method.instructions) { if (insn instanceof LdcInsnNode in && in.cst instanceof Double && (double) in.cst == 90) { InsnList insns = new InsnList(); @@ -52,7 +53,7 @@ else if ( } } - if (injectionCount < 2) throw new RuntimeException("[Meteor Client] Failed to modify GameRenderer.getFov()"); + if (injectionCount < 2) error("[Meteor Client] Failed to modify GameRenderer.getFov()"); } private void generateEventCall(InsnList insns, AbstractInsnNode loadPreviousFov) { diff --git a/src/main/java/meteordevelopment/meteorclient/asm/transformers/PacketInflaterTransformer.java b/src/main/java/meteordevelopment/meteorclient/asm/transformers/PacketInflaterTransformer.java new file mode 100644 index 0000000000..0e30913175 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/asm/transformers/PacketInflaterTransformer.java @@ -0,0 +1,62 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.asm.transformers; + +import meteordevelopment.meteorclient.asm.AsmTransformer; +import meteordevelopment.meteorclient.asm.Descriptor; +import meteordevelopment.meteorclient.asm.MethodInfo; +import meteordevelopment.meteorclient.systems.modules.misc.AntiPacketKick; +import org.objectweb.asm.Label; +import org.objectweb.asm.Opcodes; +import org.objectweb.asm.Type; +import org.objectweb.asm.tree.*; + +// Future compatibility +// Future uses @ModifyConstant which does not chain when multiple mods do it and mixins / mixinextra can't target throw +// statements. So using a custom ASM transformer we wrap the throw statement inside another if statement. +public class PacketInflaterTransformer extends AsmTransformer { + private final MethodInfo decodeMethod; + + public PacketInflaterTransformer() { + super(mapClassName("net/minecraft/class_2532")); + + decodeMethod = new MethodInfo("net/minecraft/class_2532", "decode", new Descriptor("Lio/netty/channel/ChannelHandlerContext;", "Lio/netty/buffer/ByteBuf;", "Ljava/util/List;", "V"), true); + } + + @Override + public void transform(ClassNode klass) { + MethodNode method = getMethod(klass, decodeMethod); + if (method == null) error("[Meteor Client] Could not find method PacketInflater.decode()"); + + int newCount = 0; + LabelNode label = new LabelNode(new Label()); + + //noinspection DataFlowIssue + for (AbstractInsnNode insn : method.instructions) { + if (insn instanceof TypeInsnNode typeInsn && typeInsn.getOpcode() == Opcodes.NEW && typeInsn.desc.equals("io/netty/handler/codec/DecoderException")) { + newCount++; + + if (newCount == 2) { + InsnList list = new InsnList(); + + list.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "meteordevelopment/meteorclient/systems/modules/Modules", "get", "()Lmeteordevelopment/meteorclient/systems/modules/Modules;", false)); + list.add(new LdcInsnNode(Type.getType(AntiPacketKick.class))); + list.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "meteordevelopment/meteorclient/systems/modules/Modules", "isActive", "(Ljava/lang/Class;)Z", false)); + + list.add(new JumpInsnNode(Opcodes.IFNE, label)); + + method.instructions.insertBefore(insn, list); + } + } + else if (newCount == 2 && insn.getOpcode() == Opcodes.ATHROW) { + method.instructions.insert(insn, label); + return; + } + } + + error("[Meteor Client] Failed to modify PacketInflater.decode()"); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PacketInflaterMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/PacketInflaterMixin.java deleted file mode 100644 index 9d2c502d92..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PacketInflaterMixin.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 meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.systems.modules.misc.AntiPacketKick; -import net.minecraft.network.PacketInflater; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.Constant; -import org.spongepowered.asm.mixin.injection.ModifyConstant; - -@Mixin(PacketInflater.class) -public class PacketInflaterMixin { - @ModifyConstant(method = "decode", constant = @Constant(intValue = 8388608), require = 0) - private int maxValue(int value) { - return Modules.get().isActive(AntiPacketKick.class) ? Integer.MAX_VALUE : value; - } -} diff --git a/src/main/resources/meteor-client.mixins.json b/src/main/resources/meteor-client.mixins.json index 711924c05c..b0ad1f5301 100644 --- a/src/main/resources/meteor-client.mixins.json +++ b/src/main/resources/meteor-client.mixins.json @@ -118,7 +118,6 @@ "MouseMixin", "MultiplayerScreenMixin", "PacketByteBufMixin", - "PacketInflaterMixin", "ParticleManagerMixin", "PlayerArmorSlotMixin", "PlayerEntityMixin", From 7c00a9cb33b4087702d6acaa1c9a4bd6bc95a345 Mon Sep 17 00:00:00 2001 From: DesiCow <80271842+DesiCow@users.noreply.github.com> Date: Mon, 21 Aug 2023 00:41:40 +0530 Subject: [PATCH 076/357] AutoTool : Prefer Fortune for ores and crops option (#3212) --- .../systems/modules/player/AutoTool.java | 30 ++++++++++++++----- .../systems/modules/render/Xray.java | 24 ++------------- .../systems/modules/world/HighwayBuilder.java | 2 +- 3 files changed, 27 insertions(+), 29 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java index efdaa37381..8bf546c011 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java @@ -12,15 +12,13 @@ import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.render.Xray; import meteordevelopment.meteorclient.systems.modules.world.InfinityMiner; import meteordevelopment.meteorclient.utils.player.InvUtils; import meteordevelopment.meteorclient.utils.world.BlockUtils; import meteordevelopment.orbit.EventHandler; import meteordevelopment.orbit.EventPriority; -import net.minecraft.block.BambooBlock; -import net.minecraft.block.BambooSaplingBlock; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; +import net.minecraft.block.*; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.enchantment.Enchantments; import net.minecraft.item.*; @@ -48,6 +46,13 @@ public class AutoTool extends Module { .build() ); + private final Setting fortuneForOresCrops = sgGeneral.add(new BoolSetting.Builder() + .name("fortune-for-ores-and-crops") + .description("Mines Ores and crops only with the Fortune enchantment.") + .defaultValue(true) + .build() + ); + private final Setting antiBreak = sgGeneral.add(new BoolSetting.Builder() .name("anti-break") .description("Stops you from breaking your tool.") @@ -153,7 +158,7 @@ private void onStartBreakingBlock(StartBreakingBlockEvent event) { if (listMode.get() == ListMode.Whitelist && !whitelist.get().contains(itemStack.getItem())) continue; if (listMode.get() == ListMode.Blacklist && blacklist.get().contains(itemStack.getItem())) continue; - double score = getScore(itemStack, blockState, silkTouchForEnderChest.get(), prefer.get(), itemStack2 -> !shouldStopUsing(itemStack2)); + double score = getScore(itemStack, blockState, silkTouchForEnderChest.get(), fortuneForOresCrops.get(), prefer.get(), itemStack2 -> !shouldStopUsing(itemStack2)); if (score < 0) continue; if (score > bestScore) { @@ -162,7 +167,7 @@ private void onStartBreakingBlock(StartBreakingBlockEvent event) { } } - if ((bestSlot != -1 && (bestScore > getScore(currentStack, blockState, silkTouchForEnderChest.get(), prefer.get(), itemStack -> !shouldStopUsing(itemStack))) || shouldStopUsing(currentStack) || !isTool(currentStack))) { + if ((bestSlot != -1 && (bestScore > getScore(currentStack, blockState, silkTouchForEnderChest.get(), fortuneForOresCrops.get(), prefer.get(), itemStack -> !shouldStopUsing(itemStack))) || shouldStopUsing(currentStack) || !isTool(currentStack))) { ticks = switchDelay.get(); if (ticks == 0) InvUtils.swap(bestSlot, true); @@ -182,7 +187,7 @@ private boolean shouldStopUsing(ItemStack itemStack) { return antiBreak.get() && (itemStack.getMaxDamage() - itemStack.getDamage()) < (itemStack.getMaxDamage() * breakDurability.get() / 100); } - public static double getScore(ItemStack itemStack, BlockState state, boolean silkTouchEnderChest, EnchantPreference enchantPreference, Predicate good) { + public static double getScore(ItemStack itemStack, BlockState state, boolean silkTouchEnderChest, boolean fortuneOre, EnchantPreference enchantPreference, Predicate good) { if (!good.test(itemStack) || !isTool(itemStack)) return -1; if (!itemStack.isSuitableFor(state) && !(itemStack.getItem() instanceof SwordItem && (state.getBlock() instanceof BambooBlock || state.getBlock() instanceof BambooSaplingBlock))) return -1; @@ -192,6 +197,12 @@ public static double getScore(ItemStack itemStack, BlockState state, boolean sil return -1; } + if (fortuneOre + && isFortunable(state.getBlock()) + && EnchantmentHelper.getLevel(Enchantments.FORTUNE, itemStack) == 0) { + return -1; + } + double score = 0; score += itemStack.getMiningSpeedMultiplier(state) * 1000; @@ -216,6 +227,11 @@ public static boolean isTool(ItemStack itemStack) { return isTool(itemStack.getItem()); } + private static boolean isFortunable(Block block) { + if (block == Blocks.ANCIENT_DEBRIS) return false; + return Xray.ORES.contains(block) || block instanceof CropBlock; + } + public enum EnchantPreference { None, Fortune, diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Xray.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Xray.java index 4a83972073..2ab23b7150 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Xray.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Xray.java @@ -31,30 +31,12 @@ public class Xray extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); + public static final List ORES = List.of(Blocks.COAL_ORE, Blocks.DEEPSLATE_COAL_ORE, Blocks.IRON_ORE, Blocks.DEEPSLATE_IRON_ORE, Blocks.GOLD_ORE, Blocks.DEEPSLATE_GOLD_ORE, Blocks.LAPIS_ORE, Blocks.DEEPSLATE_LAPIS_ORE, Blocks.REDSTONE_ORE, Blocks.REDSTONE_ORE, Blocks.DIAMOND_ORE, Blocks.DEEPSLATE_DIAMOND_ORE, Blocks.EMERALD_ORE, Blocks.DEEPSLATE_EMERALD_ORE, Blocks.COPPER_ORE, Blocks.DEEPSLATE_COPPER_ORE, Blocks.NETHER_GOLD_ORE, Blocks.NETHER_QUARTZ_ORE, Blocks.ANCIENT_DEBRIS); + private final Setting> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("whitelist") .description("Which blocks to show x-rayed.") - .defaultValue( - Blocks.COAL_ORE, - Blocks.DEEPSLATE_COAL_ORE, - Blocks.IRON_ORE, - Blocks.DEEPSLATE_IRON_ORE, - Blocks.GOLD_ORE, - Blocks.DEEPSLATE_GOLD_ORE, - Blocks.LAPIS_ORE, - Blocks.DEEPSLATE_LAPIS_ORE, - Blocks.REDSTONE_ORE, - Blocks.DEEPSLATE_REDSTONE_ORE, - Blocks.DIAMOND_ORE, - Blocks.DEEPSLATE_DIAMOND_ORE, - Blocks.EMERALD_ORE, - Blocks.DEEPSLATE_EMERALD_ORE, - Blocks.COPPER_ORE, - Blocks.DEEPSLATE_COPPER_ORE, - Blocks.NETHER_GOLD_ORE, - Blocks.NETHER_QUARTZ_ORE, - Blocks.ANCIENT_DEBRIS - ) + .defaultValue(ORES) .onChanged(v -> { if (isActive()) mc.worldRenderer.reload(); }) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java index 1c8739104c..8908aac703 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java @@ -864,7 +864,7 @@ protected int findAndMoveBestToolToHotbar(HighwayBuilder b, BlockState blockStat int bestSlot = -1; for (int i = 0; i < b.mc.player.getInventory().main.size(); i++) { - double score = AutoTool.getScore(b.mc.player.getInventory().getStack(i), blockState, false, AutoTool.EnchantPreference.None, itemStack -> { + double score = AutoTool.getScore(b.mc.player.getInventory().getStack(i), blockState, false, false, AutoTool.EnchantPreference.None, itemStack -> { if (noSilkTouch && EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, itemStack) != 0) return false; return !b.dontBreakTools.get() || itemStack.getMaxDamage() - itemStack.getDamage() > 1; }); From 1101e84e8d9b49fdb542fe3c7759838c705fb305 Mon Sep 17 00:00:00 2001 From: DesiCow Date: Sat, 4 Feb 2023 21:41:59 +0530 Subject: [PATCH 077/357] Better Auto Eat threshold Select "health", "hunger", "any", "both" thresholds to trigger auto eat. --- .../systems/modules/player/AutoEat.java | 49 +++++++++++++++++-- 1 file changed, 44 insertions(+), 5 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoEat.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoEat.java index 57725b8cd8..2ed7a92a6c 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoEat.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoEat.java @@ -26,12 +26,13 @@ import java.util.ArrayList; import java.util.List; +import java.util.function.BiPredicate; public class AutoEat extends Module { private static final Class[] AURAS = new Class[] { KillAura.class, CrystalAura.class, AnchorAura.class, BedAura.class }; private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgHunger = settings.createGroup("Hunger"); + private final SettingGroup sgThreshold = settings.createGroup("Threshold"); // General @@ -67,14 +68,32 @@ public class AutoEat extends Module { .build() ); - // Hunger + // Threshold - private final Setting hungerThreshold = sgHunger.add(new IntSetting.Builder() + private final Setting thresholdMode = sgThreshold.add(new EnumSetting.Builder() + .name("threshold-mode") + .description("The threshold mode to trigger auto eat.") + .defaultValue(ThresholdMode.Any) + .build() + ); + + private final Setting healthThreshold = sgThreshold.add(new DoubleSetting.Builder() + .name("health-threshold") + .description("The level of health you eat at.") + .defaultValue(10) + .range(1, 19) + .sliderRange(1, 19) + .visible(() -> thresholdMode.get() != ThresholdMode.Hunger) + .build() + ); + + private final Setting hungerThreshold = sgThreshold.add(new IntSetting.Builder() .name("hunger-threshold") .description("The level of hunger you eat at.") .defaultValue(16) .range(1, 19) .sliderRange(1, 19) + .visible(() -> thresholdMode.get() != ThresholdMode.Health) .build() ); @@ -207,8 +226,11 @@ private void changeSlot(int slot) { this.slot = slot; } - private boolean shouldEat() { - return mc.player.getHungerManager().getFoodLevel() <= hungerThreshold.get(); + public boolean shouldEat() { + boolean health = mc.player.getHealth() <= healthThreshold.get(); + boolean hunger = mc.player.getHungerManager().getFoodLevel() <= hungerThreshold.get(); + + return thresholdMode.get().test(health, hunger); } private int findSlot() { @@ -237,4 +259,21 @@ private int findSlot() { return slot; } + + public enum ThresholdMode { + Health((health, hunger) -> health), + Hunger((health, hunger) -> hunger), + Any((health, hunger) -> health || hunger), + Both((health, hunger) -> health && hunger); + + private final BiPredicate predicate; + + ThresholdMode(BiPredicate predicate) { + this.predicate = predicate; + } + + public boolean test(boolean health, boolean hunger) { + return predicate.test(health, hunger); + } + } } From 775939db91071d1dfed46e2dc90f539dad4afcc0 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Mon, 21 Aug 2023 17:35:39 +0100 Subject: [PATCH 078/357] add option to hand view to disable the eating animation --- .../mixin/HeldItemRendererMixin.java | 9 ++++ .../systems/modules/render/HandView.java | 41 ++++++++++++------- 2 files changed, 35 insertions(+), 15 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/HeldItemRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/HeldItemRendererMixin.java index e6f21a619f..72748fa436 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/HeldItemRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/HeldItemRendererMixin.java @@ -16,9 +16,11 @@ import net.minecraft.client.render.item.HeldItemRenderer; import net.minecraft.client.util.math.MatrixStack; 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.Unique; import org.spongepowered.asm.mixin.injection.*; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @@ -83,6 +85,13 @@ private void onRenderArm(AbstractClientPlayerEntity player, float tickDelta, flo 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, CallbackInfo ci) { + if (Modules.get().get(HandView.class).disableFoodAnimation()) ci.cancel(); + } + + + @Unique private boolean showSwapping(ItemStack stack1, ItemStack stack2) { return !Modules.get().get(HandView.class).showSwapping() || ItemStack.areEqual(stack1, stack2); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/HandView.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/HandView.java index 9aa25519a4..fd718dec4d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/HandView.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/HandView.java @@ -32,6 +32,27 @@ public class HandView extends Module { .build() ); + public final Setting oldAnimations = sgGeneral.add(new BoolSetting.Builder() + .name("old-animations") + .description("Changes hit animations to those like 1.8") + .defaultValue(false) + .build() + ); + + public final Setting showSwapping = sgGeneral.add(new BoolSetting.Builder() + .name("show-swapping") + .description("Whether or not to show the item swapping animation") + .defaultValue(true) + .build() + ); + + private final Setting disableFoodAnimation = sgGeneral.add(new BoolSetting.Builder() + .name("disable-eating-animation") + .description("Disables the eating animation. Potentially desirable if it goes offscreen.") + .defaultValue(false) + .build() + ); + public final Setting swingMode = sgGeneral.add(new EnumSetting.Builder() .name("swing-mode") .description("Modifies your client & server hand swinging.") @@ -66,20 +87,6 @@ public class HandView extends Module { .build() ); - public final Setting oldAnimations = sgGeneral.add(new BoolSetting.Builder() - .name("old-animations") - .description("Changes hit animations to those like 1.8") - .defaultValue(false) - .build() - ); - - public final Setting showSwapping = sgGeneral.add(new BoolSetting.Builder() - .name("show-swapping") - .description("Whether or not to show the item swapping animation") - .defaultValue(true) - .build() - ); - // Main Hand private final Setting scaleMain = sgMainHand.add(new Vector3dSetting.Builder() @@ -109,7 +116,7 @@ public class HandView extends Module { .build() ); - // Off Hand + // Offhand private final Setting scaleOff = sgOffHand.add(new Vector3dSetting.Builder() .name("scale") @@ -220,6 +227,10 @@ public boolean showSwapping() { return isActive() && showSwapping.get(); } + public boolean disableFoodAnimation() { + return isActive() && disableFoodAnimation.get(); + } + public enum SwingMode { Offhand, Mainhand, From 9ffca3f19c09b579f9ffa9c6874bba8b35c14543 Mon Sep 17 00:00:00 2001 From: Patrick Date: Mon, 21 Aug 2023 19:37:39 +0200 Subject: [PATCH 079/357] Fix Infinite Chat Box --- .../meteordevelopment/meteorclient/mixin/ChatScreenMixin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChatScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChatScreenMixin.java index c2463e8fd8..e0a3086f69 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChatScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChatScreenMixin.java @@ -19,7 +19,7 @@ public abstract class ChatScreenMixin { @Shadow protected TextFieldWidget chatField; - @Inject(method = "init", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/widget/TextFieldWidget;setMaxLength(I)V", shift = At.Shift.AFTER)) + @Inject(method = "init", at = @At(value = "TAIL")) private void onInit(CallbackInfo info) { if (Modules.get().get(BetterChat.class).isInfiniteChatBox()) chatField.setMaxLength(Integer.MAX_VALUE); } From d752b5bbed975088ae71083e425118b60e82753b Mon Sep 17 00:00:00 2001 From: Patrick <73178245+Paddyk45@users.noreply.github.com> Date: Mon, 21 Aug 2023 21:10:06 +0200 Subject: [PATCH 080/357] Fix + improve launch method (#3983) --- .../meteordevelopment/meteorclient/Main.java | 74 ++++++------------- 1 file changed, 22 insertions(+), 52 deletions(-) diff --git a/launch/src/main/java/meteordevelopment/meteorclient/Main.java b/launch/src/main/java/meteordevelopment/meteorclient/Main.java index b65233ae08..16071e0a5b 100644 --- a/launch/src/main/java/meteordevelopment/meteorclient/Main.java +++ b/launch/src/main/java/meteordevelopment/meteorclient/Main.java @@ -6,9 +6,11 @@ package meteordevelopment.meteorclient; import javax.swing.*; +import java.awt.*; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; +import java.net.URI; import java.net.URL; import java.util.Locale; @@ -20,28 +22,40 @@ public static void main(String[] args) throws UnsupportedLookAndFeelException, C null, "To install Meteor Client you need to put it in your mods folder and run Fabric for latest Minecraft version.", "Meteor Client", - JOptionPane.YES_NO_OPTION, + JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.ERROR_MESSAGE, null, - new String[] { "Open Wiki", "Open Mods Folder" }, + new String[] { "Open Wiki", "Open Mods Folder", "Join our Discord" }, null ); switch (option) { - case 0: getOS().open("https://meteorclient.com/installation"); break; + case 0: { + try { + Desktop.getDesktop().browse(URI.create("https://meteorclient.com/faq/installation")); + } catch (IOException ignored) {} + break; + } case 1: { String path; switch (getOS()) { case WINDOWS: path = System.getenv("AppData") + "/.minecraft/mods"; break; case OSX: path = System.getProperty("user.home") + "/Library/Application Support/minecraft/mods"; break; - default: path = System.getProperty("user.home") + "/.minecraft"; break; + default: path = System.getProperty("user.home") + "/.minecraft/mods"; break; } File mods = new File(path); if (!mods.exists()) mods.mkdirs(); - - getOS().open(mods); + try { + Desktop.getDesktop().open(mods); + } catch (IOException ignored) {} + break; + } + case 2: { + try { + Desktop.getDesktop().browse(URI.create("https://discord.com/invite/bBGQZvd")); + } catch (IOException ignored) {} break; } } @@ -59,52 +73,8 @@ private static OperatingSystem getOS() { private enum OperatingSystem { LINUX, - WINDOWS { - @Override - protected String[] getURLOpenCommand(URL url) { - return new String[] { "rundll32", "url.dll,FileProtocolHandler", url.toString() }; - } - }, - OSX { - @Override - protected String[] getURLOpenCommand(URL url) { - return new String[] { "open", url.toString() }; - } - }, + WINDOWS, + OSX, UNKNOWN; - - public void open(URL url) { - try { - Runtime.getRuntime().exec(getURLOpenCommand(url)); - } catch (IOException e) { - e.printStackTrace(); - } - } - - public void open(String url) { - try { - open(new URL(url)); - } catch (MalformedURLException e) { - e.printStackTrace(); - } - } - - public void open(File file) { - try { - open(file.toURI().toURL()); - } catch (MalformedURLException e) { - e.printStackTrace(); - } - } - - protected String[] getURLOpenCommand(URL url) { - String string = url.toString(); - - if ("file".equals(url.getProtocol())) { - string = string.replace("file:", "file://"); - } - - return new String[] { "xdg-open", string }; - } } } From c178e9772220372c4f2abf3ed7e68e4ce09908e2 Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Mon, 21 Aug 2023 21:39:35 +0200 Subject: [PATCH 081/357] Revert "Fix + improve launch method (#3983)" - Don't use AWT This reverts commit d752b5bbed975088ae71083e425118b60e82753b. --- .../meteordevelopment/meteorclient/Main.java | 74 +++++++++++++------ 1 file changed, 52 insertions(+), 22 deletions(-) diff --git a/launch/src/main/java/meteordevelopment/meteorclient/Main.java b/launch/src/main/java/meteordevelopment/meteorclient/Main.java index 16071e0a5b..b65233ae08 100644 --- a/launch/src/main/java/meteordevelopment/meteorclient/Main.java +++ b/launch/src/main/java/meteordevelopment/meteorclient/Main.java @@ -6,11 +6,9 @@ package meteordevelopment.meteorclient; import javax.swing.*; -import java.awt.*; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; -import java.net.URI; import java.net.URL; import java.util.Locale; @@ -22,40 +20,28 @@ public static void main(String[] args) throws UnsupportedLookAndFeelException, C null, "To install Meteor Client you need to put it in your mods folder and run Fabric for latest Minecraft version.", "Meteor Client", - JOptionPane.YES_NO_CANCEL_OPTION, + JOptionPane.YES_NO_OPTION, JOptionPane.ERROR_MESSAGE, null, - new String[] { "Open Wiki", "Open Mods Folder", "Join our Discord" }, + new String[] { "Open Wiki", "Open Mods Folder" }, null ); switch (option) { - case 0: { - try { - Desktop.getDesktop().browse(URI.create("https://meteorclient.com/faq/installation")); - } catch (IOException ignored) {} - break; - } + case 0: getOS().open("https://meteorclient.com/installation"); break; case 1: { String path; switch (getOS()) { case WINDOWS: path = System.getenv("AppData") + "/.minecraft/mods"; break; case OSX: path = System.getProperty("user.home") + "/Library/Application Support/minecraft/mods"; break; - default: path = System.getProperty("user.home") + "/.minecraft/mods"; break; + default: path = System.getProperty("user.home") + "/.minecraft"; break; } File mods = new File(path); if (!mods.exists()) mods.mkdirs(); - try { - Desktop.getDesktop().open(mods); - } catch (IOException ignored) {} - break; - } - case 2: { - try { - Desktop.getDesktop().browse(URI.create("https://discord.com/invite/bBGQZvd")); - } catch (IOException ignored) {} + + getOS().open(mods); break; } } @@ -73,8 +59,52 @@ private static OperatingSystem getOS() { private enum OperatingSystem { LINUX, - WINDOWS, - OSX, + WINDOWS { + @Override + protected String[] getURLOpenCommand(URL url) { + return new String[] { "rundll32", "url.dll,FileProtocolHandler", url.toString() }; + } + }, + OSX { + @Override + protected String[] getURLOpenCommand(URL url) { + return new String[] { "open", url.toString() }; + } + }, UNKNOWN; + + public void open(URL url) { + try { + Runtime.getRuntime().exec(getURLOpenCommand(url)); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void open(String url) { + try { + open(new URL(url)); + } catch (MalformedURLException e) { + e.printStackTrace(); + } + } + + public void open(File file) { + try { + open(file.toURI().toURL()); + } catch (MalformedURLException e) { + e.printStackTrace(); + } + } + + protected String[] getURLOpenCommand(URL url) { + String string = url.toString(); + + if ("file".equals(url.getProtocol())) { + string = string.replace("file:", "file://"); + } + + return new String[] { "xdg-open", string }; + } } } From fb573b5e66d7b73b7f1f8e019db0dd8325ce1ec9 Mon Sep 17 00:00:00 2001 From: supakeks <70498670+supakeks@users.noreply.github.com> Date: Mon, 21 Aug 2023 19:12:48 -0400 Subject: [PATCH 082/357] Add Recast mode to Elytra Fly (#3980) --- .../meteorclient/mixin/LivingEntityMixin.java | 14 ++ .../movement/elytrafly/ElytraFlightMode.java | 5 +- .../movement/elytrafly/ElytraFlightModes.java | 3 +- .../modules/movement/elytrafly/ElytraFly.java | 124 +++++++++++++----- .../movement/elytrafly/modes/Recast.java | 112 ++++++++++++++++ 5 files changed, 222 insertions(+), 36 deletions(-) create mode 100644 src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/modes/Recast.java diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java index 7a19694a92..97282fc5b2 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java @@ -10,7 +10,9 @@ import meteordevelopment.meteorclient.events.entity.DamageEvent; import meteordevelopment.meteorclient.events.entity.player.CanWalkOnFluidEvent; import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.movement.elytrafly.ElytraFlightModes; import meteordevelopment.meteorclient.systems.modules.movement.elytrafly.ElytraFly; +import meteordevelopment.meteorclient.systems.modules.movement.elytrafly.modes.Recast; import meteordevelopment.meteorclient.systems.modules.player.OffhandCrash; import meteordevelopment.meteorclient.systems.modules.player.PotionSpoof; import meteordevelopment.meteorclient.systems.modules.render.HandView; @@ -109,6 +111,18 @@ private boolean isFallFlyingHook(boolean original) { return original; } + private boolean previousElytra = false; + + @Inject(method = "isFallFlying", at = @At("TAIL"), cancellable = true) + public void recastOnLand(CallbackInfoReturnable cir) { + boolean elytra = cir.getReturnValue(); + ElytraFly elytraFly = Modules.get().get(ElytraFly.class); + if (previousElytra && !elytra && elytraFly.isActive() && elytraFly.flightMode.get() == ElytraFlightModes.Recast) { + cir.setReturnValue(Recast.recastElytra(mc.player)); + } + previousElytra = elytra; + } + @ModifyReturnValue(method = "hasStatusEffect", at = @At("RETURN")) private boolean hasStatusEffect(boolean original, StatusEffect effect) { if (Modules.get().get(PotionSpoof.class).shouldBlock(effect)) return false; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFlightMode.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFlightMode.java index 76cede0162..fdd01be6f9 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFlightMode.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFlightMode.java @@ -63,6 +63,9 @@ public void onTick() { public void onPacketSend(PacketEvent.Send event) { } + public void onPacketReceive(PacketEvent.Receive event) { + } + public void onPlayerMove() { } @@ -103,7 +106,7 @@ public void autoTakeoff() { public void handleAutopilot() { if (!mc.player.isFallFlying()) return; - if (elytraFly.autoPilot.get() && mc.player.getY() > elytraFly.autoPilotMinimumHeight.get()) { + if (elytraFly.autoPilot.get() && mc.player.getY() > elytraFly.autoPilotMinimumHeight.get() && elytraFly.flightMode.get() != ElytraFlightModes.Recast) { mc.options.forwardKey.setPressed(true); lastForwardPressed = true; } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFlightModes.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFlightModes.java index aa19531e21..9e7badcb0f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFlightModes.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFlightModes.java @@ -8,5 +8,6 @@ public enum ElytraFlightModes { Vanilla, Packet, - Pitch40 + Pitch40, + Recast } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFly.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFly.java index c0b8dd8889..1eabd6c3fd 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFly.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFly.java @@ -16,14 +16,21 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.movement.elytrafly.modes.Packet; import meteordevelopment.meteorclient.systems.modules.movement.elytrafly.modes.Pitch40; +import meteordevelopment.meteorclient.systems.modules.movement.elytrafly.modes.Recast; import meteordevelopment.meteorclient.systems.modules.movement.elytrafly.modes.Vanilla; import meteordevelopment.meteorclient.systems.modules.player.ChestSwap; import meteordevelopment.meteorclient.systems.modules.render.Freecam; +import meteordevelopment.meteorclient.utils.misc.input.Input; import meteordevelopment.orbit.EventHandler; import net.minecraft.block.Block; import net.minecraft.block.BlockState; +import net.minecraft.client.network.ClientPlayNetworkHandler; +import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.client.option.KeyBinding; import net.minecraft.entity.EquipmentSlot; +import net.minecraft.entity.effect.StatusEffects; import net.minecraft.item.ElytraItem; +import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.network.packet.c2s.play.ClientCommandC2SPacket; import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket; @@ -62,7 +69,7 @@ public class ElytraFly extends Module { .description("Controls how fast will you go down naturally.") .defaultValue(0.01) .min(0) - .visible(() -> flightMode.get() != ElytraFlightModes.Pitch40) + .visible(() -> flightMode.get() != ElytraFlightModes.Pitch40 && flightMode.get() != ElytraFlightModes.Recast) .build() ); @@ -71,7 +78,7 @@ public class ElytraFly extends Module { .description("How fast you go forward and backward.") .defaultValue(1) .min(0) - .visible(() -> flightMode.get() != ElytraFlightModes.Pitch40) + .visible(() -> flightMode.get() != ElytraFlightModes.Pitch40 && flightMode.get() != ElytraFlightModes.Recast) .build() ); @@ -80,14 +87,14 @@ public class ElytraFly extends Module { .description("How fast you go up and down.") .defaultValue(1) .min(0) - .visible(() -> flightMode.get() != ElytraFlightModes.Pitch40) + .visible(() -> flightMode.get() != ElytraFlightModes.Pitch40 && flightMode.get() != ElytraFlightModes.Recast) .build() ); public final Setting acceleration = sgGeneral.add(new BoolSetting.Builder() .name("acceleration") .defaultValue(false) - .visible(() -> flightMode.get() != ElytraFlightModes.Pitch40) + .visible(() -> flightMode.get() != ElytraFlightModes.Pitch40 && flightMode.get() != ElytraFlightModes.Recast) .build() ); @@ -96,7 +103,7 @@ public class ElytraFly extends Module { .min(0.1) .max(5) .defaultValue(1) - .visible(() -> flightMode.get() != ElytraFlightModes.Pitch40 && acceleration.get()) + .visible(() -> flightMode.get() != ElytraFlightModes.Pitch40 && acceleration.get() && flightMode.get() != ElytraFlightModes.Recast) .build() ); @@ -104,7 +111,7 @@ public class ElytraFly extends Module { .name("acceleration-start") .min(0.1) .defaultValue(0) - .visible(() -> flightMode.get() != ElytraFlightModes.Pitch40 && acceleration.get()) + .visible(() -> flightMode.get() != ElytraFlightModes.Pitch40 && acceleration.get() && flightMode.get() != ElytraFlightModes.Recast) .build() ); @@ -112,6 +119,7 @@ public class ElytraFly extends Module { .name("stop-in-water") .description("Stops flying in water.") .defaultValue(true) + .visible(() -> flightMode.get() != ElytraFlightModes.Recast) .build() ); @@ -126,6 +134,7 @@ public class ElytraFly extends Module { .name("auto-hover") .description("Automatically hover .3 blocks off ground when holding shift.") .defaultValue(false) + .visible(() -> flightMode.get() != ElytraFlightModes.Recast) .build() ); @@ -133,6 +142,7 @@ public class ElytraFly extends Module { .name("no-crash") .description("Stops you from going into walls.") .defaultValue(false) + .visible(() -> flightMode.get() != ElytraFlightModes.Recast) .build() ); @@ -150,6 +160,7 @@ public class ElytraFly extends Module { .name("insta-drop") .description("Makes you drop out of flight instantly.") .defaultValue(false) + .visible(() -> flightMode.get() != ElytraFlightModes.Recast) .build() ); @@ -158,7 +169,7 @@ public class ElytraFly extends Module { .description("The bottom height boundary for pitch40.") .defaultValue(80) .min(-128) - .sliderMax(260) + .sliderMax(360) .visible(() -> flightMode.get() == ElytraFlightModes.Pitch40) .build() ); @@ -168,7 +179,7 @@ public class ElytraFly extends Module { .description("The upper height boundary for pitch40.") .defaultValue(120) .min(-128) - .sliderMax(260) + .sliderMax(360) .visible(() -> flightMode.get() == ElytraFlightModes.Pitch40) .build() ); @@ -183,6 +194,42 @@ public class ElytraFly extends Module { .build() ); + public final Setting autoJump = sgGeneral.add(new BoolSetting.Builder() + .name("auto-jump") + .description("Automatically jumps for you.") + .defaultValue(true) + .visible(() -> flightMode.get() == ElytraFlightModes.Recast) + .build() + ); + + public final Setting pitch = sgGeneral.add(new IntSetting.Builder() + .name("pitch") + .description("The pitch angle to look at when using the recast mode.") + .defaultValue(85) + .range(0, 90) + .sliderRange(0, 90) + .visible(() -> flightMode.get() == ElytraFlightModes.Recast) + .build() + ); + + public final Setting restart = sgGeneral.add(new BoolSetting.Builder() + .name("restart") + .description("Restarts flying with the elytra when rubberbanding.") + .defaultValue(true) + .visible(() -> flightMode.get() == ElytraFlightModes.Recast) + .build() + ); + + public final Setting restartDelay = sgGeneral.add(new IntSetting.Builder() + .name("restart-delay") + .description("How many ticks to wait before restarting the elytra again after rubberbanding.") + .defaultValue(7) + .range(0, 20) + .sliderRange(0, 20) + .visible(() -> flightMode.get() == ElytraFlightModes.Recast && restart.get()) + .build() + ); + // Inventory public final Setting replace = sgInventory.add(new BoolSetting.Builder() @@ -232,7 +279,7 @@ public class ElytraFly extends Module { .name("auto-pilot") .description("Moves forward while elytra flying.") .defaultValue(false) - .visible(() -> flightMode.get() != ElytraFlightModes.Pitch40) + .visible(() -> flightMode.get() != ElytraFlightModes.Pitch40 && flightMode.get() != ElytraFlightModes.Recast) .build() ); @@ -240,7 +287,7 @@ public class ElytraFly extends Module { .name("use-fireworks") .description("Uses firework rockets every second of your choice.") .defaultValue(false) - .visible(autoPilot::get) + .visible(() -> autoPilot.get() && flightMode.get() != ElytraFlightModes.Pitch40 && flightMode.get() != ElytraFlightModes.Recast) .build() ); @@ -250,7 +297,7 @@ public class ElytraFly extends Module { .min(1) .defaultValue(8) .sliderMax(20) - .visible(useFireworks::get) + .visible(() -> useFireworks.get() && flightMode.get() != ElytraFlightModes.Pitch40 && flightMode.get() != ElytraFlightModes.Recast) .build() ); @@ -260,7 +307,7 @@ public class ElytraFly extends Module { .defaultValue(120) .min(-128) .sliderMax(260) - .visible(autoPilot::get) + .visible(() -> autoPilot.get() && flightMode.get() != ElytraFlightModes.Pitch40 && flightMode.get() != ElytraFlightModes.Recast) .build() ); @@ -303,44 +350,47 @@ private void onPlayerMove(PlayerMoveEvent event) { currentMode.autoTakeoff(); if (mc.player.isFallFlying()) { - currentMode.velX = 0; - currentMode.velY = event.movement.y; - currentMode.velZ = 0; - currentMode.forward = Vec3d.fromPolar(0, mc.player.getYaw()).multiply(0.1); - currentMode.right = Vec3d.fromPolar(0, mc.player.getYaw() + 90).multiply(0.1); - - // Handle stopInWater - if (mc.player.isTouchingWater() && stopInWater.get()) { - mc.getNetworkHandler().sendPacket(new ClientCommandC2SPacket(mc.player, ClientCommandC2SPacket.Mode.START_FALL_FLYING)); - return; - } - currentMode.handleFallMultiplier(); - currentMode.handleAutopilot(); + if (flightMode.get() != ElytraFlightModes.Recast) { + currentMode.velX = 0; + currentMode.velY = event.movement.y; + currentMode.velZ = 0; + currentMode.forward = Vec3d.fromPolar(0, mc.player.getYaw()).multiply(0.1); + currentMode.right = Vec3d.fromPolar(0, mc.player.getYaw() + 90).multiply(0.1); + + // Handle stopInWater + if (mc.player.isTouchingWater() && stopInWater.get()) { + mc.getNetworkHandler().sendPacket(new ClientCommandC2SPacket(mc.player, ClientCommandC2SPacket.Mode.START_FALL_FLYING)); + return; + } + + currentMode.handleFallMultiplier(); + currentMode.handleAutopilot(); - currentMode.handleAcceleration(); - currentMode.handleHorizontalSpeed(event); - currentMode.handleVerticalSpeed(event); + currentMode.handleAcceleration(); + currentMode.handleHorizontalSpeed(event); + currentMode.handleVerticalSpeed(event); + } int chunkX = (int) ((mc.player.getX() + currentMode.velX) / 16); int chunkZ = (int) ((mc.player.getZ() + currentMode.velZ) / 16); if (dontGoIntoUnloadedChunks.get()) { if (mc.world.getChunkManager().isChunkLoaded(chunkX, chunkZ)) { - ((IVec3d) event.movement).set(currentMode.velX, currentMode.velY, currentMode.velZ); + if (flightMode.get() != ElytraFlightModes.Recast) ((IVec3d) event.movement).set(currentMode.velX, currentMode.velY, currentMode.velZ); } else { ((IVec3d) event.movement).set(0, currentMode.velY, 0); } - } else ((IVec3d) event.movement).set(currentMode.velX, currentMode.velY, currentMode.velZ); + } else if (flightMode.get() != ElytraFlightModes.Recast) ((IVec3d) event.movement).set(currentMode.velX, currentMode.velY, currentMode.velZ); - currentMode.onPlayerMove(); + if (flightMode.get() != ElytraFlightModes.Recast) currentMode.onPlayerMove(); } else { - if (currentMode.lastForwardPressed) { + if (currentMode.lastForwardPressed && flightMode.get() != ElytraFlightModes.Recast) { mc.options.forwardKey.setPressed(false); currentMode.lastForwardPressed = false; } } - if (noCrash.get() && mc.player.isFallFlying()) { + if (noCrash.get() && mc.player.isFallFlying() && flightMode.get() != ElytraFlightModes.Recast) { Vec3d lookAheadPos = mc.player.getPos().add(mc.player.getVelocity().normalize().multiply(crashLookAhead.get())); RaycastContext raycastContext = new RaycastContext(mc.player.getPos(), new Vec3d(lookAheadPos.getX(), mc.player.getY(), lookAheadPos.getZ()), RaycastContext.ShapeType.COLLIDER, RaycastContext.FluidHandling.NONE, mc.player); BlockHitResult hitResult = mc.world.raycast(raycastContext); @@ -349,7 +399,7 @@ private void onPlayerMove(PlayerMoveEvent event) { } } - if (autoHover.get() && mc.player.input.sneaking && !Modules.get().get(Freecam.class).isActive() && mc.player.isFallFlying()) { + if (autoHover.get() && mc.player.input.sneaking && !Modules.get().get(Freecam.class).isActive() && mc.player.isFallFlying() && flightMode.get() != ElytraFlightModes.Recast) { BlockState underState = mc.world.getBlockState(mc.player.getBlockPos().down()); Block under = underState.getBlock(); BlockState under2State = mc.world.getBlockState(mc.player.getBlockPos().down().down()); @@ -392,6 +442,11 @@ private void onPacketSend(PacketEvent.Send event) { currentMode.onPacketSend(event); } + @EventHandler + private void onPacketReceive(PacketEvent.Receive event) { + currentMode.onPacketReceive(event); + } + private void onModeChanged(ElytraFlightModes mode) { switch (mode) { case Vanilla -> currentMode = new Vanilla(); @@ -400,6 +455,7 @@ private void onModeChanged(ElytraFlightModes mode) { currentMode = new Pitch40(); autoPilot.set(false); // Pitch 40 is an autopilot of its own } + case Recast -> currentMode = new Recast(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/modes/Recast.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/modes/Recast.java new file mode 100644 index 0000000000..39492d75c1 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/modes/Recast.java @@ -0,0 +1,112 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +/* + * Credit to Luna (https://github.com/InLieuOfLuna) for making the original Elytra Recast mod (https://github.com/InLieuOfLuna/elytra-recast)! + */ + +package meteordevelopment.meteorclient.systems.modules.movement.elytrafly.modes; + +import meteordevelopment.meteorclient.events.packets.PacketEvent; +import meteordevelopment.meteorclient.systems.modules.movement.elytrafly.ElytraFlightMode; +import meteordevelopment.meteorclient.systems.modules.movement.elytrafly.ElytraFlightModes; +import meteordevelopment.meteorclient.systems.modules.movement.elytrafly.ElytraFly; +import meteordevelopment.meteorclient.utils.misc.input.Input; +import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.client.option.KeyBinding; +import net.minecraft.entity.EquipmentSlot; +import net.minecraft.entity.effect.StatusEffects; +import net.minecraft.item.ElytraItem; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.network.packet.c2s.play.ClientCommandC2SPacket; +import net.minecraft.network.packet.s2c.play.PlayerPositionLookS2CPacket; + +public class Recast extends ElytraFlightMode { + + public Recast() { + super(ElytraFlightModes.Recast); + } + + public static boolean rubberbanded = false; + + int tickDelay = elytraFly.restartDelay.get(); + + @Override + public void onTick() { + super.onTick(); + + // Make sure all the conditions are met (player has an elytra, isn't in water, etc) + if (checkConditions(mc.player)) { + + mc.player.setSprinting(true); + setPressed(mc.options.forwardKey, true); + if (elytraFly.autoJump.get()) setPressed(mc.options.jumpKey, true); + mc.player.setYaw(getSmartYawDirection()); + mc.player.setPitch(elytraFly.pitch.get()); + + // Rubberbanding + if (rubberbanded && elytraFly.restart.get()) { + if (tickDelay > 0) { + tickDelay--; + } else { + rubberbanded = false; + mc.getNetworkHandler().sendPacket(new ClientCommandC2SPacket(mc.player, ClientCommandC2SPacket.Mode.START_FALL_FLYING)); + tickDelay = elytraFly.restartDelay.get(); + } + } + } + } + + private void unpress() { + setPressed(mc.options.forwardKey, false); + if (elytraFly.autoJump.get()) setPressed(mc.options.jumpKey, false); + } + + @Override + public void onPacketReceive(PacketEvent.Receive event) { + if (event.packet instanceof PlayerPositionLookS2CPacket) { + rubberbanded = true; + mc.player.stopFallFlying(); + } + } + + + private void setPressed(KeyBinding key, boolean pressed) { + key.setPressed(pressed); + Input.setKeyState(key, pressed); + } + + public static boolean recastElytra(ClientPlayerEntity player) { + if (checkConditions(player) && ignoreGround(player)) { + player.networkHandler.sendPacket(new ClientCommandC2SPacket(player, ClientCommandC2SPacket.Mode.START_FALL_FLYING)); + return true; + } else return false; + } + + public static boolean checkConditions(ClientPlayerEntity player) { + ItemStack itemStack = player.getEquippedStack(EquipmentSlot.CHEST); + return (!player.getAbilities().flying && !player.hasVehicle() && !player.isClimbing() && itemStack.isOf(Items.ELYTRA) && ElytraItem.isUsable(itemStack)); + } + + private static boolean ignoreGround(ClientPlayerEntity player) { + if (!player.isTouchingWater() && !player.hasStatusEffect(StatusEffects.LEVITATION)) { + ItemStack itemStack = player.getEquippedStack(EquipmentSlot.CHEST); + if (itemStack.isOf(Items.ELYTRA) && ElytraItem.isUsable(itemStack)) { + player.startFallFlying(); + return true; + } else return false; + } else return false; + } + + private float getSmartYawDirection() { + return Math.round((mc.player.getYaw() + 1f) / 45f) * 45f; + } + + @Override + public void onDeactivate() { + unpress(); + } +} From 68ccadab2030273844edae73ead90adfdb8e85ed Mon Sep 17 00:00:00 2001 From: Cryo <110951096+CrytoPal@users.noreply.github.com> Date: Tue, 22 Aug 2023 05:22:30 -0700 Subject: [PATCH 083/357] Sprint Improvements (#3976) --- .../systems/modules/movement/Sprint.java | 36 +++++++++++++------ 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Sprint.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Sprint.java index f5ada70e2e..f499316beb 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Sprint.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Sprint.java @@ -6,7 +6,7 @@ package meteordevelopment.meteorclient.systems.modules.movement; import meteordevelopment.meteorclient.events.world.TickEvent; -import meteordevelopment.meteorclient.settings.BoolSetting; +import meteordevelopment.meteorclient.settings.EnumSetting; import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.settings.SettingGroup; import meteordevelopment.meteorclient.systems.modules.Categories; @@ -16,13 +16,21 @@ public class Sprint extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final Setting whenStationary = sgGeneral.add(new BoolSetting.Builder() - .name("when-stationary") - .description("Continues sprinting even if you do not move.") - .defaultValue(false) + public enum Mode { + Strict, + Rage + } + + private final Setting mode = sgGeneral.add(new EnumSetting.Builder() + .name("speed-mode") + .description("What mode of sprinting.") + .defaultValue(Mode.Strict) .build() ); + // Removed whenStationary as it was just Rage sprint + + public Sprint() { super(Categories.Movement, "sprint", "Automatically sprints."); } @@ -32,12 +40,20 @@ public void onDeactivate() { mc.player.setSprinting(false); } + private void sprint() { + if (mc.player.getHungerManager().getFoodLevel() <= 6) return; + mc.player.setSprinting(true); + } + @EventHandler private void onTick(TickEvent.Post event) { - if (mc.player.forwardSpeed > 0 && !whenStationary.get()) { - mc.player.setSprinting(true); - } else if (whenStationary.get()) { - mc.player.setSprinting(true); + switch (mode.get()) { + case Strict -> { + if (mc.player.forwardSpeed > 0) { + sprint(); + } + } + case Rage -> sprint(); + } } - } } From 4bcaff43387aae70fbbb3fce5dc9261e9149333c Mon Sep 17 00:00:00 2001 From: Mana <57663038+Manaball123@users.noreply.github.com> Date: Tue, 22 Aug 2023 11:21:07 +0800 Subject: [PATCH 084/357] make pitch setting use a float instead of an int --- .../systems/modules/movement/elytrafly/ElytraFly.java | 2 +- .../systems/modules/movement/elytrafly/modes/Recast.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFly.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFly.java index 1eabd6c3fd..face4d9924 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFly.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFly.java @@ -202,7 +202,7 @@ public class ElytraFly extends Module { .build() ); - public final Setting pitch = sgGeneral.add(new IntSetting.Builder() + public final Setting pitch = sgGeneral.add(new DoubleSetting.Builder() .name("pitch") .description("The pitch angle to look at when using the recast mode.") .defaultValue(85) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/modes/Recast.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/modes/Recast.java index 39492d75c1..8b21c15def 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/modes/Recast.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/modes/Recast.java @@ -45,7 +45,7 @@ public void onTick() { setPressed(mc.options.forwardKey, true); if (elytraFly.autoJump.get()) setPressed(mc.options.jumpKey, true); mc.player.setYaw(getSmartYawDirection()); - mc.player.setPitch(elytraFly.pitch.get()); + mc.player.setPitch(elytraFly.pitch.get().floatValue()); // Rubberbanding if (rubberbanded && elytraFly.restart.get()) { From c48e8d1ae2bfd41a915112e344c140045abe5bdb Mon Sep 17 00:00:00 2001 From: Wide-Cat <74723656+Wide-Cat@users.noreply.github.com> Date: Tue, 22 Aug 2023 18:13:15 +0100 Subject: [PATCH 085/357] Update AutoTool --- .../meteorclient/systems/modules/player/AutoTool.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java index 8bf546c011..7410c1f427 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java @@ -49,7 +49,7 @@ public class AutoTool extends Module { private final Setting fortuneForOresCrops = sgGeneral.add(new BoolSetting.Builder() .name("fortune-for-ores-and-crops") .description("Mines Ores and crops only with the Fortune enchantment.") - .defaultValue(true) + .defaultValue(false) .build() ); From 1f428166efd4cbedaa977908bb526e09917a105a Mon Sep 17 00:00:00 2001 From: Cryo <110951096+CrytoPal@users.noreply.github.com> Date: Thu, 24 Aug 2023 14:09:31 -0400 Subject: [PATCH 086/357] Offhand Rewrite (#3975) --- .../systems/modules/combat/Offhand.java | 224 +++++++++++++----- 1 file changed, 164 insertions(+), 60 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Offhand.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Offhand.java index fe1dd83a50..54851c022f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Offhand.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Offhand.java @@ -7,72 +7,129 @@ import meteordevelopment.meteorclient.events.meteor.MouseButtonEvent; import meteordevelopment.meteorclient.events.world.TickEvent; -import meteordevelopment.meteorclient.settings.BoolSetting; -import meteordevelopment.meteorclient.settings.EnumSetting; -import meteordevelopment.meteorclient.settings.Setting; -import meteordevelopment.meteorclient.settings.SettingGroup; +import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.utils.misc.input.KeyAction; import meteordevelopment.meteorclient.utils.player.FindItemResult; import meteordevelopment.meteorclient.utils.player.InvUtils; +import meteordevelopment.meteorclient.utils.player.PlayerUtils; import meteordevelopment.orbit.EventHandler; -import net.minecraft.item.AxeItem; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.item.SwordItem; +import net.minecraft.entity.EquipmentSlot; +import net.minecraft.item.*; +import static meteordevelopment.orbit.EventPriority.HIGHEST; import static org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_RIGHT; public class Offhand extends Module { - private final SettingGroup sgGeneral = settings.getDefaultGroup(); + private final SettingGroup sgCombat = settings.createGroup("Combat"); + private final SettingGroup sgTotem = settings.createGroup("Totem"); - private final Setting item = sgGeneral.add(new EnumSetting.Builder() + //Combat + + private final Setting delayTicks = sgCombat.add(new IntSetting.Builder() + .name("item-switch-delay") + .description("The delay in ticks between slot movements.") + .defaultValue(0) + .min(0) + .sliderMax(20) + .build() + ); + private final Setting preferreditem = sgCombat.add(new EnumSetting.Builder() .name("item") .description("Which item to hold in your offhand.") .defaultValue(Item.Crystal) .build() ); - private final Setting hotbar = sgGeneral.add(new BoolSetting.Builder() + private final Setting hotbar = sgCombat.add(new BoolSetting.Builder() .name("hotbar") .description("Whether to use items from your hotbar.") .defaultValue(false) .build() ); - private final Setting rightClick = sgGeneral.add(new BoolSetting.Builder() - .name("right-click") - .description("Only holds the item in your offhand when you are holding right click.") + private final Setting rightgapple = sgCombat.add(new BoolSetting.Builder() + .name("right-gapple") + .description("Will switch to a gapple when holding right click.(DO NOT USE WITH POTION ON)") + .defaultValue(false) + .build() + ); + + + private final Setting SwordGap = sgCombat.add(new BoolSetting.Builder() + .name("sword-gapple") + .description("Will switch to a gapple when holding a sword and right click.") .defaultValue(false) + .visible(rightgapple::get) .build() ); - private final Setting swordGap = sgGeneral.add(new BoolSetting.Builder() - .name("sword-gap") + private final Setting alwaysSwordGap = sgCombat.add(new BoolSetting.Builder() + .name("always-gap-on-sword") .description("Holds an Enchanted Golden Apple when you are holding a sword.") - .defaultValue(true) + .defaultValue(false) + .visible(() -> !rightgapple.get()) .build() ); - private final Setting crystalCa = sgGeneral.add(new BoolSetting.Builder() - .name("crystal-on-ca") - .description("Holds a crystal when you have Crystal Aura enabled.") - .defaultValue(true) + + private final Setting alwaysPot = sgCombat.add(new BoolSetting.Builder() + .name("always-pot-on-sword") + .description("Will switch to a potion when holding a sword") + .defaultValue(false) + .visible(() -> !rightgapple.get() && !alwaysSwordGap.get()) + .build() + ); + private final Setting potionClick = sgCombat.add(new BoolSetting.Builder() + .name("sword-pot") + .description("Will switch to a potion when holding a sword and right click.") + .defaultValue(false) + .visible(() -> !rightgapple.get() && !alwaysPot.get() && !alwaysSwordGap.get() ) .build() ); - private final Setting crystalMine = sgGeneral.add(new BoolSetting.Builder() - .name("crystal-on-mine") - .description("Holds a crystal when you are mining.") + //Totem + + private final Setting minHealth = sgTotem.add(new DoubleSetting.Builder() + .name("min-health") + .description("Will hold a totem when below this amount of health.") + .defaultValue(10) + .range(0,36) + .sliderRange(0,36) + .build() + ); + + private final Setting elytra = sgTotem.add(new BoolSetting.Builder() + .name("elytra") + .description("Will always hold a totem while flying with an elytra.") .defaultValue(false) .build() ); + private final Setting falling = sgTotem.add(new BoolSetting.Builder() + .name("falling") + .description("Will hold a totem if fall damage could kill you.") + .defaultValue(false) + .build() + ); + + private final Setting explosion = sgTotem.add(new BoolSetting.Builder() + .name("explosion") + .description("Will hold a totem when explosion damage could kill you.") + .defaultValue(true) + .build() + ); + + private boolean isClicking; private boolean sentMessage; + private Item currentItem; + public boolean locked; + + private int totems, ticks; public Offhand() { super(Categories.Combat, "offhand", "Allows you to hold specified items in your offhand."); @@ -80,65 +137,111 @@ public Offhand() { @Override public void onActivate() { + ticks = 0; sentMessage = false; isClicking = false; - currentItem = item.get(); + currentItem = preferreditem.get(); } - @EventHandler - private void onTick(TickEvent.Pre event) { - AutoTotem autoTotem = Modules.get().get(AutoTotem.class); + @EventHandler(priority = HIGHEST + 999) + private void onTick(TickEvent.Pre event) throws InterruptedException { + FindItemResult result = InvUtils.find(Items.TOTEM_OF_UNDYING); + totems = result.count(); - // Sword Gap - if ((mc.player.getMainHandStack().getItem() instanceof SwordItem - || mc.player.getMainHandStack().getItem() instanceof AxeItem) && swordGap.get()) currentItem = Item.EGap; + if (totems <= 0) locked = false; + else if (ticks > delayTicks.get()) { + boolean low = mc.player.getHealth() + mc.player.getAbsorptionAmount() - PlayerUtils.possibleHealthReductions(explosion.get(), falling.get()) <= minHealth.get(); + boolean ely = elytra.get() && mc.player.getEquippedStack(EquipmentSlot.CHEST).getItem() == Items.ELYTRA && mc.player.isFallFlying(); + FindItemResult item = InvUtils.find(itemStack -> itemStack.getItem() == currentItem.item, 0, 35); - // Ca and mining - else if ((Modules.get().isActive(CrystalAura.class) && crystalCa.get()) - || mc.interactionManager.isBreakingBlock() && crystalMine.get()) currentItem = Item.Crystal; + // Calculates Damage from Falling, Explosions + Elyta + locked = (low || ely); - else currentItem = item.get(); + if (locked && mc.player.getOffHandStack().getItem() != Items.TOTEM_OF_UNDYING) { + InvUtils.move().from(result.slot()).toOffhand(); + } - // Checking offhand item - if (mc.player.getOffHandStack().getItem() != currentItem.item) { - FindItemResult item = InvUtils.find(itemStack -> itemStack.getItem() == currentItem.item, hotbar.get() ? 0 : 9, 35); + ticks = 0; + return; + } + ticks++; + + AutoTotem autoTotem = Modules.get().get(AutoTotem.class); + + // Returns to the original Item + currentItem = preferreditem.get(); - // No offhand item - if (!item.found()) { - if (!sentMessage) { - warning("Chosen item not found."); - sentMessage = true; + // Sword Gap & Right Gap + if (rightgapple.get()) { + if (!locked) { + if (SwordGap.get() && mc.player.getMainHandStack().getItem() instanceof SwordItem) { + if (isClicking) { + currentItem = Item.EGap; + } + } + if (!SwordGap.get()) { + if (isClicking) { + currentItem = Item.EGap; + } } } + } - // Swap to offhand - else if ((isClicking || !rightClick.get()) && !autoTotem.isLocked() && !item.isOffhand()) { - InvUtils.move().from(item.slot()).toOffhand(); - sentMessage = false; + // Always Gap + else if ((mc.player.getMainHandStack().getItem() instanceof SwordItem || mc.player.getMainHandStack().getItem() instanceof AxeItem) && alwaysSwordGap.get()) currentItem = Item.EGap; + + // Potion Click + else if (potionClick.get()) { + if (!locked) { + if (mc.player.getMainHandStack().getItem() instanceof SwordItem) { + if (isClicking) { + currentItem = Item.Potion; + } + } } } - // If not clicking, set to totem if auto totem is on - else if (!isClicking && rightClick.get()) { - if (autoTotem.isActive()) { - FindItemResult totem = InvUtils.find(itemStack -> itemStack.getItem() == Items.TOTEM_OF_UNDYING, hotbar.get() ? 0 : 9, 35); + // Always Pot + else if ((mc.player.getMainHandStack().getItem() instanceof SwordItem || mc.player.getMainHandStack().getItem() instanceof AxeItem) && alwaysPot.get()) currentItem = Item.Potion; - if (totem.found() && !totem.isOffhand()) { - InvUtils.move().from(totem.slot()).toOffhand(); + + else currentItem = preferreditem.get(); + + // Checking offhand item + if (mc.player.getOffHandStack().getItem() != currentItem.item) { + if (ticks >= delayTicks.get()) { + if (!locked) { + FindItemResult item = InvUtils.find(itemStack -> itemStack.getItem() == currentItem.item, hotbar.get() ? 0 : 9, 35); + + // No offhand item + if (!item.found()) { + if (!sentMessage) { + warning("Chosen item not found."); + sentMessage = true; + } + } + + // Swap to offhand + else if ((isClicking || !autoTotem.isLocked() && !item.isOffhand())) { + InvUtils.move().from(item.slot()).toOffhand(); + sentMessage = false; + } + ticks = 0; + return; } - } else { - FindItemResult empty = InvUtils.find(ItemStack::isEmpty, hotbar.get() ? 0 : 9, 35); - if (empty.found()) InvUtils.move().fromOffhand().to(empty.slot()); + ticks++; } } } @EventHandler private void onMouseButton(MouseButtonEvent event) { + // Detects if the User is right-clicking isClicking = mc.currentScreen == null && !Modules.get().get(AutoTotem.class).isLocked() && !usableItem() && !mc.player.isUsingItem() && event.action == KeyAction.Press && event.button == GLFW_MOUSE_BUTTON_RIGHT; } private boolean usableItem() { + // What counts as a Usable Item return mc.player.getMainHandStack().getItem() == Items.BOW || mc.player.getMainHandStack().getItem() == Items.TRIDENT || mc.player.getMainHandStack().getItem() == Items.CROSSBOW @@ -147,20 +250,21 @@ private boolean usableItem() { @Override public String getInfoString() { - return item.get().name(); + return preferreditem.get().name(); } public enum Item { + // Items the module could put on your offhand EGap(Items.ENCHANTED_GOLDEN_APPLE), Gap(Items.GOLDEN_APPLE), Crystal(Items.END_CRYSTAL), Totem(Items.TOTEM_OF_UNDYING), - Shield(Items.SHIELD); - + Shield(Items.SHIELD), + Potion(Items.POTION); net.minecraft.item.Item item; - Item(net.minecraft.item.Item item) { this.item = item; } } + } From cf6e9b41fc31cc882be5fce3388223f9ebf85323 Mon Sep 17 00:00:00 2001 From: thebest9178 <76120883+thebest9178@users.noreply.github.com> Date: Thu, 24 Aug 2023 18:26:01 +0000 Subject: [PATCH 087/357] Liquid filler fixes (#3968) --- .../systems/modules/world/LiquidFiller.java | 168 ++++++++++++++---- 1 file changed, 133 insertions(+), 35 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/LiquidFiller.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/LiquidFiller.java index bbafad9bcd..da46f73021 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/LiquidFiller.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/LiquidFiller.java @@ -9,56 +9,91 @@ import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; +import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.player.FindItemResult; import meteordevelopment.meteorclient.utils.player.InvUtils; import meteordevelopment.meteorclient.utils.world.BlockIterator; import meteordevelopment.meteorclient.utils.world.BlockUtils; import meteordevelopment.orbit.EventHandler; import net.minecraft.block.Block; -import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; +import net.minecraft.fluid.Fluid; +import net.minecraft.fluid.Fluids; import net.minecraft.item.BlockItem; +import net.minecraft.util.math.BlockPos; +import java.util.ArrayList; +import java.util.Comparator; import java.util.List; public class LiquidFiller extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); + private final SettingGroup sgWhitelist = settings.createGroup("Whitelist"); private final Setting placeInLiquids = sgGeneral.add(new EnumSetting.Builder() .name("place-in") .description("What type of liquids to place in.") - .defaultValue(PlaceIn.Lava) + .defaultValue(PlaceIn.Both) .build() ); - private final Setting horizontalRadius = sgGeneral.add(new IntSetting.Builder() - .name("horizontal-radius") - .description("Horizontal radius in which to search for liquids.") - .defaultValue(4) - .min(0) - .sliderMax(6) + private final Setting shape = sgGeneral.add(new EnumSetting.Builder() + .name("shape") + .description("The shape of placing algorithm.") + .defaultValue(Shape.Sphere) .build() ); - private final Setting verticalRadius = sgGeneral.add(new IntSetting.Builder() - .name("vertical-radius") - .description("Vertical radius in which to search for liquids.") + private final Setting range = sgGeneral.add(new DoubleSetting.Builder() + .name("range") + .description("The place range.") .defaultValue(4) .min(0) - .sliderMax(6) .build() ); private final Setting delay = sgGeneral.add(new IntSetting.Builder() .name("delay") .description("Delay between actions in ticks.") - .defaultValue(1) + .defaultValue(0) .min(0) .build() ); - private final Setting> whitelist = sgGeneral.add(new BlockListSetting.Builder() - .name("block-whitelist") + private final Setting maxBlocksPerTick = sgGeneral.add(new IntSetting.Builder() + .name("max-blocks-per-tick") + .description("Maximum blocks to try to place per tick.") + .defaultValue(1) + .min(1) + .sliderRange(1, 10) + .build() + ); + + private final Setting sortMode = sgGeneral.add(new EnumSetting.Builder() + .name("sort-mode") + .description("The blocks you want to place first.") + .defaultValue(SortMode.Closest) + .build() + ); + + private final Setting rotate = sgGeneral.add(new BoolSetting.Builder() + .name("rotate") + .description("Automatically rotates towards the space targeted for filling.") + .defaultValue(true) + .build() + ); + + // Whitelist and blacklist + + private final Setting listMode = sgWhitelist.add(new EnumSetting.Builder() + .name("list-mode") + .description("Selection mode.") + .defaultValue(ListMode.Whitelist) + .build() + ); + + private final Setting> whitelist = sgWhitelist.add(new BlockListSetting.Builder() + .name("whitelist") .description("The allowed blocks that it will use to fill up the liquid.") .defaultValue( Blocks.DIRT, @@ -69,16 +104,19 @@ public class LiquidFiller extends Module { Blocks.GRANITE, Blocks.ANDESITE ) + .visible(() -> listMode.get() == ListMode.Whitelist) .build() ); - private final Setting rotate = sgGeneral.add(new BoolSetting.Builder() - .name("rotate") - .description("Automatically rotates towards the space targeted for filling.") - .defaultValue(true) + private final Setting> blacklist = sgWhitelist.add(new BlockListSetting.Builder() + .name("blacklist") + .description("The denied blocks that it not will use to fill up the liquid.") + .visible(() -> listMode.get() == ListMode.Blacklist) .build() ); + private final List blocks = new ArrayList<>(); + private int timer; public LiquidFiller(){ @@ -100,33 +138,93 @@ private void onTick(TickEvent.Pre event) { timer = 0; } + // Calculate some stuff + double pX = mc.player.getX(); + double pY = mc.player.getY(); + double pZ = mc.player.getZ(); + + double rangeSq = Math.pow(range.get(), 2); + + if (shape.get() == Shape.UniformCube) range.set((double) Math.round(range.get())); + // Find slot with a block - FindItemResult item = InvUtils.findInHotbar(itemStack -> itemStack.getItem() instanceof BlockItem && whitelist.get().contains(Block.getBlockFromItem(itemStack.getItem()))); + FindItemResult item; + if (listMode.get() == ListMode.Whitelist) { + item = InvUtils.findInHotbar(itemStack -> itemStack.getItem() instanceof BlockItem && whitelist.get().contains(Block.getBlockFromItem(itemStack.getItem()))); + } else { + item = InvUtils.findInHotbar(itemStack -> itemStack.getItem() instanceof BlockItem && !blacklist.get().contains(Block.getBlockFromItem(itemStack.getItem()))); + } if (!item.found()) return; // Loop blocks around the player - BlockIterator.register(horizontalRadius.get(), verticalRadius.get(), (blockPos, blockState) -> { - // Check if the block a source liquid block - if (isSource(blockState)) { - Block liquid = blockState.getBlock(); - - PlaceIn placeIn = placeInLiquids.get(); - if (placeIn == PlaceIn.Both || (placeIn == PlaceIn.Lava && liquid == Blocks.LAVA) || (placeIn == PlaceIn.Water && liquid == Blocks.WATER)) { - if (BlockUtils.place(blockPos, item, rotate.get(), 0, true)) { - BlockIterator.disableCurrent(); - } - } + BlockIterator.register((int) Math.ceil(range.get()+1), (int) Math.ceil(range.get()), (blockPos, blockState) -> { + boolean toofarSphere = Utils.squaredDistance(pX, pY, pZ, blockPos.getX() + 0.5, blockPos.getY() + 0.5, blockPos.getZ() + 0.5) > rangeSq; + boolean toofarUniformCube = maxDist(Math.floor(pX), Math.floor(pY), Math.floor(pZ), blockPos.getX(), blockPos.getY(), blockPos.getZ()) >= range.get(); + + // Check distance + if ((toofarSphere && shape.get() == Shape.Sphere) || (toofarUniformCube && shape.get() == Shape.UniformCube)) return; + + // Check if the block is a source block and set to be filled + Fluid fluid = blockState.getFluidState().getFluid(); + if ((placeInLiquids.get() == PlaceIn.Both && (fluid != Fluids.WATER && fluid != Fluids.LAVA)) + || (placeInLiquids.get() == PlaceIn.Water && fluid != Fluids.WATER) + || (placeInLiquids.get() == PlaceIn.Lava && fluid != Fluids.LAVA)) + return; + + // Check if the player can place at pos + if (!BlockUtils.canPlace(blockPos)) return; + + // Add block + blocks.add(blockPos.mutableCopy()); + }); + + BlockIterator.after(() -> { + // Sort blocks + if (sortMode.get() == SortMode.TopDown || sortMode.get() == SortMode.BottomUp) + blocks.sort(Comparator.comparingDouble(value -> value.getY() * (sortMode.get() == SortMode.BottomUp ? 1 : -1))); + else if (sortMode.get() != SortMode.None) + blocks.sort(Comparator.comparingDouble(value -> Utils.squaredDistance(pX, pY, pZ, value.getX() + 0.5, value.getY() + 0.5, value.getZ() + 0.5) * (sortMode.get() == SortMode.Closest ? 1 : -1))); + + // Place and clear place positions + int count = 0; + for (BlockPos pos : blocks) { + if (count >= maxBlocksPerTick.get()) break; + BlockUtils.place(pos, item, rotate.get(), 0, true); + count++; } + blocks.clear(); }); } - private boolean isSource(BlockState blockState) { - return blockState.getFluidState().getLevel() == 8 && blockState.getFluidState().isStill(); + public enum ListMode { + Whitelist, + Blacklist } public enum PlaceIn { - Lava, + Both, Water, - Both + Lava + } + + public enum SortMode { + None, + Closest, + Furthest, + TopDown, + BottomUp + } + + public enum Shape { + Sphere, + UniformCube + } + + private static double maxDist(double x1, double y1, double z1, double x2, double y2, double z2) { + // Gets the largest X, Y or Z difference, manhattan style + double dX = Math.ceil(Math.abs(x2 - x1)); + double dY = Math.ceil(Math.abs(y2 - y1)); + double dZ = Math.ceil(Math.abs(z2 - z1)); + return Math.max(Math.max(dX, dY), dZ); } } From ce32561075dfb61ac5653cc01f784eb5c6b4989b Mon Sep 17 00:00:00 2001 From: The Raccoon <116294072+RaccTheRicky@users.noreply.github.com> Date: Fri, 25 Aug 2023 08:06:25 -0500 Subject: [PATCH 088/357] Add quickSwap() Action (#3985) --- .../systems/modules/misc/InventoryTweaks.java | 2 +- .../systems/modules/world/AutoBrewer.java | 2 +- .../systems/modules/world/AutoSmelter.java | 2 +- .../systems/modules/world/InfinityMiner.java | 4 ++-- .../meteorclient/utils/player/InvUtils.java | 17 ++++++++++++++++- 5 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/InventoryTweaks.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/InventoryTweaks.java index 729e372a65..c7bc6311ca 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/InventoryTweaks.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/InventoryTweaks.java @@ -398,7 +398,7 @@ private void moveSlots(ScreenHandler handler, int start, int end, boolean steal) int iCopy = i; Rotations.rotate(mc.player.getYaw() - 180, mc.player.getPitch(), () -> InvUtils.drop().slotId(iCopy)); } - } else InvUtils.quickMove().slotId(i); + } else InvUtils.shiftClick().slotId(i); } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoBrewer.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoBrewer.java index 2482423a1b..4384ee17ce 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoBrewer.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoBrewer.java @@ -159,7 +159,7 @@ private boolean insertWaterBottles(BrewingStandScreenHandler c) { private boolean takePotions(BrewingStandScreenHandler c) { for (int i = 0; i < 3; i++) { - InvUtils.quickMove().slotId(i); + InvUtils.shiftClick().slotId(i); if (!c.slots.get(i).getStack().isEmpty()) { error("You do not have a sufficient amount of inventory space... disabling."); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSmelter.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSmelter.java index 2b98278154..f74847aa5b 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSmelter.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSmelter.java @@ -138,7 +138,7 @@ private void takeResults(AbstractFurnaceScreenHandler c) { ItemStack resultStack = c.slots.get(2).getStack(); if (resultStack.isEmpty()) return; - InvUtils.quickMove().slotId(2); + InvUtils.shiftClick().slotId(2); if (!resultStack.isEmpty()) { error("Your inventory is full. Disabling."); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/InfinityMiner.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/InfinityMiner.java index 4a133445ec..1d8eb64b1b 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/InfinityMiner.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/InfinityMiner.java @@ -188,7 +188,7 @@ private boolean findPickaxe() { && !Utils.hasEnchantments(stack, Enchantments.SILK_TOUCH)); FindItemResult bestPick = InvUtils.findInHotbar(pickaxePredicate); - if (bestPick.isOffhand()) InvUtils.quickMove().fromOffhand().toHotbar(mc.player.getInventory().selectedSlot); + if (bestPick.isOffhand()) InvUtils.shiftClick().fromOffhand().toHotbar(mc.player.getInventory().selectedSlot); else if (bestPick.isHotbar()) InvUtils.swap(bestPick.slot(), false); return InvUtils.testInMainHand(pickaxePredicate); @@ -233,7 +233,7 @@ private boolean isFull() { for (int i = 0; i <= 35; i++) { ItemStack itemStack = mc.player.getInventory().getStack(i); if (itemStack.isEmpty()) return false; - + for (Item item : targetItems.get()) { if (itemStack.getItem() == item && itemStack.getCount() < itemStack.getMaxCount()) { return false; diff --git a/src/main/java/meteordevelopment/meteorclient/utils/player/InvUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/player/InvUtils.java index 11e5602a81..620b77adc0 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/player/InvUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/player/InvUtils.java @@ -178,7 +178,17 @@ public static Action click() { return ACTION; } - public static Action quickMove() { + /** + * When writing code with quickSwap, both to and from should provide the ID of a slot, not the index. + * From should be the slot in the hotbar, to should be the slot you're switching an item from. + */ + + public static Action quickSwap() { + ACTION.type = SlotActionType.SWAP; + return ACTION; + } + + public static Action shiftClick() { ACTION.type = SlotActionType.QUICK_MOVE; return ACTION; } @@ -290,6 +300,11 @@ public void slotArmor(int i) { private void run() { boolean hadEmptyCursor = mc.player.currentScreenHandler.getCursorStack().isEmpty(); + if (type == SlotActionType.SWAP) { + data = from; + from = to; + } + if (type != null && from != -1 && to != -1) { click(from); if (two) click(to); From e066654ea3862fa772dcdfb2546aef7ef6b6ab59 Mon Sep 17 00:00:00 2001 From: 19MisterX98 <41451155+19MisterX98@users.noreply.github.com> Date: Sun, 27 Aug 2023 18:12:38 +0200 Subject: [PATCH 089/357] Fix Block ESP (#4009) --- .../meteorclient/systems/modules/render/blockesp/ESPChunk.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/blockesp/ESPChunk.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/blockesp/ESPChunk.java index cc39ce2a30..0fac693cf3 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/blockesp/ESPChunk.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/blockesp/ESPChunk.java @@ -21,7 +21,6 @@ import static meteordevelopment.meteorclient.utils.Utils.getRenderDistance; public class ESPChunk { - private static final BlockPos.Mutable blockPos = new BlockPos.Mutable(); private final int x, z; public Long2ObjectMap blocks; @@ -91,6 +90,8 @@ public static ESPChunk searchChunk(Chunk chunk, List blocks) { ESPChunk schunk = new ESPChunk(chunk.getPos().x, chunk.getPos().z); if (schunk.shouldBeDeleted()) return schunk; + BlockPos.Mutable blockPos = new BlockPos.Mutable(); + for (int x = chunk.getPos().getStartX(); x <= chunk.getPos().getEndX(); x++) { for (int z = chunk.getPos().getStartZ(); z <= chunk.getPos().getEndZ(); z++) { int height = chunk.getHeightmap(Heightmap.Type.WORLD_SURFACE).get(x - chunk.getPos().getStartX(), z - chunk.getPos().getStartZ()); From 0b32e28de5433444aede8e437f79060a7da55ecb Mon Sep 17 00:00:00 2001 From: 19MisterX98 <41451155+19MisterX98@users.noreply.github.com> Date: Tue, 29 Aug 2023 20:15:46 +0200 Subject: [PATCH 090/357] Fix fastuse when item is in offhand (#4019) --- .../mixin/MinecraftClientAccessor.java | 6 ------ .../mixin/MinecraftClientMixin.java | 15 +++++++++++++++ .../systems/modules/player/FastUse.java | 17 +++++------------ 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftClientAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftClientAccessor.java index 9a878dddef..cdc94cc8fd 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftClientAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftClientAccessor.java @@ -36,12 +36,6 @@ static int getFps() { @Accessor("networkProxy") Proxy getProxy(); - @Accessor("itemUseCooldown") - void setItemUseCooldown(int itemUseCooldown); - - @Accessor("itemUseCooldown") - int getItemUseCooldown(); - @Accessor("resourceReloadLogger") ResourceReloadLogger getResourceReloadLogger(); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftClientMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftClientMixin.java index 46363df5e9..7f2f15c401 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftClientMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftClientMixin.java @@ -18,6 +18,7 @@ import meteordevelopment.meteorclient.mixininterface.IMinecraftClient; import meteordevelopment.meteorclient.systems.config.Config; import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.player.FastUse; import meteordevelopment.meteorclient.systems.modules.render.UnfocusedCPU; import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.misc.MeteorStarscript; @@ -30,6 +31,8 @@ import net.minecraft.client.option.GameOptions; import net.minecraft.client.util.Window; import net.minecraft.client.world.ClientWorld; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Hand; import net.minecraft.util.hit.HitResult; import net.minecraft.util.profiler.Profiler; import org.jetbrains.annotations.Nullable; @@ -42,6 +45,7 @@ import org.spongepowered.asm.mixin.injection.ModifyArg; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; import java.util.concurrent.CompletableFuture; @@ -66,6 +70,9 @@ public abstract class MinecraftClientMixin implements IMinecraftClient { @Nullable public ClientPlayerInteractionManager interactionManager; + @Shadow + private int itemUseCooldown; + @Inject(method = "", at = @At("TAIL")) private void onInit(CallbackInfo info) { MeteorClient.INSTANCE.onInitializeClient(); @@ -114,6 +121,14 @@ private void onSetScreen(Screen screen, CallbackInfo info) { if (event.isCancelled()) info.cancel(); } + @Inject(method = "doItemUse", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;isItemEnabled(Lnet/minecraft/resource/featuretoggle/FeatureSet;)Z"), locals = LocalCapture.CAPTURE_FAILHARD) + private void onDoItemUseHand(CallbackInfo ci, Hand[] var1, int var2, int var3, Hand hand, ItemStack itemStack) { + FastUse fastUse = Modules.get().get(FastUse.class); + if (fastUse.isActive()) { + itemUseCooldown = fastUse.getItemUseCooldown(itemStack); + } + } + @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; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/FastUse.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/FastUse.java index f3cf17ab38..0a17c7d48a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/FastUse.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/FastUse.java @@ -5,12 +5,9 @@ package meteordevelopment.meteorclient.systems.modules.player; -import meteordevelopment.meteorclient.events.world.TickEvent; -import meteordevelopment.meteorclient.mixin.MinecraftClientAccessor; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; -import meteordevelopment.orbit.EventHandler; import net.minecraft.item.BlockItem; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -60,15 +57,11 @@ public FastUse() { super(Categories.Player, "fast-use", "Allows you to use items at very high speeds."); } - @EventHandler - private void onTick(TickEvent.Post event) { - int cooldownTicks = Math.min(((MinecraftClientAccessor) mc).getItemUseCooldown(), cooldown.get()); - if (mode.get() == Mode.All || shouldWorkSome()) ((MinecraftClientAccessor) mc).setItemUseCooldown(cooldownTicks); - } - - private boolean shouldWorkSome() { - if (shouldWorkSome(mc.player.getMainHandStack())) return true; - return shouldWorkSome(mc.player.getOffHandStack()); + public int getItemUseCooldown(ItemStack itemStack) { + if (mode.get() == Mode.All || shouldWorkSome(itemStack)) { + return cooldown.get(); + } + return 4; //default cooldown } private boolean shouldWorkSome(ItemStack itemStack) { From 7d4645a0bf4cbc4c70441ba899dfbe5b074b2f3e Mon Sep 17 00:00:00 2001 From: supakeks <70498670+supakeks@users.noreply.github.com> Date: Sat, 2 Sep 2023 10:05:58 -0400 Subject: [PATCH 091/357] Improved ElytraFly Recast mode (#4010) --- .../meteorclient/mixin/LivingEntityMixin.java | 6 +- .../movement/elytrafly/ElytraFlightMode.java | 5 +- .../movement/elytrafly/ElytraFlightModes.java | 2 +- .../modules/movement/elytrafly/ElytraFly.java | 81 ++++++++++--------- .../modes/{Recast.java => Bounce.java} | 53 +++++++++--- 5 files changed, 94 insertions(+), 53 deletions(-) rename src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/modes/{Recast.java => Bounce.java} (66%) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java index 97282fc5b2..b4bccd5aa8 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java @@ -12,7 +12,7 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.movement.elytrafly.ElytraFlightModes; import meteordevelopment.meteorclient.systems.modules.movement.elytrafly.ElytraFly; -import meteordevelopment.meteorclient.systems.modules.movement.elytrafly.modes.Recast; +import meteordevelopment.meteorclient.systems.modules.movement.elytrafly.modes.Bounce; import meteordevelopment.meteorclient.systems.modules.player.OffhandCrash; import meteordevelopment.meteorclient.systems.modules.player.PotionSpoof; import meteordevelopment.meteorclient.systems.modules.render.HandView; @@ -117,8 +117,8 @@ private boolean isFallFlyingHook(boolean original) { public void recastOnLand(CallbackInfoReturnable cir) { boolean elytra = cir.getReturnValue(); ElytraFly elytraFly = Modules.get().get(ElytraFly.class); - if (previousElytra && !elytra && elytraFly.isActive() && elytraFly.flightMode.get() == ElytraFlightModes.Recast) { - cir.setReturnValue(Recast.recastElytra(mc.player)); + if (previousElytra && !elytra && elytraFly.isActive() && elytraFly.flightMode.get() == ElytraFlightModes.Bounce) { + cir.setReturnValue(Bounce.recastElytra(mc.player)); } previousElytra = elytra; } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFlightMode.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFlightMode.java index fdd01be6f9..36b3374e46 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFlightMode.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFlightMode.java @@ -60,6 +60,9 @@ public void onTick() { } } + public void onPreTick() { + } + public void onPacketSend(PacketEvent.Send event) { } @@ -106,7 +109,7 @@ public void autoTakeoff() { public void handleAutopilot() { if (!mc.player.isFallFlying()) return; - if (elytraFly.autoPilot.get() && mc.player.getY() > elytraFly.autoPilotMinimumHeight.get() && elytraFly.flightMode.get() != ElytraFlightModes.Recast) { + if (elytraFly.autoPilot.get() && mc.player.getY() > elytraFly.autoPilotMinimumHeight.get() && elytraFly.flightMode.get() != ElytraFlightModes.Bounce) { mc.options.forwardKey.setPressed(true); lastForwardPressed = true; } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFlightModes.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFlightModes.java index 9e7badcb0f..46bece5e88 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFlightModes.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFlightModes.java @@ -9,5 +9,5 @@ public enum ElytraFlightModes { Vanilla, Packet, Pitch40, - Recast + Bounce } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFly.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFly.java index face4d9924..1fa68637e2 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFly.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFly.java @@ -16,21 +16,15 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.movement.elytrafly.modes.Packet; import meteordevelopment.meteorclient.systems.modules.movement.elytrafly.modes.Pitch40; -import meteordevelopment.meteorclient.systems.modules.movement.elytrafly.modes.Recast; +import meteordevelopment.meteorclient.systems.modules.movement.elytrafly.modes.Bounce; import meteordevelopment.meteorclient.systems.modules.movement.elytrafly.modes.Vanilla; import meteordevelopment.meteorclient.systems.modules.player.ChestSwap; import meteordevelopment.meteorclient.systems.modules.render.Freecam; -import meteordevelopment.meteorclient.utils.misc.input.Input; import meteordevelopment.orbit.EventHandler; import net.minecraft.block.Block; import net.minecraft.block.BlockState; -import net.minecraft.client.network.ClientPlayNetworkHandler; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.client.option.KeyBinding; import net.minecraft.entity.EquipmentSlot; -import net.minecraft.entity.effect.StatusEffects; import net.minecraft.item.ElytraItem; -import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.network.packet.c2s.play.ClientCommandC2SPacket; import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket; @@ -60,7 +54,7 @@ public class ElytraFly extends Module { .name("auto-take-off") .description("Automatically takes off when you hold jump without needing to double jump.") .defaultValue(false) - .visible(() -> flightMode.get() != ElytraFlightModes.Pitch40) + .visible(() -> flightMode.get() != ElytraFlightModes.Pitch40 && flightMode.get() != ElytraFlightModes.Bounce) .build() ); @@ -69,7 +63,7 @@ public class ElytraFly extends Module { .description("Controls how fast will you go down naturally.") .defaultValue(0.01) .min(0) - .visible(() -> flightMode.get() != ElytraFlightModes.Pitch40 && flightMode.get() != ElytraFlightModes.Recast) + .visible(() -> flightMode.get() != ElytraFlightModes.Pitch40 && flightMode.get() != ElytraFlightModes.Bounce) .build() ); @@ -78,7 +72,7 @@ public class ElytraFly extends Module { .description("How fast you go forward and backward.") .defaultValue(1) .min(0) - .visible(() -> flightMode.get() != ElytraFlightModes.Pitch40 && flightMode.get() != ElytraFlightModes.Recast) + .visible(() -> flightMode.get() != ElytraFlightModes.Pitch40 && flightMode.get() != ElytraFlightModes.Bounce) .build() ); @@ -87,14 +81,14 @@ public class ElytraFly extends Module { .description("How fast you go up and down.") .defaultValue(1) .min(0) - .visible(() -> flightMode.get() != ElytraFlightModes.Pitch40 && flightMode.get() != ElytraFlightModes.Recast) + .visible(() -> flightMode.get() != ElytraFlightModes.Pitch40 && flightMode.get() != ElytraFlightModes.Bounce) .build() ); public final Setting acceleration = sgGeneral.add(new BoolSetting.Builder() .name("acceleration") .defaultValue(false) - .visible(() -> flightMode.get() != ElytraFlightModes.Pitch40 && flightMode.get() != ElytraFlightModes.Recast) + .visible(() -> flightMode.get() != ElytraFlightModes.Pitch40 && flightMode.get() != ElytraFlightModes.Bounce) .build() ); @@ -103,7 +97,7 @@ public class ElytraFly extends Module { .min(0.1) .max(5) .defaultValue(1) - .visible(() -> flightMode.get() != ElytraFlightModes.Pitch40 && acceleration.get() && flightMode.get() != ElytraFlightModes.Recast) + .visible(() -> flightMode.get() != ElytraFlightModes.Pitch40 && acceleration.get() && flightMode.get() != ElytraFlightModes.Bounce) .build() ); @@ -111,7 +105,7 @@ public class ElytraFly extends Module { .name("acceleration-start") .min(0.1) .defaultValue(0) - .visible(() -> flightMode.get() != ElytraFlightModes.Pitch40 && acceleration.get() && flightMode.get() != ElytraFlightModes.Recast) + .visible(() -> flightMode.get() != ElytraFlightModes.Pitch40 && acceleration.get() && flightMode.get() != ElytraFlightModes.Bounce) .build() ); @@ -119,7 +113,7 @@ public class ElytraFly extends Module { .name("stop-in-water") .description("Stops flying in water.") .defaultValue(true) - .visible(() -> flightMode.get() != ElytraFlightModes.Recast) + .visible(() -> flightMode.get() != ElytraFlightModes.Bounce) .build() ); @@ -134,7 +128,7 @@ public class ElytraFly extends Module { .name("auto-hover") .description("Automatically hover .3 blocks off ground when holding shift.") .defaultValue(false) - .visible(() -> flightMode.get() != ElytraFlightModes.Recast) + .visible(() -> flightMode.get() != ElytraFlightModes.Bounce) .build() ); @@ -142,7 +136,7 @@ public class ElytraFly extends Module { .name("no-crash") .description("Stops you from going into walls.") .defaultValue(false) - .visible(() -> flightMode.get() != ElytraFlightModes.Recast) + .visible(() -> flightMode.get() != ElytraFlightModes.Bounce) .build() ); @@ -152,7 +146,7 @@ public class ElytraFly extends Module { .defaultValue(5) .range(1, 15) .sliderMin(1) - .visible(noCrash::get) + .visible(() -> noCrash.get() && flightMode.get() != ElytraFlightModes.Bounce) .build() ); @@ -160,7 +154,7 @@ public class ElytraFly extends Module { .name("insta-drop") .description("Makes you drop out of flight instantly.") .defaultValue(false) - .visible(() -> flightMode.get() != ElytraFlightModes.Recast) + .visible(() -> flightMode.get() != ElytraFlightModes.Bounce) .build() ); @@ -198,7 +192,7 @@ public class ElytraFly extends Module { .name("auto-jump") .description("Automatically jumps for you.") .defaultValue(true) - .visible(() -> flightMode.get() == ElytraFlightModes.Recast) + .visible(() -> flightMode.get() == ElytraFlightModes.Bounce) .build() ); @@ -208,7 +202,7 @@ public class ElytraFly extends Module { .defaultValue(85) .range(0, 90) .sliderRange(0, 90) - .visible(() -> flightMode.get() == ElytraFlightModes.Recast) + .visible(() -> flightMode.get() == ElytraFlightModes.Bounce) .build() ); @@ -216,7 +210,7 @@ public class ElytraFly extends Module { .name("restart") .description("Restarts flying with the elytra when rubberbanding.") .defaultValue(true) - .visible(() -> flightMode.get() == ElytraFlightModes.Recast) + .visible(() -> flightMode.get() == ElytraFlightModes.Bounce) .build() ); @@ -224,9 +218,17 @@ public class ElytraFly extends Module { .name("restart-delay") .description("How many ticks to wait before restarting the elytra again after rubberbanding.") .defaultValue(7) - .range(0, 20) + .min(0) .sliderRange(0, 20) - .visible(() -> flightMode.get() == ElytraFlightModes.Recast && restart.get()) + .visible(() -> flightMode.get() == ElytraFlightModes.Bounce && restart.get()) + .build() + ); + + public final Setting sprint = sgGeneral.add(new BoolSetting.Builder() + .name("sprint") + .description("Sprints all the time. If turned off, it will only sprint when the player is touching the ground.") + .defaultValue(true) + .visible(() -> flightMode.get() == ElytraFlightModes.Bounce) .build() ); @@ -279,7 +281,7 @@ public class ElytraFly extends Module { .name("auto-pilot") .description("Moves forward while elytra flying.") .defaultValue(false) - .visible(() -> flightMode.get() != ElytraFlightModes.Pitch40 && flightMode.get() != ElytraFlightModes.Recast) + .visible(() -> flightMode.get() != ElytraFlightModes.Pitch40 && flightMode.get() != ElytraFlightModes.Bounce) .build() ); @@ -287,7 +289,7 @@ public class ElytraFly extends Module { .name("use-fireworks") .description("Uses firework rockets every second of your choice.") .defaultValue(false) - .visible(() -> autoPilot.get() && flightMode.get() != ElytraFlightModes.Pitch40 && flightMode.get() != ElytraFlightModes.Recast) + .visible(() -> autoPilot.get() && flightMode.get() != ElytraFlightModes.Pitch40 && flightMode.get() != ElytraFlightModes.Bounce) .build() ); @@ -297,7 +299,7 @@ public class ElytraFly extends Module { .min(1) .defaultValue(8) .sliderMax(20) - .visible(() -> useFireworks.get() && flightMode.get() != ElytraFlightModes.Pitch40 && flightMode.get() != ElytraFlightModes.Recast) + .visible(() -> useFireworks.get() && flightMode.get() != ElytraFlightModes.Pitch40 && flightMode.get() != ElytraFlightModes.Bounce) .build() ); @@ -307,7 +309,7 @@ public class ElytraFly extends Module { .defaultValue(120) .min(-128) .sliderMax(260) - .visible(() -> autoPilot.get() && flightMode.get() != ElytraFlightModes.Pitch40 && flightMode.get() != ElytraFlightModes.Recast) + .visible(() -> autoPilot.get() && flightMode.get() != ElytraFlightModes.Pitch40 && flightMode.get() != ElytraFlightModes.Bounce) .build() ); @@ -321,7 +323,7 @@ public ElytraFly() { public void onActivate() { currentMode.onActivate(); if ((chestSwap.get() == ChestSwapMode.Always || chestSwap.get() == ChestSwapMode.WaitForGround) - && mc.player.getEquippedStack(EquipmentSlot.CHEST).getItem() != Items.ELYTRA) { + && mc.player.getEquippedStack(EquipmentSlot.CHEST).getItem() != Items.ELYTRA) { Modules.get().get(ChestSwap.class).swap(); } } @@ -351,7 +353,7 @@ private void onPlayerMove(PlayerMoveEvent event) { if (mc.player.isFallFlying()) { - if (flightMode.get() != ElytraFlightModes.Recast) { + if (flightMode.get() != ElytraFlightModes.Bounce) { currentMode.velX = 0; currentMode.velY = event.movement.y; currentMode.velZ = 0; @@ -376,21 +378,21 @@ private void onPlayerMove(PlayerMoveEvent event) { int chunkZ = (int) ((mc.player.getZ() + currentMode.velZ) / 16); if (dontGoIntoUnloadedChunks.get()) { if (mc.world.getChunkManager().isChunkLoaded(chunkX, chunkZ)) { - if (flightMode.get() != ElytraFlightModes.Recast) ((IVec3d) event.movement).set(currentMode.velX, currentMode.velY, currentMode.velZ); + if (flightMode.get() != ElytraFlightModes.Bounce) ((IVec3d) event.movement).set(currentMode.velX, currentMode.velY, currentMode.velZ); } else { ((IVec3d) event.movement).set(0, currentMode.velY, 0); } - } else if (flightMode.get() != ElytraFlightModes.Recast) ((IVec3d) event.movement).set(currentMode.velX, currentMode.velY, currentMode.velZ); + } else if (flightMode.get() != ElytraFlightModes.Bounce) ((IVec3d) event.movement).set(currentMode.velX, currentMode.velY, currentMode.velZ); - if (flightMode.get() != ElytraFlightModes.Recast) currentMode.onPlayerMove(); + if (flightMode.get() != ElytraFlightModes.Bounce) currentMode.onPlayerMove(); } else { - if (currentMode.lastForwardPressed && flightMode.get() != ElytraFlightModes.Recast) { + if (currentMode.lastForwardPressed && flightMode.get() != ElytraFlightModes.Bounce) { mc.options.forwardKey.setPressed(false); currentMode.lastForwardPressed = false; } } - if (noCrash.get() && mc.player.isFallFlying() && flightMode.get() != ElytraFlightModes.Recast) { + if (noCrash.get() && mc.player.isFallFlying() && flightMode.get() != ElytraFlightModes.Bounce) { Vec3d lookAheadPos = mc.player.getPos().add(mc.player.getVelocity().normalize().multiply(crashLookAhead.get())); RaycastContext raycastContext = new RaycastContext(mc.player.getPos(), new Vec3d(lookAheadPos.getX(), mc.player.getY(), lookAheadPos.getZ()), RaycastContext.ShapeType.COLLIDER, RaycastContext.FluidHandling.NONE, mc.player); BlockHitResult hitResult = mc.world.raycast(raycastContext); @@ -399,7 +401,7 @@ private void onPlayerMove(PlayerMoveEvent event) { } } - if (autoHover.get() && mc.player.input.sneaking && !Modules.get().get(Freecam.class).isActive() && mc.player.isFallFlying() && flightMode.get() != ElytraFlightModes.Recast) { + if (autoHover.get() && mc.player.input.sneaking && !Modules.get().get(Freecam.class).isActive() && mc.player.isFallFlying() && flightMode.get() != ElytraFlightModes.Bounce) { BlockState underState = mc.world.getBlockState(mc.player.getBlockPos().down()); Block under = underState.getBlock(); BlockState under2State = mc.world.getBlockState(mc.player.getBlockPos().down().down()); @@ -437,6 +439,11 @@ private void onTick(TickEvent.Post event) { currentMode.onTick(); } + @EventHandler + private void onPreTick(TickEvent.Pre event) { + currentMode.onPreTick(); + } + @EventHandler private void onPacketSend(PacketEvent.Send event) { currentMode.onPacketSend(event); @@ -455,7 +462,7 @@ private void onModeChanged(ElytraFlightModes mode) { currentMode = new Pitch40(); autoPilot.set(false); // Pitch 40 is an autopilot of its own } - case Recast -> currentMode = new Recast(); + case Bounce -> currentMode = new Bounce(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/modes/Recast.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/modes/Bounce.java similarity index 66% rename from src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/modes/Recast.java rename to src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/modes/Bounce.java index 8b21c15def..3549f0b969 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/modes/Recast.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/modes/Bounce.java @@ -12,7 +12,6 @@ import meteordevelopment.meteorclient.events.packets.PacketEvent; import meteordevelopment.meteorclient.systems.modules.movement.elytrafly.ElytraFlightMode; import meteordevelopment.meteorclient.systems.modules.movement.elytrafly.ElytraFlightModes; -import meteordevelopment.meteorclient.systems.modules.movement.elytrafly.ElytraFly; import meteordevelopment.meteorclient.utils.misc.input.Input; import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.client.option.KeyBinding; @@ -24,42 +23,60 @@ import net.minecraft.network.packet.c2s.play.ClientCommandC2SPacket; import net.minecraft.network.packet.s2c.play.PlayerPositionLookS2CPacket; -public class Recast extends ElytraFlightMode { +public class Bounce extends ElytraFlightMode { - public Recast() { - super(ElytraFlightModes.Recast); + public Bounce() { + super(ElytraFlightModes.Bounce); } - public static boolean rubberbanded = false; + boolean rubberbanded = false; int tickDelay = elytraFly.restartDelay.get(); + double prevFov; @Override public void onTick() { super.onTick(); + if (mc.options.jumpKey.isPressed() && !mc.player.isFallFlying()) mc.getNetworkHandler().sendPacket(new ClientCommandC2SPacket(mc.player, ClientCommandC2SPacket.Mode.START_FALL_FLYING)); + // Make sure all the conditions are met (player has an elytra, isn't in water, etc) if (checkConditions(mc.player)) { - mc.player.setSprinting(true); - setPressed(mc.options.forwardKey, true); - if (elytraFly.autoJump.get()) setPressed(mc.options.jumpKey, true); - mc.player.setYaw(getSmartYawDirection()); - mc.player.setPitch(elytraFly.pitch.get().floatValue()); + if (!rubberbanded) { + if (prevFov != 0 && !elytraFly.sprint.get()) mc.options.getFovEffectScale().setValue(0.0); // This stops the FOV effects from constantly going on and off. + if (elytraFly.autoJump.get()) setPressed(mc.options.jumpKey, true); + setPressed(mc.options.forwardKey, true); + mc.player.setYaw(getSmartYawDirection()); + mc.player.setPitch(elytraFly.pitch.get().floatValue()); + } + + if (!elytraFly.sprint.get()) { + // Sprinting all the time (when not on ground) makes it rubberband on certain anticheats. + if (mc.player.isFallFlying()) mc.player.setSprinting(mc.player.isOnGround()); + else mc.player.setSprinting(true); + } // Rubberbanding if (rubberbanded && elytraFly.restart.get()) { if (tickDelay > 0) { tickDelay--; } else { - rubberbanded = false; mc.getNetworkHandler().sendPacket(new ClientCommandC2SPacket(mc.player, ClientCommandC2SPacket.Mode.START_FALL_FLYING)); + rubberbanded = false; tickDelay = elytraFly.restartDelay.get(); } } } } + @Override + public void onPreTick() { + super.onPreTick(); + + if (checkConditions(mc.player) && elytraFly.sprint.get()) mc.player.setSprinting(true); + } + private void unpress() { setPressed(mc.options.forwardKey, false); if (elytraFly.autoJump.get()) setPressed(mc.options.jumpKey, false); @@ -73,6 +90,13 @@ public void onPacketReceive(PacketEvent.Receive event) { } } + @Override + public void onPacketSend(PacketEvent.Send event) { + if (event.packet instanceof ClientCommandC2SPacket && ((ClientCommandC2SPacket) event.packet).getMode().equals(ClientCommandC2SPacket.Mode.START_FALL_FLYING) && !elytraFly.sprint.get()) { + mc.player.setSprinting(true); + } + } + private void setPressed(KeyBinding key, boolean pressed) { key.setPressed(pressed); @@ -105,8 +129,15 @@ private float getSmartYawDirection() { return Math.round((mc.player.getYaw() + 1f) / 45f) * 45f; } + @Override + public void onActivate() { + prevFov = mc.options.getFovEffectScale().getValue(); + } + @Override public void onDeactivate() { unpress(); + rubberbanded = false; + if (prevFov != 0 && !elytraFly.sprint.get()) mc.options.getFovEffectScale().setValue(prevFov); } } From 3af641e785d98db8d79b34114ff0bfc892348a7b Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Sat, 2 Sep 2023 16:19:14 -0400 Subject: [PATCH 092/357] improve anti afk (#4033) --- .../systems/modules/movement/AntiAFK.java | 306 +++++++----------- 1 file changed, 123 insertions(+), 183 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AntiAFK.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AntiAFK.java index 1ab24dfebe..49a4c6200b 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AntiAFK.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AntiAFK.java @@ -6,12 +6,6 @@ package meteordevelopment.meteorclient.systems.modules.movement; import meteordevelopment.meteorclient.events.world.TickEvent; -import meteordevelopment.meteorclient.gui.GuiTheme; -import meteordevelopment.meteorclient.gui.widgets.WWidget; -import meteordevelopment.meteorclient.gui.widgets.containers.WTable; -import meteordevelopment.meteorclient.gui.widgets.input.WTextBox; -import meteordevelopment.meteorclient.gui.widgets.pressable.WMinus; -import meteordevelopment.meteorclient.gui.widgets.pressable.WPlus; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; @@ -19,83 +13,50 @@ import meteordevelopment.meteorclient.utils.player.ChatUtils; import meteordevelopment.meteorclient.utils.player.Rotations; import meteordevelopment.orbit.EventHandler; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtElement; -import net.minecraft.nbt.NbtList; -import net.minecraft.nbt.NbtString; -import java.util.ArrayList; import java.util.List; import java.util.Random; public class AntiAFK extends Module { - public enum SpinMode { - Server, - Client - } - private final SettingGroup sgActions = settings.createGroup("Actions"); private final SettingGroup sgMessages = settings.createGroup("Messages"); // Actions - private final Setting spin = sgActions.add(new BoolSetting.Builder() - .name("spin") - .description("Spins.") - .defaultValue(true) - .build() - ); - - private final Setting spinMode = sgActions.add(new EnumSetting.Builder() - .name("spin-mode") - .description("The method of rotating.") - .defaultValue(SpinMode.Server) - .visible(spin::get) - .build() - ); - - private final Setting spinSpeed = sgActions.add(new IntSetting.Builder() - .name("spin-speed") - .description("The speed to spin you.") - .defaultValue(7) - .visible(spin::get) - .build() - ); - - private final Setting pitch = sgActions.add(new DoubleSetting.Builder() - .name("pitch") - .description("The pitch to set in server mode.") - .defaultValue(-90) - .range(-90, 90) - .sliderRange(-90, 90) - .visible(() -> spin.get() && spinMode.get() == SpinMode.Server) - .build() - ); - private final Setting jump = sgActions.add(new BoolSetting.Builder() .name("jump") - .description("Jumps.") + .description("Jump randomly.") .defaultValue(true) .build() ); - private final Setting click = sgActions.add(new BoolSetting.Builder() - .name("click") - .description("Clicks.") + private final Setting swing = sgActions.add(new BoolSetting.Builder() + .name("swing") + .description("Swings your hand.") .defaultValue(false) .build() ); - private final Setting disco = sgActions.add(new BoolSetting.Builder() - .name("disco") + private final Setting sneak = sgActions.add(new BoolSetting.Builder() + .name("sneak") .description("Sneaks and unsneaks quickly.") .defaultValue(false) .build() ); + private final Setting sneakTime = sgActions.add(new IntSetting.Builder() + .name("sneak-time") + .description("How many ticks to stay sneaked.") + .defaultValue(5) + .min(1) + .sliderMin(1) + .visible(sneak::get) + .build() + ); + private final Setting strafe = sgActions.add(new BoolSetting.Builder() .name("strafe") - .description("Strafe right and left") + .description("Strafe right and left.") .defaultValue(false) .onChanged(aBoolean -> { strafeTimer = 0; @@ -109,6 +70,40 @@ public enum SpinMode { .build() ); + private final Setting spin = sgActions.add(new BoolSetting.Builder() + .name("spin") + .description("Spins the player in place.") + .defaultValue(true) + .build() + ); + + private final Setting spinMode = sgActions.add(new EnumSetting.Builder() + .name("spin-mode") + .description("The method of rotating.") + .defaultValue(SpinMode.Server) + .visible(spin::get) + .build() + ); + + private final Setting spinSpeed = sgActions.add(new IntSetting.Builder() + .name("speed") + .description("The speed to spin you.") + .defaultValue(7) + .visible(spin::get) + .build() + ); + + private final Setting pitch = sgActions.add(new IntSetting.Builder() + .name("pitch") + .description("The pitch to send to the server.") + .defaultValue(0) + .range(-90, 90) + .sliderRange(-90, 90) + .visible(() -> spin.get() && spinMode.get() == SpinMode.Server) + .build() + ); + + // Messages private final Setting sendMessages = sgMessages.add(new BoolSetting.Builder() @@ -118,40 +113,56 @@ public enum SpinMode { .build() ); + private final Setting randomMessage = sgMessages.add(new BoolSetting.Builder() + .name("random") + .description("Selects a random message from your message list.") + .defaultValue(false) + .visible(sendMessages::get) + .build() + ); + private final Setting delay = sgMessages.add(new IntSetting.Builder() .name("delay") .description("The delay between specified messages in seconds.") - .defaultValue(2) + .defaultValue(15) .min(0) - .sliderMax(20) + .sliderMax(30) + .visible(sendMessages::get) .build() ); - private final Setting randomMessage = sgMessages.add(new BoolSetting.Builder() - .name("random") - .description("Selects a random message from your message list.") - .defaultValue(false) + private final Setting> messages = sgMessages.add(new StringListSetting.Builder() + .name("messages") + .description("The messages to choose from.") + .defaultValue( + "Meteor on top!", + "Meteor on crack!" + ) + .visible(sendMessages::get) .build() ); - private final List messages = new ArrayList<>(); - private int timer; - private int messageI; - private int strafeTimer = 0; - private boolean direction = false; + public AntiAFK() { + super(Categories.Player, "anti-afk", "Performs different actions to prevent getting kicked while AFK."); + } private final Random random = new Random(); - + private int messageTimer = 0; + private int messageI = 0; + private int sneakTimer = 0; + private int strafeTimer = 0; + private boolean direction = false; private float prevYaw; - public AntiAFK() { - super(Categories.Player, "anti-afk", "Performs different actions to prevent getting kicked for AFK reasons."); - } - @Override public void onActivate() { + if (sendMessages.get() && messages.get().isEmpty()) { + warning("Message list is empty, disabling messages..."); + sendMessages.set(false); + } + prevYaw = mc.player.getYaw(); - timer = delay.get() * 20; + messageTimer = delay.get() * 20; } @Override @@ -164,127 +175,56 @@ public void onDeactivate() { @EventHandler private void onTick(TickEvent.Pre event) { - if (Utils.canUpdate()) { - //Spin - if (spin.get()) { - prevYaw += spinSpeed.get(); - switch (spinMode.get()) { - case Client -> mc.player.setYaw(prevYaw); - case Server -> Rotations.rotate(prevYaw, pitch.get(), -15, null); - } - } - - //Jump - if (jump.get() && mc.options.jumpKey.isPressed()) mc.options.jumpKey.setPressed(false); - if (jump.get() && mc.options.sneakKey.isPressed()) mc.options.sneakKey.setPressed(false); - else if (jump.get() && random.nextInt(99) + 1 == 50) mc.options.jumpKey.setPressed(true); - - //Click - if (click.get() && random.nextInt(99) + 1 == 45) { - mc.options.attackKey.setPressed(true); - Utils.leftClick(); - mc.options.attackKey.setPressed(false); - } + if (!Utils.canUpdate()) return; - //Disco - if (disco.get() && random.nextInt(24) + 1 == 15) mc.options.sneakKey.setPressed(true); - - //Spam - if (sendMessages.get() && !messages.isEmpty()) - if (timer <= 0) { - int i; - if (randomMessage.get()) { - i = Utils.random(0, messages.size()); - } else { - if (messageI >= messages.size()) messageI = 0; - i = messageI++; - } - - ChatUtils.sendPlayerMsg(messages.get(i)); - - timer = delay.get() * 20; - } else { - timer--; - } - - //Strafe - if (strafe.get() && strafeTimer == 20) { - mc.options.leftKey.setPressed(!direction); - mc.options.rightKey.setPressed(direction); - direction = !direction; - strafeTimer = 0; - } else - strafeTimer++; + // Jump + if (jump.get()) { + if (mc.options.jumpKey.isPressed()) mc.options.jumpKey.setPressed(false); + else if (random.nextInt(99) == 0) mc.options.jumpKey.setPressed(true); } - } - @Override - public WWidget getWidget(GuiTheme theme) { - messages.removeIf(String::isEmpty); + // Swing + if (swing.get() && random.nextInt(99) == 0) { + mc.player.swingHand(mc.player.getActiveHand()); + } - WTable table = theme.table(); - fillTable(theme, table); + // Sneak + if (sneak.get()) { + if (sneakTimer++ >= sneakTime.get()) { + mc.options.sneakKey.setPressed(false); + if (random.nextInt(99) == 0) sneakTimer = 0; // Sneak after ~5 seconds + } else mc.options.sneakKey.setPressed(true); + } - return table; - } + // Strafe + if (strafe.get() && strafeTimer-- <= 0) { + mc.options.leftKey.setPressed(!direction); + mc.options.rightKey.setPressed(direction); + direction = !direction; + strafeTimer = 20; + } - private void fillTable(GuiTheme theme, WTable table) { - table.add(theme.horizontalSeparator("Message List")).expandX(); - table.row(); + // Spin + if (spin.get()) { + prevYaw += spinSpeed.get(); + switch (spinMode.get()) { + case Client -> mc.player.setYaw(prevYaw); + case Server -> Rotations.rotate(prevYaw, pitch.get(), -15); + } + } // Messages - for (int i = 0; i < messages.size(); i++) { - int msgI = i; - String message = messages.get(i); - - WTextBox textBox = table.add(theme.textBox(message)).minWidth(100).expandX().widget(); - textBox.action = () -> messages.set(msgI, textBox.get()); - - WMinus delete = table.add(theme.minus()).widget(); - delete.action = () -> { - messages.remove(msgI); - - table.clear(); - fillTable(theme, table); - }; + if (sendMessages.get() && !messages.get().isEmpty() && messageTimer-- <= 0) { + if (randomMessage.get()) messageI = random.nextInt(messages.get().size()); + else if (++messageI >= messages.get().size()) messageI = 0; - table.row(); + ChatUtils.sendPlayerMsg(messages.get().get(messageI)); + messageTimer = delay.get() * 20; } - - // New Message - WPlus add = table.add(theme.plus()).expandCellX().right().widget(); - add.action = () -> { - messages.add(""); - - table.clear(); - fillTable(theme, table); - }; - } - - @Override - public NbtCompound toTag() { - NbtCompound tag = super.toTag(); - - messages.removeIf(String::isEmpty); - NbtList messagesTag = new NbtList(); - - for (String message : messages) messagesTag.add(NbtString.of(message)); - tag.put("messages", messagesTag); - - return tag; } - @Override - public Module fromTag(NbtCompound tag) { - messages.clear(); - - if (tag.contains("messages")) { - NbtList messagesTag = tag.getList("messages", 8); - for (NbtElement messageTag : messagesTag) messages.add(messageTag.asString()); - } else { - messages.add("This is an AntiAFK message. Meteor on Crack!"); - } - - return super.fromTag(tag); + public enum SpinMode { + Server, + Client } } From 1505263299a3094f4aa72d30ee948a40b3290060 Mon Sep 17 00:00:00 2001 From: Big Iron <52252627+Big-Iron-Cheems@users.noreply.github.com> Date: Sat, 2 Sep 2023 22:24:20 +0200 Subject: [PATCH 093/357] Refactor AutoMount (#4034) --- .../systems/modules/world/AutoMount.java | 104 ++++-------------- .../utils/entity/EntityUtils.java | 4 + 2 files changed, 26 insertions(+), 82 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoMount.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoMount.java index 1f2fb0a21f..74a40224ff 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoMount.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoMount.java @@ -9,26 +9,30 @@ import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.settings.BoolSetting; +import meteordevelopment.meteorclient.settings.EntityTypeListSetting; import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.settings.SettingGroup; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; +import meteordevelopment.meteorclient.utils.entity.EntityUtils; import meteordevelopment.meteorclient.utils.player.PlayerUtils; import meteordevelopment.meteorclient.utils.player.Rotations; import meteordevelopment.orbit.EventHandler; import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.Saddleable; import net.minecraft.entity.mob.SkeletonHorseEntity; -import net.minecraft.entity.passive.*; -import net.minecraft.entity.vehicle.BoatEntity; -import net.minecraft.entity.vehicle.MinecartEntity; +import net.minecraft.entity.mob.ZombieHorseEntity; +import net.minecraft.entity.passive.LlamaEntity; +import net.minecraft.entity.passive.PigEntity; +import net.minecraft.entity.passive.StriderEntity; import net.minecraft.item.SpawnEggItem; import net.minecraft.util.Hand; +import java.util.Set; + public class AutoMount extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgMount = settings.createGroup("Mount"); - - // General private final Setting checkSaddle = sgGeneral.add(new BoolSetting.Builder() .name("check-saddle") @@ -44,61 +48,10 @@ public class AutoMount extends Module { .build() ); - // Mount - - private final Setting horses = sgMount.add(new BoolSetting.Builder() - .name("horse") - .description("Horse") - .defaultValue(false) - .build() - ); - - private final Setting donkeys = sgMount.add(new BoolSetting.Builder() - .name("donkey") - .description("Donkey") - .defaultValue(false) - .build() - ); - - private final Setting mules = sgMount.add(new BoolSetting.Builder() - .name("mule") - .description("Mule") - .defaultValue(false) - .build() - ); - - private final Setting skeletonHorse = sgMount.add(new BoolSetting.Builder() - .name("skeleton-horse") - .description("Skeleton Horse") - .defaultValue(false) - .build() - ); - - private final Setting llamas = sgMount.add(new BoolSetting.Builder() - .name("llama") - .description("Llama") - .defaultValue(false) - .build() - ); - - private final Setting pigs = sgMount.add(new BoolSetting.Builder() - .name("pig") - .description("Pig") - .defaultValue(false) - .build() - ); - - private final Setting boats = sgMount.add(new BoolSetting.Builder() - .name("boat") - .description("Boat") - .defaultValue(false) - .build() - ); - - private final Setting minecarts = sgMount.add(new BoolSetting.Builder() - .name("minecart") - .description("Minecart") - .defaultValue(false) + private final Setting>> entities = sgGeneral.add(new EntityTypeListSetting.Builder() + .name("entities") + .description("Rideable entities.") + .filter(EntityUtils::isRideable) .build() ); @@ -109,29 +62,16 @@ public AutoMount() { @EventHandler private void onTick(TickEvent.Pre event) { if (mc.player.hasVehicle()) return; + if (mc.player.isSneaking()) return; + if (mc.player.getMainHandStack().getItem() instanceof SpawnEggItem) return; - for (Entity entity : mc.world.getEntities()){ + for (Entity entity : mc.world.getEntities()) { + if (!entities.get().contains(entity.getType())) continue; if (!PlayerUtils.isWithin(entity, 4)) continue; - - if (mc.player.getMainHandStack().getItem() instanceof SpawnEggItem) return; - - if (donkeys.get() && entity instanceof DonkeyEntity && (!checkSaddle.get() || ((DonkeyEntity) entity).isSaddled())) { - interact(entity); - } else if (llamas.get() && entity instanceof LlamaEntity) { - interact(entity); - } else if (boats.get() && entity instanceof BoatEntity) { - interact(entity); - } else if (minecarts.get() && entity instanceof MinecartEntity) { - interact(entity); - } else if (horses.get() && entity instanceof HorseEntity && (!checkSaddle.get() || ((HorseEntity) entity).isSaddled())) { - interact(entity); - } else if (pigs.get() && entity instanceof PigEntity && ((PigEntity) entity).isSaddled()) { - interact(entity); - } else if (mules.get() && entity instanceof MuleEntity && (!checkSaddle.get() || ((MuleEntity) entity).isSaddled())) { - interact(entity); - } else if (skeletonHorse.get() && entity instanceof SkeletonHorseEntity && (!checkSaddle.get() || ((SkeletonHorseEntity) entity).isSaddled())) { - interact(entity); - } + if ((entity instanceof PigEntity || entity instanceof SkeletonHorseEntity || entity instanceof StriderEntity || entity instanceof ZombieHorseEntity) && !((Saddleable) entity).isSaddled()) continue; + if (!(entity instanceof LlamaEntity) && entity instanceof Saddleable saddleable && checkSaddle.get() && !saddleable.isSaddled()) continue; + interact(entity); + return; } } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityUtils.java index 0736545c4b..1b2edf76e6 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityUtils.java @@ -48,6 +48,10 @@ public static boolean isAttackable(EntityType type) { return type != EntityType.AREA_EFFECT_CLOUD && type != EntityType.ARROW && type != EntityType.FALLING_BLOCK && type != EntityType.FIREWORK_ROCKET && type != EntityType.ITEM && type != EntityType.LLAMA_SPIT && type != EntityType.SPECTRAL_ARROW && type != EntityType.ENDER_PEARL && type != EntityType.EXPERIENCE_BOTTLE && type != EntityType.POTION && type != EntityType.TRIDENT && type != EntityType.LIGHTNING_BOLT && type != EntityType.FISHING_BOBBER && type != EntityType.EXPERIENCE_ORB && type != EntityType.EGG; } + public static boolean isRideable(EntityType type) { + return type == EntityType.MINECART || type == EntityType.BOAT || type == EntityType.CAMEL || type == EntityType.DONKEY || type == EntityType.HORSE || type == EntityType.LLAMA || type == EntityType.MULE || type == EntityType.PIG || type == EntityType.SKELETON_HORSE || type == EntityType.STRIDER || type == EntityType.ZOMBIE_HORSE; + } + public static float getTotalHealth(PlayerEntity target) { return target.getHealth() + target.getAbsorptionAmount(); } From 7d30a0e1301dc4ace0a0d00ee96481c3e4223ab2 Mon Sep 17 00:00:00 2001 From: Mana <57663038+Manaball123@users.noreply.github.com> Date: Sun, 3 Sep 2023 00:36:48 +0800 Subject: [PATCH 094/357] make yaw lock of bounce efly optional and fixed typo --- .../modules/movement/elytrafly/ElytraFly.java | 21 ++++++++++++++++++- .../movement/elytrafly/modes/Bounce.java | 19 ++++++++++++++--- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFly.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFly.java index 1fa68637e2..35f20b7a5e 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFly.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFly.java @@ -19,6 +19,7 @@ import meteordevelopment.meteorclient.systems.modules.movement.elytrafly.modes.Bounce; import meteordevelopment.meteorclient.systems.modules.movement.elytrafly.modes.Vanilla; import meteordevelopment.meteorclient.systems.modules.player.ChestSwap; +import meteordevelopment.meteorclient.systems.modules.player.Rotation; import meteordevelopment.meteorclient.systems.modules.render.Freecam; import meteordevelopment.orbit.EventHandler; import net.minecraft.block.Block; @@ -196,9 +197,17 @@ public class ElytraFly extends Module { .build() ); + public final Setting yawLockMode = sgGeneral.add(new EnumSetting.Builder() + .name("yaw-lock") + .description("Whether to enable yaw lock or not") + .defaultValue(Rotation.LockMode.Smart) + .visible(() -> flightMode.get() == ElytraFlightModes.Bounce) + .build() + ); + public final Setting pitch = sgGeneral.add(new DoubleSetting.Builder() .name("pitch") - .description("The pitch angle to look at when using the recast mode.") + .description("The pitch angle to look at when using the bounce mode.") .defaultValue(85) .range(0, 90) .sliderRange(0, 90) @@ -206,6 +215,16 @@ public class ElytraFly extends Module { .build() ); + public final Setting yaw = sgGeneral.add(new DoubleSetting.Builder() + .name("yaw") + .description("The yaw angle to look at when using simple rotation lock in bounce mode.") + .defaultValue(0) + .range(0, 360) + .sliderRange(0,360) + .visible(() -> flightMode.get() == ElytraFlightModes.Bounce && yawLockMode.get() == Rotation.LockMode.Simple) + .build() + ); + public final Setting restart = sgGeneral.add(new BoolSetting.Builder() .name("restart") .description("Restarts flying with the elytra when rubberbanding.") diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/modes/Bounce.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/modes/Bounce.java index 3549f0b969..58e6ee10f5 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/modes/Bounce.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/modes/Bounce.java @@ -12,6 +12,7 @@ import meteordevelopment.meteorclient.events.packets.PacketEvent; import meteordevelopment.meteorclient.systems.modules.movement.elytrafly.ElytraFlightMode; import meteordevelopment.meteorclient.systems.modules.movement.elytrafly.ElytraFlightModes; +import meteordevelopment.meteorclient.systems.modules.player.Rotation; import meteordevelopment.meteorclient.utils.misc.input.Input; import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.client.option.KeyBinding; @@ -47,7 +48,7 @@ public void onTick() { if (prevFov != 0 && !elytraFly.sprint.get()) mc.options.getFovEffectScale().setValue(0.0); // This stops the FOV effects from constantly going on and off. if (elytraFly.autoJump.get()) setPressed(mc.options.jumpKey, true); setPressed(mc.options.forwardKey, true); - mc.player.setYaw(getSmartYawDirection()); + mc.player.setYaw(getYawDirection()); mc.player.setPitch(elytraFly.pitch.get().floatValue()); } @@ -125,8 +126,20 @@ private static boolean ignoreGround(ClientPlayerEntity player) { } else return false; } - private float getSmartYawDirection() { - return Math.round((mc.player.getYaw() + 1f) / 45f) * 45f; + private float getYawDirection() { + switch (elytraFly.yawLockMode.get()) { + case None -> { + return mc.player.getYaw(); + } + case Smart -> { + return Math.round((mc.player.getYaw() + 1f) / 45f) * 45f; + } + case Simple -> { + return elytraFly.yaw.get().floatValue(); + } + }; + throw new IllegalArgumentException("um wtf"); + } @Override From 40dbfbd9661561c14e881435d210ed45732c4daf Mon Sep 17 00:00:00 2001 From: Mana <57663038+Manaball123@users.noreply.github.com> Date: Sun, 3 Sep 2023 09:32:07 +0800 Subject: [PATCH 095/357] thing --- .../modules/movement/elytrafly/modes/Bounce.java | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/modes/Bounce.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/modes/Bounce.java index 58e6ee10f5..deceb1f5a5 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/modes/Bounce.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/modes/Bounce.java @@ -127,18 +127,11 @@ private static boolean ignoreGround(ClientPlayerEntity player) { } private float getYawDirection() { - switch (elytraFly.yawLockMode.get()) { - case None -> { - return mc.player.getYaw(); - } - case Smart -> { - return Math.round((mc.player.getYaw() + 1f) / 45f) * 45f; - } - case Simple -> { - return elytraFly.yaw.get().floatValue(); - } + return switch (elytraFly.yawLockMode.get()) { + case None -> mc.player.getYaw(); + case Smart -> Math.round((mc.player.getYaw() + 1f) / 45f) * 45f; + case Simple -> elytraFly.yaw.get().floatValue(); }; - throw new IllegalArgumentException("um wtf"); } From 14dd21b29813a487ca8134d313303532fc5aa3f4 Mon Sep 17 00:00:00 2001 From: supakeks Date: Wed, 6 Sep 2023 14:21:16 -0400 Subject: [PATCH 096/357] Added rotations to Nuker and improved block breaking on strict servers. --- .../systems/modules/combat/AutoCity.java | 2 +- .../systems/modules/world/Nuker.java | 276 +++++++++--------- .../meteorclient/utils/world/BlockUtils.java | 27 +- 3 files changed, 170 insertions(+), 135 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoCity.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoCity.java index 1dc5674676..effcf624a7 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoCity.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoCity.java @@ -211,7 +211,7 @@ public void mine(boolean done) { InvUtils.swap(pick.slot(), switchMode.get() == SwitchMode.Silent); if (rotate.get()) Rotations.rotate(Rotations.getYaw(targetPos), Rotations.getPitch(targetPos)); - Direction direction = (mc.player.getY() > targetPos.getY()) ? Direction.UP : Direction.DOWN; + Direction direction = BlockUtils.getDirection(targetPos); if (!done) mc.getNetworkHandler().sendPacket(new PlayerActionC2SPacket(PlayerActionC2SPacket.Action.START_DESTROY_BLOCK, targetPos, direction)); mc.getNetworkHandler().sendPacket(new PlayerActionC2SPacket(PlayerActionC2SPacket.Action.STOP_DESTROY_BLOCK, targetPos, direction)); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java index ca691ea6cd..71dd4fd48e 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java @@ -14,6 +14,7 @@ import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.misc.Pool; +import meteordevelopment.meteorclient.utils.player.Rotations; import meteordevelopment.meteorclient.utils.render.RenderUtils; import meteordevelopment.meteorclient.utils.render.color.SettingColor; import meteordevelopment.meteorclient.utils.world.BlockIterator; @@ -25,7 +26,6 @@ import net.minecraft.util.Hand; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Box; -import net.minecraft.util.math.Direction; import net.minecraft.util.math.Vec3d; import java.util.ArrayList; @@ -40,201 +40,208 @@ public class Nuker extends Module { // General private final Setting shape = sgGeneral.add(new EnumSetting.Builder() - .name("shape") - .description("The shape of nuking algorithm.") - .defaultValue(Shape.Sphere) - .build() + .name("shape") + .description("The shape of nuking algorithm.") + .defaultValue(Shape.Sphere) + .build() ); private final Setting mode = sgGeneral.add(new EnumSetting.Builder() - .name("mode") - .description("The way the blocks are broken.") - .defaultValue(Nuker.Mode.Flatten) - .build() + .name("mode") + .description("The way the blocks are broken.") + .defaultValue(Nuker.Mode.Flatten) + .build() ); private final Setting range = sgGeneral.add(new DoubleSetting.Builder() - .name("range") - .description("The break range.") - .defaultValue(4) - .min(0) - .visible(() -> shape.get() != Shape.Cube) - .build() + .name("range") + .description("The break range.") + .defaultValue(4) + .min(0) + .visible(() -> shape.get() != Shape.Cube) + .build() ); private final Setting range_up = sgGeneral.add(new IntSetting.Builder() - .name("up") - .description("The break range.") - .defaultValue(1) - .min(0) - .visible(() -> shape.get() == Shape.Cube) - .build() + .name("up") + .description("The break range.") + .defaultValue(1) + .min(0) + .visible(() -> shape.get() == Shape.Cube) + .build() ); private final Setting range_down = sgGeneral.add(new IntSetting.Builder() - .name("down") - .description("The break range.") - .defaultValue(1) - .min(0) - .visible(() -> shape.get() == Shape.Cube) - .build() + .name("down") + .description("The break range.") + .defaultValue(1) + .min(0) + .visible(() -> shape.get() == Shape.Cube) + .build() ); private final Setting range_left = sgGeneral.add(new IntSetting.Builder() - .name("left") - .description("The break range.") - .defaultValue(1) - .min(0) - .visible(() -> shape.get() == Shape.Cube) - .build() + .name("left") + .description("The break range.") + .defaultValue(1) + .min(0) + .visible(() -> shape.get() == Shape.Cube) + .build() ); private final Setting range_right = sgGeneral.add(new IntSetting.Builder() - .name("right") - .description("The break range.") - .defaultValue(1) - .min(0) - .visible(() -> shape.get() == Shape.Cube) - .build() + .name("right") + .description("The break range.") + .defaultValue(1) + .min(0) + .visible(() -> shape.get() == Shape.Cube) + .build() ); private final Setting range_forward = sgGeneral.add(new IntSetting.Builder() - .name("forward") - .description("The break range.") - .defaultValue(1) - .min(0) - .visible(() -> shape.get() == Shape.Cube) - .build() + .name("forward") + .description("The break range.") + .defaultValue(1) + .min(0) + .visible(() -> shape.get() == Shape.Cube) + .build() ); private final Setting range_back = sgGeneral.add(new IntSetting.Builder() - .name("back") - .description("The break range.") - .defaultValue(1) - .min(0) - .visible(() -> shape.get() == Shape.Cube) - .build() + .name("back") + .description("The break range.") + .defaultValue(1) + .min(0) + .visible(() -> shape.get() == Shape.Cube) + .build() ); private final Setting delay = sgGeneral.add(new IntSetting.Builder() - .name("delay") - .description("Delay in ticks between breaking blocks.") - .defaultValue(0) - .build() + .name("delay") + .description("Delay in ticks between breaking blocks.") + .defaultValue(0) + .build() ); private final Setting maxBlocksPerTick = sgGeneral.add(new IntSetting.Builder() - .name("max-blocks-per-tick") - .description("Maximum blocks to try to break per tick. Useful when insta mining.") - .defaultValue(1) - .min(1) - .sliderRange(1, 6) - .build() + .name("max-blocks-per-tick") + .description("Maximum blocks to try to break per tick. Useful when insta mining.") + .defaultValue(1) + .min(1) + .sliderRange(1, 6) + .build() ); private final Setting sortMode = sgGeneral.add(new EnumSetting.Builder() - .name("sort-mode") - .description("The blocks you want to mine first.") - .defaultValue(Nuker.SortMode.Closest) - .build() + .name("sort-mode") + .description("The blocks you want to mine first.") + .defaultValue(Nuker.SortMode.Closest) + .build() ); private final Setting swingHand = sgGeneral.add(new BoolSetting.Builder() - .name("swing-hand") - .description("Swing hand client side.") - .defaultValue(true) - .build() + .name("swing-hand") + .description("Swing hand client side.") + .defaultValue(true) + .build() ); private final Setting packetMine = sgGeneral.add(new BoolSetting.Builder() - .name("packet-mine") - .description("Attempt to instamine everything at once.") - .defaultValue(false) - .build() + .name("packet-mine") + .description("Attempt to instamine everything at once.") + .defaultValue(false) + .build() + ); + + private final Setting rotate = sgGeneral.add(new BoolSetting.Builder() + .name("rotate") + .description("Rotates server-side to the block being mined.") + .defaultValue(true) + .build() ); // Whitelist and blacklist private final Setting listMode = sgWhitelist.add(new EnumSetting.Builder() - .name("list-mode") - .description("Selection mode.") - .defaultValue(ListMode.Whitelist) - .build() + .name("list-mode") + .description("Selection mode.") + .defaultValue(ListMode.Whitelist) + .build() ); private final Setting> blacklist = sgWhitelist.add(new BlockListSetting.Builder() - .name("blacklist") - .description("The blocks you don't want to mine.") - .visible(() -> listMode.get() == ListMode.Blacklist) - .build() + .name("blacklist") + .description("The blocks you don't want to mine.") + .visible(() -> listMode.get() == ListMode.Blacklist) + .build() ); private final Setting> whitelist = sgWhitelist.add(new BlockListSetting.Builder() - .name("whitelist") - .description("The blocks you want to mine.") - .visible(() -> listMode.get() == ListMode.Whitelist) - .build() + .name("whitelist") + .description("The blocks you want to mine.") + .visible(() -> listMode.get() == ListMode.Whitelist) + .build() ); // Rendering private final Setting enableRenderBounding = sgRender.add(new BoolSetting.Builder() - .name("bounding-box") - .description("Enable rendering bounding box for Cube and Uniform Cube.") - .defaultValue(true) - .build() + .name("bounding-box") + .description("Enable rendering bounding box for Cube and Uniform Cube.") + .defaultValue(true) + .build() ); private final Setting shapeModeBox = sgRender.add(new EnumSetting.Builder() - .name("nuke-box-mode") - .description("How the shape for the bounding box is rendered.") - .defaultValue(ShapeMode.Both) - .build() + .name("nuke-box-mode") + .description("How the shape for the bounding box is rendered.") + .defaultValue(ShapeMode.Both) + .build() ); private final Setting sideColorBox = sgRender.add(new ColorSetting.Builder() - .name("side-color") - .description("The side color of the bounding box.") - .defaultValue(new SettingColor(16,106,144, 100)) - .build() + .name("side-color") + .description("The side color of the bounding box.") + .defaultValue(new SettingColor(16,106,144, 100)) + .build() ); private final Setting lineColorBox = sgRender.add(new ColorSetting.Builder() - .name("line-color") - .description("The line color of the bounding box.") - .defaultValue(new SettingColor(16,106,144, 255)) - .build() + .name("line-color") + .description("The line color of the bounding box.") + .defaultValue(new SettingColor(16,106,144, 255)) + .build() ); private final Setting enableRenderBreaking = sgRender.add(new BoolSetting.Builder() - .name("broken-blocks") - .description("Enable rendering bounding box for Cube and Uniform Cube.") - .defaultValue(true) - .build() + .name("broken-blocks") + .description("Enable rendering bounding box for Cube and Uniform Cube.") + .defaultValue(true) + .build() ); private final Setting shapeModeBreak = sgRender.add(new EnumSetting.Builder() - .name("nuke-block-mode") - .description("How the shapes for broken blocks are rendered.") - .defaultValue(ShapeMode.Both) - .visible(enableRenderBreaking::get) - .build() + .name("nuke-block-mode") + .description("How the shapes for broken blocks are rendered.") + .defaultValue(ShapeMode.Both) + .visible(enableRenderBreaking::get) + .build() ); private final Setting sideColor = sgRender.add(new ColorSetting.Builder() - .name("side-color") - .description("The side color of the target block rendering.") - .defaultValue(new SettingColor(255, 0, 0, 80)) - .visible(enableRenderBreaking::get) - .build() + .name("side-color") + .description("The side color of the target block rendering.") + .defaultValue(new SettingColor(255, 0, 0, 80)) + .visible(enableRenderBreaking::get) + .build() ); private final Setting lineColor = sgRender.add(new ColorSetting.Builder() - .name("line-color") - .description("The line color of the target block rendering.") - .defaultValue(new SettingColor(255, 0, 0, 255)) - .visible(enableRenderBreaking::get) - .build() + .name("line-color") + .description("The line color of the target block rendering.") + .defaultValue(new SettingColor(255, 0, 0, 255)) + .visible(enableRenderBreaking::get) + .build() ); private final Pool blockPosPool = new Pool<>(BlockPos.Mutable::new); @@ -344,9 +351,9 @@ private void onTickPre(TickEvent.Pre event) { boolean toofarCube = !box.contains(Vec3d.ofCenter(blockPos)); if (!BlockUtils.canBreak(blockPos, blockState) - || (toofarSphere && shape.get() == Shape.Sphere) - || (toofarUniformCube && shape.get() == Shape.UniformCube) - || (toofarCube && shape.get() == Shape.Cube)) + || (toofarSphere && shape.get() == Shape.Sphere) + || (toofarUniformCube && shape.get() == Shape.UniformCube) + || (toofarCube && shape.get() == Shape.Cube)) return; // Flatten @@ -366,7 +373,7 @@ private void onTickPre(TickEvent.Pre event) { // Break block if found BlockIterator.after(() -> { // Sort blocks - if (sortMode.get() == SortMode.TopDown) + if (sortMode.get() == SortMode.TopDown) blocks.sort(Comparator.comparingDouble(value -> -1*value.getY())); else if (sortMode.get() != SortMode.None) blocks.sort(Comparator.comparingDouble(value -> Utils.squaredDistance(pX, pY, pZ, value.getX() + 0.5, value.getY() + 0.5, value.getZ() + 0.5) * (sortMode.get() == SortMode.Closest ? 1 : -1))); @@ -399,13 +406,8 @@ else if (sortMode.get() != SortMode.None) boolean canInstaMine = BlockUtils.canInstaBreak(block); - if (packetMine.get()) { - mc.getNetworkHandler().sendPacket(new PlayerActionC2SPacket(PlayerActionC2SPacket.Action.START_DESTROY_BLOCK, block, Direction.UP)); - mc.player.swingHand(Hand.MAIN_HAND); - mc.getNetworkHandler().sendPacket(new PlayerActionC2SPacket(PlayerActionC2SPacket.Action.STOP_DESTROY_BLOCK, block, Direction.UP)); - } else { - BlockUtils.breakBlock(block, swingHand.get()); - } + if (rotate.get()) Rotations.rotate(Rotations.getYaw(block), Rotations.getPitch(block), () -> breakBlock(block)); + else breakBlock(block); if (enableRenderBreaking.get()) RenderUtils.renderTickingBlock(block.toImmutable(), sideColor.get(), lineColor.get(), shapeModeBreak.get(), 0, 8, true, false); lastBlockPos.set(block); @@ -421,7 +423,17 @@ else if (sortMode.get() != SortMode.None) blocks.clear(); }); } - + + private void breakBlock(BlockPos blockPos) { + if (packetMine.get()) { + mc.getNetworkHandler().sendPacket(new PlayerActionC2SPacket(PlayerActionC2SPacket.Action.START_DESTROY_BLOCK, blockPos, BlockUtils.getDirection(blockPos))); + mc.player.swingHand(Hand.MAIN_HAND); + mc.getNetworkHandler().sendPacket(new PlayerActionC2SPacket(PlayerActionC2SPacket.Action.STOP_DESTROY_BLOCK, blockPos, BlockUtils.getDirection(blockPos))); + } else { + BlockUtils.breakBlock(blockPos, swingHand.get()); + } + } + @EventHandler(priority = EventPriority.HIGHEST) private void onBlockBreakingCooldown(BlockBreakingCooldownEvent event) { event.cooldown = 0; diff --git a/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java index 0185036d73..ab6e3c2d89 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java @@ -187,8 +187,8 @@ public static boolean breakBlock(BlockPos blockPos, boolean swing) { BlockPos pos = blockPos instanceof BlockPos.Mutable ? new BlockPos(blockPos) : blockPos; if (mc.interactionManager.isBreakingBlock()) - mc.interactionManager.updateBlockBreakingProgress(pos, Direction.UP); - else mc.interactionManager.attackBlock(pos, Direction.UP); + mc.interactionManager.updateBlockBreakingProgress(pos, getDirection(blockPos)); + else mc.interactionManager.attackBlock(pos, getDirection(blockPos)); if (swing) mc.player.swingHand(Hand.MAIN_HAND); else mc.getNetworkHandler().sendPacket(new HandSwingC2SPacket(Hand.MAIN_HAND)); @@ -265,6 +265,29 @@ public static boolean topSurface(BlockState blockState) { else return blockState.getBlock() instanceof StairsBlock && blockState.get(StairsBlock.HALF) == BlockHalf.TOP; } + // Finds the best block direction to get when interacting with the block. + public static Direction getDirection(BlockPos pos) { + Vec3d eyesPos = new Vec3d(mc.player.getX(), mc.player.getY() + mc.player.getEyeHeight(mc.player.getPose()), mc.player.getZ()); + if ((double) pos.getY() > eyesPos.y) { + if (mc.world.getBlockState(pos.add(0, -1, 0)).isReplaceable()) return Direction.DOWN; + else return getOppositeDirection(); + } + if (!mc.world.getBlockState(pos.add(0, 1, 0)).isReplaceable()) return getOppositeDirection(); + return Direction.UP; + } + + // Example: If the player is facing east, then that means they would click the west side of a block. + private static Direction getOppositeDirection() { + return switch (mc.player.getHorizontalFacing()) { + case DOWN -> Direction.UP; + case UP -> Direction.DOWN; + case NORTH -> Direction.SOUTH; + case SOUTH -> Direction.NORTH; + case WEST -> Direction.EAST; + case EAST -> Direction.WEST; + }; + } + public enum MobSpawn { Never, Potential, From 30bbdca71ef68c14efb5c1400b4752677da60ec1 Mon Sep 17 00:00:00 2001 From: zyktex <47159134+TransRights@users.noreply.github.com> Date: Wed, 6 Sep 2023 21:32:39 +0200 Subject: [PATCH 097/357] Fix NPE caused by ChatHudMixin --- .../java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java index ec91daed4a..9f194d731a 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java @@ -130,7 +130,7 @@ private int addMessageListSizeProxy(int size) { @ModifyExpressionValue(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/math/MathHelper;ceil(F)I")) private int onRender_modifyWidth(int width) { - return betterChat.modifyChatWidth(width); + return getBetterChat().modifyChatWidth(width); } @ModifyReceiver(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;drawTextWithShadow(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/text/OrderedText;III)I")) From 74deeea904737c34a6f4dd5bda146feb9a05756a Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Wed, 6 Sep 2023 20:58:18 +0100 Subject: [PATCH 098/357] cleanup blockutils --- .../meteorclient/utils/world/BlockUtils.java | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java index ab6e3c2d89..e7a53280c3 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java @@ -270,24 +270,12 @@ public static Direction getDirection(BlockPos pos) { Vec3d eyesPos = new Vec3d(mc.player.getX(), mc.player.getY() + mc.player.getEyeHeight(mc.player.getPose()), mc.player.getZ()); if ((double) pos.getY() > eyesPos.y) { if (mc.world.getBlockState(pos.add(0, -1, 0)).isReplaceable()) return Direction.DOWN; - else return getOppositeDirection(); + else return mc.player.getHorizontalFacing().getOpposite(); } - if (!mc.world.getBlockState(pos.add(0, 1, 0)).isReplaceable()) return getOppositeDirection(); + if (!mc.world.getBlockState(pos.add(0, 1, 0)).isReplaceable()) return mc.player.getHorizontalFacing().getOpposite(); return Direction.UP; } - // Example: If the player is facing east, then that means they would click the west side of a block. - private static Direction getOppositeDirection() { - return switch (mc.player.getHorizontalFacing()) { - case DOWN -> Direction.UP; - case UP -> Direction.DOWN; - case NORTH -> Direction.SOUTH; - case SOUTH -> Direction.NORTH; - case WEST -> Direction.EAST; - case EAST -> Direction.WEST; - }; - } - public enum MobSpawn { Never, Potential, From c8cf97a5c6772a7a1e3cf8913502b0de23290747 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Fri, 8 Sep 2023 17:41:13 +0100 Subject: [PATCH 099/357] Fix xray with indium --- build.gradle | 1 + gradle.properties | 3 ++ .../meteorclient/MixinPlugin.java | 5 ++++ .../AbstractBlockRenderContextMixin.java | 2 ++ .../indium/BakedModelConsumerImplMixin.java | 29 +++++++++++++++++++ src/main/resources/fabric.mod.json | 3 +- .../meteor-client-indium.mixins.json | 12 ++++++++ 7 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/indium/BakedModelConsumerImplMixin.java create mode 100644 src/main/resources/meteor-client-indium.mixins.json diff --git a/build.gradle b/build.gradle index 69d62e702e..666ba25473 100644 --- a/build.gradle +++ b/build.gradle @@ -57,6 +57,7 @@ dependencies { modCompileOnly("maven.modrinth:lithium:${project.lithium_version}") { transitive = false } modCompileOnly("maven.modrinth:iris:${project.iris_version}") { transitive = false } //modCompileOnly("io.vram:canvas-fabric-mc119:1.0.+") { transitive = false } // TODO: 1.19.3 + modCompileOnly("maven.modrinth:indium:${project.indium_version}") { transitive = false } // Baritone (https://github.com/MeteorDevelopment/baritone) modInclude "baritone:fabric:${project.minecraft_version}-SNAPSHOT" diff --git a/gradle.properties b/gradle.properties index 67c205ad26..0d58f0181c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -39,3 +39,6 @@ netty_version=4.1.90.Final # Mixin Extras (https://github.com/LlamaLad7/MixinExtras) mixin_extras_version=0.2.0-beta.8 + +# Indium (https://github.com/comp500/Indium) +indium_version=1.0.25+mc1.20.1 diff --git a/src/main/java/meteordevelopment/meteorclient/MixinPlugin.java b/src/main/java/meteordevelopment/meteorclient/MixinPlugin.java index eee2133334..c4d672e2f9 100644 --- a/src/main/java/meteordevelopment/meteorclient/MixinPlugin.java +++ b/src/main/java/meteordevelopment/meteorclient/MixinPlugin.java @@ -28,6 +28,7 @@ public class MixinPlugin implements IMixinConfigPlugin { private static boolean isCanvasPresent; private static boolean isLithiumPresent; public static boolean isIrisPresent; + private static boolean isIndiumPresent; @Override public void onLoad(String mixinPackage) { @@ -72,6 +73,7 @@ public void onLoad(String mixinPackage) { isCanvasPresent = FabricLoader.getInstance().isModLoaded("canvas"); isLithiumPresent = FabricLoader.getInstance().isModLoaded("lithium"); isIrisPresent = FabricLoader.getInstance().isModLoaded("iris"); + isIndiumPresent = FabricLoader.getInstance().isModLoaded("indium"); loaded = true; } @@ -101,6 +103,9 @@ else if (mixinClassName.startsWith(mixinPackage + ".canvas")) { else if (mixinClassName.startsWith(mixinPackage + ".lithium")) { return isLithiumPresent; } + else if (mixinClassName.startsWith(mixinPackage + ".indium")) { + return isIndiumPresent; + } return true; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/indigo/AbstractBlockRenderContextMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/indigo/AbstractBlockRenderContextMixin.java index a4c5837f2f..12c97c52bd 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/indigo/AbstractBlockRenderContextMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/indigo/AbstractBlockRenderContextMixin.java @@ -12,6 +12,7 @@ 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; @@ -32,6 +33,7 @@ else if (alpha != -1) { } } + @Unique private int rewriteQuadAlpha(int color, int alpha) { return ((alpha & 0xFF) << 24) | (color & 0x00FFFFFF); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/indium/BakedModelConsumerImplMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/indium/BakedModelConsumerImplMixin.java new file mode 100644 index 0000000000..7d3cf8f1d8 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/indium/BakedModelConsumerImplMixin.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.indium; + +import link.infra.indium.renderer.mesh.MutableQuadViewImpl; +import link.infra.indium.renderer.render.AbstractBlockRenderContext; +import link.infra.indium.renderer.render.BlockRenderInfo; +import meteordevelopment.meteorclient.systems.modules.render.Xray; +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(value = AbstractBlockRenderContext.class, remap = false) +public class BakedModelConsumerImplMixin { + @Shadow + protected BlockRenderInfo blockInfo; + + @Inject(method = "renderQuad(Llink/infra/indium/renderer/mesh/MutableQuadViewImpl;Z)V", at = @At(value = "INVOKE", target = "Llink/infra/indium/renderer/render/AbstractBlockRenderContext;bufferQuad(Llink/infra/indium/renderer/mesh/MutableQuadViewImpl;Lme/jellysquid/mods/sodium/client/render/chunk/terrain/material/Material;)V"), cancellable = true) + private void onBufferQuad(MutableQuadViewImpl quad, boolean isVanilla, CallbackInfo ci) { + int alpha = Xray.getAlpha(blockInfo.blockState, blockInfo.blockPos); + + if (alpha == 0) ci.cancel(); + } +} diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 95d3c99762..9152c8dad7 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -32,7 +32,8 @@ "meteor-client-indigo.mixins.json", "meteor-client-sodium.mixins.json", "meteor-client-canvas.mixins.json", - "meteor-client-lithium.mixins.json" + "meteor-client-lithium.mixins.json", + "meteor-client-indium.mixins.json" ], "accessWidener": "meteor-client.accesswidener", "custom": { diff --git a/src/main/resources/meteor-client-indium.mixins.json b/src/main/resources/meteor-client-indium.mixins.json new file mode 100644 index 0000000000..a61a9b6e05 --- /dev/null +++ b/src/main/resources/meteor-client-indium.mixins.json @@ -0,0 +1,12 @@ +{ + "required": true, + "package": "meteordevelopment.meteorclient.mixin.indium", + "compatibilityLevel": "JAVA_17", + "plugin": "meteordevelopment.meteorclient.MixinPlugin", + "client": [ + "BakedModelConsumerImplMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} From d768fc815c15198509b63aff9ec41286765cfc47 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Fri, 8 Sep 2023 17:46:57 +0100 Subject: [PATCH 100/357] refactor --- ...sumerImplMixin.java => AbstractBlockRenderContextMixin.java} | 2 +- src/main/resources/meteor-client-indium.mixins.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename src/main/java/meteordevelopment/meteorclient/mixin/indium/{BakedModelConsumerImplMixin.java => AbstractBlockRenderContextMixin.java} (96%) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/indium/BakedModelConsumerImplMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/indium/AbstractBlockRenderContextMixin.java similarity index 96% rename from src/main/java/meteordevelopment/meteorclient/mixin/indium/BakedModelConsumerImplMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/indium/AbstractBlockRenderContextMixin.java index 7d3cf8f1d8..8ead45ba5e 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/indium/BakedModelConsumerImplMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/indium/AbstractBlockRenderContextMixin.java @@ -16,7 +16,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(value = AbstractBlockRenderContext.class, remap = false) -public class BakedModelConsumerImplMixin { +public class AbstractBlockRenderContextMixin { @Shadow protected BlockRenderInfo blockInfo; diff --git a/src/main/resources/meteor-client-indium.mixins.json b/src/main/resources/meteor-client-indium.mixins.json index a61a9b6e05..536550283b 100644 --- a/src/main/resources/meteor-client-indium.mixins.json +++ b/src/main/resources/meteor-client-indium.mixins.json @@ -4,7 +4,7 @@ "compatibilityLevel": "JAVA_17", "plugin": "meteordevelopment.meteorclient.MixinPlugin", "client": [ - "BakedModelConsumerImplMixin" + "AbstractBlockRenderContextMixin" ], "injectors": { "defaultRequire": 1 From dbf27d3a7fac70c13f6493b45dd0679647fb4dd3 Mon Sep 17 00:00:00 2001 From: The Raccoon <116294072+RaccTheRicky@users.noreply.github.com> Date: Sat, 9 Sep 2023 11:08:04 -0500 Subject: [PATCH 101/357] Improve MiddleClickExtra (#4029) --- .../meteorclient/systems/modules/Modules.java | 1 - .../modules/misc/MiddleClickFriend.java | 51 ------ .../modules/player/MiddleClickExtra.java | 155 ++++++++++++------ 3 files changed, 109 insertions(+), 98 deletions(-) delete mode 100644 src/main/java/meteordevelopment/meteorclient/systems/modules/misc/MiddleClickFriend.java diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java index 6a10a6f29b..1e18bfd65d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java @@ -556,7 +556,6 @@ private void initMisc() { add(new BookBot()); add(new DiscordPresence()); add(new MessageAura()); - add(new MiddleClickFriend()); add(new NameProtect()); add(new Notebot()); add(new Notifier()); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/MiddleClickFriend.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/MiddleClickFriend.java deleted file mode 100644 index 212506b871..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/MiddleClickFriend.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.systems.modules.misc; - -import meteordevelopment.meteorclient.events.meteor.MouseButtonEvent; -import meteordevelopment.meteorclient.settings.BoolSetting; -import meteordevelopment.meteorclient.settings.Setting; -import meteordevelopment.meteorclient.settings.SettingGroup; -import meteordevelopment.meteorclient.systems.friends.Friend; -import meteordevelopment.meteorclient.systems.friends.Friends; -import meteordevelopment.meteorclient.systems.modules.Categories; -import meteordevelopment.meteorclient.systems.modules.Module; -import meteordevelopment.meteorclient.utils.misc.input.KeyAction; -import meteordevelopment.meteorclient.utils.player.ChatUtils; -import meteordevelopment.orbit.EventHandler; -import net.minecraft.entity.player.PlayerEntity; - -import static org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_MIDDLE; - -public class MiddleClickFriend extends Module { - private final SettingGroup sgGeneral = settings.getDefaultGroup(); - - private final Setting message = sgGeneral.add(new BoolSetting.Builder() - .name("message") - .description("Sends a message to the player when you add them as a friend.") - .defaultValue(false) - .build() - ); - - public MiddleClickFriend() { - super(Categories.Misc, "middle-click-friend", "Adds or removes a player as a friend via middle click."); - } - - @EventHandler - private void onMouseButton(MouseButtonEvent event) { - if (event.action != KeyAction.Press || event.button != GLFW_MOUSE_BUTTON_MIDDLE || mc.currentScreen != null || mc.targetedEntity == null || !(mc.targetedEntity instanceof PlayerEntity player)) return; - - if (!Friends.get().isFriend(player)) { - Friends.get().add(new Friend(player)); - info("Added %s to friends", player.getEntityName()); - if (message.get()) ChatUtils.sendPlayerMsg("/msg " + player.getEntityName() + " I just friended you on Meteor."); - } - else { - Friends.get().remove(Friends.get().get(player)); - info("Removed %s from friends", player.getEntityName()); - } - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/MiddleClickExtra.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/MiddleClickExtra.java index 8e518b2323..0af7d1116e 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/MiddleClickExtra.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/MiddleClickExtra.java @@ -8,20 +8,26 @@ import meteordevelopment.meteorclient.events.entity.player.FinishUsingItemEvent; import meteordevelopment.meteorclient.events.entity.player.StoppedUsingItemEvent; import meteordevelopment.meteorclient.events.meteor.MouseButtonEvent; +import meteordevelopment.meteorclient.events.packets.PacketEvent; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.settings.BoolSetting; import meteordevelopment.meteorclient.settings.EnumSetting; import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.settings.SettingGroup; +import meteordevelopment.meteorclient.systems.friends.Friend; +import meteordevelopment.meteorclient.systems.friends.Friends; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.misc.input.KeyAction; +import meteordevelopment.meteorclient.utils.player.ChatUtils; import meteordevelopment.meteorclient.utils.player.FindItemResult; import meteordevelopment.meteorclient.utils.player.InvUtils; import meteordevelopment.orbit.EventHandler; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.BowItem; import net.minecraft.item.Item; import net.minecraft.item.Items; +import net.minecraft.network.packet.c2s.play.UpdateSelectedSlotC2SPacket; import net.minecraft.util.Hand; import static org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_MIDDLE; @@ -36,105 +42,162 @@ public class MiddleClickExtra extends Module { .build() ); + private final Setting message = sgGeneral.add(new BoolSetting.Builder() + .name("message") + .description("Sends a message to the player when you add them as a friend.") + .defaultValue(false) + .visible(() -> mode.get() == Mode.AddFriend) + .build() + ); + + private final Setting quickSwap = sgGeneral.add(new BoolSetting.Builder() + .name("quick-swap") + .description("Allows you to use items in your inventory by simulating hotbar key presses. May get flagged by anticheats.") + .defaultValue(false) + .visible(() -> mode.get() != Mode.AddFriend) + .build() + ); + + private final Setting swapBack = sgGeneral.add(new BoolSetting.Builder() + .name("swap-back") + .description("Swap back to your original slot when you finish using an item.") + .defaultValue(false) + .visible(() -> mode.get() != Mode.AddFriend && !quickSwap.get()) + .build() + ); + private final Setting notify = sgGeneral.add(new BoolSetting.Builder() .name("notify") .description("Notifies you when you do not have the specified item in your hotbar.") .defaultValue(true) + .visible(() -> mode.get() != Mode.AddFriend) .build() ); - private boolean isUsing; - public MiddleClickExtra() { - super(Categories.Player, "middle-click-extra", "Lets you use items when you middle click."); + super(Categories.Player, "middle-click-extra", "Perform various actions when you middle click."); } + private boolean isUsing; + private boolean wasHeld; + private int itemSlot; + private int selectedSlot; + @Override public void onDeactivate() { - stopIfUsing(); + stopIfUsing(false); } @EventHandler private void onMouseButton(MouseButtonEvent event) { if (event.action != KeyAction.Press || event.button != GLFW_MOUSE_BUTTON_MIDDLE || mc.currentScreen != null) return; - FindItemResult result = InvUtils.findInHotbar(mode.get().item); + if (mode.get() == Mode.AddFriend) { + if (mc.targetedEntity == null) return; + if (!(mc.targetedEntity instanceof PlayerEntity player)) return; + + if (!Friends.get().isFriend(player)) { + Friends.get().add(new Friend(player)); + info("Added %s to friends", player.getEntityName()); + if (message.get()) ChatUtils.sendPlayerMsg("/msg " + player.getEntityName() + " I just friended you on Meteor."); + } else { + Friends.get().remove(Friends.get().get(player)); + info("Removed %s from friends", player.getEntityName()); + } + + return; + } - if (!result.found()) { + FindItemResult result = InvUtils.find(mode.get().item); + if (!result.found() || !result.isHotbar() && !quickSwap.get()) { if (notify.get()) warning("Unable to find specified item."); return; } - InvUtils.swap(result.slot(), true); + selectedSlot = mc.player.getInventory().selectedSlot; + itemSlot = result.slot(); + wasHeld = result.isMainHand(); - switch (mode.get().type) { - case Immediate -> { - mc.interactionManager.interactItem(mc.player, Hand.MAIN_HAND); - InvUtils.swapBack(); - } - case LongerSingleClick -> mc.interactionManager.interactItem(mc.player, Hand.MAIN_HAND); - case Longer -> { - mc.options.useKey.setPressed(true); - isUsing = true; - } + if (!wasHeld) { + if (!quickSwap.get()) InvUtils.swap(result.slot(), swapBack.get()); + else InvUtils.quickSwap().fromId(selectedSlot).to(itemSlot); + } + + if (mode.get().immediate) { + mc.interactionManager.interactItem(mc.player, Hand.MAIN_HAND); + swapBack(false); + } else { + mc.options.useKey.setPressed(true); + isUsing = true; } } @EventHandler private void onTick(TickEvent.Pre event) { - if (isUsing) { - boolean pressed = true; + if (!isUsing) return; + boolean pressed = true; - if (mc.player.getMainHandStack().getItem() instanceof BowItem) { - pressed = BowItem.getPullProgress(mc.player.getItemUseTime()) < 1; - } - - mc.options.useKey.setPressed(pressed); + if (mc.player.getMainHandStack().getItem() instanceof BowItem) { + pressed = BowItem.getPullProgress(mc.player.getItemUseTime()) < 1; } + + mc.options.useKey.setPressed(pressed); } @EventHandler - private void onFinishUsingItem(FinishUsingItemEvent event) { - stopIfUsing(); + private void onPacketSendEvent(PacketEvent.Send event) { + if (event.packet instanceof UpdateSelectedSlotC2SPacket) { + stopIfUsing(true); + } } @EventHandler private void onStoppedUsingItem(StoppedUsingItemEvent event) { - stopIfUsing(); + stopIfUsing(false); } - private void stopIfUsing() { + @EventHandler + private void onFinishUsingItem(FinishUsingItemEvent event) { + stopIfUsing(false); + } + + private void stopIfUsing(boolean wasCancelled) { if (isUsing) { + swapBack(wasCancelled); mc.options.useKey.setPressed(false); - InvUtils.swapBack(); isUsing = false; } } + void swapBack(boolean wasCancelled) { + if (wasHeld) return; + + if (quickSwap.get()) { + InvUtils.quickSwap().fromId(selectedSlot).to(itemSlot); + } else { + if (!swapBack.get() || wasCancelled) return; + InvUtils.swapBack(); + } + } + public enum Mode { - Pearl(Items.ENDER_PEARL, Type.Immediate), - Rocket(Items.FIREWORK_ROCKET, Type.Immediate), + Pearl(Items.ENDER_PEARL, true), + XP(Items.EXPERIENCE_BOTTLE, true), + Rocket(Items.FIREWORK_ROCKET, true), - Rod(Items.FISHING_ROD, Type.LongerSingleClick), + Bow(Items.BOW, false), + Gap(Items.GOLDEN_APPLE, false), + EGap(Items.ENCHANTED_GOLDEN_APPLE, false), + Chorus(Items.CHORUS_FRUIT, false), - Bow(Items.BOW, Type.Longer), - Gap(Items.GOLDEN_APPLE, Type.Longer), - EGap(Items.ENCHANTED_GOLDEN_APPLE, Type.Longer), - Chorus(Items.CHORUS_FRUIT, Type.Longer), - XP(Items.EXPERIENCE_BOTTLE, Type.Immediate); + AddFriend(null, true); private final Item item; - private final Type type; + private final boolean immediate; - Mode(Item item, Type type) { + Mode(Item item, boolean immediate) { this.item = item; - this.type = type; + this.immediate = immediate; } } - - private enum Type { - Immediate, - LongerSingleClick, - Longer - } } From b1aa34fa48cf9e24c97360831f5e9e8776a140f1 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Sun, 10 Sep 2023 15:25:38 -0400 Subject: [PATCH 102/357] Highlight antixrayheuristics in red in .server plugins command (#4060) --- .../meteorclient/commands/commands/ServerCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java index c825bb0469..bf532fed28 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java @@ -36,7 +36,7 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; public class ServerCommand extends Command { - private static final List ANTICHEAT_LIST = Arrays.asList("nocheatplus", "negativity", "warden", "horizon", "illegalstack", "coreprotect", "exploitsx", "vulcan", "abc", "spartan", "kauri", "anticheatreloaded", "witherac", "godseye", "matrix", "wraith"); + private static final List ANTICHEAT_LIST = Arrays.asList("nocheatplus", "negativity", "warden", "horizon", "illegalstack", "coreprotect", "exploitsx", "vulcan", "abc", "spartan", "kauri", "anticheatreloaded", "witherac", "godseye", "matrix", "wraith", "antixrayheuristics"); private static final String completionStarts = "/:abcdefghijklmnopqrstuvwxyz0123456789-"; private int ticks = 0; private boolean bukkitMode = false; From e5b64cc6d0545903ad408b6d2a04b4a84110297a Mon Sep 17 00:00:00 2001 From: panpanpro888 <77934024+panpanpro888@users.noreply.github.com> Date: Sun, 10 Sep 2023 22:30:58 +0300 Subject: [PATCH 103/357] Add a CPS variable to Meteor Starscript (#4057) --- .../mixin/MinecraftClientMixin.java | 7 +++ .../meteorclient/utils/Utils.java | 6 +-- .../meteorclient/utils/misc/CPSUtils.java | 50 +++++++++++++++++++ .../utils/misc/MeteorStarscript.java | 3 +- 4 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 src/main/java/meteordevelopment/meteorclient/utils/misc/CPSUtils.java diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftClientMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftClientMixin.java index 7f2f15c401..02bdc0cc4b 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftClientMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftClientMixin.java @@ -21,6 +21,7 @@ import meteordevelopment.meteorclient.systems.modules.player.FastUse; import meteordevelopment.meteorclient.systems.modules.render.UnfocusedCPU; import meteordevelopment.meteorclient.utils.Utils; +import meteordevelopment.meteorclient.utils.misc.CPSUtils; import meteordevelopment.meteorclient.utils.misc.MeteorStarscript; import meteordevelopment.meteorclient.utils.network.OnlinePlayers; import meteordevelopment.starscript.Script; @@ -82,6 +83,7 @@ private void onInit(CallbackInfo info) { @Inject(at = @At("HEAD"), method = "tick") private void onPreTick(CallbackInfo info) { OnlinePlayers.update(); + doItemUseCalled = false; getProfiler().push(MeteorClient.MOD_ID + "_pre_update"); @@ -99,6 +101,11 @@ private void onTick(CallbackInfo info) { getProfiler().pop(); } + @Inject(method = "doAttack", at = @At("HEAD")) + private void onAttack(CallbackInfoReturnable cir) { + CPSUtils.onAttack(); + } + @Inject(method = "doItemUse", at = @At("HEAD")) private void onDoItemUse(CallbackInfo info) { doItemUseCalled = true; diff --git a/src/main/java/meteordevelopment/meteorclient/utils/Utils.java b/src/main/java/meteordevelopment/meteorclient/utils/Utils.java index df8bfa0b4e..c8e84ac468 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/Utils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/Utils.java @@ -64,17 +64,17 @@ import static org.lwjgl.glfw.GLFW.*; public class Utils { + public static final Pattern FILE_NAME_INVALID_CHARS_PATTERN = Pattern.compile("[\\s\\\\/:*?\"<>|]"); + public static final Color WHITE = new Color(255, 255, 255); + private static final Random random = new Random(); public static boolean firstTimeTitleScreen = true; public static boolean isReleasingTrident; - public static final Color WHITE = new Color(255, 255, 255); public static boolean rendering3D = true; public static double frameTime; public static Screen screenToOpen; public static VertexSorter vertexSorter; - public static final Pattern FILE_NAME_INVALID_CHARS_PATTERN = Pattern.compile("[\\s\\\\/:*?\"<>|]"); - @PreInit public static void init() { MeteorClient.EVENT_BUS.subscribe(Utils.class); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/CPSUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/CPSUtils.java new file mode 100644 index 0000000000..ecbc4c056c --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/CPSUtils.java @@ -0,0 +1,50 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.utils.misc; + +import meteordevelopment.meteorclient.MeteorClient; +import meteordevelopment.meteorclient.events.world.TickEvent; +import meteordevelopment.meteorclient.utils.PreInit; +import meteordevelopment.orbit.EventHandler; + + +public class CPSUtils { + private static int clicks; + private static int cps; + private static int secondsClicking; + private static long lastTime; + + @PreInit + public static void init() { + MeteorClient.EVENT_BUS.subscribe(CPSUtils.class); + } + + @EventHandler + private static void onTick(TickEvent.Pre event) { + long currentTime = System.currentTimeMillis(); + // Run every second + if (currentTime - CPSUtils.lastTime >= 1000) { + if (CPSUtils.cps == 0) { + CPSUtils.clicks = 0; + CPSUtils.secondsClicking = 0; + } else { + CPSUtils.lastTime = currentTime; + CPSUtils.secondsClicking++; + CPSUtils.cps = 0; + } + } + } + + + public static void onAttack() { + CPSUtils.clicks++; + CPSUtils.cps++; + } + + public static int getCpsAverage() { + return clicks / (secondsClicking == 0 ? 1 : secondsClicking); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorStarscript.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorStarscript.java index dedb7b8e80..242fb36a4b 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorStarscript.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorStarscript.java @@ -78,6 +78,7 @@ public static void init() { ss.set("fps", () -> Value.number(MinecraftClientAccessor.getFps())); ss.set("ping", MeteorStarscript::ping); ss.set("time", () -> Value.string(LocalTime.now().format(DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT)))); + ss.set("cps", () -> Value.number(CPSUtils.getCpsAverage())); // Meteor ss.set("meteor", new ValueMap() @@ -125,7 +126,7 @@ public static void init() { .set("health", () -> Value.number(mc.player != null ? mc.player.getHealth() : 0)) .set("absorption", () -> Value.number(mc.player != null ? mc.player.getAbsorptionAmount() : 0)) .set("hunger", () -> Value.number(mc.player != null ? mc.player.getHungerManager().getFoodLevel() : 0)) - + .set("speed", () -> Value.number(Utils.getPlayerSpeed().horizontalLength())) .set("speed_all", new ValueMap() .set("_toString", () -> Value.string(mc.player != null ? Utils.getPlayerSpeed().toString() : "")) From 52595d08d43112fe122783e5d4d2acf0b9c492e5 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Sun, 10 Sep 2023 15:33:51 -0400 Subject: [PATCH 104/357] Fix ChatUtils formatting in log files (#4061) --- .../meteorclient/utils/player/ChatUtils.java | 60 ++++++++++++++----- 1 file changed, 46 insertions(+), 14 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/utils/player/ChatUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/player/ChatUtils.java index b46da53a06..bf2283e4f6 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/player/ChatUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/player/ChatUtils.java @@ -6,6 +6,7 @@ package meteordevelopment.meteorclient.utils.player; import baritone.api.BaritoneAPI; +import com.mojang.brigadier.StringReader; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.mixininterface.IChatHud; import meteordevelopment.meteorclient.systems.config.Config; @@ -30,7 +31,7 @@ public class ChatUtils { @PostInit public static void init() { - PREFIX = Text.literal("") + PREFIX = Text.empty() .setStyle(Style.EMPTY.withFormatting(Formatting.GRAY)) .append("[") .append(Text.literal("Meteor").setStyle(Style.EMPTY.withColor(TextColor.fromRgb(MeteorClient.ADDON.color.getPacked())))) @@ -121,19 +122,19 @@ public static void sendMsg(int id, Formatting color, String message, Object... a } public static void sendMsg(int id, @Nullable String prefixTitle, @Nullable Formatting prefixColor, Formatting messageColor, String messageContent, Object... args) { - sendMsg(id, prefixTitle, prefixColor, formatMsg(messageContent, messageColor, args), messageColor); + MutableText message = formatMsg(String.format(messageContent, args), messageColor); + sendMsg(id, prefixTitle, prefixColor, message); } public static void sendMsg(int id, @Nullable String prefixTitle, @Nullable Formatting prefixColor, String messageContent, Formatting messageColor) { - MutableText message = Text.literal(messageContent); - message.setStyle(message.getStyle().withFormatting(messageColor)); + MutableText message = formatMsg(messageContent, messageColor); sendMsg(id, prefixTitle, prefixColor, message); } public static void sendMsg(int id, @Nullable String prefixTitle, @Nullable Formatting prefixColor, Text msg) { if (mc.world == null) return; - MutableText message = Text.literal(""); + MutableText message = Text.empty(); message.append(getPrefix()); if (prefixTitle != null) message.append(getCustomPrefix(prefixTitle, prefixColor)); message.append(msg); @@ -144,7 +145,7 @@ public static void sendMsg(int id, @Nullable String prefixTitle, @Nullable Forma } private static MutableText getCustomPrefix(String prefixTitle, Formatting prefixColor) { - MutableText prefix = Text.literal(""); + MutableText prefix = Text.empty(); prefix.setStyle(prefix.getStyle().withFormatting(Formatting.GRAY)); prefix.append("["); @@ -196,19 +197,50 @@ private static Text getPrefix() { return PREFIX; } - private static String formatMsg(String format, Formatting defaultColor, Object... args) { - String msg = String.format(format, args); - msg = msg.replace("(default)", defaultColor.toString()); - msg = msg.replace("(highlight)", Formatting.WHITE.toString()); - msg = msg.replace("(underline)", Formatting.UNDERLINE.toString()); + private static MutableText formatMsg(String message, Formatting defaultColor) { + StringReader reader = new StringReader(message); + MutableText text = Text.empty(); + Style style = Style.EMPTY.withFormatting(defaultColor); + StringBuilder result = new StringBuilder(); + boolean formatting = false; + while (reader.canRead()) { + char c = reader.read(); + if (c == '(') { + text.append(Text.literal(result.toString()).setStyle(style)); + result.setLength(0); + result.append(c); + formatting = true; + } else { + result.append(c); + + if (formatting && c == ')') { + switch (result.toString()) { + case "(default)" -> { + style = style.withFormatting(defaultColor); + result.setLength(0); + } + case "(highlight)" -> { + style = style.withFormatting(Formatting.WHITE); + result.setLength(0); + } + case "(underline)" -> { + style = style.withFormatting(Formatting.UNDERLINE); + result.setLength(0); + } + } + formatting = false; + } + } + } + + if (!result.isEmpty()) text.append(Text.literal(result.toString()).setStyle(style)); - return msg; + return text; } public static MutableText formatCoords(Vec3d pos) { String coordsString = String.format("(highlight)(underline)%.0f, %.0f, %.0f(default)", pos.x, pos.y, pos.z); - coordsString = formatMsg(coordsString, Formatting.GRAY); - MutableText coordsText = Text.literal(coordsString); + MutableText coordsText = formatMsg(coordsString, Formatting.GRAY); coordsText.setStyle(coordsText.getStyle() .withFormatting(Formatting.BOLD) .withClickEvent(new ClickEvent( From e58f821baa54c0128d662318e03db15b353d76f9 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Wed, 20 Sep 2023 18:54:15 -0400 Subject: [PATCH 105/357] Custom text renderer shadow fix (#4090) --- .../meteorclient/renderer/text/CustomTextRenderer.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/text/CustomTextRenderer.java b/src/main/java/meteordevelopment/meteorclient/renderer/text/CustomTextRenderer.java index 1ac7352446..a7c52dac92 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/text/CustomTextRenderer.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/text/CustomTextRenderer.java @@ -26,6 +26,7 @@ public class CustomTextRenderer implements TextRenderer { private boolean building; private boolean scaleOnly; + private double fontScale = 1; private double scale = 1; public CustomTextRenderer(FontFace fontFace) { @@ -71,7 +72,7 @@ public void begin(double scale, boolean scaleOnly, boolean big) { this.building = true; this.scaleOnly = scaleOnly; - double fontScale = font.getHeight() / 18.0; + this.fontScale = font.getHeight() / 18.0; this.scale = 1 + (scale - fontScale) / fontScale; } @@ -80,7 +81,7 @@ public double getWidth(String text, int length, boolean shadow) { if (text.isEmpty()) return 0; Font font = building ? this.font : fonts[0]; - return (font.getWidth(text, length) + (shadow ? 1 : 0)) * scale + (shadow ? 1 : 0); + return (font.getWidth(text, length) + (shadow ? 1 : 0)) * scale; } @Override @@ -99,7 +100,7 @@ public double render(String text, double x, double y, Color color, boolean shado int preShadowA = SHADOW_COLOR.a; SHADOW_COLOR.a = (int) (color.a / 255.0 * preShadowA); - width = font.render(mesh, text, x + 1, y + 1, SHADOW_COLOR, scale); + width = font.render(mesh, text, x + fontScale * scale, y + fontScale * scale, SHADOW_COLOR, scale); font.render(mesh, text, x, y, color, scale); SHADOW_COLOR.a = preShadowA; From 4676675f1f22a32ff336b245fa40ca2cd2267c8c Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Wed, 20 Sep 2023 19:25:03 -0400 Subject: [PATCH 106/357] PotionTimersHud infinite effects fix (#4091) --- .../meteorclient/systems/hud/elements/PotionTimersHud.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 554d12d46e..92a92cf6ef 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PotionTimersHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PotionTimersHud.java @@ -244,7 +244,7 @@ public void render(HudRenderer renderer) { } private String getString(StatusEffectInstance statusEffectInstance) { - return String.format("%s %d (%s)", Names.get(statusEffectInstance.getEffectType()), statusEffectInstance.getAmplifier() + 1, StatusEffectUtil.getDurationText(statusEffectInstance, 1).getString()); + return String.format("%s %d (%s)", Names.get(statusEffectInstance.getEffectType()), statusEffectInstance.getAmplifier() + 1, statusEffectInstance.isInfinite() ? "inf" : StatusEffectUtil.getDurationText(statusEffectInstance, 1).getString()); //todo remove "inf" when font rendering can use symbols } private double getScale() { From 738d0d93d24e80c7527ef67d95205dfe341ec253 Mon Sep 17 00:00:00 2001 From: P529 Date: Thu, 21 Sep 2023 19:18:58 +0200 Subject: [PATCH 107/357] Added Tab Height adjustment (#4088) --- .../meteorclient/mixin/PlayerListHudMixin.java | 6 ++++++ .../meteorclient/systems/modules/misc/BetterTab.java | 11 ++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerListHudMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerListHudMixin.java index 137a7fbc66..ecb00bd57d 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerListHudMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerListHudMixin.java @@ -42,6 +42,12 @@ private int modifyWidth(int width) { return module.isActive() && module.accurateLatency.get() ? width + 30 : width; } + @ModifyConstant(constant = @Constant(intValue = 20), method = "render") + private int modifyHeight(int height) { + BetterTab module = Modules.get().get(BetterTab.class); + return module.isActive() ? module.tabHeight.get() : height; + } + @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); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterTab.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterTab.java index 68203b343c..5bdd2c8fdb 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterTab.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterTab.java @@ -26,13 +26,22 @@ public class BetterTab extends Module { public final Setting tabSize = sgGeneral.add(new IntSetting.Builder() .name("tablist-size") - .description("How many players to display in the tablist.") + .description("How many players in total to display in the tablist.") .defaultValue(100) .min(1) .sliderRange(1, 1000) .build() ); + public final Setting tabHeight = sgGeneral.add(new IntSetting.Builder() + .name("column-height") + .description("How many players to display in each column.") + .defaultValue(20) + .min(1) + .sliderRange(1, 1000) + .build() + ); + private final Setting self = sgGeneral.add(new BoolSetting.Builder() .name("highlight-self") .description("Highlights yourself in the tablist.") From 8536494b0767bb8219d496f26936534e7b47be2e Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Fri, 22 Sep 2023 12:32:21 +0100 Subject: [PATCH 108/357] Let the setting command open the hud screen --- .../commands/commands/SettingCommand.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/SettingCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/SettingCommand.java index 6facd73456..87b43478c8 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/SettingCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/SettingCommand.java @@ -12,6 +12,8 @@ import meteordevelopment.meteorclient.commands.arguments.SettingValueArgumentType; import meteordevelopment.meteorclient.gui.GuiThemes; import meteordevelopment.meteorclient.gui.WidgetScreen; +import meteordevelopment.meteorclient.gui.tabs.TabScreen; +import meteordevelopment.meteorclient.gui.tabs.Tabs; import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.Utils; @@ -26,6 +28,17 @@ public SettingCommand() { @Override public void build(LiteralArgumentBuilder builder) { + builder.then( + literal("hud") + .executes(context -> { + TabScreen screen = Tabs.get().get(3).createScreen(GuiThemes.get()); + screen.parent = null; + + Utils.screenToOpen = screen; + return SINGLE_SUCCESS; + }) + ); + // Open module screen builder.then( argument("module", ModuleArgumentType.create()) From 6ff4d92b1921e17a1213d8d30d2c33fb6c7ee6d6 Mon Sep 17 00:00:00 2001 From: Patrick Date: Fri, 15 Sep 2023 21:06:43 +0200 Subject: [PATCH 109/357] Add null check to runObject --- .../meteorclient/systems/hud/screens/AddHudElementScreen.java | 1 + 1 file changed, 1 insertion(+) 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 851b44c2ac..b4ac74cbfe 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/screens/AddHudElementScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/screens/AddHudElementScreen.java @@ -104,6 +104,7 @@ public void initWidgets() { } private void runObject(Object object) { + if (object == null) return; if (object instanceof HudElementInfo.Preset preset) { Hud.get().add(preset, x, y); close(); From b8d8f069f31ba26933195332644c5275f6367c1f Mon Sep 17 00:00:00 2001 From: Wide-Cat <74723656+Wide-Cat@users.noreply.github.com> Date: Sun, 24 Sep 2023 17:51:20 +0100 Subject: [PATCH 110/357] Update Nuker --- .../meteorclient/systems/modules/world/Nuker.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java index 71dd4fd48e..b3123ee743 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java @@ -165,7 +165,7 @@ public class Nuker extends Module { private final Setting listMode = sgWhitelist.add(new EnumSetting.Builder() .name("list-mode") .description("Selection mode.") - .defaultValue(ListMode.Whitelist) + .defaultValue(ListMode.Blacklist) .build() ); From 6d76982a87ed175642d4f2ba2703179ab816cde3 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Sun, 8 Oct 2023 18:16:55 +0100 Subject: [PATCH 111/357] fix flight crash --- .../meteorclient/systems/modules/movement/Flight.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Flight.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Flight.java index fd613bd701..33a74f2eb2 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Flight.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Flight.java @@ -12,6 +12,7 @@ import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; +import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.orbit.EventHandler; import net.minecraft.block.AbstractBlock; import net.minecraft.entity.Entity; @@ -28,7 +29,7 @@ public class Flight extends Module { .description("The mode for Flight.") .defaultValue(Mode.Abilities) .onChanged(mode -> { - if (!isActive()) return; + if (!isActive() || !Utils.canUpdate()) return; abilitiesOff(); }) .build() From 0e0808ce6af85fa5e2fdb8523fc7b27443cc22b3 Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Mon, 9 Oct 2023 17:39:32 +0200 Subject: [PATCH 112/357] Future version 0.5.5 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 0d58f0181c..093f333337 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,7 +7,7 @@ loader_version=0.14.21 fapi_version=0.84.0+1.20.1 # Mod Properties -mod_version=0.5.4 +mod_version=0.5.5 maven_group=meteordevelopment archives_base_name=meteor-client From 1ceea3e666e374e67b70c630d105251aeebf6154 Mon Sep 17 00:00:00 2001 From: Wide-Cat <74723656+Wide-Cat@users.noreply.github.com> Date: Mon, 9 Oct 2023 17:06:54 +0100 Subject: [PATCH 113/357] 1.20.2 update (#4119) --- build.gradle | 9 +- gradle.properties | 18 +-- gradle/wrapper/gradle-wrapper.properties | 2 +- .../commands/commands/ServerCommand.java | 2 +- .../meteorclient/gui/WidgetScreen.java | 14 +-- .../AbstractClientPlayerEntityMixin.java | 9 -- .../mixin/BookEditScreenMixin.java | 2 +- .../mixin/CapeFeatureRendererMixin.java | 24 ++++ .../meteorclient/mixin/ChatHudMixin.java | 6 + .../mixin/ClientConnectionMixin.java | 10 +- .../mixin/ClientPlayNetworkHandlerMixin.java | 15 ++- .../meteorclient/mixin/ClientWorldMixin.java | 4 +- .../mixin/CustomPayloadC2SPacketAccessor.java | 26 ----- .../mixin/CustomPayloadS2CPacketMixin.java | 6 +- .../mixin/DefaultSkinHelperMixin.java | 2 +- .../mixin/DisconnectedScreenMixin.java | 21 ++-- .../mixin/ElytraFeatureRendererMixin.java | 33 ++++++ .../meteorclient/mixin/FileCacheAccessor.java | 18 +++ .../mixin/MinecraftClientAccessor.java | 12 +- .../mixin/MinecraftClientMixin.java | 2 +- .../mixin/PacketByteBufMixin.java | 8 +- .../mixin/PlayerEntityRendererMixin.java | 2 +- .../mixin/PlayerListEntryMixin.java | 8 +- .../mixin/PlayerSkinProviderAccessor.java | 6 +- .../meteorclient/mixin/ScreenMixin.java | 2 +- ...drasilMinecraftSessionServiceAccessor.java | 6 +- .../systems/accounts/Account.java | 19 +++- .../systems/accounts/AccountCache.java | 4 +- .../accounts/types/CrackedAccount.java | 4 +- .../systems/accounts/types/EasyMCAccount.java | 11 +- .../accounts/types/MicrosoftAccount.java | 5 +- .../accounts/types/TheAlteningAccount.java | 36 +++--- .../meteorclient/systems/friends/Friend.java | 6 +- .../meteorclient/systems/friends/Friends.java | 4 +- .../meteorclient/systems/hud/Hud.java | 2 +- .../systems/hud/elements/CombatHud.java | 12 +- .../systems/hud/elements/PlayerModelHud.java | 2 +- .../systems/hud/screens/HudEditorScreen.java | 2 +- .../systems/modules/misc/AutoLog.java | 2 +- .../systems/modules/misc/BetterChat.java | 2 +- .../systems/modules/misc/ServerSpoof.java | 15 ++- .../systems/modules/movement/ElytraBoost.java | 2 +- .../modules/render/BetterTooltips.java | 2 +- .../modules/render/BreakIndicators.java | 12 +- .../systems/modules/render/LogoutSpots.java | 6 +- .../systems/modules/world/InfinityMiner.java | 2 +- .../meteorclient/utils/Utils.java | 7 +- .../entity/fakeplayer/FakePlayerEntity.java | 2 +- .../utils/misc/FakeClientPlayer.java | 35 ++++-- .../utils/network/PacketUtils.java | 104 ++++++++++-------- .../utils/render/MeteorToast.java | 2 + .../utils/render/PlayerHeadUtils.java | 3 +- src/main/resources/fabric.mod.json | 4 +- .../resources/meteor-client.accesswidener | 1 + src/main/resources/meteor-client.mixins.json | 10 +- 55 files changed, 348 insertions(+), 237 deletions(-) create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/CapeFeatureRendererMixin.java delete mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/CustomPayloadC2SPacketAccessor.java create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/ElytraFeatureRendererMixin.java create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/FileCacheAccessor.java diff --git a/build.gradle b/build.gradle index 666ba25473..335f2911f2 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ plugins { - id "fabric-loom" version "1.2-SNAPSHOT" + id "fabric-loom" version "1.4-SNAPSHOT" id "maven-publish" - id "com.github.johnrengelman.shadow" version "7.1.2" + id "com.github.johnrengelman.shadow" version "8.1.1" } sourceCompatibility = targetCompatibility = JavaVersion.VERSION_17 @@ -69,8 +69,9 @@ dependencies { library "org.reflections:reflections:${project.reflections_version}" library("io.netty:netty-handler-proxy:${project.netty_version}") { transitive = false } library("io.netty:netty-codec-socks:${project.netty_version}") { transitive = false } - library "com.github.LlamaLad7.MixinExtras:mixinextras-fabric:${project.mixin_extras_version}" - annotationProcessor "com.github.LlamaLad7.MixinExtras:mixinextras-fabric:${project.mixin_extras_version}" + library "io.github.llamalad7:mixinextras-fabric:${project.mixin_extras_version}" + annotationProcessor "io.github.llamalad7:mixinextras-fabric:${project.mixin_extras_version}" + library "de.florianmichael:WaybackAuthLib:1.0.0" // Launch sub project shadow project(":launch") diff --git a/gradle.properties b/gradle.properties index 093f333337..0a629a6fad 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,10 +1,10 @@ org.gradle.jvmargs=-Xmx2G # Fabric (https://fabricmc.net/develop) -minecraft_version=1.20.1 -yarn_mappings=1.20.1+build.1 -loader_version=0.14.21 -fapi_version=0.84.0+1.20.1 +minecraft_version=1.20.2 +yarn_mappings=1.20.2+build.4 +loader_version=0.14.22 +fapi_version=0.89.3+1.20.2 # Mod Properties mod_version=0.5.5 @@ -14,13 +14,13 @@ archives_base_name=meteor-client # Dependency Versions # Sodium (https://github.com/CaffeineMC/sodium-fabric) -sodium_version=mc1.20.1-0.5.0 +sodium_version=mc1.20.2-0.5.3 # Lithium (https://github.com/CaffeineMC/lithium-fabric) -lithium_version=mc1.20-0.11.2 +lithium_version=mc1.20.2-0.12.0 # Iris (https://github.com/IrisShaders/Iris) -iris_version=1.6.5+1.20.1 +iris_version=1.6.9+1.20.2 # Orbit (https://github.com/MeteorDevelopment/orbit) orbit_version=0.2.3 @@ -38,7 +38,7 @@ reflections_version=0.10.2 netty_version=4.1.90.Final # Mixin Extras (https://github.com/LlamaLad7/MixinExtras) -mixin_extras_version=0.2.0-beta.8 +mixin_extras_version=0.2.0-rc.5 # Indium (https://github.com/comp500/Indium) -indium_version=1.0.25+mc1.20.1 +indium_version=1.0.27+mc1.20.1 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index fae08049a6..db9a6b825d 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java index bf532fed28..ce1fb6f02c 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java @@ -194,7 +194,7 @@ private void basicInfo() { info("Port: %d", ServerAddress.parse(server.address).getPort()); - info("Type: %s", mc.player.getServerBrand() != null ? mc.player.getServerBrand() : "unknown"); + info("Type: %s", mc.player.getServer().getSaveProperties().getServerBrands() != null ? mc.player.getServer().getSaveProperties().getServerBrands() : "unknown"); info("Motd: %s", server.label != null ? server.label.getString() : "unknown"); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/WidgetScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/WidgetScreen.java index 8ca1698fd6..1128b0b238 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/WidgetScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/WidgetScreen.java @@ -151,12 +151,12 @@ public void mouseMoved(double mouseX, double mouseY) { } @Override - public boolean mouseScrolled(double mouseX, double mouseY, double amount) { + public boolean mouseScrolled(double mouseX, double mouseY, double horizontalAmount, double verticalAmount) { if (locked) return false; - root.mouseScrolled(amount); + root.mouseScrolled(verticalAmount); - return super.mouseScrolled(mouseX, mouseY, amount); + return super.mouseScrolled(mouseX, mouseY, horizontalAmount, verticalAmount); } @Override @@ -197,8 +197,7 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) { textBox.setCursorMax(); done.set(true); - } - else { + } else { if (textBox.isFocused()) { textBox.setFocused(false); foundFocused.set(true); @@ -220,8 +219,7 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) { if (control && keyCode == GLFW_KEY_C && toClipboard()) { return true; - } - else if (control && keyCode == GLFW_KEY_V && fromClipboard()) { + } else if (control && keyCode == GLFW_KEY_V && fromClipboard()) { reload(); if (parent instanceof WidgetScreen wScreen) { wScreen.reload(); @@ -247,7 +245,7 @@ public boolean charTyped(char chr, int keyCode) { @Override public void render(DrawContext context, int mouseX, int mouseY, float delta) { - if (!Utils.canUpdate()) renderBackground(context); + if (!Utils.canUpdate()) renderBackground(context, mouseX, mouseY, delta); double s = mc.getWindow().getScaleFactor(); mouseX *= s; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/AbstractClientPlayerEntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractClientPlayerEntityMixin.java index a5945c409f..9f0d700cb3 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/AbstractClientPlayerEntityMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractClientPlayerEntityMixin.java @@ -6,11 +6,8 @@ package meteordevelopment.meteorclient.mixin; import meteordevelopment.meteorclient.utils.misc.FakeClientPlayer; -import meteordevelopment.meteorclient.utils.network.Capes; import net.minecraft.client.network.AbstractClientPlayerEntity; import net.minecraft.client.network.PlayerListEntry; -import net.minecraft.entity.player.PlayerEntity; -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; @@ -20,12 +17,6 @@ @Mixin(AbstractClientPlayerEntity.class) public class AbstractClientPlayerEntityMixin { - @Inject(method = "getCapeTexture", at = @At("HEAD"), cancellable = true) - private void onGetCapeTexture(CallbackInfoReturnable info) { - Identifier id = Capes.get((PlayerEntity) (Object) this); - if (id != null) info.setReturnValue(id); - } - // Player model rendering in main menu @Inject(method = "getPlayerListEntry", at = @At("HEAD"), cancellable = true) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BookEditScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BookEditScreenMixin.java index ab937ccd9d..a1a1c95cc2 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BookEditScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BookEditScreenMixin.java @@ -87,7 +87,7 @@ private void onInit(CallbackInfo info) { DataInputStream in = new DataInputStream(new ByteArrayInputStream(bytes)); try { - NbtCompound tag = NbtIo.read(in); + NbtCompound tag = NbtIo.readCompressed(in); NbtList listTag = tag.getList("pages", 8).copy(); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/CapeFeatureRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/CapeFeatureRendererMixin.java new file mode 100644 index 0000000000..b492d3cc5e --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/CapeFeatureRendererMixin.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 com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import meteordevelopment.meteorclient.utils.network.Capes; +import net.minecraft.client.network.AbstractClientPlayerEntity; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.entity.feature.CapeFeatureRenderer; +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; + +@Mixin(CapeFeatureRenderer.class) +public class CapeFeatureRendererMixin { + @ModifyExpressionValue(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/SkinTextures;capeTexture()Lnet/minecraft/util/Identifier;")) + private Identifier modifyCapeTexture(Identifier original, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, AbstractClientPlayerEntity abstractClientPlayerEntity, float f, float g, float h, float j, float k, float l) { + return Capes.get(abstractClientPlayerEntity); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java index 9f194d731a..19aa45dbea 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java @@ -121,6 +121,8 @@ private void onAddMessage(Text message, @Nullable MessageSignatureData signature @ModifyExpressionValue(method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;ILnet/minecraft/client/gui/hud/MessageIndicator;Z)V", slice = @Slice(from = @At(value = "FIELD", target = "Lnet/minecraft/client/gui/hud/ChatHud;visibleMessages:Ljava/util/List;")), at = @At(value = "INVOKE", target = "Ljava/util/List;size()I")) private int addMessageListSizeProxy(int size) { + if (Modules.get() == null) return size; + BetterChat betterChat = getBetterChat(); if (betterChat.isLongerChat() && betterChat.getChatLength() >= 100) return size - betterChat.getChatLength(); return size; @@ -151,12 +153,16 @@ private MessageIndicator onRender_modifyIndicator(MessageIndicator indicator) { @Inject(method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;ILnet/minecraft/client/gui/hud/MessageIndicator;Z)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/ChatHud;isChatFocused()Z"), locals = LocalCapture.CAPTURE_FAILSOFT) private void onBreakChatMessageLines(Text message, MessageSignatureData signature, int ticks, MessageIndicator indicator, boolean refresh, CallbackInfo ci, int i, List list) { + if (Modules.get() == null) return; // baritone calls addMessage before we initialise + getBetterChat().lines.add(0, list.size()); } @Inject(method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;ILnet/minecraft/client/gui/hud/MessageIndicator;Z)V", slice = @Slice(from = @At(value = "FIELD", target = "Lnet/minecraft/client/gui/hud/ChatHud;messages:Ljava/util/List;")), at = @At(value = "INVOKE", target = "Ljava/util/List;remove(I)Ljava/lang/Object;")) private void onRemoveMessage(Text message, MessageSignatureData signature, int ticks, MessageIndicator indicator, boolean refresh, CallbackInfo ci) { + if (Modules.get() == null) return; + BetterChat betterChat = getBetterChat(); int size = betterChat.lines.size() - (betterChat.isLongerChat() && betterChat.getChatLength() >= 100 ? betterChat.getChatLength() : 0); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java index 47592eca6a..ddbf0dc837 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java @@ -5,7 +5,6 @@ package meteordevelopment.meteorclient.mixin; -import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelPipeline; import io.netty.handler.proxy.Socks4ProxyHandler; @@ -21,7 +20,8 @@ import meteordevelopment.meteorclient.systems.proxies.Proxy; import net.minecraft.network.ClientConnection; import net.minecraft.network.NetworkSide; -import net.minecraft.network.PacketEncoderException; +import net.minecraft.network.handler.PacketEncoderException; +import net.minecraft.network.handler.PacketSizeLogger; import net.minecraft.network.listener.ClientPlayPacketListener; import net.minecraft.network.listener.PacketListener; import net.minecraft.network.packet.Packet; @@ -59,8 +59,8 @@ private void disconnect(Text disconnectReason, CallbackInfo ci) { } } - @Inject(method = "connect", at = @At("HEAD")) - private static void onConnect(InetSocketAddress address, boolean useEpoll, CallbackInfoReturnable cir) { + @Inject(method = "connect(Ljava/net/InetSocketAddress;ZLnet/minecraft/network/ClientConnection;)Lio/netty/channel/ChannelFuture;", at = @At("HEAD")) + private static void onConnect(InetSocketAddress address, boolean useEpoll, ClientConnection connection, CallbackInfoReturnable cir) { MeteorClient.EVENT_BUS.post(ServerConnectEndEvent.get(address)); } @@ -84,7 +84,7 @@ private void exceptionCaught(ChannelHandlerContext context, Throwable throwable, } @Inject(method = "addHandlers", at = @At("RETURN")) - private static void onAddHandlers(ChannelPipeline pipeline, NetworkSide side, CallbackInfo ci) { + private static void onAddHandlers(ChannelPipeline pipeline, NetworkSide side, PacketSizeLogger packetSizeLogger, CallbackInfo ci) { if (side != NetworkSide.CLIENTBOUND) return; Proxy proxy = Proxies.get().getEnabled(); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerMixin.java index 57bc791247..3016a695f9 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerMixin.java @@ -25,13 +25,15 @@ 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.world.chunk.WorldChunk; -import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -40,10 +42,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(ClientPlayNetworkHandler.class) -public abstract class ClientPlayNetworkHandlerMixin { - @Shadow - @Final - private MinecraftClient client; +public abstract class ClientPlayNetworkHandlerMixin extends ClientCommonNetworkHandler { @Shadow private ClientWorld world; @@ -55,6 +54,10 @@ public abstract class ClientPlayNetworkHandlerMixin { private boolean worldNotNull; + 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) { @@ -85,7 +88,7 @@ private void onPlaySound(PlaySoundS2CPacket packet, CallbackInfo info) { @Inject(method = "onChunkData", at = @At("TAIL")) private void onChunkData(ChunkDataS2CPacket packet, CallbackInfo info) { - WorldChunk chunk = client.world.getChunk(packet.getX(), packet.getZ()); + WorldChunk chunk = client.world.getChunk(packet.getChunkX(), packet.getChunkZ()); MeteorClient.EVENT_BUS.post(ChunkDataEvent.get(chunk)); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientWorldMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientWorldMixin.java index e2b441b389..106d8a1d4b 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientWorldMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientWorldMixin.java @@ -34,8 +34,8 @@ public abstract class ClientWorldMixin { @Shadow @Nullable public abstract Entity getEntityById(int id); - @Inject(method = "addEntityPrivate", at = @At("TAIL")) - private void onAddEntityPrivate(int id, Entity entity, CallbackInfo info) { + @Inject(method = "addEntity", at = @At("TAIL")) + private void onAddEntity(Entity entity, CallbackInfo info) { if (entity != null) MeteorClient.EVENT_BUS.post(EntityAddedEvent.get(entity)); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/CustomPayloadC2SPacketAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/CustomPayloadC2SPacketAccessor.java deleted file mode 100644 index 6ca12566e4..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/CustomPayloadC2SPacketAccessor.java +++ /dev/null @@ -1,26 +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.network.PacketByteBuf; -import net.minecraft.network.packet.c2s.play.CustomPayloadC2SPacket; -import net.minecraft.util.Identifier; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Mutable; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(CustomPayloadC2SPacket.class) -public interface CustomPayloadC2SPacketAccessor { - @Accessor("channel") - Identifier getChannel(); - - @Accessor("data") - PacketByteBuf getData(); - - @Mutable - @Accessor("data") - void setData(PacketByteBuf data); -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/CustomPayloadS2CPacketMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/CustomPayloadS2CPacketMixin.java index 553e0fe18e..01a3ff3fef 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/CustomPayloadS2CPacketMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/CustomPayloadS2CPacketMixin.java @@ -7,15 +7,15 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.misc.AntiPacketKick; -import net.minecraft.network.packet.s2c.play.CustomPayloadS2CPacket; +import net.minecraft.network.packet.s2c.common.CustomPayloadS2CPacket; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.Constant; import org.spongepowered.asm.mixin.injection.ModifyConstant; @Mixin(CustomPayloadS2CPacket.class) public class CustomPayloadS2CPacketMixin { - @ModifyConstant(method = "", constant = @Constant(intValue = 1048576)) - private int maxValue(int value) { + @ModifyConstant(method = "readUnknownPayload", constant = @Constant(intValue = 1048576)) + private static int maxValue(int value) { return Modules.get().isActive(AntiPacketKick.class) ? Integer.MAX_VALUE : value; } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/DefaultSkinHelperMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/DefaultSkinHelperMixin.java index 1eec65c6d7..a710fc3c87 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/DefaultSkinHelperMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/DefaultSkinHelperMixin.java @@ -16,7 +16,7 @@ @Mixin(DefaultSkinHelper.class) public class DefaultSkinHelperMixin { // Player model rendering in main menu - @Inject(method = "getSkin", at = @At("HEAD"), cancellable = true) + @Inject(method = "getSkinTextures(Ljava/util/UUID;)Lnet/minecraft/client/util/SkinTextures;", at = @At("HEAD"), cancellable = true) private static void onShouldUseSlimModel(UUID uuid, CallbackInfoReturnable info) { if (uuid == null) info.setReturnValue(false); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/DisconnectedScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/DisconnectedScreenMixin.java index 7e93545d24..3092d3f470 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/DisconnectedScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/DisconnectedScreenMixin.java @@ -12,12 +12,11 @@ import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.TitleScreen; import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.client.gui.widget.GridWidget; -import net.minecraft.client.network.ServerAddress; -import net.minecraft.client.network.ServerInfo; -import net.minecraft.client.resource.language.I18n; +import net.minecraft.client.gui.widget.DirectionalLayoutWidget; 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; @@ -28,6 +27,9 @@ @Mixin(DisconnectedScreen.class) 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; @@ -35,14 +37,15 @@ protected DisconnectedScreenMixin(Text title) { super(title); } - @Inject(method = "init", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/widget/GridWidget;refreshPositions()V", shift = At.Shift.BEFORE), locals = LocalCapture.CAPTURE_FAILHARD) - private void addButtons(CallbackInfo info, GridWidget.Adder adder) { + @Inject(method = "init", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/widget/DirectionalLayoutWidget;refreshPositions()V", shift = At.Shift.BEFORE), locals = LocalCapture.CAPTURE_FAILHARD) + private void addButtons(CallbackInfo ci, ButtonWidget buttonWidget) { AutoReconnect autoReconnect = Modules.get().get(AutoReconnect.class); if (autoReconnect.lastServerConnection != null) { - reconnectBtn = adder.add(new ButtonWidget.Builder(Text.literal(getText()), button -> tryConnecting()).build()); + reconnectBtn = new ButtonWidget.Builder(Text.literal(getText()), button -> tryConnecting()).build(); + grid.add(reconnectBtn); - adder.add( + grid.add( new ButtonWidget.Builder(Text.literal("Toggle Auto Reconnect"), button -> { autoReconnect.toggle(); reconnectBtn.setMessage(Text.literal(getText())); @@ -65,12 +68,14 @@ public void tick() { } } + @Unique private String getText() { String reconnectText = "Reconnect"; if (Modules.get().isActive(AutoReconnect.class)) reconnectText += " " + String.format("(%.1f)", time / 20); return reconnectText; } + @Unique private void tryConnecting() { var lastServer = Modules.get().get(AutoReconnect.class).lastServerConnection; ConnectScreen.connect(new TitleScreen(), mc, lastServer.left(), lastServer.right(), false); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ElytraFeatureRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ElytraFeatureRendererMixin.java new file mode 100644 index 0000000000..a96914a807 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ElytraFeatureRendererMixin.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.utils.network.Capes; +import net.minecraft.client.network.AbstractClientPlayerEntity; +import net.minecraft.client.render.VertexConsumerProvider; +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.util.math.MatrixStack; +import net.minecraft.entity.LivingEntity; +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", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/SkinTextures;capeTexture()Lnet/minecraft/util/Identifier;")) + private Identifier modifyCapeTexture(Identifier original, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, T livingEntity, float f, float g, float h, float j, float k, float l) { + if (!(livingEntity instanceof AbstractClientPlayerEntity playerEntity)) return original; + return Capes.get(playerEntity); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/FileCacheAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/FileCacheAccessor.java new file mode 100644 index 0000000000..3683e21f81 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/FileCacheAccessor.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.client.texture.PlayerSkinProvider; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.nio.file.Path; + +@Mixin(PlayerSkinProvider.FileCache.class) +public interface FileCacheAccessor { + @Accessor + Path getDirectory(); +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftClientAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftClientAccessor.java index cdc94cc8fd..48ad6bacdd 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftClientAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftClientAccessor.java @@ -7,20 +7,22 @@ import com.mojang.authlib.minecraft.MinecraftSessionService; import com.mojang.authlib.minecraft.UserApiService; +import com.mojang.authlib.yggdrasil.ProfileResult; import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService; import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.SocialInteractionsManager; -import net.minecraft.client.report.AbuseReportContext; 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.client.util.ProfileKeys; -import net.minecraft.client.util.Session; 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.net.Proxy; +import java.util.concurrent.CompletableFuture; @Mixin(MinecraftClient.class) public interface MinecraftClientAccessor { @@ -72,4 +74,8 @@ static int getFps() { @Mutable @Accessor("abuseReportContext") void setAbuseReportContext(AbuseReportContext abuseReportContext); + + @Mutable + @Accessor("gameProfileFuture") + void setGameProfileFuture(CompletableFuture future); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftClientMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftClientMixin.java index 02bdc0cc4b..94c0bad093 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftClientMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftClientMixin.java @@ -141,7 +141,7 @@ private HitResult doItemUseMinecraftClientCrosshairTargetProxy(HitResult origina return MeteorClient.EVENT_BUS.post(ItemUseCrosshairTargetEvent.get(original)).target; } - @ModifyReturnValue(method = "reloadResources(Z)Ljava/util/concurrent/CompletableFuture;", at = @At("RETURN")) + @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())); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PacketByteBufMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/PacketByteBufMixin.java index 78401930af..aad3f17962 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PacketByteBufMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/PacketByteBufMixin.java @@ -10,13 +10,17 @@ import net.minecraft.nbt.NbtTagSizeTracker; import net.minecraft.network.PacketByteBuf; 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; @Mixin(PacketByteBuf.class) public class PacketByteBufMixin { - @ModifyArg(method = "readNbt()Lnet/minecraft/nbt/NbtCompound;", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/PacketByteBuf;readNbt(Lnet/minecraft/nbt/NbtTagSizeTracker;)Lnet/minecraft/nbt/NbtCompound;")) + @Unique + private static final NbtTagSizeTracker EMPTY = new NbtTagSizeTracker(0L, 0); + + @ModifyArg(method = "readNbt()Lnet/minecraft/nbt/NbtCompound;", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/PacketByteBuf;readNbt(Lnet/minecraft/nbt/NbtTagSizeTracker;)Lnet/minecraft/nbt/NbtElement;")) private NbtTagSizeTracker xlPackets(NbtTagSizeTracker sizeTracker) { - return Modules.get().isActive(AntiPacketKick.class) ? NbtTagSizeTracker.EMPTY : sizeTracker; + return Modules.get().isActive(AntiPacketKick.class) ? EMPTY : sizeTracker; } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityRendererMixin.java index ea35d8defe..434a79f3d7 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityRendererMixin.java @@ -30,7 +30,7 @@ private void modifyRenderLayer(Args args, MatrixStack matrices, VertexConsumerPr Chams chams = Modules.get().get(Chams.class); if (chams.isActive() && chams.hand.get()) { - Identifier texture = chams.handTexture.get() ? player.getSkinTexture() : Chams.BLANK; + Identifier texture = chams.handTexture.get() ? player.playerListEntry.getSkinTextures().texture() : Chams.BLANK; args.set(1, vertexConsumers.getBuffer(RenderLayer.getEntityTranslucent(texture))); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerListEntryMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerListEntryMixin.java index 7c5a0c1068..f040007d03 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerListEntryMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerListEntryMixin.java @@ -11,7 +11,7 @@ import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.PlayerListEntry; import net.minecraft.client.util.DefaultSkinHelper; -import net.minecraft.util.Identifier; +import net.minecraft.client.util.SkinTextures; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -23,11 +23,11 @@ public abstract class PlayerListEntryMixin { @Shadow public abstract GameProfile getProfile(); - @Inject(method = "getSkinTexture", at = @At("HEAD"), cancellable = true) - private void onGetTexture(CallbackInfoReturnable info) { + @Inject(method = "getSkinTextures", at = @At("HEAD"), cancellable = true) + private void onGetTexture(CallbackInfoReturnable info) { if (getProfile().getName().equals(MinecraftClient.getInstance().getSession().getUsername())) { if (Modules.get().get(NameProtect.class).skinProtect()) { - info.setReturnValue(DefaultSkinHelper.getTexture()); + info.setReturnValue(DefaultSkinHelper.getSkinTextures(getProfile())); } } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerSkinProviderAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerSkinProviderAccessor.java index 5f2dc2f56e..88660357dd 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerSkinProviderAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerSkinProviderAccessor.java @@ -9,10 +9,8 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -import java.io.File; - @Mixin(PlayerSkinProvider.class) public interface PlayerSkinProviderAccessor { - @Accessor("skinCacheDir") - File getSkinCacheDir(); + @Accessor("skinCache") + PlayerSkinProvider.FileCache getSkinCache(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ScreenMixin.java index b5dd66cd0d..ee67c6bdb5 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ScreenMixin.java @@ -21,7 +21,7 @@ @Mixin(value = Screen.class, priority = 500) // needs to be before baritone public abstract class ScreenMixin { - @Inject(method = "renderBackground(Lnet/minecraft/client/gui/DrawContext;)V", at = @At("HEAD"), cancellable = true) + @Inject(method = "renderBackground", at = @At("HEAD"), cancellable = true) private void onRenderBackground(CallbackInfo info) { if (Utils.canUpdate() && Modules.get().get(NoRender.class).noGuiBackground()) info.cancel(); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/YggdrasilMinecraftSessionServiceAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/YggdrasilMinecraftSessionServiceAccessor.java index 36dc719950..16ab642ec2 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/YggdrasilMinecraftSessionServiceAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/YggdrasilMinecraftSessionServiceAccessor.java @@ -6,15 +6,17 @@ package meteordevelopment.meteorclient.mixin; import com.mojang.authlib.Environment; -import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService; +import com.mojang.authlib.yggdrasil.ServicesKeySet; import com.mojang.authlib.yggdrasil.YggdrasilMinecraftSessionService; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; +import java.net.Proxy; + @Mixin(YggdrasilMinecraftSessionService.class) public interface YggdrasilMinecraftSessionServiceAccessor { @Invoker("") - static YggdrasilMinecraftSessionService createYggdrasilMinecraftSessionService(final YggdrasilAuthenticationService service, final Environment env) { + static YggdrasilMinecraftSessionService createYggdrasilMinecraftSessionService(final ServicesKeySet servicesKeySet, final Proxy proxy, final Environment env) { throw new UnsupportedOperationException(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/accounts/Account.java b/src/main/java/meteordevelopment/meteorclient/systems/accounts/Account.java index 96132e9d55..428a424eb9 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/accounts/Account.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/accounts/Account.java @@ -10,18 +10,23 @@ import com.mojang.authlib.minecraft.UserApiService; 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.utils.misc.ISerializable; import meteordevelopment.meteorclient.utils.misc.NbtException; import net.minecraft.client.network.SocialInteractionsManager; -import net.minecraft.client.report.AbuseReportContext; -import net.minecraft.client.report.ReporterEnvironment; +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.util.ProfileKeys; -import net.minecraft.client.util.Session; import net.minecraft.nbt.NbtCompound; import net.minecraft.network.encryption.SignatureVerifier; +import net.minecraft.util.Util; + +import java.nio.file.Path; +import java.util.concurrent.CompletableFuture; import static meteordevelopment.meteorclient.MeteorClient.mc; @@ -62,7 +67,6 @@ public AccountCache getCache() { public static void setSession(Session session) { MinecraftClientAccessor mca = (MinecraftClientAccessor) mc; mca.setSession(session); - mc.getSessionProperties().clear(); UserApiService apiService; try { apiService = mca.getAuthenticationService().createUserApiService(session.getAccessToken()); @@ -73,6 +77,7 @@ public static void setSession(Session session) { mca.setSocialInteractionsManager(new SocialInteractionsManager(mc, apiService)); mca.setProfileKeys(ProfileKeys.create(apiService, session, mc.runDirectory.toPath())); mca.setAbuseReportContext(AbuseReportContext.create(ReporterEnvironment.ofIntegratedServer(), apiService)); + mca.setGameProfileFuture(CompletableFuture.supplyAsync(() -> mc.getSessionService().fetchProfile(mc.getSession().getUuidOrNull(), true), Util.getIoWorkerExecutor())); } public static void applyLoginEnvironment(YggdrasilAuthenticationService authService, MinecraftSessionService sessService) { @@ -80,7 +85,9 @@ public static void applyLoginEnvironment(YggdrasilAuthenticationService authServ mca.setAuthenticationService(authService); SignatureVerifier.create(authService.getServicesKeySet(), ServicesKeyType.PROFILE_KEY); mca.setSessionService(sessService); - mca.setSkinProvider(new PlayerSkinProvider(mc.getTextureManager(), ((PlayerSkinProviderAccessor) mc.getSkinProvider()).getSkinCacheDir(), sessService)); + PlayerSkinProvider.FileCache skinCache = ((PlayerSkinProviderAccessor) mc.getSkinProvider()).getSkinCache(); + Path skinCachePath = ((FileCacheAccessor) skinCache).getDirectory(); + mca.setSkinProvider(new PlayerSkinProvider(mc.getTextureManager(), skinCachePath, sessService, mc)); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/accounts/AccountCache.java b/src/main/java/meteordevelopment/meteorclient/systems/accounts/AccountCache.java index 684cf73437..8ab88f86be 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/accounts/AccountCache.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/accounts/AccountCache.java @@ -5,7 +5,7 @@ package meteordevelopment.meteorclient.systems.accounts; -import com.mojang.util.UUIDTypeAdapter; +import com.mojang.util.UndashedUuid; import meteordevelopment.meteorclient.utils.misc.ISerializable; import meteordevelopment.meteorclient.utils.misc.NbtException; import meteordevelopment.meteorclient.utils.render.PlayerHeadTexture; @@ -23,7 +23,7 @@ public PlayerHeadTexture getHeadTexture() { public void loadHead() { if (uuid == null || uuid.isBlank()) return; - headTexture = PlayerHeadUtils.fetchHead(UUIDTypeAdapter.fromString(uuid)); + headTexture = PlayerHeadUtils.fetchHead(UndashedUuid.fromStringLenient(uuid)); } @Override 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 447bb623b5..6087790b0d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/CrackedAccount.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/CrackedAccount.java @@ -7,7 +7,7 @@ import meteordevelopment.meteorclient.systems.accounts.Account; import meteordevelopment.meteorclient.systems.accounts.AccountType; -import net.minecraft.client.util.Session; +import net.minecraft.client.session.Session; import net.minecraft.util.Uuids; import java.util.Optional; @@ -28,7 +28,7 @@ public boolean login() { super.login(); cache.loadHead(); - setSession(new Session(name, Uuids.getOfflinePlayerUuid(name).toString(), "", Optional.empty(), Optional.empty(), Session.AccountType.MOJANG)); + setSession(new Session(name, Uuids.getOfflinePlayerUuid(name), "", Optional.empty(), Optional.empty(), Session.AccountType.MOJANG)); return true; } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/EasyMCAccount.java b/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/EasyMCAccount.java index 2731612249..e6f023df4e 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/EasyMCAccount.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/EasyMCAccount.java @@ -7,12 +7,13 @@ import com.mojang.authlib.Environment; import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService; +import com.mojang.util.UndashedUuid; import meteordevelopment.meteorclient.mixin.MinecraftClientAccessor; import meteordevelopment.meteorclient.mixin.YggdrasilMinecraftSessionServiceAccessor; import meteordevelopment.meteorclient.systems.accounts.Account; import meteordevelopment.meteorclient.systems.accounts.AccountType; import meteordevelopment.meteorclient.utils.network.Http; -import net.minecraft.client.util.Session; +import net.minecraft.client.session.Session; import java.util.Optional; @@ -20,8 +21,8 @@ public class EasyMCAccount extends Account { - private static final Environment ENVIRONMENT = Environment.create("https://authserver.mojang.com", "https://api.mojang.com", "https://sessionserver.easymc.io", "https://api.minecraftservices.com", "EasyMC"); - private static final YggdrasilAuthenticationService SERVICE = new YggdrasilAuthenticationService(((MinecraftClientAccessor) mc).getProxy(), "", ENVIRONMENT); + private static final Environment ENVIRONMENT = new Environment("https://authserver.mojang.com", "https://sessionserver.easymc.io", "https://api.minecraftservices.com", "EasyMC"); + private static final YggdrasilAuthenticationService SERVICE = new YggdrasilAuthenticationService(((MinecraftClientAccessor) mc).getProxy(), ENVIRONMENT); public EasyMCAccount(String token) { super(AccountType.EasyMC, token); @@ -50,8 +51,8 @@ public boolean fetchInfo() { @Override public boolean login() { - applyLoginEnvironment(SERVICE, YggdrasilMinecraftSessionServiceAccessor.createYggdrasilMinecraftSessionService(SERVICE, ENVIRONMENT)); - setSession(new Session(cache.username, cache.uuid, name, Optional.empty(), Optional.empty(), Session.AccountType.MOJANG)); + applyLoginEnvironment(SERVICE, YggdrasilMinecraftSessionServiceAccessor.createYggdrasilMinecraftSessionService(SERVICE.getServicesKeySet(), SERVICE.getProxy(), ENVIRONMENT)); + setSession(new Session(cache.username, UndashedUuid.fromStringLenient(cache.uuid), name, Optional.empty(), Optional.empty(), Session.AccountType.MOJANG)); cache.loadHead(); 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 01404a9c09..ba0804ba71 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/MicrosoftAccount.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/MicrosoftAccount.java @@ -5,10 +5,11 @@ package meteordevelopment.meteorclient.systems.accounts.types; +import com.mojang.util.UndashedUuid; import meteordevelopment.meteorclient.systems.accounts.Account; import meteordevelopment.meteorclient.systems.accounts.AccountType; import meteordevelopment.meteorclient.systems.accounts.MicrosoftLogin; -import net.minecraft.client.util.Session; +import net.minecraft.client.session.Session; import java.util.Optional; @@ -31,7 +32,7 @@ public boolean login() { cache.loadHead(); - setSession(new Session(cache.username, cache.uuid, token, Optional.empty(), Optional.empty(), Session.AccountType.MSA)); + setSession(new Session(cache.username, UndashedUuid.fromStringLenient(cache.uuid), token, Optional.empty(), Optional.empty(), Session.AccountType.MSA)); 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 2da37aeb27..b1c37466f2 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/TheAlteningAccount.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/TheAlteningAccount.java @@ -5,25 +5,24 @@ package meteordevelopment.meteorclient.systems.accounts.types; -import com.mojang.authlib.Agent; import com.mojang.authlib.Environment; -import com.mojang.authlib.exceptions.AuthenticationException; import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService; -import com.mojang.authlib.yggdrasil.YggdrasilUserAuthentication; +import de.florianmichael.waybackauthlib.InvalidCredentialsException; +import de.florianmichael.waybackauthlib.WaybackAuthLib; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.mixin.MinecraftClientAccessor; import meteordevelopment.meteorclient.mixin.YggdrasilMinecraftSessionServiceAccessor; import meteordevelopment.meteorclient.systems.accounts.Account; import meteordevelopment.meteorclient.systems.accounts.AccountType; -import net.minecraft.client.util.Session; +import net.minecraft.client.session.Session; import java.util.Optional; import static meteordevelopment.meteorclient.MeteorClient.mc; public class TheAlteningAccount extends Account { - private static final Environment ENVIRONMENT = Environment.create("http://authserver.thealtening.com", "https://api.mojang.com", "http://sessionserver.thealtening.com", "https://api.minecraftservices.com", "The Altening"); - private static final YggdrasilAuthenticationService SERVICE = new YggdrasilAuthenticationService(((MinecraftClientAccessor) mc).getProxy(), "", ENVIRONMENT); + private static final Environment ENVIRONMENT = new Environment("http://authserver.thealtening.com", "http://sessionserver.thealtening.com", "https://api.minecraftservices.com", "The Altening"); + private static final YggdrasilAuthenticationService SERVICE = new YggdrasilAuthenticationService(((MinecraftClientAccessor) mc).getProxy(), ENVIRONMENT); public TheAlteningAccount(String token) { super(AccountType.TheAltening, token); @@ -31,42 +30,45 @@ public TheAlteningAccount(String token) { @Override public boolean fetchInfo() { - YggdrasilUserAuthentication auth = getAuth(); + WaybackAuthLib auth = getAuth(); try { auth.logIn(); - cache.username = auth.getSelectedProfile().getName(); - cache.uuid = auth.getSelectedProfile().getId().toString(); + cache.username = auth.getCurrentProfile().getName(); + cache.uuid = auth.getCurrentProfile().getId().toString(); return true; - } catch (AuthenticationException e) { + } catch (Exception e) { return false; } } @Override public boolean login() { - applyLoginEnvironment(SERVICE, YggdrasilMinecraftSessionServiceAccessor.createYggdrasilMinecraftSessionService(SERVICE, ENVIRONMENT)); + applyLoginEnvironment(SERVICE, YggdrasilMinecraftSessionServiceAccessor.createYggdrasilMinecraftSessionService(SERVICE.getServicesKeySet(), SERVICE.getProxy(), ENVIRONMENT)); - YggdrasilUserAuthentication auth = getAuth(); + WaybackAuthLib auth = getAuth(); try { auth.logIn(); - setSession(new Session(auth.getSelectedProfile().getName(), auth.getSelectedProfile().getId().toString(), auth.getAuthenticatedToken(), Optional.empty(), Optional.empty(), Session.AccountType.MOJANG)); + setSession(new Session(auth.getCurrentProfile().getName(), auth.getCurrentProfile().getId(), auth.getAccessToken(), Optional.empty(), Optional.empty(), Session.AccountType.MOJANG)); - cache.username = auth.getSelectedProfile().getName(); + cache.username = auth.getCurrentProfile().getName(); cache.loadHead(); return true; - } catch (AuthenticationException e) { + } catch (InvalidCredentialsException e) { + MeteorClient.LOG.error("Invalid TheAltening credentials."); + return false; + } catch (Exception e) { MeteorClient.LOG.error("Failed to login with TheAltening."); return false; } } - private YggdrasilUserAuthentication getAuth() { - YggdrasilUserAuthentication auth = (YggdrasilUserAuthentication) SERVICE.createUserAuthentication(Agent.MINECRAFT); + private WaybackAuthLib getAuth() { + WaybackAuthLib auth = new WaybackAuthLib(ENVIRONMENT.accountsHost()); auth.setUsername(name); auth.setPassword("Meteor on Crack!"); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/friends/Friend.java b/src/main/java/meteordevelopment/meteorclient/systems/friends/Friend.java index 5b6187301f..16476b039a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/friends/Friend.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/friends/Friend.java @@ -5,7 +5,7 @@ package meteordevelopment.meteorclient.systems.friends; -import com.mojang.util.UUIDTypeAdapter; +import com.mojang.util.UndashedUuid; import meteordevelopment.meteorclient.utils.misc.ISerializable; import meteordevelopment.meteorclient.utils.network.Http; import meteordevelopment.meteorclient.utils.render.PlayerHeadTexture; @@ -50,7 +50,7 @@ public void updateInfo() { APIResponse res = Http.get("https://api.mojang.com/users/profiles/minecraft/" + name).sendJson(APIResponse.class); if (res == null || res.name == null || res.id == null) return; name = res.name; - id = UUIDTypeAdapter.fromString(res.id); + id = UndashedUuid.fromStringLenient(res.id); headTexture = PlayerHeadUtils.fetchHead(id); updating = false; } @@ -64,7 +64,7 @@ public NbtCompound toTag() { NbtCompound tag = new NbtCompound(); tag.putString("name", name); - if (id != null) tag.putString("id", UUIDTypeAdapter.fromUUID(id)); + if (id != null) tag.putString("id", UndashedUuid.toString(id)); return tag; } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/friends/Friends.java b/src/main/java/meteordevelopment/meteorclient/systems/friends/Friends.java index 8df4f22ebe..7227e58c4d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/friends/Friends.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/friends/Friends.java @@ -5,7 +5,7 @@ package meteordevelopment.meteorclient.systems.friends; -import com.mojang.util.UUIDTypeAdapter; +import com.mojang.util.UndashedUuid; import meteordevelopment.meteorclient.systems.System; import meteordevelopment.meteorclient.systems.Systems; import meteordevelopment.meteorclient.utils.misc.NbtUtils; @@ -119,7 +119,7 @@ public Friends fromTag(NbtCompound tag) { String uuid = friendTag.getString("id"); Friend friend = !uuid.isBlank() - ? new Friend(name, UUIDTypeAdapter.fromString(uuid)) + ? new Friend(name, UndashedUuid.fromStringLenient(uuid)) : new Friend(name); friends.add(friend); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/Hud.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/Hud.java index 04d89ec506..4e8b962de7 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/Hud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/Hud.java @@ -224,7 +224,7 @@ private void onRender(Render2DEvent event) { if (Utils.isLoading()) return; if (!active || shouldHideHud()) return; - if ((mc.options.hudHidden || mc.options.debugEnabled) && !HudEditorScreen.isOpen()) return; + if ((mc.options.hudHidden || mc.inGameHud.getDebugHud().shouldShowDebugHud()) && !HudEditorScreen.isOpen()) return; HudRenderer.INSTANCE.begin(event.drawContext); 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 ee31b24347..000b7a65c5 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/CombatHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/CombatHud.java @@ -209,11 +209,15 @@ public void render(HudRenderer renderer) { // Player Model InventoryScreen.drawEntity( renderer.drawContext, + (int) x, + (int) y, (int) (x + (25 * scale.get())), (int) (y + (66 * scale.get())), (int) (30 * scale.get()), + 0, -MathHelper.wrapDegrees(playerEntity.prevYaw + (playerEntity.getYaw() - playerEntity.prevYaw) * mc.getTickDelta()), - -playerEntity.getPitch(), playerEntity + -playerEntity.getPitch(), + playerEntity ); // Moving pos to past player model @@ -254,8 +258,7 @@ public void render(HudRenderer renderer) { if (Friends.get().isFriend(playerEntity)) { friendText = "Friend"; friendColor = Config.get().friendColor.get(); - } - else { + } else { boolean naked = true; for (int position = 3; position >= 0; position--) { @@ -267,8 +270,7 @@ public void render(HudRenderer renderer) { if (naked) { friendText = "Naked"; friendColor = GREEN; - } - else { + } else { boolean threat = false; for (int position = 5; position >= 0; position--) { 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 2f3aa7fd4f..f03133ce56 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PlayerModelHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PlayerModelHud.java @@ -99,7 +99,7 @@ public void render(HudRenderer renderer) { float yaw = copyYaw.get() ? MathHelper.wrapDegrees(player.prevYaw + (player.getYaw() - player.prevYaw) * mc.getTickDelta()) : (float) customYaw.get(); float pitch = copyPitch.get() ? player.getPitch() : (float) customPitch.get(); - InventoryScreen.drawEntity(renderer.drawContext, (int) (x + (25 * scale.get())), (int) (y + (66 * scale.get())), (int) (30 * scale.get()), -yaw, -pitch, player); + InventoryScreen.drawEntity(renderer.drawContext, x, y, (int) (x + (25 * scale.get())), (int) (y + (66 * scale.get())), (int) (30 * scale.get()), 0, -yaw, -pitch, player); }); if (background.get()) { 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 5b69d1bacb..3aa991e061 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/screens/HudEditorScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/screens/HudEditorScreen.java @@ -261,7 +261,7 @@ private void renderElement(HudElement element, Color bgColor, Color olColor) { @Override public void render(DrawContext context, int mouseX, int mouseY, float delta) { - if (!Utils.canUpdate()) renderBackground(context); + if (!Utils.canUpdate()) renderBackground(context, mouseX, mouseY, delta); double s = mc.getWindow().getScaleFactor(); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/AutoLog.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/AutoLog.java index e6f5349cbf..113e995ea5 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/AutoLog.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/AutoLog.java @@ -21,7 +21,7 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.decoration.EndCrystalEntity; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.network.packet.s2c.play.DisconnectS2CPacket; +import net.minecraft.network.packet.s2c.common.DisconnectS2CPacket; import net.minecraft.text.Text; public class AutoLog extends Module { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java index b260d10588..f60de694b6 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java @@ -413,7 +413,7 @@ private void drawTexture(DrawContext context, IChatHudLine line, int y) { PlayerListEntry entry = mc.getNetworkHandler().getPlayerListEntry(sender.getId()); if (entry == null) return; - Identifier skin = entry.getSkinTexture(); + Identifier skin = entry.getSkinTextures().texture(); context.drawTexture(skin, 0, y, 8, 8, 8, 8, 8, 8, 64, 64); context.drawTexture(skin, 0, y, 8, 8, 40, 8, 8, 8, 64, 64); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/ServerSpoof.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/ServerSpoof.java index 8386f1600a..94edd3b9b0 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/ServerSpoof.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/ServerSpoof.java @@ -8,14 +8,14 @@ import io.netty.buffer.Unpooled; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.packets.PacketEvent; -import meteordevelopment.meteorclient.mixin.CustomPayloadC2SPacketAccessor; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.orbit.EventHandler; import net.minecraft.network.PacketByteBuf; -import net.minecraft.network.packet.c2s.play.CustomPayloadC2SPacket; -import net.minecraft.network.packet.s2c.play.ResourcePackSendS2CPacket; +import net.minecraft.network.packet.BrandCustomPayload; +import net.minecraft.network.packet.c2s.common.CustomPayloadC2SPacket; +import net.minecraft.network.packet.s2c.common.ResourcePackSendS2CPacket; import net.minecraft.text.ClickEvent; import net.minecraft.text.HoverEvent; import net.minecraft.text.MutableText; @@ -77,11 +77,10 @@ private class Listener { private void onPacketSend(PacketEvent.Send event) { if (!isActive()) return; if (!(event.packet instanceof CustomPayloadC2SPacket)) return; - CustomPayloadC2SPacketAccessor packet = (CustomPayloadC2SPacketAccessor) event.packet; - Identifier id = packet.getChannel(); + Identifier id = ((CustomPayloadC2SPacket) event.packet).payload().id(); - if (spoofBrand.get() && id.equals(CustomPayloadC2SPacket.BRAND)) - packet.setData(new PacketByteBuf(Unpooled.buffer()).writeString(brand.get())); + if (spoofBrand.get() && id.equals(BrandCustomPayload.ID)) + event.packet.write(new PacketByteBuf(Unpooled.buffer()).writeString(brand.get())); if (blockChannels.get()) { for (String channel : channels.get()) { @@ -106,7 +105,7 @@ private void onPacketRecieve(PacketEvent.Receive event) { link.setStyle(link.getStyle() .withColor(Formatting.BLUE) .withUnderline(true) - .withClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, packet.getURL())) + .withClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, packet.getUrl())) .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Text.literal("Click to download"))) ); msg.append(link); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/ElytraBoost.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/ElytraBoost.java index a0b38e253a..4248fadda2 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/ElytraBoost.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/ElytraBoost.java @@ -95,7 +95,7 @@ private void boost() { FireworkRocketEntity entity = new FireworkRocketEntity(mc.world, itemStack, mc.player); fireworks.add(entity); if (playSound.get()) mc.world.playSoundFromEntity(mc.player, entity, SoundEvents.ENTITY_FIREWORK_ROCKET_LAUNCH, SoundCategory.AMBIENT, 3.0F, 1.0F); - mc.world.addEntity(entity.getId(), entity); + mc.world.addEntity(entity); } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java index ba593fb806..cbf85e39ad 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java @@ -236,7 +236,7 @@ private void appendTooltip(ItemStackTooltipEvent event) { NbtCompound effectTag = effects.getCompound(i); byte effectId = effectTag.getByte("EffectId"); int effectDuration = effectTag.contains("EffectDuration") ? effectTag.getInt("EffectDuration") : 160; - StatusEffect type = StatusEffect.byRawId(effectId); + StatusEffect type = Registries.STATUS_EFFECT.get(effectId); if (type != null) { StatusEffectInstance effect = new StatusEffectInstance(type, effectDuration, 0); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BreakIndicators.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BreakIndicators.java index c24d9942b2..ebf448ca16 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BreakIndicators.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BreakIndicators.java @@ -129,14 +129,14 @@ private void renderPacket(Render3DEvent event, List blocks) private void renderBlock(Render3DEvent event, Box orig, BlockPos pos, double shrinkFactor, double progress) { Box box = orig.shrink( - orig.getXLength() * shrinkFactor, - orig.getYLength() * shrinkFactor, - orig.getZLength() * shrinkFactor + orig.getLengthX() * shrinkFactor, + orig.getLengthY() * shrinkFactor, + orig.getLengthZ() * shrinkFactor ); - double xShrink = (orig.getXLength() * shrinkFactor) / 2; - double yShrink = (orig.getYLength() * shrinkFactor) / 2; - double zShrink = (orig.getZLength() * shrinkFactor) / 2; + double xShrink = (orig.getLengthX() * shrinkFactor) / 2; + double yShrink = (orig.getLengthY() * shrinkFactor) / 2; + double zShrink = (orig.getLengthZ() * shrinkFactor) / 2; double x1 = pos.getX() + box.minX + xShrink; double y1 = pos.getY() + box.minY + yShrink; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/LogoutSpots.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/LogoutSpots.java index 4d00e47f44..a750a33afb 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/LogoutSpots.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/LogoutSpots.java @@ -212,9 +212,9 @@ public Entry(PlayerEntity entity) { y = entity.getY(); z = entity.getZ() - halfWidth; - xWidth = entity.getBoundingBox().getXLength(); - zWidth = entity.getBoundingBox().getZLength(); - height = entity.getBoundingBox().getYLength(); + xWidth = entity.getBoundingBox().getLengthX(); + zWidth = entity.getBoundingBox().getLengthZ(); + height = entity.getBoundingBox().getLengthY(); uuid = entity.getUuid(); name = entity.getEntityName(); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/InfinityMiner.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/InfinityMiner.java index 1d8eb64b1b..b1618bb819 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/InfinityMiner.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/InfinityMiner.java @@ -27,7 +27,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.item.PickaxeItem; -import net.minecraft.network.packet.s2c.play.DisconnectS2CPacket; +import net.minecraft.network.packet.s2c.common.DisconnectS2CPacket; import net.minecraft.text.Text; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/meteordevelopment/meteorclient/utils/Utils.java b/src/main/java/meteordevelopment/meteorclient/utils/Utils.java index c8e84ac468..3cbead6f0c 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/Utils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/Utils.java @@ -56,7 +56,10 @@ import java.io.IOException; import java.io.InputStream; import java.net.InetSocketAddress; -import java.util.*; +import java.util.Arrays; +import java.util.Iterator; +import java.util.Locale; +import java.util.Random; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -336,7 +339,7 @@ public static String getWorldName() { // Multiplayer if (mc.getCurrentServerEntry() != null) { - return mc.isConnectedToRealms() ? "realms" : mc.getCurrentServerEntry().address; + return mc.getCurrentServerEntry().isRealm() ? "realms" : mc.getCurrentServerEntry().address; } return ""; diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/fakeplayer/FakePlayerEntity.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/fakeplayer/FakePlayerEntity.java index 4ddc217c9e..381968a25a 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/entity/fakeplayer/FakePlayerEntity.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/entity/fakeplayer/FakePlayerEntity.java @@ -52,7 +52,7 @@ public FakePlayerEntity(PlayerEntity player, String name, float health, boolean public void spawn() { unsetRemoved(); - mc.world.addEntity(getId(), this); + mc.world.addEntity(this); } public void despawn() { diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/FakeClientPlayer.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/FakeClientPlayer.java index 9ecddf42e3..7f5a9e8ab3 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/FakeClientPlayer.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/FakeClientPlayer.java @@ -5,10 +5,10 @@ package meteordevelopment.meteorclient.utils.misc; +import com.mojang.authlib.GameProfile; import meteordevelopment.meteorclient.MeteorClient; -import meteordevelopment.meteorclient.events.game.GameJoinedEvent; import meteordevelopment.meteorclient.utils.PreInit; -import meteordevelopment.orbit.EventHandler; +import net.minecraft.client.network.ClientConnectionState; import net.minecraft.client.network.ClientPlayNetworkHandler; import net.minecraft.client.network.OtherClientPlayerEntity; import net.minecraft.client.network.PlayerListEntry; @@ -18,6 +18,8 @@ import net.minecraft.network.NetworkSide; import net.minecraft.world.Difficulty; +import java.util.UUID; + import static meteordevelopment.meteorclient.MeteorClient.mc; public class FakeClientPlayer { @@ -25,7 +27,7 @@ public class FakeClientPlayer { private static PlayerEntity player; private static PlayerListEntry playerListEntry; - private static String lastId; + private static UUID lastId; private static boolean needsNewEntry; @PreInit @@ -33,19 +35,30 @@ public static void init() { MeteorClient.EVENT_BUS.subscribe(FakeClientPlayer.class); } - @EventHandler - private static void onGameJoined(GameJoinedEvent event) { - } - public static PlayerEntity getPlayer() { - String id = mc.getSession().getUuid(); + UUID id = mc.getSession().getUuidOrNull(); if (player == null || (!id.equals(lastId))) { if (world == null) { - world = new ClientWorld(new ClientPlayNetworkHandler(mc, null, new ClientConnection(NetworkSide.CLIENTBOUND), mc.getCurrentServerEntry(), mc.getSession().getProfile(), null), new ClientWorld.Properties(Difficulty.NORMAL, false, false), world.getRegistryKey(), world.getDimensionEntry(), 1, 1, mc::getProfiler, null, false, 0); + world = new ClientWorld( + new ClientPlayNetworkHandler( + mc, + new ClientConnection(NetworkSide.CLIENTBOUND), + new ClientConnectionState(new GameProfile(mc.getSession().getUuidOrNull(), mc.getSession().getUsername()), null, null, null, null, mc.getCurrentServerEntry(), null) + ), // todo test this + new ClientWorld.Properties(Difficulty.NORMAL, false, false), + world.getRegistryKey(), + world.getDimensionEntry(), + 1, + 1, + mc::getProfiler, + null, + false, + 0 + ); } - player = new OtherClientPlayerEntity(world, mc.getSession().getProfile()); + player = new OtherClientPlayerEntity(world, new GameProfile(id, mc.getSession().getUsername())); lastId = id; needsNewEntry = true; @@ -56,7 +69,7 @@ public static PlayerEntity getPlayer() { public static PlayerListEntry getPlayerListEntry() { if (playerListEntry == null || needsNewEntry) { - playerListEntry = new PlayerListEntry(mc.getSession().getProfile(), false); + playerListEntry = new PlayerListEntry(new GameProfile(lastId, mc.getSession().getUsername()), false); needsNewEntry = false; } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtils.java index 6e5cbc6123..76494d2559 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtils.java @@ -36,6 +36,8 @@ public class PacketUtils { C2S_PACKETS_R.put("ClientStatusC2SPacket", net.minecraft.network.packet.c2s.play.ClientStatusC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.PlayerInteractItemC2SPacket.class, "PlayerInteractItemC2SPacket"); C2S_PACKETS_R.put("PlayerInteractItemC2SPacket", net.minecraft.network.packet.c2s.play.PlayerInteractItemC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.login.EnterConfigurationC2SPacket.class, "EnterConfigurationC2SPacket"); + C2S_PACKETS_R.put("EnterConfigurationC2SPacket", net.minecraft.network.packet.c2s.login.EnterConfigurationC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket.class, "PlayerActionC2SPacket"); C2S_PACKETS_R.put("PlayerActionC2SPacket", net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.SelectMerchantTradeC2SPacket.class, "SelectMerchantTradeC2SPacket"); @@ -52,14 +54,14 @@ public class PacketUtils { C2S_PACKETS_R.put("QueryBlockNbtC2SPacket", net.minecraft.network.packet.c2s.play.QueryBlockNbtC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.PlayerInteractEntityC2SPacket.class, "PlayerInteractEntityC2SPacket"); C2S_PACKETS_R.put("PlayerInteractEntityC2SPacket", net.minecraft.network.packet.c2s.play.PlayerInteractEntityC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.AcknowledgeReconfigurationC2SPacket.class, "AcknowledgeReconfigurationC2SPacket"); + C2S_PACKETS_R.put("AcknowledgeReconfigurationC2SPacket", net.minecraft.network.packet.c2s.play.AcknowledgeReconfigurationC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.RequestCommandCompletionsC2SPacket.class, "RequestCommandCompletionsC2SPacket"); C2S_PACKETS_R.put("RequestCommandCompletionsC2SPacket", net.minecraft.network.packet.c2s.play.RequestCommandCompletionsC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdatePlayerAbilitiesC2SPacket.class, "UpdatePlayerAbilitiesC2SPacket"); C2S_PACKETS_R.put("UpdatePlayerAbilitiesC2SPacket", net.minecraft.network.packet.c2s.play.UpdatePlayerAbilitiesC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.query.QueryRequestC2SPacket.class, "QueryRequestC2SPacket"); C2S_PACKETS_R.put("QueryRequestC2SPacket", net.minecraft.network.packet.c2s.query.QueryRequestC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.CustomPayloadC2SPacket.class, "CustomPayloadC2SPacket"); - C2S_PACKETS_R.put("CustomPayloadC2SPacket", net.minecraft.network.packet.c2s.play.CustomPayloadC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdateCommandBlockC2SPacket.class, "UpdateCommandBlockC2SPacket"); C2S_PACKETS_R.put("UpdateCommandBlockC2SPacket", net.minecraft.network.packet.c2s.play.UpdateCommandBlockC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.HandSwingC2SPacket.class, "HandSwingC2SPacket"); @@ -68,8 +70,8 @@ public class PacketUtils { C2S_PACKETS_R.put("ClickSlotC2SPacket", net.minecraft.network.packet.c2s.play.ClickSlotC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.AdvancementTabC2SPacket.class, "AdvancementTabC2SPacket"); C2S_PACKETS_R.put("AdvancementTabC2SPacket", net.minecraft.network.packet.c2s.play.AdvancementTabC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.ClientSettingsC2SPacket.class, "ClientSettingsC2SPacket"); - C2S_PACKETS_R.put("ClientSettingsC2SPacket", net.minecraft.network.packet.c2s.play.ClientSettingsC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.AcknowledgeChunksC2SPacket.class, "AcknowledgeChunksC2SPacket"); + C2S_PACKETS_R.put("AcknowledgeChunksC2SPacket", net.minecraft.network.packet.c2s.play.AcknowledgeChunksC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.SpectatorTeleportC2SPacket.class, "SpectatorTeleportC2SPacket"); C2S_PACKETS_R.put("SpectatorTeleportC2SPacket", net.minecraft.network.packet.c2s.play.SpectatorTeleportC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdateDifficultyLockC2SPacket.class, "UpdateDifficultyLockC2SPacket"); @@ -84,20 +86,28 @@ public class PacketUtils { C2S_PACKETS_R.put("UpdateSelectedSlotC2SPacket", net.minecraft.network.packet.c2s.play.UpdateSelectedSlotC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.RecipeCategoryOptionsC2SPacket.class, "RecipeCategoryOptionsC2SPacket"); C2S_PACKETS_R.put("RecipeCategoryOptionsC2SPacket", net.minecraft.network.packet.c2s.play.RecipeCategoryOptionsC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.common.ResourcePackStatusC2SPacket.class, "ResourcePackStatusC2SPacket"); + C2S_PACKETS_R.put("ResourcePackStatusC2SPacket", net.minecraft.network.packet.c2s.common.ResourcePackStatusC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket.class, "PlayerMoveC2SPacket"); C2S_PACKETS_R.put("PlayerMoveC2SPacket", net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.common.ClientOptionsC2SPacket.class, "ClientOptionsC2SPacket"); + C2S_PACKETS_R.put("ClientOptionsC2SPacket", net.minecraft.network.packet.c2s.common.ClientOptionsC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.common.CustomPayloadC2SPacket.class, "CustomPayloadC2SPacket"); + C2S_PACKETS_R.put("CustomPayloadC2SPacket", net.minecraft.network.packet.c2s.common.CustomPayloadC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.PickFromInventoryC2SPacket.class, "PickFromInventoryC2SPacket"); C2S_PACKETS_R.put("PickFromInventoryC2SPacket", net.minecraft.network.packet.c2s.play.PickFromInventoryC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.PlayerSessionC2SPacket.class, "PlayerSessionC2SPacket"); C2S_PACKETS_R.put("PlayerSessionC2SPacket", net.minecraft.network.packet.c2s.play.PlayerSessionC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.CloseHandledScreenC2SPacket.class, "CloseHandledScreenC2SPacket"); C2S_PACKETS_R.put("CloseHandledScreenC2SPacket", net.minecraft.network.packet.c2s.play.CloseHandledScreenC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.config.ReadyC2SPacket.class, "ReadyC2SPacket"); + C2S_PACKETS_R.put("ReadyC2SPacket", net.minecraft.network.packet.c2s.config.ReadyC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.BoatPaddleStateC2SPacket.class, "BoatPaddleStateC2SPacket"); C2S_PACKETS_R.put("BoatPaddleStateC2SPacket", net.minecraft.network.packet.c2s.play.BoatPaddleStateC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.ButtonClickC2SPacket.class, "ButtonClickC2SPacket"); - C2S_PACKETS_R.put("ButtonClickC2SPacket", net.minecraft.network.packet.c2s.play.ButtonClickC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.ChatMessageC2SPacket.class, "ChatMessageC2SPacket"); C2S_PACKETS_R.put("ChatMessageC2SPacket", net.minecraft.network.packet.c2s.play.ChatMessageC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.ButtonClickC2SPacket.class, "ButtonClickC2SPacket"); + C2S_PACKETS_R.put("ButtonClickC2SPacket", net.minecraft.network.packet.c2s.play.ButtonClickC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdateBeaconC2SPacket.class, "UpdateBeaconC2SPacket"); C2S_PACKETS_R.put("UpdateBeaconC2SPacket", net.minecraft.network.packet.c2s.play.UpdateBeaconC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.TeleportConfirmC2SPacket.class, "TeleportConfirmC2SPacket"); @@ -108,8 +118,8 @@ public class PacketUtils { C2S_PACKETS_R.put("UpdateStructureBlockC2SPacket", net.minecraft.network.packet.c2s.play.UpdateStructureBlockC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdateCommandBlockMinecartC2SPacket.class, "UpdateCommandBlockMinecartC2SPacket"); C2S_PACKETS_R.put("UpdateCommandBlockMinecartC2SPacket", net.minecraft.network.packet.c2s.play.UpdateCommandBlockMinecartC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.KeepAliveC2SPacket.class, "KeepAliveC2SPacket"); - C2S_PACKETS_R.put("KeepAliveC2SPacket", net.minecraft.network.packet.c2s.play.KeepAliveC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.common.CommonPongC2SPacket.class, "CommonPongC2SPacket"); + C2S_PACKETS_R.put("CommonPongC2SPacket", net.minecraft.network.packet.c2s.common.CommonPongC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.PlayerInputC2SPacket.class, "PlayerInputC2SPacket"); C2S_PACKETS_R.put("PlayerInputC2SPacket", net.minecraft.network.packet.c2s.play.PlayerInputC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.ClientCommandC2SPacket.class, "ClientCommandC2SPacket"); @@ -118,12 +128,10 @@ public class PacketUtils { C2S_PACKETS_R.put("UpdateJigsawC2SPacket", net.minecraft.network.packet.c2s.play.UpdateJigsawC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.query.QueryPingC2SPacket.class, "QueryPingC2SPacket"); C2S_PACKETS_R.put("QueryPingC2SPacket", net.minecraft.network.packet.c2s.query.QueryPingC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.ResourcePackStatusC2SPacket.class, "ResourcePackStatusC2SPacket"); - C2S_PACKETS_R.put("ResourcePackStatusC2SPacket", net.minecraft.network.packet.c2s.play.ResourcePackStatusC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.PlayPongC2SPacket.class, "PlayPongC2SPacket"); - C2S_PACKETS_R.put("PlayPongC2SPacket", net.minecraft.network.packet.c2s.play.PlayPongC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.MessageAcknowledgmentC2SPacket.class, "MessageAcknowledgmentC2SPacket"); C2S_PACKETS_R.put("MessageAcknowledgmentC2SPacket", net.minecraft.network.packet.c2s.play.MessageAcknowledgmentC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.common.KeepAliveC2SPacket.class, "KeepAliveC2SPacket"); + C2S_PACKETS_R.put("KeepAliveC2SPacket", net.minecraft.network.packet.c2s.common.KeepAliveC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.VehicleMoveC2SPacket.class, "VehicleMoveC2SPacket"); C2S_PACKETS_R.put("VehicleMoveC2SPacket", net.minecraft.network.packet.c2s.play.VehicleMoveC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.CreativeInventoryActionC2SPacket.class, "CreativeInventoryActionC2SPacket"); @@ -153,10 +161,6 @@ public class PacketUtils { S2C_PACKETS_R.put("WorldBorderSizeChangedS2CPacket", net.minecraft.network.packet.s2c.play.WorldBorderSizeChangedS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.AdvancementUpdateS2CPacket.class, "AdvancementUpdateS2CPacket"); S2C_PACKETS_R.put("AdvancementUpdateS2CPacket", net.minecraft.network.packet.s2c.play.AdvancementUpdateS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.CustomPayloadS2CPacket.class, "CustomPayloadS2CPacket"); - S2C_PACKETS_R.put("CustomPayloadS2CPacket", net.minecraft.network.packet.s2c.play.CustomPayloadS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.FeaturesS2CPacket.class, "FeaturesS2CPacket"); - S2C_PACKETS_R.put("FeaturesS2CPacket", net.minecraft.network.packet.s2c.play.FeaturesS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.WorldBorderInterpolateSizeS2CPacket.class, "WorldBorderInterpolateSizeS2CPacket"); S2C_PACKETS_R.put("WorldBorderInterpolateSizeS2CPacket", net.minecraft.network.packet.s2c.play.WorldBorderInterpolateSizeS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ChunkLoadDistanceS2CPacket.class, "ChunkLoadDistanceS2CPacket"); @@ -173,6 +177,8 @@ public class PacketUtils { S2C_PACKETS_R.put("RemoveMessageS2CPacket", net.minecraft.network.packet.s2c.play.RemoveMessageS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.SetCameraEntityS2CPacket.class, "SetCameraEntityS2CPacket"); S2C_PACKETS_R.put("SetCameraEntityS2CPacket", net.minecraft.network.packet.s2c.play.SetCameraEntityS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.common.ResourcePackSendS2CPacket.class, "ResourcePackSendS2CPacket"); + S2C_PACKETS_R.put("ResourcePackSendS2CPacket", net.minecraft.network.packet.s2c.common.ResourcePackSendS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.DamageTiltS2CPacket.class, "DamageTiltS2CPacket"); S2C_PACKETS_R.put("DamageTiltS2CPacket", net.minecraft.network.packet.s2c.play.DamageTiltS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.StatisticsS2CPacket.class, "StatisticsS2CPacket"); @@ -185,14 +191,14 @@ public class PacketUtils { S2C_PACKETS_R.put("VehicleMoveS2CPacket", net.minecraft.network.packet.s2c.play.VehicleMoveS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityAttributesS2CPacket.class, "EntityAttributesS2CPacket"); S2C_PACKETS_R.put("EntityAttributesS2CPacket", net.minecraft.network.packet.s2c.play.EntityAttributesS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.StopSoundS2CPacket.class, "StopSoundS2CPacket"); - S2C_PACKETS_R.put("StopSoundS2CPacket", net.minecraft.network.packet.s2c.play.StopSoundS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ScoreboardObjectiveUpdateS2CPacket.class, "ScoreboardObjectiveUpdateS2CPacket"); S2C_PACKETS_R.put("ScoreboardObjectiveUpdateS2CPacket", net.minecraft.network.packet.s2c.play.ScoreboardObjectiveUpdateS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.StopSoundS2CPacket.class, "StopSoundS2CPacket"); + S2C_PACKETS_R.put("StopSoundS2CPacket", net.minecraft.network.packet.s2c.play.StopSoundS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.StartChunkSendS2CPacket.class, "StartChunkSendS2CPacket"); + S2C_PACKETS_R.put("StartChunkSendS2CPacket", net.minecraft.network.packet.s2c.play.StartChunkSendS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntitySetHeadYawS2CPacket.class, "EntitySetHeadYawS2CPacket"); S2C_PACKETS_R.put("EntitySetHeadYawS2CPacket", net.minecraft.network.packet.s2c.play.EntitySetHeadYawS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.KeepAliveS2CPacket.class, "KeepAliveS2CPacket"); - S2C_PACKETS_R.put("KeepAliveS2CPacket", net.minecraft.network.packet.s2c.play.KeepAliveS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.SetTradeOffersS2CPacket.class, "SetTradeOffersS2CPacket"); S2C_PACKETS_R.put("SetTradeOffersS2CPacket", net.minecraft.network.packet.s2c.play.SetTradeOffersS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.SelectAdvancementTabS2CPacket.class, "SelectAdvancementTabS2CPacket"); @@ -201,14 +207,16 @@ public class PacketUtils { S2C_PACKETS_R.put("PlaySoundS2CPacket", net.minecraft.network.packet.s2c.play.PlaySoundS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.BlockEventS2CPacket.class, "BlockEventS2CPacket"); S2C_PACKETS_R.put("BlockEventS2CPacket", net.minecraft.network.packet.s2c.play.BlockEventS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ChunkSentS2CPacket.class, "ChunkSentS2CPacket"); + S2C_PACKETS_R.put("ChunkSentS2CPacket", net.minecraft.network.packet.s2c.play.ChunkSentS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlayerPositionLookS2CPacket.class, "PlayerPositionLookS2CPacket"); S2C_PACKETS_R.put("PlayerPositionLookS2CPacket", net.minecraft.network.packet.s2c.play.PlayerPositionLookS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.HealthUpdateS2CPacket.class, "HealthUpdateS2CPacket"); S2C_PACKETS_R.put("HealthUpdateS2CPacket", net.minecraft.network.packet.s2c.play.HealthUpdateS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlayPingS2CPacket.class, "PlayPingS2CPacket"); - S2C_PACKETS_R.put("PlayPingS2CPacket", net.minecraft.network.packet.s2c.play.PlayPingS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.WorldEventS2CPacket.class, "WorldEventS2CPacket"); S2C_PACKETS_R.put("WorldEventS2CPacket", net.minecraft.network.packet.s2c.play.WorldEventS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.common.SynchronizeTagsS2CPacket.class, "SynchronizeTagsS2CPacket"); + S2C_PACKETS_R.put("SynchronizeTagsS2CPacket", net.minecraft.network.packet.s2c.common.SynchronizeTagsS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ServerMetadataS2CPacket.class, "ServerMetadataS2CPacket"); S2C_PACKETS_R.put("ServerMetadataS2CPacket", net.minecraft.network.packet.s2c.play.ServerMetadataS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.UpdateSelectedSlotS2CPacket.class, "UpdateSelectedSlotS2CPacket"); @@ -217,14 +225,14 @@ public class PacketUtils { S2C_PACKETS_R.put("ChunkDeltaUpdateS2CPacket", net.minecraft.network.packet.s2c.play.ChunkDeltaUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.query.QueryResponseS2CPacket.class, "QueryResponseS2CPacket"); S2C_PACKETS_R.put("QueryResponseS2CPacket", net.minecraft.network.packet.s2c.query.QueryResponseS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.CooldownUpdateS2CPacket.class, "CooldownUpdateS2CPacket"); - S2C_PACKETS_R.put("CooldownUpdateS2CPacket", net.minecraft.network.packet.s2c.play.CooldownUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.TeamS2CPacket.class, "TeamS2CPacket"); S2C_PACKETS_R.put("TeamS2CPacket", net.minecraft.network.packet.s2c.play.TeamS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityAnimationS2CPacket.class, "EntityAnimationS2CPacket"); - S2C_PACKETS_R.put("EntityAnimationS2CPacket", net.minecraft.network.packet.s2c.play.EntityAnimationS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.CooldownUpdateS2CPacket.class, "CooldownUpdateS2CPacket"); + S2C_PACKETS_R.put("CooldownUpdateS2CPacket", net.minecraft.network.packet.s2c.play.CooldownUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ExperienceOrbSpawnS2CPacket.class, "ExperienceOrbSpawnS2CPacket"); S2C_PACKETS_R.put("ExperienceOrbSpawnS2CPacket", net.minecraft.network.packet.s2c.play.ExperienceOrbSpawnS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityAnimationS2CPacket.class, "EntityAnimationS2CPacket"); + S2C_PACKETS_R.put("EntityAnimationS2CPacket", net.minecraft.network.packet.s2c.play.EntityAnimationS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.OpenScreenS2CPacket.class, "OpenScreenS2CPacket"); S2C_PACKETS_R.put("OpenScreenS2CPacket", net.minecraft.network.packet.s2c.play.OpenScreenS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlayerAbilitiesS2CPacket.class, "PlayerAbilitiesS2CPacket"); @@ -245,18 +253,18 @@ public class PacketUtils { S2C_PACKETS_R.put("OverlayMessageS2CPacket", net.minecraft.network.packet.s2c.play.OverlayMessageS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.WorldBorderCenterChangedS2CPacket.class, "WorldBorderCenterChangedS2CPacket"); S2C_PACKETS_R.put("WorldBorderCenterChangedS2CPacket", net.minecraft.network.packet.s2c.play.WorldBorderCenterChangedS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.DifficultyS2CPacket.class, "DifficultyS2CPacket"); - S2C_PACKETS_R.put("DifficultyS2CPacket", net.minecraft.network.packet.s2c.play.DifficultyS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityVelocityUpdateS2CPacket.class, "EntityVelocityUpdateS2CPacket"); S2C_PACKETS_R.put("EntityVelocityUpdateS2CPacket", net.minecraft.network.packet.s2c.play.EntityVelocityUpdateS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.DifficultyS2CPacket.class, "DifficultyS2CPacket"); + S2C_PACKETS_R.put("DifficultyS2CPacket", net.minecraft.network.packet.s2c.play.DifficultyS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.LookAtS2CPacket.class, "LookAtS2CPacket"); S2C_PACKETS_R.put("LookAtS2CPacket", net.minecraft.network.packet.s2c.play.LookAtS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ScreenHandlerPropertyUpdateS2CPacket.class, "ScreenHandlerPropertyUpdateS2CPacket"); S2C_PACKETS_R.put("ScreenHandlerPropertyUpdateS2CPacket", net.minecraft.network.packet.s2c.play.ScreenHandlerPropertyUpdateS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.OpenHorseScreenS2CPacket.class, "OpenHorseScreenS2CPacket"); - S2C_PACKETS_R.put("OpenHorseScreenS2CPacket", net.minecraft.network.packet.s2c.play.OpenHorseScreenS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.TitleS2CPacket.class, "TitleS2CPacket"); S2C_PACKETS_R.put("TitleS2CPacket", net.minecraft.network.packet.s2c.play.TitleS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.OpenHorseScreenS2CPacket.class, "OpenHorseScreenS2CPacket"); + S2C_PACKETS_R.put("OpenHorseScreenS2CPacket", net.minecraft.network.packet.s2c.play.OpenHorseScreenS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.SimulationDistanceS2CPacket.class, "SimulationDistanceS2CPacket"); S2C_PACKETS_R.put("SimulationDistanceS2CPacket", net.minecraft.network.packet.s2c.play.SimulationDistanceS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ChatSuggestionsS2CPacket.class, "ChatSuggestionsS2CPacket"); @@ -273,8 +281,6 @@ public class PacketUtils { S2C_PACKETS_R.put("BlockEntityUpdateS2CPacket", net.minecraft.network.packet.s2c.play.BlockEntityUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ScreenHandlerSlotUpdateS2CPacket.class, "ScreenHandlerSlotUpdateS2CPacket"); S2C_PACKETS_R.put("ScreenHandlerSlotUpdateS2CPacket", net.minecraft.network.packet.s2c.play.ScreenHandlerSlotUpdateS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.SynchronizeTagsS2CPacket.class, "SynchronizeTagsS2CPacket"); - S2C_PACKETS_R.put("SynchronizeTagsS2CPacket", net.minecraft.network.packet.s2c.play.SynchronizeTagsS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlayerSpawnPositionS2CPacket.class, "PlayerSpawnPositionS2CPacket"); S2C_PACKETS_R.put("PlayerSpawnPositionS2CPacket", net.minecraft.network.packet.s2c.play.PlayerSpawnPositionS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityStatusEffectS2CPacket.class, "EntityStatusEffectS2CPacket"); @@ -285,34 +291,36 @@ public class PacketUtils { S2C_PACKETS_R.put("CommandTreeS2CPacket", net.minecraft.network.packet.s2c.play.CommandTreeS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.login.LoginCompressionS2CPacket.class, "LoginCompressionS2CPacket"); S2C_PACKETS_R.put("LoginCompressionS2CPacket", net.minecraft.network.packet.s2c.login.LoginCompressionS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.common.CommonPingS2CPacket.class, "CommonPingS2CPacket"); + S2C_PACKETS_R.put("CommonPingS2CPacket", net.minecraft.network.packet.s2c.common.CommonPingS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.TitleFadeS2CPacket.class, "TitleFadeS2CPacket"); S2C_PACKETS_R.put("TitleFadeS2CPacket", net.minecraft.network.packet.s2c.play.TitleFadeS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlayerSpawnS2CPacket.class, "PlayerSpawnS2CPacket"); - S2C_PACKETS_R.put("PlayerSpawnS2CPacket", net.minecraft.network.packet.s2c.play.PlayerSpawnS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.query.PingResultS2CPacket.class, "PingResultS2CPacket"); + S2C_PACKETS_R.put("PingResultS2CPacket", net.minecraft.network.packet.s2c.query.PingResultS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlayerActionResponseS2CPacket.class, "PlayerActionResponseS2CPacket"); S2C_PACKETS_R.put("PlayerActionResponseS2CPacket", net.minecraft.network.packet.s2c.play.PlayerActionResponseS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.InventoryS2CPacket.class, "InventoryS2CPacket"); S2C_PACKETS_R.put("InventoryS2CPacket", net.minecraft.network.packet.s2c.play.InventoryS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ResourcePackSendS2CPacket.class, "ResourcePackSendS2CPacket"); - S2C_PACKETS_R.put("ResourcePackSendS2CPacket", net.minecraft.network.packet.s2c.play.ResourcePackSendS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ChunkBiomeDataS2CPacket.class, "ChunkBiomeDataS2CPacket"); S2C_PACKETS_R.put("ChunkBiomeDataS2CPacket", net.minecraft.network.packet.s2c.play.ChunkBiomeDataS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.WorldBorderWarningTimeChangedS2CPacket.class, "WorldBorderWarningTimeChangedS2CPacket"); S2C_PACKETS_R.put("WorldBorderWarningTimeChangedS2CPacket", net.minecraft.network.packet.s2c.play.WorldBorderWarningTimeChangedS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ScoreboardPlayerUpdateS2CPacket.class, "ScoreboardPlayerUpdateS2CPacket"); S2C_PACKETS_R.put("ScoreboardPlayerUpdateS2CPacket", net.minecraft.network.packet.s2c.play.ScoreboardPlayerUpdateS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.query.QueryPongS2CPacket.class, "QueryPongS2CPacket"); - S2C_PACKETS_R.put("QueryPongS2CPacket", net.minecraft.network.packet.s2c.query.QueryPongS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityDamageS2CPacket.class, "EntityDamageS2CPacket"); S2C_PACKETS_R.put("EntityDamageS2CPacket", net.minecraft.network.packet.s2c.play.EntityDamageS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ChatMessageS2CPacket.class, "ChatMessageS2CPacket"); S2C_PACKETS_R.put("ChatMessageS2CPacket", net.minecraft.network.packet.s2c.play.ChatMessageS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.common.KeepAliveS2CPacket.class, "KeepAliveS2CPacket"); + S2C_PACKETS_R.put("KeepAliveS2CPacket", net.minecraft.network.packet.s2c.common.KeepAliveS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.OpenWrittenBookS2CPacket.class, "OpenWrittenBookS2CPacket"); S2C_PACKETS_R.put("OpenWrittenBookS2CPacket", net.minecraft.network.packet.s2c.play.OpenWrittenBookS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlaySoundFromEntityS2CPacket.class, "PlaySoundFromEntityS2CPacket"); - S2C_PACKETS_R.put("PlaySoundFromEntityS2CPacket", net.minecraft.network.packet.s2c.play.PlaySoundFromEntityS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.WorldTimeUpdateS2CPacket.class, "WorldTimeUpdateS2CPacket"); S2C_PACKETS_R.put("WorldTimeUpdateS2CPacket", net.minecraft.network.packet.s2c.play.WorldTimeUpdateS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlaySoundFromEntityS2CPacket.class, "PlaySoundFromEntityS2CPacket"); + S2C_PACKETS_R.put("PlaySoundFromEntityS2CPacket", net.minecraft.network.packet.s2c.play.PlaySoundFromEntityS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.config.FeaturesS2CPacket.class, "FeaturesS2CPacket"); + S2C_PACKETS_R.put("FeaturesS2CPacket", net.minecraft.network.packet.s2c.config.FeaturesS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.SignEditorOpenS2CPacket.class, "SignEditorOpenS2CPacket"); S2C_PACKETS_R.put("SignEditorOpenS2CPacket", net.minecraft.network.packet.s2c.play.SignEditorOpenS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ExplosionS2CPacket.class, "ExplosionS2CPacket"); @@ -325,8 +333,6 @@ public class PacketUtils { S2C_PACKETS_R.put("EndCombatS2CPacket", net.minecraft.network.packet.s2c.play.EndCombatS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlayerListS2CPacket.class, "PlayerListS2CPacket"); S2C_PACKETS_R.put("PlayerListS2CPacket", net.minecraft.network.packet.s2c.play.PlayerListS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.DisconnectS2CPacket.class, "DisconnectS2CPacket"); - S2C_PACKETS_R.put("DisconnectS2CPacket", net.minecraft.network.packet.s2c.play.DisconnectS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ChunkRenderDistanceCenterS2CPacket.class, "ChunkRenderDistanceCenterS2CPacket"); S2C_PACKETS_R.put("ChunkRenderDistanceCenterS2CPacket", net.minecraft.network.packet.s2c.play.ChunkRenderDistanceCenterS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ExperienceBarUpdateS2CPacket.class, "ExperienceBarUpdateS2CPacket"); @@ -345,6 +351,8 @@ public class PacketUtils { S2C_PACKETS_R.put("LoginSuccessS2CPacket", net.minecraft.network.packet.s2c.login.LoginSuccessS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.BlockBreakingProgressS2CPacket.class, "BlockBreakingProgressS2CPacket"); S2C_PACKETS_R.put("BlockBreakingProgressS2CPacket", net.minecraft.network.packet.s2c.play.BlockBreakingProgressS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.common.DisconnectS2CPacket.class, "DisconnectS2CPacket"); + S2C_PACKETS_R.put("DisconnectS2CPacket", net.minecraft.network.packet.s2c.common.DisconnectS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.GameMessageS2CPacket.class, "GameMessageS2CPacket"); S2C_PACKETS_R.put("GameMessageS2CPacket", net.minecraft.network.packet.s2c.play.GameMessageS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityPassengersSetS2CPacket.class, "EntityPassengersSetS2CPacket"); @@ -361,6 +369,10 @@ public class PacketUtils { S2C_PACKETS_R.put("EntityStatusS2CPacket", net.minecraft.network.packet.s2c.play.EntityStatusS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityTrackerUpdateS2CPacket.class, "EntityTrackerUpdateS2CPacket"); S2C_PACKETS_R.put("EntityTrackerUpdateS2CPacket", net.minecraft.network.packet.s2c.play.EntityTrackerUpdateS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.config.DynamicRegistriesS2CPacket.class, "DynamicRegistriesS2CPacket"); + S2C_PACKETS_R.put("DynamicRegistriesS2CPacket", net.minecraft.network.packet.s2c.config.DynamicRegistriesS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.common.CustomPayloadS2CPacket.class, "CustomPayloadS2CPacket"); + S2C_PACKETS_R.put("CustomPayloadS2CPacket", net.minecraft.network.packet.s2c.common.CustomPayloadS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.SubtitleS2CPacket.class, "SubtitleS2CPacket"); S2C_PACKETS_R.put("SubtitleS2CPacket", net.minecraft.network.packet.s2c.play.SubtitleS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.NbtQueryResponseS2CPacket.class, "NbtQueryResponseS2CPacket"); @@ -369,10 +381,14 @@ public class PacketUtils { S2C_PACKETS_R.put("UnloadChunkS2CPacket", net.minecraft.network.packet.s2c.play.UnloadChunkS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityEquipmentUpdateS2CPacket.class, "EntityEquipmentUpdateS2CPacket"); S2C_PACKETS_R.put("EntityEquipmentUpdateS2CPacket", net.minecraft.network.packet.s2c.play.EntityEquipmentUpdateS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.BossBarS2CPacket.class, "BossBarS2CPacket"); - S2C_PACKETS_R.put("BossBarS2CPacket", net.minecraft.network.packet.s2c.play.BossBarS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.config.ReadyS2CPacket.class, "ReadyS2CPacket"); + S2C_PACKETS_R.put("ReadyS2CPacket", net.minecraft.network.packet.s2c.config.ReadyS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EnterReconfigurationS2CPacket.class, "EnterReconfigurationS2CPacket"); + S2C_PACKETS_R.put("EnterReconfigurationS2CPacket", net.minecraft.network.packet.s2c.play.EnterReconfigurationS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityAttachS2CPacket.class, "EntityAttachS2CPacket"); S2C_PACKETS_R.put("EntityAttachS2CPacket", net.minecraft.network.packet.s2c.play.EntityAttachS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.BossBarS2CPacket.class, "BossBarS2CPacket"); + S2C_PACKETS_R.put("BossBarS2CPacket", net.minecraft.network.packet.s2c.play.BossBarS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityPositionS2CPacket.class, "EntityPositionS2CPacket"); S2C_PACKETS_R.put("EntityPositionS2CPacket", net.minecraft.network.packet.s2c.play.EntityPositionS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ChunkDataS2CPacket.class, "ChunkDataS2CPacket"); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/MeteorToast.java b/src/main/java/meteordevelopment/meteorclient/utils/render/MeteorToast.java index 1aec6d3760..731f31401d 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/MeteorToast.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/MeteorToast.java @@ -19,6 +19,7 @@ import net.minecraft.text.Style; import net.minecraft.text.Text; import net.minecraft.text.TextColor; +import net.minecraft.util.Identifier; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -27,6 +28,7 @@ public class MeteorToast implements Toast { public static final int TITLE_COLOR = Color.fromRGBA(145, 61, 226, 255); public static final int TEXT_COLOR = Color.fromRGBA(220, 220, 220, 255); + private static final Identifier TEXTURE = new Identifier("textures/gui/sprites/toast/advancement.png"); private ItemStack icon; private Text title, text; diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/PlayerHeadUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/render/PlayerHeadUtils.java index 3da0df73ab..132cf8f5ff 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/PlayerHeadUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/PlayerHeadUtils.java @@ -1,7 +1,6 @@ package meteordevelopment.meteorclient.utils.render; import com.google.gson.Gson; -import com.mojang.util.UUIDTypeAdapter; import meteordevelopment.meteorclient.systems.accounts.TexturesJson; import meteordevelopment.meteorclient.systems.accounts.UuidToProfileResponse; import meteordevelopment.meteorclient.utils.PostInit; @@ -26,7 +25,7 @@ public static PlayerHeadTexture fetchHead(UUID id) { } public static String getSkinUrl(UUID id) { - UuidToProfileResponse res2 = Http.get("https://sessionserver.mojang.com/session/minecraft/profile/" + UUIDTypeAdapter.fromUUID(id)).sendJson(UuidToProfileResponse.class); + UuidToProfileResponse res2 = Http.get("https://sessionserver.mojang.com/session/minecraft/profile/" + id).sendJson(UuidToProfileResponse.class); if (res2 == null) return null; String base64Textures = res2.getPropertyValue("textures"); diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 9152c8dad7..c3523f4237 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -48,8 +48,8 @@ }, "depends": { "java": ">=17", - "minecraft": [ "1.20", "1.20.1" ], - "fabricloader": ">=0.14.21" + "minecraft": "1.20.2", + "fabricloader": ">=0.14.22" }, "breaks": { "optifabric": "*", diff --git a/src/main/resources/meteor-client.accesswidener b/src/main/resources/meteor-client.accesswidener index 5632e6397b..30a856f583 100644 --- a/src/main/resources/meteor-client.accesswidener +++ b/src/main/resources/meteor-client.accesswidener @@ -1,5 +1,6 @@ accessWidener v1 named +accessible class net/minecraft/client/texture/PlayerSkinProvider$FileCache accessible class net/minecraft/client/render/RenderLayer$OutlineMode accessible class net/minecraft/client/particle/FireworksSparkParticle$Explosion accessible class net/minecraft/network/packet/c2s/play/PlayerInteractEntityC2SPacket$InteractType diff --git a/src/main/resources/meteor-client.mixins.json b/src/main/resources/meteor-client.mixins.json index b0ad1f5301..6ea10c20d4 100644 --- a/src/main/resources/meteor-client.mixins.json +++ b/src/main/resources/meteor-client.mixins.json @@ -37,8 +37,10 @@ "BufferRendererAccessor", "CameraMixin", "CapabilityTrackerMixin", + "CapeFeatureRendererMixin", "ChatHudAccessor", "ChatHudLineMixin", + "ChatHudLineVisibleMixin", "ChatHudMixin", "ChatInputSuggestorMixin", "ChatScreenMixin", @@ -64,11 +66,11 @@ "CreativeInventoryScreenAccessor", "CreativeSlotMixin", "CrossbowItemAccessor", - "CustomPayloadC2SPacketAccessor", "CustomPayloadS2CPacketMixin", "DefaultSkinHelperMixin", "DisconnectedScreenMixin", "DrawContextMixin", + "ElytraFeatureRendererMixin", "EnchantingTableBlockEntityRendererMixin", "EndCrystalEntityRendererMixin", "EntityAccessor", @@ -80,6 +82,7 @@ "EntityVelocityUpdateS2CPacketAccessor", "ExplosionMixin", "ExplosionS2CPacketMixin", + "FileCacheAccessor", "FireworkRocketEntityMixin", "FireworksSparkParticleMixin", "FireworksSparkParticleSubMixin", @@ -111,6 +114,7 @@ "LivingEntityRendererMixin", "MapRendererAccessor", "MapRendererMixin", + "MessageHandlerMixin", "MinecraftClientAccessor", "MinecraftClientMixin", "MinecraftServerAccessor", @@ -166,9 +170,7 @@ "WorldChunkMixin", "WorldRendererAccessor", "WorldRendererMixin", - "YggdrasilMinecraftSessionServiceAccessor", - "MessageHandlerMixin", - "ChatHudLineVisibleMixin" + "YggdrasilMinecraftSessionServiceAccessor" ], "injectors": { "defaultRequire": 1 From 3872a8eff3621549cde377a4989429cfdca317b2 Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Tue, 10 Oct 2023 21:09:46 +0200 Subject: [PATCH 114/357] Fix publishing to maven --- build.gradle | 34 ++++++++++++++-------------------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/build.gradle b/build.gradle index 335f2911f2..f5e73bea45 100644 --- a/build.gradle +++ b/build.gradle @@ -4,8 +4,6 @@ plugins { id "com.github.johnrengelman.shadow" version "8.1.1" } -sourceCompatibility = targetCompatibility = JavaVersion.VERSION_17 - archivesBaseName = project.archives_base_name version = project.mod_version + (project.hasProperty("devbuild") ? ("-" + project.findProperty("devbuild")) : "") group = project.maven_group @@ -113,6 +111,13 @@ jar { } } +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + + withSourcesJar() +} + remapJar { dependsOn shadowJar inputFile.set(shadowJar.archiveFile) @@ -123,33 +128,22 @@ javadoc { options.encoding = "UTF-8" } -task sourcesJar(type: Jar, dependsOn: classes) { - archiveClassifier.set("sources") - from sourceSets.main.allSource +tasks.register("javadocJar", Jar) { + from javadoc + archiveClassifier.set("javadoc") } -task javadocJar(type: Jar) { - archiveClassifier.set("javadoc") - from javadoc +build { + dependsOn javadocJar } publishing { publications { - java(MavenPublication) { + mavenJava(MavenPublication) { artifactId = "meteor-client" version = project.hasProperty("devbuild") ? (project.mod_version + "-SNAPSHOT") : project.mod_version - artifact(remapJar) { - builtBy remapJar - } - - artifact(sourcesJar) { - builtBy remapSourcesJar - } - - artifact(javadocJar) { - builtBy javadocJar - } + from components.java } } From 4de4aac69ef4a62971e975535419afceefe8b3b4 Mon Sep 17 00:00:00 2001 From: Lovecrafts-Cat Date: Wed, 11 Oct 2023 17:32:12 +0200 Subject: [PATCH 115/357] Fix crash, add icons to spoofed potions screen --- .../StatusEffectAmplifierMapSettingScreen.java | 14 +++++++++++--- .../settings/StatusEffectListSettingScreen.java | 5 +---- 2 files changed, 12 insertions(+), 7 deletions(-) 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 5da5e5194d..f4b4c073c8 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/StatusEffectAmplifierMapSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/StatusEffectAmplifierMapSettingScreen.java @@ -14,6 +14,8 @@ import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.utils.misc.Names; import net.minecraft.entity.effect.StatusEffect; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; @@ -25,7 +27,6 @@ public class StatusEffectAmplifierMapSettingScreen extends WindowScreen { private WTable table; - private WTextBox filter; private String filterText = ""; public StatusEffectAmplifierMapSettingScreen(GuiTheme theme, Setting> setting) { @@ -36,7 +37,7 @@ public StatusEffectAmplifierMapSettingScreen(GuiTheme theme, Setting { filterText = filter.get().trim(); @@ -46,6 +47,7 @@ public void initWidgets() { }; table = add(theme.table()).expandX().widget(); + initTable(); } @@ -57,7 +59,7 @@ private void initTable() { String name = Names.get(statusEffect); if (!StringUtils.containsIgnoreCase(name, filterText)) continue; - table.add(theme.label(name)).expandCellX(); + table.add(theme.itemWithLabel(getPotionStack(statusEffect), name)).expandCellX(); WIntEdit level = theme.intEdit(setting.get().getInt(statusEffect), 0, Integer.MAX_VALUE, true); level.action = () -> { @@ -69,4 +71,10 @@ private void initTable() { table.row(); } } + + private ItemStack getPotionStack(StatusEffect effect) { + ItemStack potion = Items.POTION.getDefaultStack(); + potion.getOrCreateNbt().putInt("CustomPotionColor", effect.getColor()); + return potion; + } } 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 d9687c73af..39ba69ed93 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/StatusEffectListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/StatusEffectListSettingScreen.java @@ -10,11 +10,8 @@ import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.utils.misc.Names; import net.minecraft.entity.effect.StatusEffect; -import net.minecraft.entity.effect.StatusEffectInstance; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; -import net.minecraft.potion.Potion; -import net.minecraft.potion.PotionUtil; import net.minecraft.registry.Registries; import java.util.List; @@ -36,7 +33,7 @@ protected String getValueName(StatusEffect value) { private ItemStack getPotionStack(StatusEffect effect) { ItemStack potion = Items.POTION.getDefaultStack(); - potion.getOrCreateNbt().putInt("CustomPotionColor", PotionUtil.getColor(new Potion(new StatusEffectInstance(effect)))); + potion.getOrCreateNbt().putInt("CustomPotionColor", effect.getColor()); return potion; } } From f6cea7ce02cad2bb07d2abd75fc289e8e42f1ed4 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Wed, 11 Oct 2023 18:31:37 -0400 Subject: [PATCH 116/357] fix .server info command --- .../meteorclient/commands/commands/ServerCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java index ce1fb6f02c..1a673867dc 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java @@ -194,7 +194,7 @@ private void basicInfo() { info("Port: %d", ServerAddress.parse(server.address).getPort()); - info("Type: %s", mc.player.getServer().getSaveProperties().getServerBrands() != null ? mc.player.getServer().getSaveProperties().getServerBrands() : "unknown"); + info("Type: %s", mc.getNetworkHandler().getBrand() != null ? mc.getNetworkHandler().getBrand() : "unknown"); info("Motd: %s", server.label != null ? server.label.getString() : "unknown"); From 47b95b67421fdd6ce82841681a9cb098cc85a26a Mon Sep 17 00:00:00 2001 From: misterx Date: Fri, 13 Oct 2023 19:03:54 +0200 Subject: [PATCH 117/357] Reconfiguration phase disables modules. --- .../meteorclient/mixin/ClientPlayNetworkHandlerMixin.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerMixin.java index 3016a695f9..a6f62321b2 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerMixin.java @@ -52,6 +52,7 @@ public abstract class ClientPlayNetworkHandlerMixin extends ClientCommonNetworkH @Unique private boolean ignoreChatMessage; + @Unique private boolean worldNotNull; protected ClientPlayNetworkHandlerMixin(MinecraftClient client, ClientConnection connection, ClientConnectionState connectionState) { @@ -81,6 +82,12 @@ private void onGameJoinTail(GameJoinS2CPacket packet, CallbackInfo info) { MeteorClient.EVENT_BUS.post(GameJoinedEvent.get()); } + // the server sends a GameJoin packet after the reconfiguration phase + @Inject(method = "onEnterReconfiguration", at = @At("HEAD")) + 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)); From 1b705d1786eb918a3521842d6c4c441ea674ec24 Mon Sep 17 00:00:00 2001 From: Patrick Date: Thu, 12 Oct 2023 18:38:03 +0200 Subject: [PATCH 118/357] Make Infinite Chat Box compatible with ViaFabricPlus --- .../meteordevelopment/meteorclient/mixin/ChatScreenMixin.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChatScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChatScreenMixin.java index e0a3086f69..379cfb8868 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChatScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChatScreenMixin.java @@ -15,11 +15,11 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(ChatScreen.class) +@Mixin(value = ChatScreen.class, priority = 1001) public abstract class ChatScreenMixin { @Shadow protected TextFieldWidget chatField; - @Inject(method = "init", at = @At(value = "TAIL")) + @Inject(method = "init", at = @At(value = "RETURN")) private void onInit(CallbackInfo info) { if (Modules.get().get(BetterChat.class).isInfiniteChatBox()) chatField.setMaxLength(Integer.MAX_VALUE); } From f30f2b38f6520a42ee3360b48a3c31c52d9235f6 Mon Sep 17 00:00:00 2001 From: Big Iron <52252627+Big-Iron-Cheems@users.noreply.github.com> Date: Fri, 20 Oct 2023 15:18:31 +0200 Subject: [PATCH 119/357] Update issue templates (#4152) [skip ci] --- .github/ISSUE_TEMPLATE/bug.yml | 16 +++++---- .github/ISSUE_TEMPLATE/crash.yml | 56 ++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 7 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/crash.yml diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml index 346b948719..cdd9c0885e 100644 --- a/.github/ISSUE_TEMPLATE/bug.yml +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -8,8 +8,10 @@ body: label: Describe the bug description: | A clear and concise description of what the issue is. - Provide as much information as possible, videos, crash reports, etc. - DO NOT PASTE A CRASH REPORT HERE!!!! + Provide as much information as possible, videos, images, etc. + placeholder: | + This module is broken / not working as intended. + It should do X but it does Y instead. validations: required: true - type: textarea @@ -17,23 +19,23 @@ body: attributes: label: Steps to reproduce description: How do you trigger this bug? - render: bash + placeholder: | + 1. I did this thing; + 2. Then I did this other thing, which caused the bug. validations: required: true - - type: input - id: crash-report - attributes: - label: Link to crash report/log if applicable (https://mclo.gs) - type: input id: meteor-version attributes: label: Meteor Version + placeholder: Meteor X.Y.Z (or X.Y.Z-build_number) validations: required: true - type: input id: mc-version attributes: label: Minecraft Version + placeholder: MC X.Y.Z validations: required: true - type: dropdown diff --git a/.github/ISSUE_TEMPLATE/crash.yml b/.github/ISSUE_TEMPLATE/crash.yml new file mode 100644 index 0000000000..ce24178959 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/crash.yml @@ -0,0 +1,56 @@ +name: Crash +description: Report a crash to help us improve Meteor. +labels: [ crash ] +body: + - type: textarea + id: reproducing + attributes: + label: Steps to reproduce + description: How do you trigger this crash? + placeholder: | + 1. I did this thing; + 2. Then I did this other thing, which caused the crash. + validations: + required: true + - type: input + id: crash-report + attributes: + label: Link to crash report/log (upload to https://mclo.gs and paste resulting link here) + placeholder: https://mclo.gs/xxxxxx + validations: + required: true + - type: input + id: meteor-version + attributes: + label: Meteor Version + placeholder: Meteor X.Y.Z (or X.Y.Z-build_number) + validations: + required: true + - type: input + id: mc-version + attributes: + label: Minecraft Version + placeholder: MC X.Y.Z + validations: + required: true + - type: dropdown + id: operating-systems + attributes: + label: Operating System + options: + - macOS + - Windows + - Linux + validations: + required: true + - type: checkboxes + id: prerequisites + attributes: + label: Before submitting a crash report + options: + - label: | + This crash wasn't already reported (I have searched crash reports on GitHub). + required: true + - label: | + This is a valid crash (I am able to reproduce this on the latest dev build). + required: true From e5713e4e03831c0558f6f4c5440e03441a8d2f0c Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Sun, 22 Oct 2023 05:07:10 -0400 Subject: [PATCH 120/357] Echest memory patch (#4153) --- .../modules/render/BetterTooltips.java | 3 ++- .../utils/player/EChestMemory.java | 13 ++++++++++ .../utils/tooltip/TextTooltipComponent.java | 26 +++++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 src/main/java/meteordevelopment/meteorclient/utils/tooltip/TextTooltipComponent.java diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java index cbf85e39ad..4158e0646e 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java @@ -325,7 +325,8 @@ private void getTooltipData(TooltipDataEvent event) { // EChest preview else if (event.itemStack.getItem() == Items.ENDER_CHEST && previewEChest()) { - event.tooltipData = new ContainerTooltipComponent(EChestMemory.ITEMS, ECHEST_COLOR); + event.tooltipData = EChestMemory.isKnown() ? new ContainerTooltipComponent(EChestMemory.ITEMS, ECHEST_COLOR) + : new TextTooltipComponent(Text.literal("Unknown ender chest inventory.").formatted(Formatting.DARK_RED)); } // Map preview diff --git a/src/main/java/meteordevelopment/meteorclient/utils/player/EChestMemory.java b/src/main/java/meteordevelopment/meteorclient/utils/player/EChestMemory.java index 20797b548f..f806c712fb 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/player/EChestMemory.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/player/EChestMemory.java @@ -6,6 +6,7 @@ package meteordevelopment.meteorclient.utils.player; import meteordevelopment.meteorclient.MeteorClient; +import meteordevelopment.meteorclient.events.game.GameLeftEvent; import meteordevelopment.meteorclient.events.game.OpenScreenEvent; import meteordevelopment.meteorclient.events.world.BlockActivateEvent; import meteordevelopment.meteorclient.utils.PreInit; @@ -22,6 +23,7 @@ public class EChestMemory { public static final DefaultedList ITEMS = DefaultedList.ofSize(27, ItemStack.EMPTY); private static int echestOpenedState; + private static boolean isKnown = false; @PreInit public static void init() { @@ -49,7 +51,18 @@ private static void onOpenScreenEvent(OpenScreenEvent event) { for (int i = 0; i < 27; i++) { ITEMS.set(i, inv.getStack(i)); } + isKnown = true; echestOpenedState = 0; } + + @EventHandler + private static void onLeaveEvent(GameLeftEvent event) { + ITEMS.clear(); + isKnown = false; + } + + public static boolean isKnown() { + return isKnown; + } } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/tooltip/TextTooltipComponent.java b/src/main/java/meteordevelopment/meteorclient/utils/tooltip/TextTooltipComponent.java new file mode 100644 index 0000000000..8693e3ed2d --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/utils/tooltip/TextTooltipComponent.java @@ -0,0 +1,26 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.utils.tooltip; + +import net.minecraft.client.gui.tooltip.OrderedTextTooltipComponent; +import net.minecraft.client.gui.tooltip.TooltipComponent; +import net.minecraft.text.OrderedText; +import net.minecraft.text.Text; + +public class TextTooltipComponent extends OrderedTextTooltipComponent implements MeteorTooltipData { + public TextTooltipComponent(OrderedText text) { + super(text); + } + + public TextTooltipComponent(Text text) { + this(text.asOrderedText()); + } + + @Override + public TooltipComponent getComponent() { + return this; + } +} From 89e4ae35c3ff2f13ca90a587d6e6e0798ec591f2 Mon Sep 17 00:00:00 2001 From: Patrick Date: Wed, 18 Oct 2023 20:41:55 +0200 Subject: [PATCH 121/357] Fix Meteor logo when using BetterChat with Player Heads and Timestamps --- .../meteorclient/systems/modules/misc/BetterChat.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java index f60de694b6..28ceaf0c5c 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java @@ -394,7 +394,8 @@ private void drawTexture(DrawContext context, IChatHudLine line, int y) { int startOffset = 0; try { - startOffset = TIMESTAMP_REGEX.matcher(text).end(); + Matcher m = TIMESTAMP_REGEX.matcher(text); + if (m.find()) startOffset = m.end() + 1; } catch (IllegalStateException ignored) {} From 3fb57b6e1ed75b2786380fbf7db887d69abb5ee2 Mon Sep 17 00:00:00 2001 From: misterx Date: Tue, 17 Oct 2023 00:22:27 +0200 Subject: [PATCH 122/357] call on main thread --- .../meteorclient/mixin/ClientPlayNetworkHandlerMixin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerMixin.java index a6f62321b2..e5858794f4 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerMixin.java @@ -83,7 +83,7 @@ private void onGameJoinTail(GameJoinS2CPacket packet, CallbackInfo info) { } // the server sends a GameJoin packet after the reconfiguration phase - @Inject(method = "onEnterReconfiguration", at = @At("HEAD")) + @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/util/thread/ThreadExecutor;)V", shift = At.Shift.AFTER)) private void onEnterReconfiguration(EnterReconfigurationS2CPacket packet, CallbackInfo info) { MeteorClient.EVENT_BUS.post(GameLeftEvent.get()); } From 6576056331d72f7b2738e4c591969d7c04df45a8 Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Sun, 22 Oct 2023 14:18:26 +0200 Subject: [PATCH 123/357] Make Baritone optional and not bundled with Meteor (#4155) --- build.gradle | 2 +- .../meteorclient/commands/Commands.java | 5 +- .../commands/commands/LocateCommand.java | 23 +- .../commands/commands/SwarmCommand.java | 16 +- .../meteorclient/gui/tabs/Tabs.java | 9 +- .../gui/tabs/builtin/PathManagerTab.java | 59 +++++ .../mixin/ClientPlayNetworkHandlerMixin.java | 3 +- .../pathing/BaritonePathManager.java | 248 ++++++++++++++++++ .../BaritoneSettings.java} | 141 +++++----- .../meteorclient/pathing/BaritoneUtils.java | 20 ++ .../meteorclient/pathing/IPathManager.java | 47 ++++ .../meteorclient/pathing/NopPathManager.java | 99 +++++++ .../meteorclient/pathing/PathManagers.java | 49 ++++ .../meteorclient/systems/modules/Modules.java | 8 +- .../systems/modules/combat/BowAimbot.java | 8 +- .../systems/modules/combat/KillAura.java | 8 +- .../modules/misc/swarm/SwarmWorker.java | 10 +- .../systems/modules/movement/AutoWalk.java | 27 +- .../systems/modules/movement/Jesus.java | 18 +- .../systems/modules/movement/NoFall.java | 11 +- .../systems/modules/movement/Step.java | 11 +- .../systems/modules/player/AutoEat.java | 8 +- .../systems/modules/player/AutoGap.java | 8 +- .../modules/render/WaypointsModule.java | 11 +- .../systems/modules/world/StashFinder.java | 6 +- .../utils/misc/BaritoneUtils.java | 42 --- .../utils/misc/MeteorStarscript.java | 20 +- .../meteorclient/utils/player/ChatUtils.java | 27 +- .../utils/player/PlayerUtils.java | 9 +- .../utils/world/GoalDirection.java | 69 ----- 30 files changed, 735 insertions(+), 287 deletions(-) create mode 100644 src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/PathManagerTab.java create mode 100644 src/main/java/meteordevelopment/meteorclient/pathing/BaritonePathManager.java rename src/main/java/meteordevelopment/meteorclient/{gui/tabs/builtin/BaritoneTab.java => pathing/BaritoneSettings.java} (92%) create mode 100644 src/main/java/meteordevelopment/meteorclient/pathing/BaritoneUtils.java create mode 100644 src/main/java/meteordevelopment/meteorclient/pathing/IPathManager.java create mode 100644 src/main/java/meteordevelopment/meteorclient/pathing/NopPathManager.java create mode 100644 src/main/java/meteordevelopment/meteorclient/pathing/PathManagers.java delete mode 100644 src/main/java/meteordevelopment/meteorclient/utils/misc/BaritoneUtils.java delete mode 100644 src/main/java/meteordevelopment/meteorclient/utils/world/GoalDirection.java diff --git a/build.gradle b/build.gradle index f5e73bea45..cb542a93da 100644 --- a/build.gradle +++ b/build.gradle @@ -58,7 +58,7 @@ dependencies { modCompileOnly("maven.modrinth:indium:${project.indium_version}") { transitive = false } // Baritone (https://github.com/MeteorDevelopment/baritone) - modInclude "baritone:fabric:${project.minecraft_version}-SNAPSHOT" + modCompileOnly "meteordevelopment:baritone:${project.minecraft_version}-SNAPSHOT" // Libraries library "meteordevelopment:orbit:${project.orbit_version}" diff --git a/src/main/java/meteordevelopment/meteorclient/commands/Commands.java b/src/main/java/meteordevelopment/meteorclient/commands/Commands.java index fbae5aac16..6550ce95d9 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/Commands.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/Commands.java @@ -8,6 +8,7 @@ import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.exceptions.CommandSyntaxException; import meteordevelopment.meteorclient.commands.commands.*; +import meteordevelopment.meteorclient.pathing.PathManagers; import meteordevelopment.meteorclient.utils.PostInit; import net.minecraft.client.network.ClientCommandSource; import net.minecraft.command.CommandSource; @@ -23,7 +24,7 @@ public class Commands { public static final CommandSource COMMAND_SOURCE = new ClientCommandSource(null, mc); public static final List COMMANDS = new ArrayList<>(); - @PostInit + @PostInit(dependencies = PathManagers.class) public static void init() { add(new VClipCommand()); add(new HClipCommand()); @@ -35,7 +36,6 @@ public static void init() { add(new FriendsCommand()); add(new CommandsCommand()); add(new InventoryCommand()); - add(new LocateCommand()); add(new NbtCommand()); add(new NotebotCommand()); add(new PeekCommand()); @@ -61,6 +61,7 @@ public static void init() { add(new RotationCommand()); add(new WaypointCommand()); add(new InputCommand()); + add(new LocateCommand()); COMMANDS.sort(Comparator.comparing(Command::getName)); } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/LocateCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/LocateCommand.java index 241bc6cad9..fbddc68791 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/LocateCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/LocateCommand.java @@ -10,6 +10,8 @@ import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.commands.Command; import meteordevelopment.meteorclient.events.packets.PacketEvent; +import meteordevelopment.meteorclient.pathing.BaritoneUtils; +import meteordevelopment.meteorclient.pathing.PathManagers; import meteordevelopment.meteorclient.utils.player.ChatUtils; import meteordevelopment.meteorclient.utils.player.InvUtils; import meteordevelopment.orbit.EventHandler; @@ -17,6 +19,7 @@ import net.minecraft.block.Blocks; import net.minecraft.command.CommandSource; import net.minecraft.entity.EntityType; +import net.minecraft.entity.EyeOfEnderEntity; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.nbt.NbtCompound; @@ -143,10 +146,15 @@ public void build(LiteralArgumentBuilder builder) { })); builder.then(literal("stronghold").executes(s -> { + if (!BaritoneUtils.IS_AVAILABLE) { + error("Locating this structure requires Baritone."); + return SINGLE_SUCCESS; + } + boolean foundEye = InvUtils.testInHotbar(Items.ENDER_EYE); if (foundEye) { - BaritoneAPI.getProvider().getPrimaryBaritone().getCommandManager().execute("follow entity minecraft:eye_of_ender"); + PathManagers.get().follow(entity -> entity instanceof EyeOfEnderEntity); firstStart = null; firstEnd = null; secondStart = null; @@ -168,6 +176,11 @@ public void build(LiteralArgumentBuilder builder) { })); builder.then(literal("nether_fortress").executes(s -> { + if (!BaritoneUtils.IS_AVAILABLE) { + error("Locating this structure requires Baritone."); + return SINGLE_SUCCESS; + } + Vec3d coords = findByBlockList(netherFortressBlocks); if (coords == null) { error("No nether fortress found."); @@ -181,6 +194,11 @@ public void build(LiteralArgumentBuilder builder) { })); builder.then(literal("monument").executes(s -> { + if (!BaritoneUtils.IS_AVAILABLE) { + error("Locating this structure requires Baritone."); + return SINGLE_SUCCESS; + } + ItemStack stack = mc.player.getInventory().getMainHandStack(); if (stack.getItem() == Items.FILLED_MAP) { NbtCompound tag = stack.getNbt(); @@ -271,7 +289,8 @@ private void lastPosition(double x, double y, double z) { } private void findStronghold() { - BaritoneAPI.getProvider().getPrimaryBaritone().getCommandManager().execute("stop"); + PathManagers.get().stop(); + if (this.firstStart == null || this.firstEnd == null || this.secondStart == null || this.secondEnd == null) { error("Missing position data"); cancel(); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java index 8ce4ec004e..fda2554682 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java @@ -5,8 +5,6 @@ package meteordevelopment.meteorclient.commands.commands; -import baritone.api.BaritoneAPI; -import baritone.api.pathing.goals.GoalXZ; import com.mojang.brigadier.arguments.BoolArgumentType; import com.mojang.brigadier.arguments.IntegerArgumentType; import com.mojang.brigadier.arguments.StringArgumentType; @@ -15,6 +13,7 @@ import meteordevelopment.meteorclient.commands.Command; import meteordevelopment.meteorclient.commands.arguments.ModuleArgumentType; import meteordevelopment.meteorclient.commands.arguments.PlayerArgumentType; +import meteordevelopment.meteorclient.pathing.PathManagers; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.misc.swarm.Swarm; @@ -27,6 +26,7 @@ import net.minecraft.command.argument.BlockStateArgumentType; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.text.Text; +import net.minecraft.util.math.BlockPos; import java.util.List; import java.util.Random; @@ -124,7 +124,7 @@ else if (swarm.isWorker()) { swarm.host.sendMessage(context.getInput()); } else if (swarm.isWorker() && playerEntity != null) { - BaritoneAPI.getProvider().getPrimaryBaritone().getFollowProcess().follow(entity -> entity.getEntityName().equalsIgnoreCase(playerEntity.getEntityName())); + PathManagers.get().follow(entity -> entity.getEntityName().equalsIgnoreCase(playerEntity.getEntityName())); } } else { @@ -146,7 +146,7 @@ else if (swarm.isWorker()) { int x = IntegerArgumentType.getInteger(context, "x"); int z = IntegerArgumentType.getInteger(context, "z"); - BaritoneAPI.getProvider().getPrimaryBaritone().getCustomGoalProcess().setGoalAndPath(new GoalXZ(x, z)); + PathManagers.get().moveTo(new BlockPos(x, 0, z), true); } } else { @@ -330,7 +330,7 @@ else if (swarm.isWorker()) { if (swarm.isHost()) { swarm.host.sendMessage(context.getInput()); } else if (swarm.isWorker()) { - BaritoneAPI.getProvider().getPrimaryBaritone().getPathingBehavior().cancelEverything(); + PathManagers.get().stop(); } } else { throw SWARM_NOT_ACTIVE.create(); @@ -362,11 +362,13 @@ private void runInfinityMiner() { private void scatter(int radius) { Random random = new Random(); + double a = random.nextDouble() * 2 * Math.PI; double r = radius * Math.sqrt(random.nextDouble()); double x = mc.player.getX() + r * Math.cos(a); double z = mc.player.getZ() + r * Math.sin(a); - BaritoneAPI.getProvider().getPrimaryBaritone().getPathingBehavior().cancelEverything(); - BaritoneAPI.getProvider().getPrimaryBaritone().getCustomGoalProcess().setGoalAndPath(new GoalXZ((int) x, (int) z)); + + PathManagers.get().stop(); + PathManagers.get().moveTo(new BlockPos((int) x, 0, (int) z), true); } } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/tabs/Tabs.java b/src/main/java/meteordevelopment/meteorclient/gui/tabs/Tabs.java index 237466fcc4..704eb5989e 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/tabs/Tabs.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/tabs/Tabs.java @@ -6,6 +6,8 @@ package meteordevelopment.meteorclient.gui.tabs; import meteordevelopment.meteorclient.gui.tabs.builtin.*; +import meteordevelopment.meteorclient.pathing.BaritoneUtils; +import meteordevelopment.meteorclient.pathing.PathManagers; import meteordevelopment.meteorclient.utils.PreInit; import java.util.ArrayList; @@ -14,7 +16,7 @@ public class Tabs { private static final List tabs = new ArrayList<>(); - @PreInit + @PreInit(dependencies = PathManagers.class) public static void init() { add(new ModulesTab()); add(new ConfigTab()); @@ -23,7 +25,10 @@ public static void init() { add(new FriendsTab()); add(new MacrosTab()); add(new ProfilesTab()); - add(new BaritoneTab()); + + if (PathManagers.get().getSettings().get().sizeGroups() > 0) { + add(new PathManagerTab()); + } } public static void add(Tab tab) { diff --git a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/PathManagerTab.java b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/PathManagerTab.java new file mode 100644 index 0000000000..404dd529ee --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/PathManagerTab.java @@ -0,0 +1,59 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.gui.tabs.builtin; + +import baritone.api.BaritoneAPI; +import baritone.api.utils.SettingsUtil; +import meteordevelopment.meteorclient.gui.GuiTheme; +import meteordevelopment.meteorclient.gui.tabs.Tab; +import meteordevelopment.meteorclient.gui.tabs.TabScreen; +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; + +public class PathManagerTab extends Tab { + public PathManagerTab() { + super(PathManagers.get().getName()); + } + + @Override + public TabScreen createScreen(GuiTheme theme) { + return new PathManagerScreen(theme, this); + } + + @Override + public boolean isScreen(Screen screen) { + return screen instanceof PathManagerScreen; + } + + private static class PathManagerScreen extends WindowTabScreen { + public PathManagerScreen(GuiTheme theme, Tab tab) { + super(theme, tab); + + PathManagers.get().getSettings().get().onActivated(); + } + + @Override + public void initWidgets() { + WTextBox filter = add(theme.textBox("")).minWidth(400).expandX().widget(); + filter.setFocused(true); + filter.action = () -> { + clear(); + + add(filter); + add(theme.settings(PathManagers.get().getSettings().get(), filter.get().trim())).expandX(); + }; + + add(theme.settings(PathManagers.get().getSettings().get(), filter.get().trim())).expandX(); + } + + @Override + protected void onClosed() { + SettingsUtil.save(BaritoneAPI.getSettings()); + } + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerMixin.java index e5858794f4..2e51e27d72 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerMixin.java @@ -19,6 +19,7 @@ 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; @@ -140,7 +141,7 @@ private void onItemPickupAnimation(ItemPickupAnimationS2CPacket packet, Callback private void onSendChatMessage(String message, CallbackInfo ci) { if (ignoreChatMessage) return; - if (!message.startsWith(Config.get().prefix.get()) && !message.startsWith(BaritoneAPI.getSettings().prefix.value)) { + 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()) { diff --git a/src/main/java/meteordevelopment/meteorclient/pathing/BaritonePathManager.java b/src/main/java/meteordevelopment/meteorclient/pathing/BaritonePathManager.java new file mode 100644 index 0000000000..408c7288f0 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/pathing/BaritonePathManager.java @@ -0,0 +1,248 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.pathing; + +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; +import baritone.api.process.PathingCommandType; +import baritone.api.utils.Rotation; +import baritone.api.utils.SettingsUtil; +import meteordevelopment.meteorclient.MeteorClient; +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 java.lang.invoke.MethodHandles; +import java.lang.invoke.VarHandle; +import java.lang.reflect.Field; +import java.util.function.Predicate; + +import static meteordevelopment.meteorclient.MeteorClient.mc; + +public class BaritonePathManager implements IPathManager { + private final VarHandle rotationField; + private final BaritoneSettings settings; + + private GoalDirection directionGoal; + private boolean pathingPaused; + + public BaritonePathManager() { + // Subscribe to event bus + MeteorClient.EVENT_BUS.subscribe(this); + + // Find rotation field + Class klass = BaritoneAPI.getProvider().getPrimaryBaritone().getLookBehavior().getClass(); + VarHandle rotationField = null; + + for (Field field : klass.getDeclaredFields()) { + if (field.getType() == Rotation.class) { + try { + rotationField = MethodHandles.lookup().unreflectVarHandle(field); + break; + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } + } + + this.rotationField = rotationField; + + // Create settings + settings = new BaritoneSettings(); + + // Baritone pathing control + BaritoneAPI.getProvider().getPrimaryBaritone().getPathingControlManager().registerProcess(new BaritoneProcess()); + } + + @Override + public String getName() { + return "Baritone"; + } + + @Override + public boolean isPathing() { + return BaritoneAPI.getProvider().getPrimaryBaritone().getPathingBehavior().isPathing(); + } + + @Override + public void pause() { + pathingPaused = true; + } + + @Override + public void resume() { + pathingPaused = false; + } + + @Override + public void stop() { + BaritoneAPI.getProvider().getPrimaryBaritone().getPathingBehavior().cancelEverything(); + } + + @Override + public void moveTo(BlockPos pos, boolean ignoreY) { + if (ignoreY) { + BaritoneAPI.getProvider().getPrimaryBaritone().getCustomGoalProcess().setGoalAndPath(new GoalXZ(pos.getX(), pos.getZ())); + return; + } + + BaritoneAPI.getProvider().getPrimaryBaritone().getCustomGoalProcess().setGoalAndPath(new GoalGetToBlock(pos)); + } + + @Override + public void moveInDirection(float yaw) { + directionGoal = new GoalDirection(yaw); + BaritoneAPI.getProvider().getPrimaryBaritone().getCustomGoalProcess().setGoalAndPath(directionGoal); + } + + @Override + public void mine(Block... blocks) { + BaritoneAPI.getProvider().getPrimaryBaritone().getMineProcess().mine(blocks); + } + + @Override + public void follow(Predicate entity) { + BaritoneAPI.getProvider().getPrimaryBaritone().getFollowProcess().follow(entity); + } + + @Override + public float getTargetYaw() { + Rotation rotation = (Rotation) rotationField.get(BaritoneAPI.getProvider().getPrimaryBaritone().getLookBehavior()); + return rotation == null ? 0 : rotation.getYaw(); + } + + @Override + public float getTargetPitch() { + Rotation rotation = (Rotation) rotationField.get(BaritoneAPI.getProvider().getPrimaryBaritone().getLookBehavior()); + return rotation == null ? 0 : rotation.getPitch(); + } + + @Override + public ISettings getSettings() { + return settings; + } + + @EventHandler(priority = EventPriority.HIGHEST) + private void onTick(TickEvent.Pre event) { + if (directionGoal == null) return; + + if (directionGoal != BaritoneAPI.getProvider().getPrimaryBaritone().getCustomGoalProcess().getGoal()) { + directionGoal = null; + return; + } + + directionGoal.tick(); + } + + private static class GoalDirection implements Goal { + private static final double SQRT_2 = Math.sqrt(2); + + private final float yaw; + private int x; + private int z; + + private int timer; + + public GoalDirection(float yaw) { + this.yaw = yaw; + tick(); + } + + public static double calculate(double xDiff, double zDiff) { + double x = Math.abs(xDiff); + double z = Math.abs(zDiff); + double straight; + double diagonal; + if (x < z) { + straight = z - x; + diagonal = x; + } else { + straight = x - z; + diagonal = z; + } + + diagonal *= SQRT_2; + return (diagonal + straight) * BaritoneAPI.getSettings().costHeuristic.value; + } + + public void tick() { + if (timer > 20) { + timer = 0; + + Vec3d pos = mc.player.getPos(); + 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); + } + + timer++; + } + + public boolean isInGoal(int x, int y, int z) { + return x == this.x && z == this.z; + } + + public double heuristic(int x, int y, int z) { + int xDiff = x - this.x; + int zDiff = z - this.z; + return calculate(xDiff, zDiff); + } + + public String toString() { + return String.format("GoalXZ{x=%s,z=%s}", SettingsUtil.maybeCensor(this.x), SettingsUtil.maybeCensor(this.z)); + } + + public int getX() { + return this.x; + } + + public int getZ() { + return this.z; + } + } + + private class BaritoneProcess implements IBaritoneProcess { + @Override + public boolean isActive() { + return pathingPaused; + } + + @Override + public PathingCommand onTick(boolean b, boolean b1) { + BaritoneAPI.getProvider().getPrimaryBaritone().getInputOverrideHandler().clearAllKeys(); + return new PathingCommand(null, PathingCommandType.REQUEST_PAUSE); + } + + @Override + public boolean isTemporary() { + return true; + } + + @Override + public void onLostControl() { + } + + @Override + public double priority() { + return 0d; + } + + @Override + public String displayName0() { + return "Meteor Client"; + } + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/BaritoneTab.java b/src/main/java/meteordevelopment/meteorclient/pathing/BaritoneSettings.java similarity index 92% rename from src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/BaritoneTab.java rename to src/main/java/meteordevelopment/meteorclient/pathing/BaritoneSettings.java index 6514ee493f..c50c73345b 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/BaritoneTab.java +++ b/src/main/java/meteordevelopment/meteorclient/pathing/BaritoneSettings.java @@ -3,19 +3,12 @@ * Copyright (c) Meteor Development. */ -package meteordevelopment.meteorclient.gui.tabs.builtin; +package meteordevelopment.meteorclient.pathing; import baritone.api.BaritoneAPI; -import baritone.api.utils.SettingsUtil; -import meteordevelopment.meteorclient.gui.GuiTheme; -import meteordevelopment.meteorclient.gui.tabs.Tab; -import meteordevelopment.meteorclient.gui.tabs.TabScreen; -import meteordevelopment.meteorclient.gui.tabs.WindowTabScreen; -import meteordevelopment.meteorclient.gui.widgets.input.WTextBox; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.utils.render.color.SettingColor; import net.minecraft.block.Block; -import net.minecraft.client.gui.screen.Screen; import net.minecraft.item.Item; import java.awt.*; @@ -26,20 +19,45 @@ import java.util.List; import java.util.Map; -public class BaritoneTab extends Tab { - private static Settings settings; - private static Map descriptions; +public class BaritoneSettings implements IPathManager.ISettings { + private final Settings settings = new Settings(); + + private Setting walkOnWater, walkOnLava; + private Setting step, noFall; - public BaritoneTab() { - super("Baritone"); + public BaritoneSettings() { + createWrappers(); } - @SuppressWarnings("unchecked") - private static Settings getSettings() { - if (settings != null) return settings; + @Override + public Settings get() { + return settings; + } - settings = new Settings(); + @Override + public Setting getWalkOnWater() { + return walkOnWater; + } + + @Override + public Setting getWalkOnLava() { + return walkOnLava; + } + + @Override + public Setting getStep() { + return step; + } + @Override + public Setting getNoFall() { + return noFall; + } + + // Wrappers + + @SuppressWarnings({"rawtypes", "unchecked"}) + private void createWrappers() { SettingGroup sgBool = settings.createGroup("Checkboxes"); SettingGroup sgDouble = settings.createGroup("Numbers"); SettingGroup sgInt = settings.createGroup("Whole Numbers"); @@ -51,6 +69,7 @@ private static Settings getSettings() { try { Class klass = BaritoneAPI.getSettings().getClass(); + for (Field field : klass.getDeclaredFields()) { Object obj = field.get(BaritoneAPI.getSettings()); if (!(obj instanceof baritone.api.Settings.Setting setting)) continue; @@ -58,7 +77,7 @@ private static Settings getSettings() { Object value = setting.value; if (value instanceof Boolean) { - sgBool.add(new BoolSetting.Builder() + Setting wrapper = sgBool.add(new BoolSetting.Builder() .name(setting.getName()) .description(getDescription(setting.getName())) .defaultValue((boolean) setting.defaultValue) @@ -66,7 +85,14 @@ private static Settings getSettings() { .onModuleActivated(booleanSetting -> booleanSetting.set((Boolean) setting.value)) .build() ); - } else if (value instanceof Double) { + + switch (wrapper.name) { + case "assumeWalkOnWater" -> walkOnWater = wrapper; + case "assumeWalkOnLava" -> walkOnLava = wrapper; + case "assumeStep" -> step = wrapper; + } + } + else if (value instanceof Double) { sgDouble.add(new DoubleSetting.Builder() .name(setting.getName()) .description(getDescription(setting.getName())) @@ -75,7 +101,8 @@ private static Settings getSettings() { .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())) @@ -84,8 +111,9 @@ private static Settings getSettings() { .onModuleActivated(doubleSetting -> doubleSetting.set(((Float) setting.value).doubleValue())) .build() ); - } else if (value instanceof Integer) { - sgInt.add(new IntSetting.Builder() + } + else if (value instanceof Integer) { + Setting wrapper = sgInt.add(new IntSetting.Builder() .name(setting.getName()) .description(getDescription(setting.getName())) .defaultValue((int) setting.defaultValue) @@ -93,7 +121,18 @@ private static Settings getSettings() { .onModuleActivated(integerSetting -> integerSetting.set((Integer) setting.value)) .build() ); - } else if (value instanceof Long) { + + if (wrapper.name.equals("maxFallHeightNoWater")) { + noFall = new BoolSetting.Builder() + .name(wrapper.name) + .description(wrapper.description) + .defaultValue(false) + .onChanged(aBoolean -> wrapper.set(aBoolean ? 159159 : wrapper.getDefaultValue())) + .onModuleActivated(booleanSetting -> booleanSetting.set(wrapper.get() >= 255)) + .build(); + } + } + else if (value instanceof Long) { sgInt.add(new IntSetting.Builder() .name(setting.getName()) .description(getDescription(setting.getName())) @@ -102,7 +141,8 @@ private static Settings getSettings() { .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())) @@ -111,7 +151,8 @@ private static Settings getSettings() { .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() @@ -122,7 +163,8 @@ private static Settings getSettings() { .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]; @@ -135,7 +177,8 @@ private static Settings getSettings() { .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())) @@ -147,22 +190,15 @@ private static Settings getSettings() { } } } - } catch (IllegalAccessException e) { - e.printStackTrace(); } - - return settings; + catch (IllegalAccessException e) { + throw new RuntimeException(e); + } } - @Override - public TabScreen createScreen(GuiTheme theme) { - return new BaritoneScreen(theme, this); - } + // Descriptions - @Override - public boolean isScreen(Screen screen) { - return screen instanceof BaritoneScreen; - } + private static Map descriptions; private static void addDescription(String settingName, String description) { descriptions.put(settingName.toLowerCase(), description); @@ -174,33 +210,6 @@ private static String getDescription(String settingName) { return descriptions.get(settingName.toLowerCase()); } - private static class BaritoneScreen extends WindowTabScreen { - public BaritoneScreen(GuiTheme theme, Tab tab) { - super(theme, tab); - - getSettings().onActivated(); - } - - @Override - public void initWidgets() { - WTextBox filter = add(theme.textBox("")).minWidth(400).expandX().widget(); - filter.setFocused(true); - filter.action = () -> { - clear(); - - add(filter); - add(theme.settings(getSettings(), filter.get().trim())).expandX(); - }; - - add(theme.settings(getSettings(), filter.get().trim())).expandX(); - } - - @Override - protected void onClosed() { - SettingsUtil.save(BaritoneAPI.getSettings()); - } - } - private static void loadDescriptions() { descriptions = new HashMap<>(); addDescription("acceptableThrowawayItems", "Blocks that Baritone is allowed to place (as throwaway, for sneak bridging, pillaring, etc.)"); diff --git a/src/main/java/meteordevelopment/meteorclient/pathing/BaritoneUtils.java b/src/main/java/meteordevelopment/meteorclient/pathing/BaritoneUtils.java new file mode 100644 index 0000000000..7830aafad9 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/pathing/BaritoneUtils.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.pathing; + +import baritone.api.BaritoneAPI; + +public class BaritoneUtils { + public static boolean IS_AVAILABLE = false; + + public static String getPrefix() { + if (IS_AVAILABLE) { + return BaritoneAPI.getSettings().prefix.value; + } + + return ""; + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/pathing/IPathManager.java b/src/main/java/meteordevelopment/meteorclient/pathing/IPathManager.java new file mode 100644 index 0000000000..533c285ee7 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/pathing/IPathManager.java @@ -0,0 +1,47 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.pathing; + +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 java.util.function.Predicate; + +public interface IPathManager { + String getName(); + + boolean isPathing(); + + void pause(); + void resume(); + void stop(); + + default void moveTo(BlockPos pos) { moveTo(pos, false); } + void moveTo(BlockPos pos, boolean ignoreY); + void moveInDirection(float yaw); + + void mine(Block... blocks); + + void follow(Predicate entity); + + float getTargetYaw(); + float getTargetPitch(); + + ISettings getSettings(); + + interface ISettings { + Settings get(); + + Setting getWalkOnWater(); + Setting getWalkOnLava(); + + Setting getStep(); + Setting getNoFall(); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/pathing/NopPathManager.java b/src/main/java/meteordevelopment/meteorclient/pathing/NopPathManager.java new file mode 100644 index 0000000000..873b3915a3 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/pathing/NopPathManager.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.pathing; + +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 java.util.function.Predicate; + +public class NopPathManager implements IPathManager { + private final NopSettings settings = new NopSettings(); + + @Override + public String getName() { + return "none"; + } + + @Override + public boolean isPathing() { + return false; + } + + @Override + public void pause() {} + + @Override + public void resume() {} + + @Override + public void stop() {} + + @Override + public void moveTo(BlockPos pos, boolean ignoreY) {} + + @Override + public void moveInDirection(float yaw) {} + + @Override + public void mine(Block... blocks) {} + + @Override + public void follow(Predicate entity) {} + + @Override + public float getTargetYaw() { + return 0; + } + + @Override + public float getTargetPitch() { + return 0; + } + + @Override + public ISettings getSettings() { + return settings; + } + + private static class NopSettings implements ISettings { + private final Settings settings = new Settings(); + private final Setting setting = new BoolSetting.Builder().build(); + + @Override + public Settings get() { + return settings; + } + + @Override + public Setting getWalkOnWater() { + setting.reset(); + return setting; + } + + @Override + public Setting getWalkOnLava() { + setting.reset(); + return setting; + } + + @Override + public Setting getStep() { + setting.reset(); + return setting; + } + + @Override + public Setting getNoFall() { + setting.reset(); + return setting; + } + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/pathing/PathManagers.java b/src/main/java/meteordevelopment/meteorclient/pathing/PathManagers.java new file mode 100644 index 0000000000..d7f9ebf45d --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/pathing/PathManagers.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.pathing; + +import meteordevelopment.meteorclient.MeteorClient; +import meteordevelopment.meteorclient.utils.PreInit; + +import java.lang.reflect.InvocationTargetException; + +public class PathManagers { + private static IPathManager INSTANCE = new NopPathManager(); + + public static IPathManager get() { + return INSTANCE; + } + + @PreInit + public static void init() { + if (exists("meteordevelopment.voyager.PathManager")) { + try { + INSTANCE = (IPathManager) Class.forName("meteordevelopment.voyager.PathManager").getConstructor().newInstance(); + } catch (InstantiationException | IllegalAccessException | InvocationTargetException | + NoSuchMethodException | ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + + if (exists("baritone.api.BaritoneAPI")) { + BaritoneUtils.IS_AVAILABLE = true; + + if (INSTANCE instanceof NopPathManager) + INSTANCE = new BaritonePathManager(); + } + + MeteorClient.LOG.info("Path Manager: {}", INSTANCE.getName()); + } + + private static boolean exists(String name) { + try { + Class.forName(name); + return true; + } catch (ClassNotFoundException e) { + return false; + } + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java index 1e18bfd65d..0d1d18e527 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java @@ -16,6 +16,7 @@ import meteordevelopment.meteorclient.events.meteor.KeyEvent; import meteordevelopment.meteorclient.events.meteor.ModuleBindChangedEvent; import meteordevelopment.meteorclient.events.meteor.MouseButtonEvent; +import meteordevelopment.meteorclient.pathing.BaritoneUtils; import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.settings.SettingGroup; import meteordevelopment.meteorclient.systems.System; @@ -529,9 +530,7 @@ private void initWorld() { add(new BuildHeight()); add(new EChestFarmer()); add(new EndermanLook()); - add(new Excavator()); add(new Flamethrower()); - add(new InfinityMiner()); add(new LiquidFiller()); add(new MountBypass()); add(new NoGhostBlocks()); @@ -541,6 +540,11 @@ private void initWorld() { add(new Timer()); add(new VeinMiner()); add(new HighwayBuilder()); + + if (BaritoneUtils.IS_AVAILABLE) { + add(new Excavator()); + add(new InfinityMiner()); + } } private void initMisc() { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BowAimbot.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BowAimbot.java index 4f5361fb35..7a3a86f667 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BowAimbot.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BowAimbot.java @@ -5,8 +5,8 @@ package meteordevelopment.meteorclient.systems.modules.combat; -import baritone.api.BaritoneAPI; import meteordevelopment.meteorclient.events.render.Render3DEvent; +import meteordevelopment.meteorclient.pathing.PathManagers; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.friends.Friends; import meteordevelopment.meteorclient.systems.modules.Categories; @@ -111,15 +111,15 @@ private void onRender(Render3DEvent event) { if (target == null) { if (wasPathing) { - BaritoneAPI.getProvider().getPrimaryBaritone().getCommandManager().execute("resume"); + PathManagers.get().resume(); wasPathing = false; } return; } if (mc.options.useKey.isPressed() && itemInHand()) { - if (pauseOnCombat.get() && BaritoneAPI.getProvider().getPrimaryBaritone().getPathingBehavior().isPathing() && !wasPathing) { - BaritoneAPI.getProvider().getPrimaryBaritone().getCommandManager().execute("pause"); + if (pauseOnCombat.get() && PathManagers.get().isPathing() && !wasPathing) { + PathManagers.get().pause(); wasPathing = true; } aim(event.tickDelta); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java index 2b7170b046..3ec357a68f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java @@ -5,9 +5,9 @@ package meteordevelopment.meteorclient.systems.modules.combat; -import baritone.api.BaritoneAPI; import meteordevelopment.meteorclient.events.packets.PacketEvent; import meteordevelopment.meteorclient.events.world.TickEvent; +import meteordevelopment.meteorclient.pathing.PathManagers; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.friends.Friends; import meteordevelopment.meteorclient.systems.modules.Categories; @@ -270,7 +270,7 @@ private void onTick(TickEvent.Pre event) { if (targets.isEmpty()) { if (wasPathing) { - BaritoneAPI.getProvider().getPrimaryBaritone().getCommandManager().execute("resume"); + PathManagers.get().resume(); wasPathing = false; } return; @@ -298,8 +298,8 @@ private void onTick(TickEvent.Pre event) { if (!itemInHand()) return; if (rotation.get() == RotationMode.Always) Rotations.rotate(Rotations.getYaw(primary), Rotations.getPitch(primary, Target.Body)); - if (pauseOnCombat.get() && BaritoneAPI.getProvider().getPrimaryBaritone().getPathingBehavior().isPathing() && !wasPathing) { - BaritoneAPI.getProvider().getPrimaryBaritone().getCommandManager().execute("pause"); + if (pauseOnCombat.get() && PathManagers.get().isPathing() && !wasPathing) { + PathManagers.get().pause(); wasPathing = true; } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmWorker.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmWorker.java index 55852e2c8f..090a089359 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmWorker.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmWorker.java @@ -5,8 +5,8 @@ package meteordevelopment.meteorclient.systems.modules.misc.swarm; -import baritone.api.BaritoneAPI; import meteordevelopment.meteorclient.commands.Commands; +import meteordevelopment.meteorclient.pathing.PathManagers; import meteordevelopment.meteorclient.utils.player.ChatUtils; import net.minecraft.block.Block; @@ -68,7 +68,7 @@ public void disconnect() { e.printStackTrace(); } - BaritoneAPI.getProvider().getPrimaryBaritone().getPathingBehavior().cancelEverything(); + PathManagers.get().stop(); ChatUtils.infoPrefix("Swarm", "Disconnected from host."); @@ -77,8 +77,10 @@ public void disconnect() { public void tick() { if (target == null) return; - BaritoneAPI.getProvider().getPrimaryBaritone().getPathingBehavior().cancelEverything(); - BaritoneAPI.getProvider().getPrimaryBaritone().getMineProcess().mine(target); + + PathManagers.get().stop(); + PathManagers.get().mine(target); + target = null; } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AutoWalk.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AutoWalk.java index 7277b5ecca..ccfb619c18 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AutoWalk.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AutoWalk.java @@ -5,15 +5,15 @@ package meteordevelopment.meteorclient.systems.modules.movement; -import baritone.api.BaritoneAPI; import meteordevelopment.meteorclient.events.world.TickEvent; +import meteordevelopment.meteorclient.pathing.NopPathManager; +import meteordevelopment.meteorclient.pathing.PathManagers; import meteordevelopment.meteorclient.settings.EnumSetting; import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.settings.SettingGroup; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.misc.input.Input; -import meteordevelopment.meteorclient.utils.world.GoalDirection; import meteordevelopment.orbit.EventHandler; import meteordevelopment.orbit.EventPriority; import net.minecraft.client.option.KeyBinding; @@ -28,10 +28,8 @@ public class AutoWalk extends Module { .onChanged(mode1 -> { if (isActive()) { if (mode1 == Mode.Simple) { - BaritoneAPI.getProvider().getPrimaryBaritone().getPathingBehavior().cancelEverything(); - goal = null; + PathManagers.get().stop(); } else { - timer = 0; createGoal(); } @@ -52,9 +50,6 @@ public class AutoWalk extends Module { .build() ); - private int timer = 0; - private GoalDirection goal; - public AutoWalk() { super(Categories.Movement, "auto-walk", "Automatically walks forward."); } @@ -67,9 +62,7 @@ public void onActivate() { @Override public void onDeactivate() { if (mode.get() == Mode.Simple) unpress(); - else BaritoneAPI.getProvider().getPrimaryBaritone().getPathingBehavior().cancelEverything(); - - goal = null; + else PathManagers.get().stop(); } @EventHandler(priority = EventPriority.HIGH) @@ -82,12 +75,10 @@ private void onTick(TickEvent.Pre event) { case Right -> setPressed(mc.options.rightKey, true); } } else { - if (timer > 20) { - timer = 0; - goal.recalculate(mc.player.getPos()); + if (PathManagers.get() instanceof NopPathManager) { + info("Smart mode requires Baritone"); + toggle(); } - - timer++; } } @@ -104,9 +95,7 @@ private void setPressed(KeyBinding key, boolean pressed) { } private void createGoal() { - timer = 0; - goal = new GoalDirection(mc.player.getPos(), mc.player.getYaw()); - BaritoneAPI.getProvider().getPrimaryBaritone().getCustomGoalProcess().setGoalAndPath(goal); + PathManagers.get().moveInDirection(mc.player.getYaw()); } public enum Mode { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Jesus.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Jesus.java index 3b7a6b68c2..b4cb52f0e6 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Jesus.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Jesus.java @@ -5,7 +5,6 @@ package meteordevelopment.meteorclient.systems.modules.movement; -import baritone.api.BaritoneAPI; import com.google.common.collect.Streams; import meteordevelopment.meteorclient.events.entity.player.CanWalkOnFluidEvent; import meteordevelopment.meteorclient.events.packets.PacketEvent; @@ -13,6 +12,7 @@ import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.mixin.LivingEntityAccessor; import meteordevelopment.meteorclient.mixininterface.IVec3d; +import meteordevelopment.meteorclient.pathing.PathManagers; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; @@ -144,8 +144,8 @@ public class Jesus extends Module { private int tickTimer = 10; private int packetTimer = 0; - private boolean preBaritoneAssumeWalkOnWater; - private boolean preBaritoneAssumeWalkOnLava; + private boolean prePathManagerWalkOnWater; + private boolean prePathManagerWalkOnLava; public Jesus() { super(Categories.Movement, "jesus", "Walk on liquids and powder snow like Jesus."); @@ -153,17 +153,17 @@ public Jesus() { @Override public void onActivate() { - preBaritoneAssumeWalkOnWater = BaritoneAPI.getSettings().assumeWalkOnWater.value; - preBaritoneAssumeWalkOnLava = BaritoneAPI.getSettings().assumeWalkOnLava.value; + prePathManagerWalkOnWater = PathManagers.get().getSettings().getWalkOnWater().get(); + prePathManagerWalkOnLava = PathManagers.get().getSettings().getWalkOnLava().get(); - BaritoneAPI.getSettings().assumeWalkOnWater.value = waterMode.get() == Mode.Solid; - BaritoneAPI.getSettings().assumeWalkOnLava.value = lavaMode.get() == Mode.Solid; + PathManagers.get().getSettings().getWalkOnWater().set(waterMode.get() == Mode.Solid); + PathManagers.get().getSettings().getWalkOnLava().set(lavaMode.get() == Mode.Solid); } @Override public void onDeactivate() { - BaritoneAPI.getSettings().assumeWalkOnWater.value = preBaritoneAssumeWalkOnWater; - BaritoneAPI.getSettings().assumeWalkOnLava.value = preBaritoneAssumeWalkOnLava; + PathManagers.get().getSettings().getWalkOnWater().set(prePathManagerWalkOnWater); + PathManagers.get().getSettings().getWalkOnLava().set(prePathManagerWalkOnLava); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/NoFall.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/NoFall.java index 6bc05b35bb..0ec72a7f64 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/NoFall.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/NoFall.java @@ -5,12 +5,12 @@ package meteordevelopment.meteorclient.systems.modules.movement; -import baritone.api.BaritoneAPI; import meteordevelopment.meteorclient.events.packets.PacketEvent; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.mixin.PlayerMoveC2SPacketAccessor; import meteordevelopment.meteorclient.mixininterface.IPlayerMoveC2SPacket; import meteordevelopment.meteorclient.mixininterface.IVec3d; +import meteordevelopment.meteorclient.pathing.PathManagers; import meteordevelopment.meteorclient.settings.BoolSetting; import meteordevelopment.meteorclient.settings.EnumSetting; import meteordevelopment.meteorclient.settings.Setting; @@ -92,7 +92,7 @@ public class NoFall extends Module { private boolean placedWater; private BlockPos targetPos; private int timer; - private int preBaritoneFallHeight; + private boolean prePathManagerNoFall; public NoFall() { super(Categories.Movement, "no-fall", "Attempts to prevent you from taking fall damage."); @@ -100,14 +100,15 @@ public NoFall() { @Override public void onActivate() { - preBaritoneFallHeight = BaritoneAPI.getSettings().maxFallHeightNoWater.value; - if (mode.get() == Mode.Packet) BaritoneAPI.getSettings().maxFallHeightNoWater.value = 255; + prePathManagerNoFall = PathManagers.get().getSettings().getNoFall().get(); + if (mode.get() == Mode.Packet) PathManagers.get().getSettings().getNoFall().set(true); + placedWater = false; } @Override public void onDeactivate() { - BaritoneAPI.getSettings().maxFallHeightNoWater.value = preBaritoneFallHeight; + PathManagers.get().getSettings().getNoFall().set(prePathManagerNoFall); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Step.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Step.java index 63b2994f3d..785df81932 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Step.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Step.java @@ -5,9 +5,9 @@ package meteordevelopment.meteorclient.systems.modules.movement; -import baritone.api.BaritoneAPI; import com.google.common.collect.Streams; import meteordevelopment.meteorclient.events.world.TickEvent; +import meteordevelopment.meteorclient.pathing.PathManagers; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; @@ -55,7 +55,7 @@ public class Step extends Module { ); private float prevStepHeight; - private boolean prevBaritoneAssumeStep; + private boolean prevPathManagerStep; public Step() { super(Categories.Movement, "step", "Allows you to walk up full blocks instantly."); @@ -64,9 +64,9 @@ public Step() { @Override public void onActivate() { prevStepHeight = mc.player.getStepHeight(); - prevBaritoneAssumeStep = BaritoneAPI.getSettings().assumeStep.value; - BaritoneAPI.getSettings().assumeStep.value = true; + prevPathManagerStep = PathManagers.get().getSettings().getStep().get(); + PathManagers.get().getSettings().getStep().set(true); } @EventHandler @@ -84,7 +84,8 @@ private void onTick(TickEvent.Post event) { @Override public void onDeactivate() { mc.player.setStepHeight(prevStepHeight); - BaritoneAPI.getSettings().assumeStep.value = prevBaritoneAssumeStep; + + PathManagers.get().getSettings().getStep().set(prevPathManagerStep); } private float getHealth(){ diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoEat.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoEat.java index 2ed7a92a6c..307854c048 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoEat.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoEat.java @@ -5,9 +5,9 @@ package meteordevelopment.meteorclient.systems.modules.player; -import baritone.api.BaritoneAPI; import meteordevelopment.meteorclient.events.entity.player.ItemUseCrosshairTargetEvent; import meteordevelopment.meteorclient.events.world.TickEvent; +import meteordevelopment.meteorclient.pathing.PathManagers; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; @@ -179,9 +179,9 @@ private void startEating() { } // Pause baritone - if (pauseBaritone.get() && BaritoneAPI.getProvider().getPrimaryBaritone().getPathingBehavior().isPathing() && !wasBaritone) { + if (pauseBaritone.get() && PathManagers.get().isPathing() && !wasBaritone) { wasBaritone = true; - BaritoneAPI.getProvider().getPrimaryBaritone().getCommandManager().execute("pause"); + PathManagers.get().pause(); } } @@ -213,7 +213,7 @@ private void stopEating() { // Resume baritone if (pauseBaritone.get() && wasBaritone) { wasBaritone = false; - BaritoneAPI.getProvider().getPrimaryBaritone().getCommandManager().execute("resume"); + PathManagers.get().resume(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoGap.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoGap.java index 9c7aa5eb85..5ce30960c1 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoGap.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoGap.java @@ -5,9 +5,9 @@ package meteordevelopment.meteorclient.systems.modules.player; -import baritone.api.BaritoneAPI; import meteordevelopment.meteorclient.events.entity.player.ItemUseCrosshairTargetEvent; import meteordevelopment.meteorclient.events.world.TickEvent; +import meteordevelopment.meteorclient.pathing.PathManagers; import meteordevelopment.meteorclient.settings.BoolSetting; import meteordevelopment.meteorclient.settings.IntSetting; import meteordevelopment.meteorclient.settings.Setting; @@ -195,9 +195,9 @@ private void startEating() { // Pause baritone wasBaritone = false; - if (pauseBaritone.get() && BaritoneAPI.getProvider().getPrimaryBaritone().getPathingBehavior().isPathing()) { + if (pauseBaritone.get() && PathManagers.get().isPathing()) { wasBaritone = true; - BaritoneAPI.getProvider().getPrimaryBaritone().getCommandManager().execute("pause"); + PathManagers.get().pause(); } } @@ -228,7 +228,7 @@ private void stopEating() { // Resume baritone if (pauseBaritone.get() && wasBaritone) { - BaritoneAPI.getProvider().getPrimaryBaritone().getCommandManager().execute("resume"); + PathManagers.get().resume(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WaypointsModule.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WaypointsModule.java index 45b64bf019..0af2db5d59 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WaypointsModule.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WaypointsModule.java @@ -5,9 +5,6 @@ package meteordevelopment.meteorclient.systems.modules.render; -import baritone.api.BaritoneAPI; -import baritone.api.IBaritone; -import baritone.api.pathing.goals.GoalGetToBlock; import meteordevelopment.meteorclient.events.game.OpenScreenEvent; import meteordevelopment.meteorclient.gui.GuiTheme; import meteordevelopment.meteorclient.gui.renderer.GuiRenderer; @@ -18,6 +15,7 @@ import meteordevelopment.meteorclient.gui.widgets.pressable.WButton; import meteordevelopment.meteorclient.gui.widgets.pressable.WCheckbox; import meteordevelopment.meteorclient.gui.widgets.pressable.WMinus; +import meteordevelopment.meteorclient.pathing.PathManagers; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; @@ -155,9 +153,10 @@ private void initTable(GuiTheme theme, WTable table) { if (validDim) { WButton gotoB = table.add(theme.button("Goto")).widget(); gotoB.action = () -> { - IBaritone baritone = BaritoneAPI.getProvider().getPrimaryBaritone(); - if (baritone.getPathingBehavior().isPathing()) baritone.getPathingBehavior().cancelEverything(); - baritone.getCustomGoalProcess().setGoalAndPath(new GoalGetToBlock(waypoint.getPos())); + if (PathManagers.get().isPathing()) + PathManagers.get().stop(); + + PathManagers.get().moveTo(waypoint.getPos()); }; } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/StashFinder.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/StashFinder.java index b79aa52617..3cfc6b6d86 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/StashFinder.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/StashFinder.java @@ -5,8 +5,6 @@ package meteordevelopment.meteorclient.systems.modules.world; -import baritone.api.BaritoneAPI; -import baritone.api.pathing.goals.GoalXZ; import com.google.common.reflect.TypeToken; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -19,6 +17,7 @@ import meteordevelopment.meteorclient.gui.widgets.containers.WVerticalList; import meteordevelopment.meteorclient.gui.widgets.pressable.WButton; import meteordevelopment.meteorclient.gui.widgets.pressable.WMinus; +import meteordevelopment.meteorclient.pathing.PathManagers; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; @@ -27,6 +26,7 @@ import meteordevelopment.orbit.EventHandler; import net.minecraft.block.entity.*; import net.minecraft.item.Items; +import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.ChunkPos; import java.io.*; @@ -170,7 +170,7 @@ private void fillTable(GuiTheme theme, WTable table) { open.action = () -> mc.setScreen(new ChunkScreen(theme, chunk)); WButton gotoBtn = table.add(theme.button("Goto")).widget(); - gotoBtn.action = () -> BaritoneAPI.getProvider().getPrimaryBaritone().getCustomGoalProcess().setGoalAndPath(new GoalXZ(chunk.x, chunk.z)); + gotoBtn.action = () -> PathManagers.get().moveTo(new BlockPos(chunk.x, 0, chunk.z), true); WMinus delete = table.add(theme.minus()).widget(); delete.action = () -> { diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/BaritoneUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/BaritoneUtils.java deleted file mode 100644 index 317385d8ea..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/BaritoneUtils.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). - * Copyright (c) Meteor Development. - */ - -package meteordevelopment.meteorclient.utils.misc; - -import baritone.api.BaritoneAPI; -import baritone.api.utils.Rotation; - -import java.lang.reflect.Field; - -public class BaritoneUtils { - private static Field targetField; - - public static Rotation getTarget() { - findField(); - if (targetField == null) return null; - - targetField.setAccessible(true); - - try { - return (Rotation) targetField.get(BaritoneAPI.getProvider().getPrimaryBaritone().getLookBehavior()); - } catch (IllegalAccessException e) { - e.printStackTrace(); - return null; - } - } - - private static void findField() { - if (targetField != null) return; - - Class klass = BaritoneAPI.getProvider().getPrimaryBaritone().getLookBehavior().getClass(); - - for (Field field : klass.getDeclaredFields()) { - if (field.getType() == Rotation.class) { - targetField = field; - break; - } - } - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorStarscript.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorStarscript.java index 242fb36a4b..eba2bba254 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorStarscript.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorStarscript.java @@ -11,6 +11,8 @@ import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.mixin.ClientPlayerInteractionManagerAccessor; import meteordevelopment.meteorclient.mixin.MinecraftClientAccessor; +import meteordevelopment.meteorclient.pathing.BaritoneUtils; +import meteordevelopment.meteorclient.pathing.PathManagers; import meteordevelopment.meteorclient.systems.config.Config; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; @@ -69,7 +71,7 @@ public class MeteorStarscript { private static final BlockPos.Mutable BP = new BlockPos.Mutable(); private static final StringBuilder SB = new StringBuilder(); - @PreInit + @PreInit(dependencies = PathManagers.class) public static void init() { StandardLib.init(ss); @@ -92,13 +94,15 @@ public static void init() { ); // Baritone - ss.set("baritone", new ValueMap() - .set("is_pathing", () -> Value.bool(BaritoneAPI.getProvider().getPrimaryBaritone().getPathingBehavior().isPathing())) - .set("distance_to_goal", MeteorStarscript::baritoneDistanceToGoal) - .set("process", MeteorStarscript::baritoneProcess) - .set("process_name", MeteorStarscript::baritoneProcessName) - .set("eta", MeteorStarscript::baritoneETA) - ); + if (BaritoneUtils.IS_AVAILABLE) { + ss.set("baritone", new ValueMap() + .set("is_pathing", () -> Value.bool(BaritoneAPI.getProvider().getPrimaryBaritone().getPathingBehavior().isPathing())) + .set("distance_to_goal", MeteorStarscript::baritoneDistanceToGoal) + .set("process", MeteorStarscript::baritoneProcess) + .set("process_name", MeteorStarscript::baritoneProcessName) + .set("eta", MeteorStarscript::baritoneETA) + ); + } // Camera ss.set("camera", new ValueMap() diff --git a/src/main/java/meteordevelopment/meteorclient/utils/player/ChatUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/player/ChatUtils.java index bf2283e4f6..d4eace822e 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/player/ChatUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/player/ChatUtils.java @@ -5,10 +5,10 @@ package meteordevelopment.meteorclient.utils.player; -import baritone.api.BaritoneAPI; import com.mojang.brigadier.StringReader; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.mixininterface.IChatHud; +import meteordevelopment.meteorclient.pathing.BaritoneUtils; import meteordevelopment.meteorclient.systems.config.Config; import meteordevelopment.meteorclient.utils.PostInit; import net.minecraft.text.*; @@ -241,17 +241,20 @@ private static MutableText formatMsg(String message, Formatting defaultColor) { public static MutableText formatCoords(Vec3d pos) { String coordsString = String.format("(highlight)(underline)%.0f, %.0f, %.0f(default)", pos.x, pos.y, pos.z); MutableText coordsText = formatMsg(coordsString, Formatting.GRAY); - coordsText.setStyle(coordsText.getStyle() - .withFormatting(Formatting.BOLD) - .withClickEvent(new ClickEvent( - ClickEvent.Action.RUN_COMMAND, - String.format("%sgoto %d %d %d", BaritoneAPI.getSettings().prefix.value, (int) pos.x, (int) pos.y, (int) pos.z) - )) - .withHoverEvent(new HoverEvent( - HoverEvent.Action.SHOW_TEXT, - Text.literal("Set as Baritone goal") - )) - ); + + Style style = coordsText.getStyle().withFormatting(Formatting.BOLD).withHoverEvent(new HoverEvent( + HoverEvent.Action.SHOW_TEXT, + Text.literal("Set as Baritone goal") + )); + + if (BaritoneUtils.IS_AVAILABLE) { + style = style.withClickEvent(new ClickEvent( + ClickEvent.Action.RUN_COMMAND, + String.format("%sgoto %d %d %d", BaritoneUtils.getPrefix(), (int) pos.x, (int) pos.y, (int) pos.z) + )); + } + + coordsText.setStyle(style); return coordsText; } } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/player/PlayerUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/player/PlayerUtils.java index 13b7604ef1..df40bf5cb3 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/player/PlayerUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/player/PlayerUtils.java @@ -5,16 +5,14 @@ package meteordevelopment.meteorclient.utils.player; -import baritone.api.BaritoneAPI; -import baritone.api.utils.Rotation; import meteordevelopment.meteorclient.mixininterface.IVec3d; +import meteordevelopment.meteorclient.pathing.PathManagers; import meteordevelopment.meteorclient.systems.config.Config; import meteordevelopment.meteorclient.systems.friends.Friends; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.movement.NoFall; import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.entity.EntityUtils; -import meteordevelopment.meteorclient.utils.misc.BaritoneUtils; import meteordevelopment.meteorclient.utils.misc.text.TextUtils; import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.world.Dimension; @@ -60,9 +58,8 @@ public static Color getPlayerColor(PlayerEntity entity, Color defaultColor) { public static Vec3d getHorizontalVelocity(double bps) { float yaw = mc.player.getYaw(); - if (BaritoneAPI.getProvider().getPrimaryBaritone().getPathingBehavior().isPathing()) { - Rotation target = BaritoneUtils.getTarget(); - if (target != null) yaw = target.getYaw(); + if (PathManagers.get().isPathing()) { + yaw = PathManagers.get().getTargetYaw(); } Vec3d forward = Vec3d.fromPolar(0, yaw); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/world/GoalDirection.java b/src/main/java/meteordevelopment/meteorclient/utils/world/GoalDirection.java deleted file mode 100644 index 72d282f971..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/utils/world/GoalDirection.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). - * Copyright (c) Meteor Development. - */ - -package meteordevelopment.meteorclient.utils.world; - -import baritone.api.BaritoneAPI; -import baritone.api.pathing.goals.Goal; -import baritone.api.utils.SettingsUtil; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3d; - -public class GoalDirection implements Goal { - private static final double SQRT_2 = Math.sqrt(2.0D); - private final float yaw; - private int x; - private int z; - - public GoalDirection(Vec3d origin, float yaw) { - this.yaw = yaw; - recalculate(origin); - } - - public static double calculate(double xDiff, double zDiff) { - double x = Math.abs(xDiff); - double z = Math.abs(zDiff); - double straight; - double diagonal; - if (x < z) { - straight = z - x; - diagonal = x; - } else { - straight = x - z; - diagonal = z; - } - - diagonal *= SQRT_2; - return (diagonal + straight) * BaritoneAPI.getSettings().costHeuristic.value; - } - - public void recalculate(Vec3d origin) { - float theta = (float) Math.toRadians(yaw); - x = (int) Math.floor(origin.x - (double) MathHelper.sin(theta) * 100); - z = (int) Math.floor(origin.z + (double) MathHelper.cos(theta) * 100); - } - - public boolean isInGoal(int x, int y, int z) { - return x == this.x && z == this.z; - } - - public double heuristic(int x, int y, int z) { - int xDiff = x - this.x; - int zDiff = z - this.z; - return calculate(xDiff, zDiff); - } - - public String toString() { - return String.format("GoalXZ{x=%s,z=%s}", SettingsUtil.maybeCensor(this.x), SettingsUtil.maybeCensor(this.z)); - } - - public int getX() { - return this.x; - } - - public int getZ() { - return this.z; - } -} From f0438f73fa5ae123328f24d981c9aade028760cb Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Sun, 22 Oct 2023 15:30:10 +0200 Subject: [PATCH 124/357] Add IPathManager.ISettings.save method --- .../meteorclient/gui/tabs/builtin/PathManagerTab.java | 4 +--- .../meteorclient/pathing/BaritoneSettings.java | 6 ++++++ .../meteorclient/pathing/IPathManager.java | 2 ++ .../meteorclient/pathing/NopPathManager.java | 3 +++ 4 files changed, 12 insertions(+), 3 deletions(-) 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 404dd529ee..d2fd0ade51 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/PathManagerTab.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/PathManagerTab.java @@ -5,8 +5,6 @@ package meteordevelopment.meteorclient.gui.tabs.builtin; -import baritone.api.BaritoneAPI; -import baritone.api.utils.SettingsUtil; import meteordevelopment.meteorclient.gui.GuiTheme; import meteordevelopment.meteorclient.gui.tabs.Tab; import meteordevelopment.meteorclient.gui.tabs.TabScreen; @@ -53,7 +51,7 @@ public void initWidgets() { @Override protected void onClosed() { - SettingsUtil.save(BaritoneAPI.getSettings()); + PathManagers.get().getSettings().save(); } } } diff --git a/src/main/java/meteordevelopment/meteorclient/pathing/BaritoneSettings.java b/src/main/java/meteordevelopment/meteorclient/pathing/BaritoneSettings.java index c50c73345b..cc790ceec5 100644 --- a/src/main/java/meteordevelopment/meteorclient/pathing/BaritoneSettings.java +++ b/src/main/java/meteordevelopment/meteorclient/pathing/BaritoneSettings.java @@ -6,6 +6,7 @@ package meteordevelopment.meteorclient.pathing; import baritone.api.BaritoneAPI; +import baritone.api.utils.SettingsUtil; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.utils.render.color.SettingColor; import net.minecraft.block.Block; @@ -54,6 +55,11 @@ public Setting getNoFall() { return noFall; } + @Override + public void save() { + SettingsUtil.save(BaritoneAPI.getSettings()); + } + // Wrappers @SuppressWarnings({"rawtypes", "unchecked"}) diff --git a/src/main/java/meteordevelopment/meteorclient/pathing/IPathManager.java b/src/main/java/meteordevelopment/meteorclient/pathing/IPathManager.java index 533c285ee7..77e5344612 100644 --- a/src/main/java/meteordevelopment/meteorclient/pathing/IPathManager.java +++ b/src/main/java/meteordevelopment/meteorclient/pathing/IPathManager.java @@ -43,5 +43,7 @@ interface ISettings { 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 873b3915a3..dc2ab84d21 100644 --- a/src/main/java/meteordevelopment/meteorclient/pathing/NopPathManager.java +++ b/src/main/java/meteordevelopment/meteorclient/pathing/NopPathManager.java @@ -95,5 +95,8 @@ public Setting getNoFall() { setting.reset(); return setting; } + + @Override + public void save() {} } } From 7b011fb6d2ab66acb141622cd8494b37996c5b10 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Mon, 23 Oct 2023 16:02:49 +0100 Subject: [PATCH 125/357] fullbright luminance mode - fixes and new setting --- .../mixin/EntityRendererMixin.java | 8 +++++- .../mixin/WorldRendererMixin.java | 8 +++++- .../mixin/indigo/AoCalculatorMixin.java | 27 +++++++++++++++++++ .../sodium/SodiumLightDataAccessMixin.java | 18 ++++++++++--- .../systems/modules/render/Fullbright.java | 18 ++++++++++--- .../meteor-client-indigo.mixins.json | 3 ++- 6 files changed, 73 insertions(+), 9 deletions(-) create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/indigo/AoCalculatorMixin.java diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/EntityRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/EntityRendererMixin.java index b97663704e..d7d227aedc 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/EntityRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/EntityRendererMixin.java @@ -22,6 +22,7 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.text.Text; import net.minecraft.util.Identifier; +import net.minecraft.world.LightType; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -51,7 +52,12 @@ private void shouldRender(T entity, Frustum frustum, double x, double y, double @ModifyReturnValue(method = "getSkyLight", at = @At("RETURN")) private int onGetSkyLight(int original) { - return Math.max(Modules.get().get(Fullbright.class).getLuminance(), original); + return Math.max(Modules.get().get(Fullbright.class).getLuminance(LightType.SKY), original); + } + + @ModifyReturnValue(method = "getBlockLight", at = @At("RETURN")) + private int onGetBlockLight(int original) { + return Math.max(Modules.get().get(Fullbright.class).getLuminance(LightType.BLOCK), original); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererMixin.java index c6538a7396..5baabf8289 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererMixin.java @@ -17,6 +17,7 @@ import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.Entity; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.LightType; import org.joml.Matrix4f; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -127,6 +128,11 @@ private void onRenderEndSkyDraw(MatrixStack matrices, CallbackInfo info) { @ModifyVariable(method = "getLightmapCoordinates(Lnet/minecraft/world/BlockRenderView;Lnet/minecraft/block/BlockState;Lnet/minecraft/util/math/BlockPos;)I", at = @At(value = "STORE"), ordinal = 0) private static int getLightmapCoordinatesModifySkyLight(int sky) { - return Math.max(Modules.get().get(Fullbright.class).getLuminance(), sky); + return Math.max(Modules.get().get(Fullbright.class).getLuminance(LightType.SKY), sky); + } + + @ModifyVariable(method = "getLightmapCoordinates(Lnet/minecraft/world/BlockRenderView;Lnet/minecraft/block/BlockState;Lnet/minecraft/util/math/BlockPos;)I", at = @At(value = "STORE"), ordinal = 1) + private static int getLightmapCoordinatesModifyBlockLight(int sky) { + return Math.max(Modules.get().get(Fullbright.class).getLuminance(LightType.BLOCK), sky); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/indigo/AoCalculatorMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/indigo/AoCalculatorMixin.java new file mode 100644 index 0000000000..2d74602f34 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/indigo/AoCalculatorMixin.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.indigo; + +import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.render.Fullbright; +import net.fabricmc.fabric.impl.client.indigo.renderer.aocalc.AoCalculator; +import net.minecraft.world.LightType; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyVariable; + +@Mixin(AoCalculator.class) +public class AoCalculatorMixin { + @ModifyVariable(method = "getLightmapCoordinates(Lnet/minecraft/world/BlockRenderView;Lnet/minecraft/block/BlockState;Lnet/minecraft/util/math/BlockPos;)I", at = @At(value = "STORE"), ordinal = 0) + private static int getLightmapCoordinatesModifySkyLight(int sky) { + return Math.max(Modules.get().get(Fullbright.class).getLuminance(LightType.SKY), sky); + } + + @ModifyVariable(method = "getLightmapCoordinates(Lnet/minecraft/world/BlockRenderView;Lnet/minecraft/block/BlockState;Lnet/minecraft/util/math/BlockPos;)I", at = @At(value = "STORE"), ordinal = 1) + private static int getLightmapCoordinatesModifyBlockLight(int sky) { + return Math.max(Modules.get().get(Fullbright.class).getLuminance(LightType.BLOCK), sky); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumLightDataAccessMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumLightDataAccessMixin.java index e70755b1f8..215bd3de49 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumLightDataAccessMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumLightDataAccessMixin.java @@ -12,6 +12,7 @@ import net.minecraft.block.BlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.world.BlockRenderView; +import net.minecraft.world.LightType; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -34,9 +35,13 @@ public class SodiumLightDataAccessMixin { @Unique private Xray xray; + @Unique + private Fullbright fb; + @Inject(method = "", at = @At("TAIL")) private void onInit(CallbackInfo info) { xray = Modules.get().get(Xray.class); + fb = Modules.get().get(Fullbright.class); } @ModifyVariable(method = "compute", at = @At(value = "TAIL"), name = "bl") @@ -49,8 +54,15 @@ private int compute_modifyBL(int light) { return light; } - @ModifyVariable(method = "compute", at = @At(value = "TAIL"), name = "sl") - private int compute_modifySL(int light) { - return Math.max(Modules.get().get(Fullbright.class).getLuminance(), light); + // fullbright + + @ModifyVariable(method = "compute", at = @At(value = "STORE"), name = "sl") + private int compute_assignSL(int sl) { + return Math.max(fb.getLuminance(LightType.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); } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Fullbright.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Fullbright.java index 5c51a78b45..c84b2d18e4 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Fullbright.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Fullbright.java @@ -11,6 +11,7 @@ import meteordevelopment.meteorclient.settings.SettingGroup; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; +import net.minecraft.world.LightType; public class Fullbright extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); @@ -22,6 +23,17 @@ public class Fullbright extends Module { .build() ); + public final Setting lightType = sgGeneral.add(new EnumSetting.Builder() + .name("light-type") + .description("Which type of light to use for Luminance mode.") + .defaultValue(LightType.BLOCK) + .visible(() -> mode.get() == Mode.Luminance) + .onChanged(integer -> { + if (mc.worldRenderer != null && isActive()) mc.worldRenderer.reload(); + }) + .build() + ); + private final Setting minimumLightLevel = sgGeneral.add(new IntSetting.Builder() .name("minimum-light-level") .description("Minimum light level when using Luminance mode.") @@ -30,7 +42,7 @@ public class Fullbright extends Module { .range(0, 15) .sliderMax(15) .onChanged(integer -> { - if (mc.worldRenderer != null) mc.worldRenderer.reload(); + if (mc.worldRenderer != null && isActive()) mc.worldRenderer.reload(); }) .build() ); @@ -49,8 +61,8 @@ public void onDeactivate() { if (mode.get() == Mode.Luminance) mc.worldRenderer.reload(); } - public int getLuminance() { - if (!isActive() || mode.get() != Mode.Luminance) return 0; + public int getLuminance(LightType type) { + if (!isActive() || mode.get() != Mode.Luminance || type != lightType.get()) return 0; return minimumLightLevel.get(); } diff --git a/src/main/resources/meteor-client-indigo.mixins.json b/src/main/resources/meteor-client-indigo.mixins.json index 7dc33a1a5e..5bce3e25ad 100644 --- a/src/main/resources/meteor-client-indigo.mixins.json +++ b/src/main/resources/meteor-client-indigo.mixins.json @@ -4,7 +4,8 @@ "compatibilityLevel": "JAVA_17", "plugin": "meteordevelopment.meteorclient.MixinPlugin", "client": [ - "AbstractBlockRenderContextMixin" + "AbstractBlockRenderContextMixin", + "AoCalculatorMixin" ], "injectors": { "defaultRequire": 1 From 24919462d2399c296c381e50544d7fc409a69f60 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Tue, 24 Oct 2023 08:12:49 -0400 Subject: [PATCH 126/357] dont run `Waypoints.render()` if waypoints are off (#4165) --- .../modules/render/WaypointsModule.java | 63 +++++++++++++++ .../systems/waypoints/Waypoints.java | 77 +------------------ 2 files changed, 66 insertions(+), 74 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WaypointsModule.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WaypointsModule.java index 0af2db5d59..4c28321b0f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WaypointsModule.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WaypointsModule.java @@ -6,6 +6,7 @@ package meteordevelopment.meteorclient.systems.modules.render; import meteordevelopment.meteorclient.events.game.OpenScreenEvent; +import meteordevelopment.meteorclient.events.render.Render2DEvent; import meteordevelopment.meteorclient.gui.GuiTheme; import meteordevelopment.meteorclient.gui.renderer.GuiRenderer; import meteordevelopment.meteorclient.gui.screens.EditSystemScreen; @@ -16,6 +17,7 @@ import meteordevelopment.meteorclient.gui.widgets.pressable.WCheckbox; import meteordevelopment.meteorclient.gui.widgets.pressable.WMinus; import meteordevelopment.meteorclient.pathing.PathManagers; +import meteordevelopment.meteorclient.renderer.text.TextRenderer; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; @@ -23,6 +25,7 @@ import meteordevelopment.meteorclient.systems.waypoints.Waypoints; import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.player.PlayerUtils; +import meteordevelopment.meteorclient.utils.render.NametagUtils; import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.orbit.EventHandler; import net.minecraft.client.gui.screen.DeathScreen; @@ -30,6 +33,7 @@ import net.minecraft.text.Text; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; +import org.joml.Vector3d; import java.text.SimpleDateFormat; import java.util.Date; @@ -39,6 +43,7 @@ public class WaypointsModule extends Module { private static final Color GRAY = new Color(200, 200, 200); + private static final Color TEXT = new Color(255, 255, 255); private final SettingGroup sgGeneral = settings.getDefaultGroup(); private final SettingGroup sgDeathPosition = settings.createGroup("Death Position"); @@ -75,6 +80,64 @@ public WaypointsModule() { private final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); + @EventHandler + private void onRender2D(Render2DEvent event) { + TextRenderer text = TextRenderer.get(); + Vector3d center = new Vector3d(mc.getWindow().getFramebufferWidth() / 2.0, mc.getWindow().getFramebufferHeight() / 2.0, 0); + int textRenderDist = textRenderDistance.get(); + + for (Waypoint waypoint : Waypoints.get()) { + // Continue if this waypoint should not be rendered + if (!waypoint.visible.get() || !Waypoints.checkDimension(waypoint)) continue; + + // Calculate distance + BlockPos blockPos = waypoint.getPos(); + Vector3d pos = new Vector3d(blockPos.getX() + 0.5, blockPos.getY(), blockPos.getZ() + 0.5); + double dist = PlayerUtils.distanceToCamera(pos.x, pos.y, pos.z); + + // Continue if this waypoint should not be rendered + if (dist > waypoint.maxVisible.get()) continue; + if (!NametagUtils.to2D(pos, 1)) continue; + + // Calculate alpha and distance to center of the screen + double distToCenter = pos.distance(center); + double a = 1; + + if (dist < 20) { + a = (dist - 10) / 10; + if (a < 0.01) continue; + } + + // Render + NametagUtils.scale = waypoint.scale.get() - 0.2; + NametagUtils.begin(pos); + + // Render icon + waypoint.renderIcon(-16, -16, a, 32); + + // Render text if cursor is close enough + if (distToCenter <= textRenderDist) { + // Setup text rendering + int preTextA = TEXT.a; + TEXT.a *= a; + text.begin(); + + // Render name + text.render(waypoint.name.get(), -text.getWidth(waypoint.name.get()) / 2, -16 - text.getHeight(), TEXT, true); + + // Render distance + String distText = String.format("%d blocks", (int) Math.round(dist)); + text.render(distText, -text.getWidth(distText) / 2, 16, TEXT, true); + + // End text rendering + text.end(); + TEXT.a = preTextA; + } + + NametagUtils.end(); + } + } + @EventHandler private void onOpenScreen(OpenScreenEvent event) { if (!(event.screen instanceof DeathScreen)) return; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/waypoints/Waypoints.java b/src/main/java/meteordevelopment/meteorclient/systems/waypoints/Waypoints.java index dbff5fbf8b..2c624f37e9 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/waypoints/Waypoints.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/waypoints/Waypoints.java @@ -8,18 +8,12 @@ import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.game.GameJoinedEvent; import meteordevelopment.meteorclient.events.game.GameLeftEvent; -import meteordevelopment.meteorclient.events.render.Render2DEvent; -import meteordevelopment.meteorclient.renderer.text.TextRenderer; import meteordevelopment.meteorclient.systems.System; import meteordevelopment.meteorclient.systems.Systems; -import meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.systems.modules.render.WaypointsModule; import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.files.StreamUtils; import meteordevelopment.meteorclient.utils.misc.NbtUtils; import meteordevelopment.meteorclient.utils.player.PlayerUtils; -import meteordevelopment.meteorclient.utils.render.NametagUtils; -import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.world.Dimension; import meteordevelopment.orbit.EventHandler; import meteordevelopment.orbit.EventPriority; @@ -27,8 +21,6 @@ import net.minecraft.client.texture.NativeImage; import net.minecraft.client.texture.NativeImageBackedTexture; import net.minecraft.nbt.NbtCompound; -import net.minecraft.util.math.BlockPos; -import org.joml.Vector3d; import java.io.File; import java.io.FileInputStream; @@ -37,15 +29,12 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; -import static meteordevelopment.meteorclient.MeteorClient.mc; - public class Waypoints extends System implements Iterable { public static final String[] BUILTIN_ICONS = {"square", "circle", "triangle", "star", "diamond", "skull"}; - private static final Color TEXT = new Color(255, 255, 255); public final Map icons = new ConcurrentHashMap<>(); - public Map waypoints = new ConcurrentHashMap<>(); + public final Map waypoints = new ConcurrentHashMap<>(); public Waypoints() { super(null); @@ -127,67 +116,6 @@ public static boolean checkDimension(Waypoint waypoint) { return playerOpp && waypointOpp; } - @EventHandler - private void onRender2D(Render2DEvent event) { - WaypointsModule module = Modules.get().get(WaypointsModule.class); - if (!module.isActive()) return; - - TextRenderer text = TextRenderer.get(); - Vector3d center = new Vector3d(mc.getWindow().getFramebufferWidth() / 2.0, mc.getWindow().getFramebufferHeight() / 2.0, 0); - int textRenderDist = module.textRenderDistance.get(); - - for (Waypoint waypoint : this) { - // Continue if this waypoint should not be rendered - if (!waypoint.visible.get() || !checkDimension(waypoint)) continue; - - // Calculate distance - BlockPos blockPos = waypoint.getPos(); - Vector3d pos = new Vector3d(blockPos.getX() + 0.5, blockPos.getY(), blockPos.getZ() + 0.5); - double dist = PlayerUtils.distanceToCamera(pos.x, pos.y, pos.z); - - // Continue if this waypoint should not be rendered - if (dist > waypoint.maxVisible.get()) continue; - if (!NametagUtils.to2D(pos, 1)) continue; - - // Calculate alpha and distance to center of the screen - double distToCenter = pos.distance(center); - double a = 1; - - if (dist < 20) { - a = (dist - 10) / 10; - if (a < 0.01) continue; - } - - // Render - NametagUtils.scale = waypoint.scale.get() - 0.2; - NametagUtils.begin(pos); - - // Render icon - waypoint.renderIcon(-16, -16, a, 32); - - // Render text if cursor is close enough - if (distToCenter <= textRenderDist) { - // Setup text rendering - int preTextA = TEXT.a; - TEXT.a *= a; - text.begin(); - - // Render name - text.render(waypoint.name.get(), -text.getWidth(waypoint.name.get()) / 2, -16 - text.getHeight(), TEXT, true); - - // Render distance - String distText = String.format("%d blocks", (int) Math.round(dist)); - text.render(distText, -text.getWidth(distText) / 2, 16, TEXT, true); - - // End text rendering - text.end(); - TEXT.a = preTextA; - } - - NametagUtils.end(); - } - } - @Override public File getFile() { if (!Utils.canUpdate()) return null; @@ -221,7 +149,8 @@ public NbtCompound toTag() { @Override public Waypoints fromTag(NbtCompound tag) { Map fromNbt = NbtUtils.listFromTag(tag.getList("waypoints", 10), Waypoint::new).stream().collect(Collectors.toMap(o -> o.name.get().toLowerCase(Locale.ROOT), o -> o)); - this.waypoints = new ConcurrentHashMap<>(fromNbt); + this.waypoints.clear(); + this.waypoints.putAll(fromNbt); return this; } From 686b3b7a6b956ebc8411a60650aa8fcc45e2d26c Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Tue, 24 Oct 2023 08:17:48 -0400 Subject: [PATCH 127/357] Make LightOverlay & SpawnProofer faster (#4164) --- .../systems/modules/render/LightOverlay.java | 13 ++++--------- .../systems/modules/world/SpawnProofer.java | 4 +++- .../meteorclient/utils/world/BlockUtils.java | 18 ++++++++++++------ 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/LightOverlay.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/LightOverlay.java index 63be9247c1..32b3f02be0 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/LightOverlay.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/LightOverlay.java @@ -93,16 +93,11 @@ private void onTick(TickEvent.Pre event) { for (Cross cross : crosses) crossPool.free(cross); crosses.clear(); + int spawnLightLevel = newMobSpawnLightLevel.get() ? 0 : 7; BlockIterator.register(horizontalRange.get(), verticalRange.get(), (blockPos, blockState) -> { - switch (BlockUtils.isValidMobSpawn(blockPos, newMobSpawnLightLevel.get())) { - case Never: - break; - case Potential: - crosses.add(crossPool.get().set(blockPos, true)); - break; - case Always: - crosses.add((crossPool.get().set(blockPos, false))); - break; + switch (BlockUtils.isValidMobSpawn(blockPos, blockState, spawnLightLevel)) { + case Potential -> crosses.add(crossPool.get().set(blockPos, true)); + case Always -> crosses.add((crossPool.get().set(blockPos, false))); } }); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/SpawnProofer.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/SpawnProofer.java index 49066626ff..f08857d2b9 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/SpawnProofer.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/SpawnProofer.java @@ -96,8 +96,10 @@ private void onTickPre(TickEvent.Pre event) { // Find spawn locations for (BlockPos.Mutable blockPos : spawns) spawnPool.free(blockPos); spawns.clear(); + + int lightLevel = newMobSpawnLightLevel.get() ? 0 : 7; BlockIterator.register(range.get(), range.get(), (blockPos, blockState) -> { - BlockUtils.MobSpawn spawn = BlockUtils.isValidMobSpawn(blockPos, newMobSpawnLightLevel.get()); + BlockUtils.MobSpawn spawn = BlockUtils.isValidMobSpawn(blockPos, blockState, lightLevel); if ((spawn == BlockUtils.MobSpawn.Always && (mode.get() == Mode.Always || mode.get() == Mode.Both)) || spawn == BlockUtils.MobSpawn.Potential && (mode.get() == Mode.Potential || mode.get() == Mode.Both)) { diff --git a/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java index e7a53280c3..365fd8acb2 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java @@ -244,14 +244,20 @@ public static boolean isClickable(Block block) { } public static MobSpawn isValidMobSpawn(BlockPos blockPos, boolean newMobSpawnLightLevel) { - int spawnLightLimit = newMobSpawnLightLevel ? 0 : 7; - if (!(mc.world.getBlockState(blockPos).getBlock() instanceof AirBlock) || - mc.world.getBlockState(blockPos.down()).getBlock() == Blocks.BEDROCK) return MobSpawn.Never; + return isValidMobSpawn(blockPos, mc.world.getBlockState(blockPos), newMobSpawnLightLevel ? 0 : 7); + } + + public static MobSpawn isValidMobSpawn(BlockPos blockPos, BlockState blockState, int spawnLightLimit) { + if (!(blockState.getBlock() instanceof AirBlock)) return MobSpawn.Never; + + BlockPos down = blockPos.down(); + BlockState downState = mc.world.getBlockState(down); + if (downState.getBlock() == Blocks.BEDROCK) return MobSpawn.Never; - if (!topSurface(mc.world.getBlockState(blockPos.down()))) { - if (mc.world.getBlockState(blockPos.down()).getCollisionShape(mc.world, blockPos.down()) != VoxelShapes.fullCube()) + if (!topSurface(downState)) { + if (downState.getCollisionShape(mc.world, down) != VoxelShapes.fullCube()) return MobSpawn.Never; - if (mc.world.getBlockState(blockPos.down()).isTransparent(mc.world, blockPos.down())) return MobSpawn.Never; + if (downState.isTransparent(mc.world, down)) return MobSpawn.Never; } if (mc.world.getLightLevel(blockPos, 0) <= spawnLightLimit) return MobSpawn.Potential; From cceb15a8891790a6a7333d279930e9f24072a6ba Mon Sep 17 00:00:00 2001 From: Big-Iron-Cheems <52252627+Big-Iron-Cheems@users.noreply.github.com> Date: Wed, 25 Oct 2023 18:52:26 +0200 Subject: [PATCH 128/357] Simplify MC and FL version updates Automatically update the fabric.mod.json based on gradle.properties --- build.gradle | 4 +++- src/main/resources/fabric.mod.json | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index cb542a93da..3d97ca35a7 100644 --- a/build.gradle +++ b/build.gradle @@ -99,7 +99,9 @@ processResources { filesMatching("fabric.mod.json") { expand "version": project.version, "devbuild": project.findProperty("devbuild") ?: "", - "commit": project.findProperty("commit") ?: "" + "commit": project.findProperty("commit") ?: "", + "minecraft_version": project.minecraft_version, + "loader_version": project.loader_version } } diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index c3523f4237..a6cc83d676 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -48,8 +48,8 @@ }, "depends": { "java": ">=17", - "minecraft": "1.20.2", - "fabricloader": ">=0.14.22" + "minecraft": "${minecraft_version}", + "fabricloader": ">=${loader_version}" }, "breaks": { "optifabric": "*", From d95c68f1fc7df23b01e553891e44eae3e52908e7 Mon Sep 17 00:00:00 2001 From: Big-Iron-Cheems <52252627+Big-Iron-Cheems@users.noreply.github.com> Date: Wed, 25 Oct 2023 18:59:56 +0200 Subject: [PATCH 129/357] Bump dependencies --- gradle.properties | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gradle.properties b/gradle.properties index 0a629a6fad..28c426c625 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,8 +3,8 @@ org.gradle.jvmargs=-Xmx2G # Fabric (https://fabricmc.net/develop) minecraft_version=1.20.2 yarn_mappings=1.20.2+build.4 -loader_version=0.14.22 -fapi_version=0.89.3+1.20.2 +loader_version=0.14.24 +fapi_version=0.90.4+1.20.2 # Mod Properties mod_version=0.5.5 @@ -20,7 +20,7 @@ sodium_version=mc1.20.2-0.5.3 lithium_version=mc1.20.2-0.12.0 # Iris (https://github.com/IrisShaders/Iris) -iris_version=1.6.9+1.20.2 +iris_version=1.6.10+1.20.2 # Orbit (https://github.com/MeteorDevelopment/orbit) orbit_version=0.2.3 @@ -38,7 +38,7 @@ reflections_version=0.10.2 netty_version=4.1.90.Final # Mixin Extras (https://github.com/LlamaLad7/MixinExtras) -mixin_extras_version=0.2.0-rc.5 +mixin_extras_version=0.2.0 # Indium (https://github.com/comp500/Indium) indium_version=1.0.27+mc1.20.1 From 67b8753ef8a2af40214a3f53d58fb9aaf5825153 Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Wed, 25 Oct 2023 21:54:35 +0200 Subject: [PATCH 130/357] Add levers, rails and redstone gates to SpawnProofer --- .../meteorclient/systems/modules/world/SpawnProofer.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/SpawnProofer.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/SpawnProofer.java index f08857d2b9..0e7354008a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/SpawnProofer.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/SpawnProofer.java @@ -167,7 +167,10 @@ private boolean isNonOpaqueBlock(Block block) { block instanceof AbstractPressurePlateBlock || block instanceof TransparentBlock || block instanceof TripwireBlock || - block instanceof CarpetBlock; + block instanceof CarpetBlock || + block instanceof LeverBlock || + block instanceof AbstractRedstoneGateBlock || + block instanceof AbstractRailBlock; } private boolean isLightSource(Block block) { From 3e1df8383ae3f7d963aeadc7b95c190685692a3e Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Wed, 25 Oct 2023 22:29:22 +0200 Subject: [PATCH 131/357] Make Freecam work with F3+G (chunk borders) --- .../mixin/ChunkBorderDebugRendererMixin.java | 39 +++++++++++++++++++ src/main/resources/meteor-client.mixins.json | 1 + 2 files changed, 40 insertions(+) create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/ChunkBorderDebugRendererMixin.java diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChunkBorderDebugRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChunkBorderDebugRendererMixin.java new file mode 100644 index 0000000000..fa0bb28354 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChunkBorderDebugRendererMixin.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.MinecraftClient; +import net.minecraft.client.render.debug.ChunkBorderDebugRenderer; +import net.minecraft.util.math.ChunkPos; +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 class ChunkBorderDebugRendererMixin { + @Shadow + @Final + private MinecraftClient client; + + @ModifyExpressionValue(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;getChunkPos()Lnet/minecraft/util/math/ChunkPos;")) + private ChunkPos render$getChunkPos(ChunkPos chunkPos) { + Freecam freecam = Modules.get().get(Freecam.class); + if (!freecam.isActive()) return chunkPos; + + float delta = client.getTickDelta(); + + return new ChunkPos( + ChunkSectionPos.getSectionCoord(MathHelper.floor(freecam.getX(delta))), + ChunkSectionPos.getSectionCoord(MathHelper.floor(freecam.getZ(delta))) + ); + } +} diff --git a/src/main/resources/meteor-client.mixins.json b/src/main/resources/meteor-client.mixins.json index 6ea10c20d4..f292be27f9 100644 --- a/src/main/resources/meteor-client.mixins.json +++ b/src/main/resources/meteor-client.mixins.json @@ -45,6 +45,7 @@ "ChatInputSuggestorMixin", "ChatScreenMixin", "ChunkAccessor", + "ChunkBorderDebugRendererMixin", "ChunkOcclusionDataBuilderMixin", "ChunkSkyLightProviderMixin", "ClientChunkManagerAccessor", From 77aa25e107db479c65feea6c71143c5cbd070b7e Mon Sep 17 00:00:00 2001 From: Big-Iron-Cheems <52252627+Big-Iron-Cheems@users.noreply.github.com> Date: Wed, 25 Oct 2023 22:45:49 +0200 Subject: [PATCH 132/357] Add option to create waypoint with coords Note: the passed values are absolute coords. --- .../commands/commands/WaypointCommand.java | 44 ++++++++++++------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/WaypointCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/WaypointCommand.java index 2de5b39fb3..1859d4ae0a 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/WaypointCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/WaypointCommand.java @@ -5,8 +5,10 @@ package meteordevelopment.meteorclient.commands.commands; +import com.mojang.brigadier.arguments.IntegerArgumentType; import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.context.CommandContext; import meteordevelopment.meteorclient.commands.Command; import meteordevelopment.meteorclient.commands.arguments.WaypointArgumentType; import meteordevelopment.meteorclient.systems.waypoints.Waypoint; @@ -14,6 +16,7 @@ import meteordevelopment.meteorclient.utils.player.PlayerUtils; import net.minecraft.command.CommandSource; import net.minecraft.util.Formatting; +import net.minecraft.util.math.BlockPos; import static com.mojang.brigadier.Command.SINGLE_SUCCESS; import static meteordevelopment.meteorclient.MeteorClient.mc; @@ -45,20 +48,16 @@ public void build(LiteralArgumentBuilder builder) { return SINGLE_SUCCESS; }))); - builder.then(literal("add").then(argument("waypoint", StringArgumentType.greedyString()).executes(context -> { - if (mc.player == null) return -1; - - Waypoint waypoint = new Waypoint.Builder() - .name(StringArgumentType.getString(context, "waypoint")) - .pos(mc.player.getBlockPos().up(2)) - .dimension(PlayerUtils.getDimension()) - .build(); - - Waypoints.get().add(waypoint); - - info("Created waypoint with name: (highlight)%s(default)", waypoint.name.get()); - return SINGLE_SUCCESS; - }))); + builder.then(literal("add") + .then(argument("x", IntegerArgumentType.integer()) + .then(argument("y", IntegerArgumentType.integer()) + .then(argument("z", IntegerArgumentType.integer()) + .then(argument("waypoint", StringArgumentType.greedyString()).executes(context -> addWaypoint(context, true))) + ) + ) + ) + .then(argument("waypoint", StringArgumentType.greedyString()).executes(context -> addWaypoint(context, false))) + ); builder.then(literal("delete").then(argument("waypoint", WaypointArgumentType.create()).executes(context -> { Waypoint waypoint = WaypointArgumentType.get(context); @@ -84,6 +83,21 @@ private String waypointPos(Waypoint waypoint) { } private String waypointFullPos(Waypoint waypoint) { - return "X: " + waypoint.pos.get().getX() + ", Y: " + waypoint.pos.get().getY() + ", Z: " + waypoint.pos.get().getZ(); + return "X: " + waypoint.pos.get().getX() + ", Y: " + waypoint.pos.get().getY() + ", Z: " + waypoint.pos.get().getZ(); + } + + private int addWaypoint(CommandContext context, boolean withCoords) { + if (mc.player == null) return -1; + + Waypoint waypoint = new Waypoint.Builder() + .name(StringArgumentType.getString(context, "waypoint")) + .pos(withCoords ? BlockPos.ofFloored(IntegerArgumentType.getInteger(context, "x"), IntegerArgumentType.getInteger(context, "y"), IntegerArgumentType.getInteger(context, "z")) : mc.player.getBlockPos().up(2)) + .dimension(PlayerUtils.getDimension()) + .build(); + + Waypoints.get().add(waypoint); + + info("Created waypoint with name: (highlight)%s(default)", waypoint.name.get()); + return SINGLE_SUCCESS; } } From 12bb8197230bee81b9bab8b249d1dedf6b0339e6 Mon Sep 17 00:00:00 2001 From: Wide-Cat <74723656+Wide-Cat@users.noreply.github.com> Date: Wed, 25 Oct 2023 22:09:47 +0100 Subject: [PATCH 133/357] Update ServerCommand --- .../meteorclient/commands/commands/ServerCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java index 1a673867dc..d4e5b5c056 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java @@ -36,7 +36,7 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; public class ServerCommand extends Command { - private static final List ANTICHEAT_LIST = Arrays.asList("nocheatplus", "negativity", "warden", "horizon", "illegalstack", "coreprotect", "exploitsx", "vulcan", "abc", "spartan", "kauri", "anticheatreloaded", "witherac", "godseye", "matrix", "wraith", "antixrayheuristics"); + private static final List ANTICHEAT_LIST = Arrays.asList("nocheatplus", "negativity", "warden", "horizon", "illegalstack", "coreprotect", "exploitsx", "vulcan", "abc", "spartan", "kauri", "anticheatreloaded", "witherac", "godseye", "matrix", "wraith", "antixrayheuristics", "grimac"); private static final String completionStarts = "/:abcdefghijklmnopqrstuvwxyz0123456789-"; private int ticks = 0; private boolean bukkitMode = false; From 4c4b3eae9025b914d23af6b725fd8d8a6b643f6c Mon Sep 17 00:00:00 2001 From: seaturtle111501 <89531687+Seaturtle111501@users.noreply.github.com> Date: Sat, 28 Oct 2023 13:35:14 +0100 Subject: [PATCH 134/357] fixed drop all not dropping off hand (#4176) --- .../meteorclient/commands/commands/DropCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/DropCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/DropCommand.java index 62bbbc5626..976a47496f 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/DropCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/DropCommand.java @@ -55,6 +55,7 @@ public void build(LiteralArgumentBuilder builder) { for (int i = 0; i < player.getInventory().size(); i++) { InvUtils.drop().slot(i); } + InvUtils.drop().slotOffhand(); }))); // Armor From 3a426d57c52c09ebc6f365905e2f6d2830febf47 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Sat, 28 Oct 2023 17:04:40 +0100 Subject: [PATCH 135/357] fix anti packet kick --- .../meteorclient/mixin/PacketByteBufMixin.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PacketByteBufMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/PacketByteBufMixin.java index aad3f17962..1dd8a1fdf2 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PacketByteBufMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/PacketByteBufMixin.java @@ -10,17 +10,14 @@ import net.minecraft.nbt.NbtTagSizeTracker; import net.minecraft.network.PacketByteBuf; 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; @Mixin(PacketByteBuf.class) public class PacketByteBufMixin { - @Unique - private static final NbtTagSizeTracker EMPTY = new NbtTagSizeTracker(0L, 0); @ModifyArg(method = "readNbt()Lnet/minecraft/nbt/NbtCompound;", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/PacketByteBuf;readNbt(Lnet/minecraft/nbt/NbtTagSizeTracker;)Lnet/minecraft/nbt/NbtElement;")) private NbtTagSizeTracker xlPackets(NbtTagSizeTracker sizeTracker) { - return Modules.get().isActive(AntiPacketKick.class) ? EMPTY : sizeTracker; + return Modules.get().isActive(AntiPacketKick.class) ? NbtTagSizeTracker.ofUnlimitedBytes() : sizeTracker; } } From 4f923a74312231262f6b58123fb1acccf485e711 Mon Sep 17 00:00:00 2001 From: loma-baldsson <102317848+loma-baldsson@users.noreply.github.com> Date: Mon, 30 Oct 2023 10:22:40 +0000 Subject: [PATCH 136/357] Fix autoclicker delay visibility (#4185) --- .../meteorclient/systems/modules/player/AutoClicker.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoClicker.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoClicker.java index bf634bc9bb..63f9c8aefd 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoClicker.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoClicker.java @@ -31,7 +31,7 @@ public class AutoClicker extends Module { .defaultValue(2) .min(0) .sliderMax(60) - .visible(() -> leftClickMode.get() != Mode.Disabled) + .visible(() -> leftClickMode.get() == Mode.Press) .build() ); @@ -48,7 +48,7 @@ public class AutoClicker extends Module { .defaultValue(2) .min(0) .sliderMax(60) - .visible(() -> rightClickMode.get() != Mode.Disabled) + .visible(() -> rightClickMode.get() == Mode.Press) .build() ); From b996ff09bd740992e07c2fdcf7e1af2a7eb15aec Mon Sep 17 00:00:00 2001 From: Big-Iron-Cheems <52252627+Big-Iron-Cheems@users.noreply.github.com> Date: Sun, 29 Oct 2023 22:37:21 +0100 Subject: [PATCH 137/357] Improve WaypointCommand Allow the usage of relative coords, via `Vec3ArgumentType`. Thanks to Crosby for carrying me as always. --- .../commands/commands/WaypointCommand.java | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/WaypointCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/WaypointCommand.java index 1859d4ae0a..598c4fd308 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/WaypointCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/WaypointCommand.java @@ -5,7 +5,6 @@ package meteordevelopment.meteorclient.commands.commands; -import com.mojang.brigadier.arguments.IntegerArgumentType; import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.context.CommandContext; @@ -15,6 +14,8 @@ import meteordevelopment.meteorclient.systems.waypoints.Waypoints; import meteordevelopment.meteorclient.utils.player.PlayerUtils; import net.minecraft.command.CommandSource; +import net.minecraft.command.argument.PosArgument; +import net.minecraft.command.argument.Vec3ArgumentType; import net.minecraft.util.Formatting; import net.minecraft.util.math.BlockPos; @@ -49,13 +50,10 @@ public void build(LiteralArgumentBuilder builder) { }))); builder.then(literal("add") - .then(argument("x", IntegerArgumentType.integer()) - .then(argument("y", IntegerArgumentType.integer()) - .then(argument("z", IntegerArgumentType.integer()) - .then(argument("waypoint", StringArgumentType.greedyString()).executes(context -> addWaypoint(context, true))) - ) - ) + .then(argument("pos", Vec3ArgumentType.vec3()) + .then(argument("waypoint", StringArgumentType.greedyString()).executes(context -> addWaypoint(context, true))) ) + .then(argument("waypoint", StringArgumentType.greedyString()).executes(context -> addWaypoint(context, false))) ); @@ -89,9 +87,10 @@ private String waypointFullPos(Waypoint waypoint) { private int addWaypoint(CommandContext context, boolean withCoords) { if (mc.player == null) return -1; + BlockPos pos = withCoords ? context.getArgument("pos", PosArgument.class).toAbsoluteBlockPos(mc.player.getCommandSource()) : mc.player.getBlockPos().up(2); Waypoint waypoint = new Waypoint.Builder() .name(StringArgumentType.getString(context, "waypoint")) - .pos(withCoords ? BlockPos.ofFloored(IntegerArgumentType.getInteger(context, "x"), IntegerArgumentType.getInteger(context, "y"), IntegerArgumentType.getInteger(context, "z")) : mc.player.getBlockPos().up(2)) + .pos(pos) .dimension(PlayerUtils.getDimension()) .build(); From 775b8c3cc829b14b06cfd8fd7b2170effe8a2f3a Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Mon, 30 Oct 2023 23:02:26 -0400 Subject: [PATCH 138/357] catch corrupted files --- .../meteorclient/systems/System.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/System.java b/src/main/java/meteordevelopment/meteorclient/systems/System.java index 4f6d6353e1..f715339503 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/System.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/System.java @@ -10,9 +10,12 @@ import meteordevelopment.meteorclient.utils.misc.ISerializable; import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtIo; +import net.minecraft.util.crash.CrashException; +import org.apache.commons.io.FilenameUtils; import java.io.File; import java.io.IOException; +import java.time.LocalDate; public abstract class System implements ISerializable { private final String name; @@ -64,7 +67,16 @@ public void load(File folder) { if (folder != null) file = new File(folder, file.getName()); if (file.exists()) { - fromTag(NbtIo.read(file)); + try { + fromTag(NbtIo.read(file)); + } catch (CrashException e) { + String backupName = FilenameUtils.removeExtension(file.getName()) + "-" + LocalDate.now() + ".backup.nbt"; + File backup = new File(file.getParentFile(), backupName); + StreamUtils.copy(file, backup); + MeteorClient.LOG.error("Error loading " + this.name + ". Possibly corrupted?"); + MeteorClient.LOG.info("Saved settings backup to '" + backup + "'."); + e.printStackTrace(); + } } } catch (IOException e) { e.printStackTrace(); From 1faf01ac69f2345695e64b696a5457a73fb2bc9d Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Tue, 31 Oct 2023 15:29:56 +0000 Subject: [PATCH 139/357] add local time to corrupted system config backups --- .../meteordevelopment/meteorclient/systems/System.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/System.java b/src/main/java/meteordevelopment/meteorclient/systems/System.java index f715339503..b2d23353ed 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/System.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/System.java @@ -15,13 +15,16 @@ import java.io.File; import java.io.IOException; -import java.time.LocalDate; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Locale; public abstract class System implements ISerializable { private final String name; private File file; protected boolean isFirstInit; + private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd_HH.mm.ss", Locale.ROOT); public System(String name) { this.name = name; @@ -70,7 +73,7 @@ public void load(File folder) { try { fromTag(NbtIo.read(file)); } catch (CrashException e) { - String backupName = FilenameUtils.removeExtension(file.getName()) + "-" + LocalDate.now() + ".backup.nbt"; + String backupName = FilenameUtils.removeExtension(file.getName()) + "-" + ZonedDateTime.now().format(DATE_TIME_FORMATTER) + ".backup.nbt"; File backup = new File(file.getParentFile(), backupName); StreamUtils.copy(file, backup); MeteorClient.LOG.error("Error loading " + this.name + ". Possibly corrupted?"); From 81e2fad39e92581a7be9eed82ac127fe7925a402 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Tue, 7 Nov 2023 11:54:08 +0000 Subject: [PATCH 140/357] fix not showing capes from other sources --- .../meteorclient/mixin/CapeFeatureRendererMixin.java | 3 ++- .../meteorclient/mixin/ElytraFeatureRendererMixin.java | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/CapeFeatureRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/CapeFeatureRendererMixin.java index b492d3cc5e..43751d3d37 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/CapeFeatureRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/CapeFeatureRendererMixin.java @@ -19,6 +19,7 @@ public class CapeFeatureRendererMixin { @ModifyExpressionValue(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/SkinTextures;capeTexture()Lnet/minecraft/util/Identifier;")) private Identifier modifyCapeTexture(Identifier original, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, AbstractClientPlayerEntity abstractClientPlayerEntity, float f, float g, float h, float j, float k, float l) { - return Capes.get(abstractClientPlayerEntity); + Identifier id = Capes.get(abstractClientPlayerEntity); + return id == null ? original : id; } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ElytraFeatureRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ElytraFeatureRendererMixin.java index a96914a807..e7c7a5764c 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ElytraFeatureRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ElytraFeatureRendererMixin.java @@ -28,6 +28,8 @@ public ElytraFeatureRendererMixin(FeatureRendererContext context) { @ModifyExpressionValue(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/SkinTextures;capeTexture()Lnet/minecraft/util/Identifier;")) private Identifier modifyCapeTexture(Identifier original, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, T livingEntity, float f, float g, float h, float j, float k, float l) { if (!(livingEntity instanceof AbstractClientPlayerEntity playerEntity)) return original; - return Capes.get(playerEntity); + + Identifier id = Capes.get(playerEntity); + return id == null ? original : id; } } From c9bcfa5503750671b7e5513539062e733aab4f34 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Tue, 7 Nov 2023 11:57:08 +0000 Subject: [PATCH 141/357] reload when switching fullbright mode --- .../meteorclient/systems/modules/render/Fullbright.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Fullbright.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Fullbright.java index c84b2d18e4..d039356086 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Fullbright.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Fullbright.java @@ -20,6 +20,9 @@ public class Fullbright extends Module { .name("mode") .description("The mode to use for Fullbright.") .defaultValue(Mode.Gamma) + .onChanged(mode -> { + if (mc.worldRenderer != null && isActive()) mc.worldRenderer.reload(); + }) .build() ); From 7b5a81d36786c1660f6e9879bc5817f033827fad Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Fri, 10 Nov 2023 09:23:52 -0500 Subject: [PATCH 142/357] Add helper subcommands to .input (#4197) --- .../commands/commands/InputCommand.java | 42 ++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/InputCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/InputCommand.java index 6e7b0f328b..bb6f281619 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/InputCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/InputCommand.java @@ -14,12 +14,16 @@ import net.minecraft.client.option.KeyBinding; import net.minecraft.command.CommandSource; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import static com.mojang.brigadier.Command.SINGLE_SUCCESS; import static meteordevelopment.meteorclient.MeteorClient.mc; public class InputCommand extends Command { + private static final List activeHandlers = new ArrayList<>(); + private static final Map keys = Map.of( mc.options.forwardKey, "forwards", mc.options.backKey, "backwards", @@ -41,20 +45,55 @@ public void build(LiteralArgumentBuilder builder) { builder.then(literal(keyBinding.getValue()) .then(argument("ticks", IntegerArgumentType.integer(1)) .executes(context -> { - new KeypressHandler(keyBinding.getKey(), context.getArgument("ticks", Integer.class)); + activeHandlers.add(new KeypressHandler(keyBinding.getKey(), context.getArgument("ticks", Integer.class))); return SINGLE_SUCCESS; }) ) ); } + + builder.then(literal("clear").executes(ctx -> { + if (activeHandlers.isEmpty()) warning("No active keypress handlers."); + else { + info("Cleared all keypress handlers."); + activeHandlers.forEach(MeteorClient.EVENT_BUS::unsubscribe); + activeHandlers.clear(); + } + return SINGLE_SUCCESS; + })); + + builder.then(literal("list").executes(ctx -> { + if (activeHandlers.isEmpty()) warning("No active keypress handlers."); + else { + 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, keys.get(handler.key), handler.ticks, handler.totalTicks); + } + } + return SINGLE_SUCCESS; + })); + + builder.then(literal("remove").then(argument("index", IntegerArgumentType.integer(0)).executes(ctx -> { + int index = IntegerArgumentType.getInteger(ctx, "index"); + if (index >= activeHandlers.size()) warning("Index out of range."); + else { + info("Removed keypress handler."); + MeteorClient.EVENT_BUS.unsubscribe(activeHandlers.get(index)); + activeHandlers.remove(index); + } + return SINGLE_SUCCESS; + }))); } private static class KeypressHandler { private final KeyBinding key; + private final int totalTicks; private int ticks; public KeypressHandler(KeyBinding key, int ticks) { this.key = key; + this.totalTicks = ticks; this.ticks = ticks; MeteorClient.EVENT_BUS.subscribe(this); @@ -66,6 +105,7 @@ private void onTick(TickEvent.Post event) { else { key.setPressed(false); MeteorClient.EVENT_BUS.unsubscribe(this); + activeHandlers.remove(this); } } } From d9cd99cda9ac98acb19fd6f2109eb38e0f72de38 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Fri, 10 Nov 2023 09:43:55 -0500 Subject: [PATCH 143/357] Fix PlayerHeadTexture memory leaks (#4196) --- .../meteorclient/utils/render/PlayerHeadTexture.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/PlayerHeadTexture.java b/src/main/java/meteordevelopment/meteorclient/utils/render/PlayerHeadTexture.java index 94c0b47524..34a451889d 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/PlayerHeadTexture.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/PlayerHeadTexture.java @@ -8,10 +8,12 @@ import org.lwjgl.BufferUtils; import org.lwjgl.stb.STBImage; import org.lwjgl.system.MemoryStack; +import org.lwjgl.system.MemoryUtil; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.IOException; +import java.io.InputStream; import java.nio.ByteBuffer; import java.nio.IntBuffer; @@ -65,8 +67,8 @@ public PlayerHeadTexture(String url) { } public PlayerHeadTexture() { - try { - ByteBuffer data = TextureUtil.readResource(mc.getResourceManager().getResource(new MeteorIdentifier("textures/steve.png")).get().getInputStream()); + try (InputStream inputStream = mc.getResourceManager().getResource(new MeteorIdentifier("textures/steve.png")).get().getInputStream()) { + ByteBuffer data = TextureUtil.readResource(inputStream); data.rewind(); try (MemoryStack stack = MemoryStack.stackPush()) { @@ -78,6 +80,7 @@ public PlayerHeadTexture() { upload(image); STBImage.stbi_image_free(image); } + MemoryUtil.memFree(data); } catch (IOException e) { e.printStackTrace(); From 726e252718816566851f95de0c32b3b9769184f1 Mon Sep 17 00:00:00 2001 From: Moritz Tim W <90388353+moritz-t-w@users.noreply.github.com> Date: Fri, 10 Nov 2023 17:39:47 +0100 Subject: [PATCH 144/357] Improve AutoLog code (#4202) --- .../systems/modules/misc/AutoLog.java | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/AutoLog.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/AutoLog.java index 113e995ea5..b76d882d68 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/AutoLog.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/AutoLog.java @@ -100,39 +100,46 @@ private void onTick(TickEvent.Post event) { return; } if (playerHealth <= health.get()) { - mc.player.networkHandler.onDisconnect(new DisconnectS2CPacket(Text.literal("[AutoLog] Health was lower than " + health.get() + "."))); + disconnect("Health was lower than " + health.get() + "."); if(smartToggle.get()) { this.toggle(); enableHealthListener(); } } - if(smart.get() && playerHealth + mc.player.getAbsorptionAmount() - PlayerUtils.possibleHealthReductions() < health.get()){ - mc.player.networkHandler.onDisconnect(new DisconnectS2CPacket(Text.literal("[AutoLog] Health was going to be lower than " + health.get() + "."))); + if (smart.get() && playerHealth + mc.player.getAbsorptionAmount() - PlayerUtils.possibleHealthReductions() < health.get()){ + disconnect("Health was going to be lower than " + health.get() + "."); if (toggleOff.get()) this.toggle(); } + + if (!onlyTrusted.get() && !instantDeath.get() && !crystalLog.get()) return; // only check all entities if needed + for (Entity entity : mc.world.getEntities()) { if (entity instanceof PlayerEntity && entity.getUuid() != mc.player.getUuid()) { if (onlyTrusted.get() && entity != mc.player && !Friends.get().isFriend((PlayerEntity) entity)) { - mc.player.networkHandler.onDisconnect(new DisconnectS2CPacket(Text.literal("[AutoLog] A non-trusted player appeared in your render distance."))); + disconnect("A non-trusted player appeared in your render distance."); if (toggleOff.get()) this.toggle(); break; } - if (PlayerUtils.isWithin(entity, 8) && instantDeath.get() && DamageUtils.getSwordDamage((PlayerEntity) entity, true) + if (instantDeath.get() && PlayerUtils.isWithin(entity, 8) && DamageUtils.getSwordDamage((PlayerEntity) entity, true) > playerHealth + mc.player.getAbsorptionAmount()) { - mc.player.networkHandler.onDisconnect(new DisconnectS2CPacket(Text.literal("[AutoLog] Anti-32k measures."))); + disconnect("Anti-32k measures."); if (toggleOff.get()) this.toggle(); break; } } - if (entity instanceof EndCrystalEntity && PlayerUtils.isWithin(entity, range.get()) && crystalLog.get()) { - mc.player.networkHandler.onDisconnect(new DisconnectS2CPacket(Text.literal("[AutoLog] End Crystal appeared within specified range."))); + if (crystalLog.get() && entity instanceof EndCrystalEntity && PlayerUtils.isWithin(entity, range.get())) { + disconnect("End Crystal appeared within specified range."); if (toggleOff.get()) this.toggle(); } } } + private void disconnect(String reason) { + mc.player.networkHandler.onDisconnect(new DisconnectS2CPacket(Text.literal("[AutoLog] " + reason))); + } + private class StaticListener { @EventHandler private void healthListener(TickEvent.Post event) { @@ -149,10 +156,11 @@ else if (Utils.canUpdate() private final StaticListener staticListener = new StaticListener(); - private void enableHealthListener(){ + private void enableHealthListener() { MeteorClient.EVENT_BUS.subscribe(staticListener); } - private void disableHealthListener(){ + + private void disableHealthListener() { MeteorClient.EVENT_BUS.unsubscribe(staticListener); } } From e324fb02b11e251b14603282c3d74a48b1606c5c Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Fri, 10 Nov 2023 11:47:07 -0500 Subject: [PATCH 145/357] fix small hud details (#4190) --- .../systems/hud/elements/CombatHud.java | 17 +++++++++++++---- .../systems/hud/elements/InventoryHud.java | 10 ++++++++-- .../systems/hud/elements/PlayerModelHud.java | 14 ++++++++++++-- 3 files changed, 33 insertions(+), 8 deletions(-) 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 000b7a65c5..b868e4012c 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/CombatHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/CombatHud.java @@ -57,6 +57,7 @@ public class CombatHud extends HudElement { .defaultValue(2) .min(1) .sliderRange(1, 5) + .onChanged(aDouble -> calculateSize()) .build() ); @@ -177,10 +178,11 @@ public class CombatHud extends HudElement { public CombatHud() { super(INFO); + + calculateSize(); } - @Override - public void tick(HudRenderer renderer) { + private void calculateSize() { setSize(175 * scale.get(), 95 * scale.get()); } @@ -202,9 +204,16 @@ public void render(HudRenderer renderer) { // Background Renderer2D.COLOR.begin(); Renderer2D.COLOR.quad(x, y, getWidth(), getHeight(), backgroundColor.get()); - Renderer2D.COLOR.render(null); - if (playerEntity == null) return; + if (playerEntity == null) { + if (isInEditor()) { + renderer.line(x, y, x + getWidth(), y + getHeight(), Color.GRAY); + renderer.line(x + getWidth(), y, x, y + getHeight(), Color.GRAY); + Renderer2D.COLOR.render(null); // i know, ill fix it soon + } + return; + } + Renderer2D.COLOR.render(null); // Player Model InventoryScreen.drawEntity( 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 f61d64eb90..0e192325f5 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/InventoryHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/InventoryHud.java @@ -42,6 +42,7 @@ public class InventoryHud extends HudElement { .defaultValue(2) .min(1) .sliderRange(1, 5) + .onChanged(aDouble -> calculateSize()) .build() ); @@ -49,6 +50,7 @@ public class InventoryHud extends HudElement { .name("background") .description("Background of inventory viewer.") .defaultValue(Background.Texture) + .onChanged(bg -> calculateSize()) .build() ); @@ -64,12 +66,12 @@ public class InventoryHud extends HudElement { private InventoryHud() { super(INFO); + + calculateSize(); } @Override public void render(HudRenderer renderer) { - setSize(background.get().width * scale.get(), background.get().height * scale.get()); - double x = this.x, y = this.y; ItemStack container = getContainer(); @@ -99,6 +101,10 @@ public void render(HudRenderer renderer) { }); } + private void calculateSize() { + setSize(background.get().width * scale.get(), background.get().height * scale.get()); + } + private void drawBackground(HudRenderer renderer, int x, int y, Color color) { int w = getWidth(); int h = getHeight(); 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 f03133ce56..d431e46b9a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PlayerModelHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PlayerModelHud.java @@ -10,6 +10,7 @@ import meteordevelopment.meteorclient.systems.hud.HudElement; import meteordevelopment.meteorclient.systems.hud.HudElementInfo; import meteordevelopment.meteorclient.systems.hud.HudRenderer; +import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.render.color.SettingColor; import net.minecraft.client.gui.screen.ingame.InventoryScreen; import net.minecraft.entity.player.PlayerEntity; @@ -30,6 +31,7 @@ public class PlayerModelHud extends HudElement { .defaultValue(2) .min(1) .sliderRange(1, 5) + .onChanged(aDouble -> calculateSize()) .build() ); @@ -86,12 +88,12 @@ public class PlayerModelHud extends HudElement { public PlayerModelHud() { super(INFO); + + calculateSize(); } @Override public void render(HudRenderer renderer) { - setSize(50 * scale.get(), 75 * scale.get()); - renderer.post(() -> { PlayerEntity player = mc.player; if (player == null) return; @@ -104,6 +106,14 @@ public void render(HudRenderer renderer) { if (background.get()) { renderer.quad(x, y, getWidth(), getHeight(), backgroundColor.get()); + } 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); } } + + private void calculateSize() { + setSize(50 * scale.get(), 75 * scale.get()); + } } From aeee2b9468c97ef2fb59367c0db7ef4751ecabbb Mon Sep 17 00:00:00 2001 From: misterx Date: Sun, 29 Oct 2023 20:58:55 +0100 Subject: [PATCH 146/357] Chat fix --- .../meteorclient/mixin/ChatHudMixin.java | 22 ++++++++----------- .../systems/modules/misc/BetterChat.java | 6 ++--- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java index 19aa45dbea..77f38556ca 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java @@ -31,9 +31,7 @@ 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.Slice; +import org.spongepowered.asm.mixin.injection.*; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.LocalCapture; @@ -118,14 +116,12 @@ private void onAddMessage(Text message, @Nullable MessageSignatureData signature } } - @ModifyExpressionValue(method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;ILnet/minecraft/client/gui/hud/MessageIndicator;Z)V", - slice = @Slice(from = @At(value = "FIELD", target = "Lnet/minecraft/client/gui/hud/ChatHud;visibleMessages:Ljava/util/List;")), at = @At(value = "INVOKE", target = "Ljava/util/List;size()I")) - private int addMessageListSizeProxy(int size) { - if (Modules.get() == null) return size; + //modify max lengths for messages and visible messages + @ModifyConstant(method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;ILnet/minecraft/client/gui/hud/MessageIndicator;Z)V", constant = @Constant(intValue = 100)) + private int maxLength(int size) { + if (Modules.get() == null || !getBetterChat().isLongerChat()) return size; - BetterChat betterChat = getBetterChat(); - if (betterChat.isLongerChat() && betterChat.getChatLength() >= 100) return size - betterChat.getChatLength(); - return size; + return size + betterChat.getExtraChatLines(); } // Player Heads @@ -163,10 +159,10 @@ private void onBreakChatMessageLines(Text message, MessageSignatureData signatur private void onRemoveMessage(Text message, MessageSignatureData signature, int ticks, MessageIndicator indicator, boolean refresh, CallbackInfo ci) { if (Modules.get() == null) return; - BetterChat betterChat = getBetterChat(); - int size = betterChat.lines.size() - (betterChat.isLongerChat() && betterChat.getChatLength() >= 100 ? betterChat.getChatLength() : 0); + int extra = getBetterChat().isLongerChat() ? getBetterChat().getExtraChatLines() : 0; + int size = betterChat.lines.size(); - while (size > 100) { + while (size > 100 + extra) { betterChat.lines.removeInt(size - 1); size--; } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java index 28ceaf0c5c..14c6889448 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java @@ -147,8 +147,8 @@ public class BetterChat extends Module { .name("extra-lines") .description("The amount of extra chat lines.") .defaultValue(1000) - .min(100) - .sliderRange(100, 1000) + .min(0) + .sliderRange(0, 1000) .visible(longerChatHistory::get) .build() ); @@ -541,7 +541,7 @@ public boolean isLongerChat() { public boolean keepHistory() { return isActive() && keepHistory.get(); } - public int getChatLength() { + public int getExtraChatLines() { return longerChatLines.get(); } } From e7ab0c0da1cf7cc726b4913bd6d6ab8e61cd5597 Mon Sep 17 00:00:00 2001 From: Zgoly <46041044+Zgoly@users.noreply.github.com> Date: Fri, 10 Nov 2023 22:53:49 +0500 Subject: [PATCH 147/357] Add "Sign" setting to BookBot (#4193) --- .../systems/modules/misc/BookBot.java | 54 +++++++++++-------- 1 file changed, 32 insertions(+), 22 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BookBot.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BookBot.java index 4a270933c5..f9b47bbffd 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BookBot.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BookBot.java @@ -19,7 +19,7 @@ import meteordevelopment.meteorclient.utils.player.FindItemResult; import meteordevelopment.meteorclient.utils.player.InvUtils; import meteordevelopment.orbit.EventHandler; -import net.minecraft.item.Items; +import net.minecraft.item.*; import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtList; import net.minecraft.nbt.NbtString; @@ -39,10 +39,8 @@ import java.io.FileReader; import java.io.IOException; import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.Optional; -import java.util.PrimitiveIterator; -import java.util.Random; +import java.util.*; +import java.util.function.Predicate; public class BookBot extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); @@ -54,13 +52,6 @@ public class BookBot extends Module { .build() ); - private final Setting name = sgGeneral.add(new StringSetting.Builder() - .name("name") - .description("The name you want to give your books.") - .defaultValue("Meteor on Crack!") - .build() - ); - private final Setting pages = sgGeneral.add(new IntSetting.Builder() .name("pages") .description("The number of pages to write per book.") @@ -79,13 +70,6 @@ public class BookBot extends Module { .build() ); - private final Setting count = sgGeneral.add(new BoolSetting.Builder() - .name("append-count") - .description("Whether to append the number of the book to the title.") - .defaultValue(true) - .build() - ); - private final Setting delay = sgGeneral.add(new IntSetting.Builder() .name("delay") .description("The amount of delay between writing books.") @@ -95,6 +79,29 @@ public class BookBot extends Module { .build() ); + private final Setting sign = sgGeneral.add(new BoolSetting.Builder() + .name("sign") + .description("Whether to sign the book.") + .defaultValue(true) + .build() + ); + + private final Setting name = sgGeneral.add(new StringSetting.Builder() + .name("name") + .description("The name you want to give your books.") + .defaultValue("Meteor on Crack!") + .visible(sign::get) + .build() + ); + + private final Setting count = sgGeneral.add(new BoolSetting.Builder() + .name("append-count") + .description("Whether to append the number of the book to the title.") + .defaultValue(true) + .visible(sign::get) + .build() + ); + private File file = new File(MeteorClient.FOLDER, "bookbot.txt"); private final PointerBuffer filters; @@ -157,7 +164,10 @@ public void onActivate() { @EventHandler private void onTick(TickEvent.Post event) { - FindItemResult writableBook = InvUtils.find(Items.WRITABLE_BOOK); + Predicate bookPredicate = i -> + i.getItem() == Items.WRITABLE_BOOK && (i.getNbt() == null || i.getNbt().get("pages") == null || ((NbtList) i.getNbt().get("pages")).isEmpty()); + + FindItemResult writableBook = InvUtils.find(bookPredicate); // Check if there is a book to write if (!writableBook.found()) { @@ -166,7 +176,7 @@ private void onTick(TickEvent.Post event) { } // Move the book into hand - if (!InvUtils.testInMainHand(Items.WRITABLE_BOOK)) { + if (!InvUtils.testInMainHand(bookPredicate)) { InvUtils.move().from(writableBook.slot()).toHotbar(mc.player.getInventory().selectedSlot); return; } @@ -291,7 +301,7 @@ private void writeBook(PrimitiveIterator.OfInt chars) { if (!pages.isEmpty()) mc.player.getMainHandStack().setSubNbt("pages", pageNbt); // Send book update to server - mc.player.networkHandler.sendPacket(new BookUpdateC2SPacket(mc.player.getInventory().selectedSlot, pages, Optional.of(title))); + mc.player.networkHandler.sendPacket(new BookUpdateC2SPacket(mc.player.getInventory().selectedSlot, pages, sign.get() ? Optional.of(title) : Optional.empty())); bookCount++; } From f6ace2731425d2b12176c2e74891227fa299a75e Mon Sep 17 00:00:00 2001 From: DAM <43420467+DAMcraft@users.noreply.github.com> Date: Sun, 29 Oct 2023 21:10:57 +0100 Subject: [PATCH 148/357] Remove useless sqrt-ing once and for all --- .../meteorclient/systems/modules/combat/AutoCity.java | 6 +++--- .../meteorclient/systems/modules/combat/CrystalAura.java | 2 +- .../meteorclient/systems/modules/combat/HoleFiller.java | 2 +- .../meteorclient/systems/modules/render/ESP.java | 4 ++-- .../meteorclient/utils/entity/EntityUtils.java | 8 ++++---- .../meteorclient/utils/player/PathFinder.java | 2 +- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoCity.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoCity.java index effcf624a7..945fcb6a23 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoCity.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoCity.java @@ -149,7 +149,7 @@ public void onActivate() { } targetPos = EntityUtils.getCityBlock(target); - if (targetPos == null || PlayerUtils.distanceTo(targetPos) > breakRange.get()) { + if (targetPos == null || PlayerUtils.squaredDistanceTo(targetPos) > Math.pow(breakRange.get(), 2)) { if (chatInfo.get()) error("Couldn't find a good block, disabling."); toggle(); return; @@ -157,7 +157,7 @@ public void onActivate() { if (support.get()) { BlockPos supportPos = targetPos.down(); - if (!(PlayerUtils.distanceTo(supportPos) > placeRange.get())) { + if (!(PlayerUtils.squaredDistanceTo(supportPos) > Math.pow(placeRange.get(), 2))) { BlockUtils.place(supportPos, InvUtils.findInHotbar(Items.OBSIDIAN), rotate.get(), 0, true); } } @@ -186,7 +186,7 @@ private void onTick(TickEvent.Pre event) { return; } - if (PlayerUtils.distanceTo(targetPos) > breakRange.get()) { + if (PlayerUtils.squaredDistanceTo(targetPos) > Math.pow(breakRange.get(), 2)) { if (chatInfo.get()) error("Couldn't find a target, disabling."); toggle(); return; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/CrystalAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/CrystalAura.java index a97a50a22d..a0d23f8ea7 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/CrystalAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/CrystalAura.java @@ -1206,7 +1206,7 @@ private void findTargets() { for (PlayerEntity player : mc.world.getPlayers()) { if (player.getAbilities().creativeMode || player == mc.player) continue; if (!player.isAlive() || !Friends.get().shouldAttack(player)) continue; - if (player.distanceTo(mc.player) > targetRange.get()) continue; + if (player.squaredDistanceTo(mc.player) > Math.pow(targetRange.get(), 2)) continue; if (ignoreNakeds.get()) { if (player.getOffHandStack().isEmpty() diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/HoleFiller.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/HoleFiller.java index 562b3133c7..0a0fab02ff 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/HoleFiller.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/HoleFiller.java @@ -343,7 +343,7 @@ private void setTargets() { targets.clear(); for (PlayerEntity player : mc.world.getPlayers()) { - if (player.distanceTo(mc.player) > targetRange.get() || + if (player.squaredDistanceTo(mc.player) > targetRange.get() * targetRange.get() || player.isCreative() || player == mc.player || player.isDead() || diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ESP.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ESP.java index b1699e4487..080d164d8e 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ESP.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ESP.java @@ -314,10 +314,10 @@ public Color getColor(Entity entity) { } private double getFadeAlpha(Entity entity) { - double dist = PlayerUtils.distanceToCamera(entity.getX() + entity.getWidth() / 2, entity.getY() + entity.getEyeHeight(entity.getPose()), entity.getZ() + entity.getWidth() / 2); + double dist = PlayerUtils.squaredDistanceToCamera(entity.getX() + entity.getWidth() / 2, entity.getY() + entity.getEyeHeight(entity.getPose()), entity.getZ() + entity.getWidth() / 2); double fadeDist = Math.pow(fadeDistance.get(), 2); double alpha = 1; - if (dist <= fadeDist) alpha = (float) (dist / fadeDist); + if (dist <= fadeDist * fadeDist) alpha = (float) (Math.sqrt(dist) / fadeDist); if (alpha <= 0.075) alpha = 0; return alpha; } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityUtils.java index 1b2edf76e6..c89f3e83e5 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityUtils.java @@ -116,7 +116,7 @@ public static boolean isInRenderDistance(double posX, double posZ) { public static BlockPos getCityBlock(PlayerEntity player) { if (player == null) return null; - double bestDistance = 6; + double bestDistanceSquared = 6 * 6; Direction bestDirection = null; for (Direction direction : Direction.HORIZONTAL) { @@ -126,9 +126,9 @@ public static BlockPos getCityBlock(PlayerEntity player) { if (block != Blocks.OBSIDIAN && block != Blocks.NETHERITE_BLOCK && block != Blocks.CRYING_OBSIDIAN && block != Blocks.RESPAWN_ANCHOR && block != Blocks.ANCIENT_DEBRIS) continue; - double testDistance = PlayerUtils.distanceTo(testPos); - if (testDistance < bestDistance) { - bestDistance = testDistance; + double testDistanceSquared = PlayerUtils.squaredDistanceTo(testPos); + if (testDistanceSquared < bestDistanceSquared) { + bestDistanceSquared = testDistanceSquared; bestDirection = direction; } } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/player/PathFinder.java b/src/main/java/meteordevelopment/meteorclient/utils/player/PathFinder.java index 20f9747d2f..5ec128dc2e 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/player/PathFinder.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/player/PathFinder.java @@ -137,7 +137,7 @@ private void moveEventListener(PlayerMoveEvent event) { if (target != null && mc.player != null) { if (!PlayerUtils.isWithin(target, 3)) { if (currentPathBlock == null) currentPathBlock = getNextPathBlock(); - if (mc.player.getPos().distanceTo(new Vec3d(currentPathBlock.blockPos.getX(), currentPathBlock.blockPos.getY(), currentPathBlock.blockPos.getZ())) < .1) + if (mc.player.getPos().squaredDistanceTo(new Vec3d(currentPathBlock.blockPos.getX(), currentPathBlock.blockPos.getY(), currentPathBlock.blockPos.getZ())) < .01) currentPathBlock = getNextPathBlock(); lookAtDestination(currentPathBlock); if (!mc.options.forwardKey.isPressed()) From 9c75933ae43c925415ff6ba166059ea06feeb56a Mon Sep 17 00:00:00 2001 From: DAM <43420467+DAMcraft@users.noreply.github.com> Date: Sun, 29 Oct 2023 21:14:52 +0100 Subject: [PATCH 149/357] i guess it looks better like this --- .../meteorclient/systems/modules/combat/HoleFiller.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/HoleFiller.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/HoleFiller.java index 0a0fab02ff..1a8e92bbc2 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/HoleFiller.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/HoleFiller.java @@ -343,7 +343,7 @@ private void setTargets() { targets.clear(); for (PlayerEntity player : mc.world.getPlayers()) { - if (player.squaredDistanceTo(mc.player) > targetRange.get() * targetRange.get() || + if (player.squaredDistanceTo(mc.player) > Math.pow(targetRange.get(), 2) || player.isCreative() || player == mc.player || player.isDead() || From 9431f867ad8966026e931e43203b88e3a95cf085 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Mon, 13 Nov 2023 10:09:17 -0500 Subject: [PATCH 150/357] Optimise PotionTimersHud (#4211) --- .../systems/hud/elements/PotionTimersHud.java | 55 +++++++++---------- 1 file changed, 26 insertions(+), 29 deletions(-) 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 92a92cf6ef..8a2e1c699a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PotionTimersHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PotionTimersHud.java @@ -5,6 +5,8 @@ package meteordevelopment.meteorclient.systems.hud.elements; +import it.unimi.dsi.fastutil.Pair; +import it.unimi.dsi.fastutil.objects.ObjectObjectImmutablePair; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.hud.*; import meteordevelopment.meteorclient.utils.misc.Names; @@ -12,8 +14,9 @@ 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.util.StringHelper; +import java.util.ArrayList; import java.util.List; import static meteordevelopment.meteorclient.MeteorClient.mc; @@ -152,9 +155,8 @@ public class PotionTimersHud extends HudElement { .build() ); - private final Color rainbow = new Color(255, 255, 255); - private double rainbowHue1; - private double rainbowHue2; + private final List> texts = new ArrayList<>(); + private double rainbowHue; public PotionTimersHud() { super(INFO); @@ -180,10 +182,14 @@ public void tick(HudRenderer renderer) { double width = 0; double height = 0; + texts.clear(); + for (StatusEffectInstance statusEffectInstance : mc.player.getStatusEffects()) { if (hiddenEffects.get().contains(statusEffectInstance.getEffectType())) continue; if (!showAmbient.get() && statusEffectInstance.isAmbient()) continue; - width = Math.max(width, renderer.textWidth(getString(statusEffectInstance), shadow.get(), getScale())); + String text = getString(statusEffectInstance); + texts.add(new ObjectObjectImmutablePair<>(statusEffectInstance, text)); + width = Math.max(width, renderer.textWidth(text, shadow.get(), getScale())); height += renderer.textHeight(shadow.get(), getScale()); } @@ -204,39 +210,30 @@ public void render(HudRenderer renderer) { return; } - rainbowHue1 += rainbowSpeed.get() * renderer.delta; - if (rainbowHue1 > 1) rainbowHue1 -= 1; - else if (rainbowHue1 < -1) rainbowHue1 += 1; + rainbowHue += rainbowSpeed.get() * renderer.delta; + if (rainbowHue > 1) rainbowHue -= 1; + else if (rainbowHue < -1) rainbowHue += 1; - rainbowHue2 = rainbowHue1; + double localRainbowHue = rainbowHue; - for (StatusEffectInstance statusEffectInstance : mc.player.getStatusEffects()) { - if (hiddenEffects.get().contains(statusEffectInstance.getEffectType())) continue; - if (!showAmbient.get() && statusEffectInstance.isAmbient()) continue; - Color color = new Color(255, 255, 255); - - switch (colorMode.get()) { + for (Pair potionEffectEntry : texts) { + Color color = switch (colorMode.get()) { case Effect -> { - int c = statusEffectInstance.getEffectType().getColor(); - color.r = Color.toRGBAR(c); - color.g = Color.toRGBAG(c); - color.b = Color.toRGBAB(c); + int c = potionEffectEntry.left().getEffectType().getColor(); + yield new Color(c).a(255); } case Flat -> { - color = flatColor.get(); flatColor.get().update(); + yield flatColor.get(); } case Rainbow -> { - rainbowHue2 += rainbowSpread.get(); - int c = java.awt.Color.HSBtoRGB((float) rainbowHue2, rainbowSaturation.get().floatValue(), rainbowBrightness.get().floatValue()); - rainbow.r = Color.toRGBAR(c); - rainbow.g = Color.toRGBAG(c); - rainbow.b = Color.toRGBAB(c); - color = rainbow; + localRainbowHue += rainbowSpread.get(); + int c = java.awt.Color.HSBtoRGB((float) localRainbowHue, rainbowSaturation.get().floatValue(), rainbowBrightness.get().floatValue()); + yield new Color(c); } - } + }; - String text = getString(statusEffectInstance); + String text = potionEffectEntry.right(); renderer.text(text, x + alignX(renderer.textWidth(text, shadow.get(), getScale()), alignment.get()), y, color, shadow.get(), getScale()); y += renderer.textHeight(shadow.get(), getScale()); @@ -244,7 +241,7 @@ public void render(HudRenderer renderer) { } private String getString(StatusEffectInstance statusEffectInstance) { - return String.format("%s %d (%s)", Names.get(statusEffectInstance.getEffectType()), statusEffectInstance.getAmplifier() + 1, statusEffectInstance.isInfinite() ? "inf" : StatusEffectUtil.getDurationText(statusEffectInstance, 1).getString()); //todo remove "inf" when font rendering can use symbols + return String.format("%s %d (%s)", Names.get(statusEffectInstance.getEffectType()), statusEffectInstance.getAmplifier() + 1, statusEffectInstance.isInfinite() ? "inf" : StringHelper.formatTicks(statusEffectInstance.getDuration())); //todo remove "inf" when font rendering can use symbols } private double getScale() { From 150a9b59487517290d28fd7513da68bddb11d33a Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Fri, 10 Nov 2023 23:10:49 -0500 Subject: [PATCH 151/357] faster maps --- .../java/meteordevelopment/meteorclient/systems/Systems.java | 4 ++-- .../meteorclient/systems/modules/Modules.java | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/Systems.java b/src/main/java/meteordevelopment/meteorclient/systems/Systems.java index 5dae1e4eda..40663b851e 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/Systems.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/Systems.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.systems; +import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.game.GameLeftEvent; import meteordevelopment.meteorclient.systems.accounts.Accounts; @@ -20,13 +21,12 @@ import java.io.File; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; public class Systems { @SuppressWarnings("rawtypes") - private static final Map, System> systems = new HashMap<>(); + private static final Map, System> systems = new Reference2ReferenceOpenHashMap<>(); private static final List preLoadTasks = new ArrayList<>(1); public static void addPreLoadTask(Runnable task) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java index 0d1d18e527..ac14ca7ddc 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java @@ -8,6 +8,7 @@ import com.google.common.collect.Ordering; import com.mojang.datafixers.util.Pair; import com.mojang.serialization.Lifecycle; +import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.game.GameJoinedEvent; import meteordevelopment.meteorclient.events.game.GameLeftEvent; @@ -68,8 +69,8 @@ public class Modules extends System { private static final List CATEGORIES = new ArrayList<>(); private final List modules = new ArrayList<>(); - private final Map, Module> moduleInstances = new HashMap<>(); - private final Map> groups = new HashMap<>(); + private final Map, Module> moduleInstances = new Reference2ReferenceOpenHashMap<>(); + private final Map> groups = new Reference2ReferenceOpenHashMap<>(); private final List active = new ArrayList<>(); private Module moduleToBind; From 9af982247473e5e94808bb6cc1abe28c8d7a4d67 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Sat, 11 Nov 2023 17:57:04 -0500 Subject: [PATCH 152/357] Update Names.java --- .../meteorclient/utils/misc/Names.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/Names.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/Names.java index a5baa4afc6..02eadbac79 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/Names.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/Names.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.utils.misc; +import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.game.ResourcePacksReloadedEvent; import meteordevelopment.meteorclient.utils.PreInit; @@ -28,12 +29,12 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; public class Names { - private static final Map statusEffectNames = new HashMap<>(16); - private static final Map itemNames = new HashMap<>(128); - private static final Map blockNames = new HashMap<>(128); - private static final Map enchantmentNames = new HashMap<>(16); - private static final Map, String> entityTypeNames = new HashMap<>(64); - private static final Map, String> particleTypesNames = new HashMap<>(64); + private static final Map statusEffectNames = new Reference2ObjectOpenHashMap<>(16); + private static final Map itemNames = new Reference2ObjectOpenHashMap<>(128); + private static final Map blockNames = new Reference2ObjectOpenHashMap<>(128); + private static final Map enchantmentNames = new Reference2ObjectOpenHashMap<>(16); + private static final Map, String> entityTypeNames = new Reference2ObjectOpenHashMap<>(64); + private static final Map, String> particleTypesNames = new Reference2ObjectOpenHashMap<>(64); private static final Map soundNames = new HashMap<>(64); @PreInit From 66544a9415fe5327d586bb3b9c297a49c2eaf80f Mon Sep 17 00:00:00 2001 From: DAM <43420467+DAMcraft@users.noreply.github.com> Date: Fri, 17 Nov 2023 22:06:31 +0100 Subject: [PATCH 153/357] Fixed bug where the selection wouldn't get deleted when you are at the last index --- .../gui/widgets/input/WTextBox.java | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) 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 dd44393eb6..61846c92cb 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WTextBox.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WTextBox.java @@ -319,25 +319,24 @@ else if (cursor != selectionStart || cursor != selectionEnd) { return true; } else if (key == GLFW_KEY_DELETE) { - if (cursor < text.length()) { if (cursor == selectionStart && cursor == selectionEnd) { - String preText = text; + if (cursor < text.length()) { + String preText = text; - int count = mods == (SystemUtils.IS_OS_WINDOWS ? GLFW_MOD_ALT : MinecraftClient.IS_SYSTEM_MAC ? GLFW_MOD_SUPER : GLFW_MOD_CONTROL) - ? text.length() - cursor - : (mods == (SystemUtils.IS_OS_WINDOWS ? GLFW_MOD_CONTROL : GLFW_MOD_ALT)) - ? countToNextSpace(false) - : 1; + int count = mods == (SystemUtils.IS_OS_WINDOWS ? GLFW_MOD_ALT : MinecraftClient.IS_SYSTEM_MAC ? GLFW_MOD_SUPER : GLFW_MOD_CONTROL) + ? text.length() - cursor + : (mods == (SystemUtils.IS_OS_WINDOWS ? GLFW_MOD_CONTROL : GLFW_MOD_ALT)) + ? countToNextSpace(false) + : 1; - text = text.substring(0, cursor) + text.substring(cursor + count); + text = text.substring(0, cursor) + text.substring(cursor + count); - if (!text.equals(preText)) runAction(); + if (!text.equals(preText)) runAction(); + } } else { clearSelection(); } - } - return true; } else if (key == GLFW_KEY_LEFT) { From a4d3cacc21fd3eb5f57e7bdb3a9e391eaa902c3c Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Tue, 28 Nov 2023 22:48:21 -0500 Subject: [PATCH 154/357] prevent crash on book copy --- .../meteorclient/mixin/BookScreenMixin.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BookScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BookScreenMixin.java index 36e9eb5cde..b66e8e7575 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BookScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BookScreenMixin.java @@ -8,6 +8,7 @@ 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; @@ -20,6 +21,8 @@ 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; @@ -63,7 +66,17 @@ private void onInit(CallbackInfo info) { e.printStackTrace(); } - GLFW.glfwSetClipboardString(mc.getWindow().getHandle(), Base64.getEncoder().encodeToString(bytes.array)); + 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) From 5c6aceb302f1ebfac00ff68ed3cb02c3369727af Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Tue, 28 Nov 2023 22:13:56 -0500 Subject: [PATCH 155/357] fix bookbot text wrapping --- .../systems/modules/misc/BookBot.java | 68 ++++++++++++------- 1 file changed, 42 insertions(+), 26 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BookBot.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BookBot.java index f9b47bbffd..01c0cc4eb9 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BookBot.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BookBot.java @@ -19,6 +19,7 @@ import meteordevelopment.meteorclient.utils.player.FindItemResult; import meteordevelopment.meteorclient.utils.player.InvUtils; import meteordevelopment.orbit.EventHandler; +import net.minecraft.client.font.TextHandler; import net.minecraft.item.*; import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtList; @@ -246,44 +247,59 @@ private void onTick(TickEvent.Post event) { private void writeBook(PrimitiveIterator.OfInt chars) { ArrayList pages = new ArrayList<>(); + TextHandler.WidthRetriever widthRetriever = ((TextHandlerAccessor) mc.textRenderer.getTextHandler()).getWidthRetriever(); - for (int pageI = 0; pageI < (mode.get() == Mode.File ? 100 : this.pages.get()); pageI++) { - // Check if the stream is empty before creating a new page - if (!chars.hasNext()) break; + int maxPages = mode.get() == Mode.File ? 100 : this.pages.get(); - StringBuilder page = new StringBuilder(); + int pageIndex = 0; + int lineIndex = 0; - for (int lineI = 0; lineI < 13; lineI++) { - // Check if the stream is empty before creating a new line - if (!chars.hasNext()) break; + final StringBuilder page = new StringBuilder(); - double lineWidth = 0; - StringBuilder line = new StringBuilder(); + float lineWidth = 0; - while (true) { - // Check if the stream is empty - if (!chars.hasNext()) break; + while (chars.hasNext()) { + int c = chars.nextInt(); - // Get the next character - int nextChar = chars.nextInt(); + if (c == '\r' || c == '\n') { + page.append('\n'); + lineWidth = 0; + lineIndex++; + } else { + float charWidth = widthRetriever.getWidth(c, Style.EMPTY); - // Ignore newline chars when writing lines, should already be organised - if (nextChar == '\r' || nextChar == '\n') break; - - // Make sure the character will fit on the line - double charWidth = ((TextHandlerAccessor) mc.textRenderer.getTextHandler()).getWidthRetriever().getWidth(nextChar, Style.EMPTY); - if (lineWidth + charWidth > 114) break; - - // Append it to the line - line.appendCodePoint(nextChar); + // Reached end of line + if (lineWidth + charWidth > 114f) { + page.append('\n'); + lineWidth = charWidth; + lineIndex++; + // Wrap to next line, unless wrapping to next page + if (lineIndex != 14) page.appendCodePoint(c); + } else { lineWidth += charWidth; + page.appendCodePoint(c); } + } + + // Reached end of page + if (lineIndex == 14) { + pages.add(page.toString()); + page.setLength(0); + pageIndex++; + lineIndex = 0; - // Append the line to the page - page.append(line).append('\n'); + // No more pages + if (pageIndex == maxPages) break; + + // Wrap to next page + if (c != '\r' && c != '\n') { + page.appendCodePoint(c); + } } + } - // Append page to the page list + // No more characters, end current page + if (!page.isEmpty() && pageIndex != maxPages) { pages.add(page.toString()); } From 4796623f7796c88bc6387a6132c7da1a6d426a46 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Tue, 28 Nov 2023 22:25:07 -0500 Subject: [PATCH 156/357] prevent leading spaces --- .../meteorclient/systems/modules/misc/BookBot.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BookBot.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BookBot.java index 01c0cc4eb9..e3f6980b8b 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BookBot.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BookBot.java @@ -275,6 +275,8 @@ private void writeBook(PrimitiveIterator.OfInt chars) { lineIndex++; // Wrap to next line, unless wrapping to next page if (lineIndex != 14) page.appendCodePoint(c); + } else if (lineWidth == 0f && c == ' ') { + continue; // Prevent leading space from text wrapping } else { lineWidth += charWidth; page.appendCodePoint(c); From b0a927bafc077e9850d6a0d87710ff194c0ac7d4 Mon Sep 17 00:00:00 2001 From: Big Iron <52252627+Big-Iron-Cheems@users.noreply.github.com> Date: Fri, 8 Dec 2023 00:16:12 +0100 Subject: [PATCH 157/357] 1.20.4 update (#4249) --- build.gradle | 23 +- gradle.properties | 21 +- .../arguments/FakePlayerArgumentType.java | 2 +- .../arguments/PlayerArgumentType.java | 4 +- .../commands/commands/FakePlayerCommand.java | 4 +- .../commands/commands/SwarmCommand.java | 4 +- .../meteorclient/gui/GuiThemes.java | 8 +- .../gui/widgets/WItemWithLabel.java | 8 +- .../mixin/BookEditScreenMixin.java | 7 +- .../mixin/CapeFeatureRendererMixin.java | 2 +- .../mixin/ConnectScreenMixin.java | 2 +- .../mixin/DisconnectedScreenMixin.java | 2 +- .../mixin/ElytraFeatureRendererMixin.java | 2 +- .../meteorclient/mixin/GameRendererMixin.java | 4 +- .../mixin/LivingEntityRendererMixin.java | 5 +- .../mixin/RaycastContextMixin.java | 4 +- .../meteorclient/mixin/RegistriesMixin.java | 21 ++ .../mixin/SimpleRegistryMixin.java | 22 -- .../ChunkAwareBlockCollisionSweeperMixin.java | 2 +- .../sodium/SodiumBiomeColorCacheMixin.java | 6 +- .../sodium/SodiumFluidRendererMixin.java | 7 +- .../meteorclient/renderer/GL.java | 4 +- .../meteorclient/settings/BoolSetting.java | 3 +- .../meteorclient/settings/ColorSetting.java | 3 +- .../meteorclient/systems/System.java | 4 +- .../systems/accounts/Account.java | 6 +- .../systems/accounts/types/EasyMCAccount.java | 2 +- .../accounts/types/TheAlteningAccount.java | 4 +- .../meteorclient/systems/friends/Friend.java | 2 +- .../meteorclient/systems/friends/Friends.java | 2 +- .../systems/hud/elements/CombatHud.java | 2 +- .../systems/hud/elements/PlayerRadarHud.java | 4 +- .../systems/hud/elements/PotionTimersHud.java | 2 +- .../meteorclient/systems/modules/Modules.java | 5 +- .../systems/modules/misc/DiscordPresence.java | 8 +- .../systems/modules/misc/MessageAura.java | 2 +- .../systems/modules/misc/Notifier.java | 10 +- .../systems/modules/misc/ServerSpoof.java | 4 +- .../systems/modules/player/AutoTool.java | 4 +- .../systems/modules/player/FakePlayer.java | 2 +- .../modules/player/MiddleClickExtra.java | 6 +- .../modules/render/BetterTooltips.java | 6 +- .../systems/modules/render/EntityOwner.java | 2 +- .../systems/modules/render/LogoutSpots.java | 2 +- .../systems/modules/render/Nametags.java | 4 +- .../systems/modules/world/Flamethrower.java | 2 +- .../systems/modules/world/Nuker.java | 4 +- .../systems/modules/world/VeinMiner.java | 5 +- .../utils/entity/EntityUtils.java | 2 +- .../entity/fakeplayer/FakePlayerManager.java | 4 +- .../meteorclient/utils/misc/NbtUtils.java | 7 +- .../utils/misc/ValueComparableMap.java | 18 +- .../utils/network/PacketUtils.java | 116 +++++----- .../utils/network/PacketUtilsUtil.java | 211 +++++++++--------- .../utils/player/TitleScreenCredits.java | 63 ++---- src/main/resources/fabric.mod.json | 5 +- src/main/resources/meteor-client.mixins.json | 2 +- 57 files changed, 332 insertions(+), 360 deletions(-) create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/RegistriesMixin.java delete mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/SimpleRegistryMixin.java diff --git a/build.gradle b/build.gradle index 3d97ca35a7..17cc649a38 100644 --- a/build.gradle +++ b/build.gradle @@ -58,7 +58,7 @@ dependencies { modCompileOnly("maven.modrinth:indium:${project.indium_version}") { transitive = false } // Baritone (https://github.com/MeteorDevelopment/baritone) - modCompileOnly "meteordevelopment:baritone:${project.minecraft_version}-SNAPSHOT" + modCompileOnly "meteordevelopment:baritone:${project.baritone_version}-SNAPSHOT" // Libraries library "meteordevelopment:orbit:${project.orbit_version}" @@ -67,8 +67,6 @@ dependencies { library "org.reflections:reflections:${project.reflections_version}" library("io.netty:netty-handler-proxy:${project.netty_version}") { transitive = false } library("io.netty:netty-codec-socks:${project.netty_version}") { transitive = false } - library "io.github.llamalad7:mixinextras-fabric:${project.mixin_extras_version}" - annotationProcessor "io.github.llamalad7:mixinextras-fabric:${project.mixin_extras_version}" library "de.florianmichael:WaybackAuthLib:1.0.0" // Launch sub project @@ -96,17 +94,24 @@ shadowJar { } processResources { + def propertyMap = [ + "version" : project.version, + "devbuild" : project.findProperty("devbuild") ?: "", + "commit" : project.findProperty("commit") ?: "", + "minecraft_version": project.minecraft_version, + "loader_version" : project.loader_version + ] + + inputs.properties(propertyMap) filesMatching("fabric.mod.json") { - expand "version": project.version, - "devbuild": project.findProperty("devbuild") ?: "", - "commit": project.findProperty("commit") ?: "", - "minecraft_version": project.minecraft_version, - "loader_version": project.loader_version + expand(propertyMap) } } jar { - from "LICENSE" + from("LICENSE") { + rename { "${it}_${archivesBaseName}" } + } manifest { attributes("Main-Class": "meteordevelopment.meteorclient.Main") diff --git a/gradle.properties b/gradle.properties index 28c426c625..cd6681815d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,26 +1,30 @@ org.gradle.jvmargs=-Xmx2G # Fabric (https://fabricmc.net/develop) -minecraft_version=1.20.2 -yarn_mappings=1.20.2+build.4 -loader_version=0.14.24 -fapi_version=0.90.4+1.20.2 +# TODO: when updating to 1.21, revert "minecraft": ["1.20.3", "1.20.4"] to "minecraft": "${minecraft_version}" +minecraft_version=1.20.4 +yarn_mappings=1.20.4+build.1 +loader_version=0.15.0 +fapi_version=0.91.1+1.20.4 # Mod Properties -mod_version=0.5.5 +mod_version=0.5.6 maven_group=meteordevelopment archives_base_name=meteor-client # Dependency Versions +# Baritone (https://github.com/MeteorDevelopment/baritone) +baritone_version=1.20.2 + # Sodium (https://github.com/CaffeineMC/sodium-fabric) -sodium_version=mc1.20.2-0.5.3 +sodium_version=mc1.20.3-0.5.4 # Lithium (https://github.com/CaffeineMC/lithium-fabric) lithium_version=mc1.20.2-0.12.0 # Iris (https://github.com/IrisShaders/Iris) -iris_version=1.6.10+1.20.2 +iris_version=1.6.12+1.20.3 # Orbit (https://github.com/MeteorDevelopment/orbit) orbit_version=0.2.3 @@ -37,8 +41,5 @@ reflections_version=0.10.2 # Netty (https://github.com/netty/netty) netty_version=4.1.90.Final -# Mixin Extras (https://github.com/LlamaLad7/MixinExtras) -mixin_extras_version=0.2.0 - # Indium (https://github.com/comp500/Indium) indium_version=1.0.27+mc1.20.1 diff --git a/src/main/java/meteordevelopment/meteorclient/commands/arguments/FakePlayerArgumentType.java b/src/main/java/meteordevelopment/meteorclient/commands/arguments/FakePlayerArgumentType.java index fde62bb80d..2ba92b3409 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/arguments/FakePlayerArgumentType.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/arguments/FakePlayerArgumentType.java @@ -38,7 +38,7 @@ public String parse(StringReader reader) throws CommandSyntaxException { @Override public CompletableFuture listSuggestions(CommandContext context, SuggestionsBuilder builder) { - return suggestMatching(FakePlayerManager.stream().map(FakePlayerEntity::getEntityName), builder); + return suggestMatching(FakePlayerManager.stream().map(fakePlayerEntity -> fakePlayerEntity.getName().getString()), builder); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/arguments/PlayerArgumentType.java b/src/main/java/meteordevelopment/meteorclient/commands/arguments/PlayerArgumentType.java index b9ebc0b1e6..10472f55c6 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/arguments/PlayerArgumentType.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/arguments/PlayerArgumentType.java @@ -41,7 +41,7 @@ public PlayerEntity parse(StringReader reader) throws CommandSyntaxException { PlayerEntity playerEntity = null; for (PlayerEntity p : mc.world.getPlayers()) { - if (p.getEntityName().equalsIgnoreCase(argument)) { + if (p.getName().getString().equalsIgnoreCase(argument)) { playerEntity = p; break; } @@ -53,7 +53,7 @@ public PlayerEntity parse(StringReader reader) throws CommandSyntaxException { @Override public CompletableFuture listSuggestions(CommandContext context, SuggestionsBuilder builder) { - return CommandSource.suggestMatching(mc.world.getPlayers().stream().map(PlayerEntity::getEntityName), builder); + return CommandSource.suggestMatching(mc.world.getPlayers().stream().map(abstractClientPlayerEntity -> abstractClientPlayerEntity.getName().getString()), builder); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/FakePlayerCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/FakePlayerCommand.java index 122e9a13c6..4a05f24d14 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/FakePlayerCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/FakePlayerCommand.java @@ -50,7 +50,7 @@ public void build(LiteralArgumentBuilder builder) { } FakePlayerManager.remove(fp); - info("Removed Fake Player %s.".formatted(fp.getEntityName())); + info("Removed Fake Player %s.".formatted(fp.getName().getString())); return SINGLE_SUCCESS; }) @@ -67,7 +67,7 @@ public void build(LiteralArgumentBuilder builder) { builder.then(literal("list") .executes(context -> { info("--- Fake Players ((highlight)%s(default)) ---", FakePlayerManager.count()); - FakePlayerManager.forEach(fp -> ChatUtils.info("(highlight)%s".formatted(fp.getEntityName()))); + FakePlayerManager.forEach(fp -> ChatUtils.info("(highlight)%s".formatted(fp.getName().getString()))); return SINGLE_SUCCESS; }) ); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java index fda2554682..317550eabd 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java @@ -104,7 +104,7 @@ else if (swarm.isWorker()) { Swarm swarm = Modules.get().get(Swarm.class); if (swarm.isActive()) { if (swarm.isHost()) { - swarm.host.sendMessage(context.getInput() + " " + mc.player.getEntityName()); + swarm.host.sendMessage(context.getInput() + " " + mc.player.getName().getString()); } else if (swarm.isWorker()) { error("The follow host command must be used by the host."); @@ -124,7 +124,7 @@ else if (swarm.isWorker()) { swarm.host.sendMessage(context.getInput()); } else if (swarm.isWorker() && playerEntity != null) { - PathManagers.get().follow(entity -> entity.getEntityName().equalsIgnoreCase(playerEntity.getEntityName())); + PathManagers.get().follow(entity -> entity.getName().getString().equalsIgnoreCase(playerEntity.getName().getString())); } } else { diff --git a/src/main/java/meteordevelopment/meteorclient/gui/GuiThemes.java b/src/main/java/meteordevelopment/meteorclient/gui/GuiThemes.java index beb6e164c4..2b528f16c7 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/GuiThemes.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/GuiThemes.java @@ -35,7 +35,7 @@ public static void init() { public static void postInit() { if (FILE.exists()) { try { - NbtCompound tag = NbtIo.read(FILE); + NbtCompound tag = NbtIo.read(FILE.toPath()); if (tag != null) select(tag.getString("currentTheme")); } catch (IOException e) { @@ -82,7 +82,7 @@ public static void select(String name) { File file = new File(THEMES_FOLDER, get().name + ".nbt"); if (file.exists()) { - NbtCompound tag = NbtIo.read(file); + NbtCompound tag = NbtIo.read(file.toPath()); if (tag != null) get().fromTag(tag); } } catch (IOException e) { @@ -116,7 +116,7 @@ private static void saveTheme() { NbtCompound tag = get().toTag(); THEMES_FOLDER.mkdirs(); - NbtIo.write(tag, new File(THEMES_FOLDER, get().name + ".nbt")); + NbtIo.write(tag, new File(THEMES_FOLDER, get().name + ".nbt").toPath()); } catch (IOException e) { e.printStackTrace(); } @@ -129,7 +129,7 @@ private static void saveGlobal() { tag.putString("currentTheme", get().name); FOLDER.mkdirs(); - NbtIo.write(tag, FILE); + NbtIo.write(tag, FILE.toPath()); } catch (IOException e) { e.printStackTrace(); } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItemWithLabel.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItemWithLabel.java index 26d3c4ce85..bc8769b7aa 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItemWithLabel.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItemWithLabel.java @@ -14,6 +14,8 @@ import java.util.List; +import static meteordevelopment.meteorclient.MeteorClient.mc; + public class WItemWithLabel extends WHorizontalList { private ItemStack itemStack; private String name; @@ -38,13 +40,13 @@ private String getStringToAppend() { if (itemStack.getItem() == Items.POTION) { List effects = PotionUtil.getPotion(itemStack).getEffects(); - if (effects.size() > 0) { + if (!effects.isEmpty()) { str += " "; StatusEffectInstance effect = effects.get(0); - if (effect.getAmplifier() > 0) str += effect.getAmplifier() + 1 + " "; + if (effect.getAmplifier() > 0) str += "%d ".formatted(effect.getAmplifier() + 1); - str += "(" + StatusEffectUtil.getDurationText(effect, 1).getString() + ")"; + str += "(%s)".formatted(StatusEffectUtil.getDurationText(effect, 1, mc.world.getTickManager().getTickRate()).getString()); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BookEditScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BookEditScreenMixin.java index a1a1c95cc2..7468bd62b5 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BookEditScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BookEditScreenMixin.java @@ -9,10 +9,7 @@ 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.nbt.NbtCompound; -import net.minecraft.nbt.NbtIo; -import net.minecraft.nbt.NbtList; -import net.minecraft.nbt.NbtString; +import net.minecraft.nbt.*; import net.minecraft.text.Text; import org.lwjgl.glfw.GLFW; import org.spongepowered.asm.mixin.Final; @@ -87,7 +84,7 @@ private void onInit(CallbackInfo info) { DataInputStream in = new DataInputStream(new ByteArrayInputStream(bytes)); try { - NbtCompound tag = NbtIo.readCompressed(in); + NbtCompound tag = NbtIo.readCompressed(in, NbtTagSizeTracker.ofUnlimitedBytes()); NbtList listTag = tag.getList("pages", 8).copy(); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/CapeFeatureRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/CapeFeatureRendererMixin.java index 43751d3d37..4e9368a904 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/CapeFeatureRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/CapeFeatureRendererMixin.java @@ -17,7 +17,7 @@ @Mixin(CapeFeatureRenderer.class) public class CapeFeatureRendererMixin { - @ModifyExpressionValue(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/SkinTextures;capeTexture()Lnet/minecraft/util/Identifier;")) + @ModifyExpressionValue(method = "render(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;ILnet/minecraft/client/network/AbstractClientPlayerEntity;FFFFFF)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/SkinTextures;capeTexture()Lnet/minecraft/util/Identifier;")) private Identifier modifyCapeTexture(Identifier original, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, AbstractClientPlayerEntity abstractClientPlayerEntity, float f, float g, float h, float j, float k, float l) { Identifier id = Capes.get(abstractClientPlayerEntity); return id == null ? original : id; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ConnectScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ConnectScreenMixin.java index 2fd47394c5..fac824368d 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ConnectScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ConnectScreenMixin.java @@ -8,7 +8,7 @@ import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.world.ServerConnectBeginEvent; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.ConnectScreen; +import net.minecraft.client.gui.screen.multiplayer.ConnectScreen; import net.minecraft.client.network.ServerAddress; import net.minecraft.client.network.ServerInfo; import org.spongepowered.asm.mixin.Mixin; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/DisconnectedScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/DisconnectedScreenMixin.java index 3092d3f470..44d87fbacc 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/DisconnectedScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/DisconnectedScreenMixin.java @@ -7,7 +7,7 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.misc.AutoReconnect; -import net.minecraft.client.gui.screen.ConnectScreen; +import net.minecraft.client.gui.screen.multiplayer.ConnectScreen; import net.minecraft.client.gui.screen.DisconnectedScreen; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.TitleScreen; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ElytraFeatureRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ElytraFeatureRendererMixin.java index e7c7a5764c..4fd5c52c9e 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ElytraFeatureRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ElytraFeatureRendererMixin.java @@ -25,7 +25,7 @@ public ElytraFeatureRendererMixin(FeatureRendererContext context) { super(context); } - @ModifyExpressionValue(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/SkinTextures;capeTexture()Lnet/minecraft/util/Identifier;")) + @ModifyExpressionValue(method = "render(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;ILnet/minecraft/entity/LivingEntity;FFFFFF)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/SkinTextures;capeTexture()Lnet/minecraft/util/Identifier;")) private Identifier modifyCapeTexture(Identifier original, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, T livingEntity, float f, float g, float h, float j, float k, float l) { if (!(livingEntity instanceof AbstractClientPlayerEntity playerEntity)) return original; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java index 23fe559f8a..da6f192634 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java @@ -53,7 +53,7 @@ public abstract class GameRendererMixin { @Unique private Renderer3D renderer; @Inject(method = "renderWorld", at = @At(value = "INVOKE_STRING", target = "Lnet/minecraft/util/profiler/Profiler;swap(Ljava/lang/String;)V", args = { "ldc=hand" }), locals = LocalCapture.CAPTURE_FAILEXCEPTION) - private void onRenderWorld(float tickDelta, long limitTime, MatrixStack matrices, CallbackInfo info, boolean bl, Camera camera, MatrixStack matrixStack, double d, float f, float g, Matrix4f matrix4f, Matrix3f matrix3f) { + private void onRenderWorld(float tickDelta, long limitTime, MatrixStack matrices, CallbackInfo ci, boolean bl, Camera camera, Entity entity, MatrixStack matrixStack, double d, float f, float g, Matrix4f matrix4f, Matrix3f matrix3f) { if (!Utils.canUpdate()) return; client.getProfiler().push(MeteorClient.MOD_ID + "_render"); @@ -169,7 +169,7 @@ private void renderHand(MatrixStack matrices, Camera camera, float tickDelta, Ca info.cancel(); } - @ModifyConstant(method = "updateTargetedEntity", constant = @Constant(doubleValue = 3)) + @ModifyConstant(method = "updateTargetedEntity", constant = @Constant(doubleValue = 6)) private double updateTargetedEntityModifySurvivalReach(double d) { return Modules.get().get(Reach.class).entityReach(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityRendererMixin.java index 21263b00e1..a69f012d37 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityRendererMixin.java @@ -22,6 +22,7 @@ import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.scoreboard.AbstractTeam; +import net.minecraft.scoreboard.Team; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -66,8 +67,8 @@ public float changePitch(float oldValue, LivingEntity entity) { // Player model rendering in main menu - @ModifyExpressionValue(method = "hasLabel(Lnet/minecraft/entity/LivingEntity;)Z", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;getScoreboardTeam()Lnet/minecraft/scoreboard/AbstractTeam;")) - private AbstractTeam hasLabelClientPlayerEntityGetScoreboardTeamProxy(AbstractTeam team) { + @ModifyExpressionValue(method = "hasLabel(Lnet/minecraft/entity/LivingEntity;)Z", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;getScoreboardTeam()Lnet/minecraft/scoreboard/Team;")) + private Team hasLabelClientPlayerEntityGetScoreboardTeamProxy(Team team) { return (mc.player == null) ? null : team; } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/RaycastContextMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/RaycastContextMixin.java index 8bd300912b..659dc3160d 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/RaycastContextMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/RaycastContextMixin.java @@ -21,7 +21,7 @@ public class RaycastContextMixin implements IRaycastContext { @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 entityPosition; + @Shadow @Final @Mutable private ShapeContext shapeContext; @Override public void set(Vec3d start, Vec3d end, RaycastContext.ShapeType shapeType, RaycastContext.FluidHandling fluidHandling, Entity entity) { @@ -29,6 +29,6 @@ public void set(Vec3d start, Vec3d end, RaycastContext.ShapeType shapeType, Rayc this.end = end; this.shapeType = shapeType; this.fluid = fluidHandling; - this.entityPosition = ShapeContext.of(entity); + 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 new file mode 100644 index 0000000000..625ec10ba5 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/RegistriesMixin.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.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;Lcom/mojang/serialization/Lifecycle;)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/SimpleRegistryMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/SimpleRegistryMixin.java deleted file mode 100644 index aca4582354..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/SimpleRegistryMixin.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.registry.SimpleRegistry; -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(SimpleRegistry.class) -public class SimpleRegistryMixin { - @Redirect(method = "(Lnet/minecraft/registry/RegistryKey;Lcom/mojang/serialization/Lifecycle;Z)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/Bootstrap;ensureBootstrapped(Ljava/util/function/Supplier;)V")) - private void idk(Supplier callerGetter) { - // TODO: Probably extremely retarded but seems to work - // nothing :trolla: - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/lithium/ChunkAwareBlockCollisionSweeperMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/lithium/ChunkAwareBlockCollisionSweeperMixin.java index eb15d0e2b1..0152627779 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/lithium/ChunkAwareBlockCollisionSweeperMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/lithium/ChunkAwareBlockCollisionSweeperMixin.java @@ -21,7 +21,7 @@ @Mixin(value = ChunkAwareBlockCollisionSweeper.class) public abstract class ChunkAwareBlockCollisionSweeperMixin { - @Redirect(method = "computeNext", at = @At(value = "INVOKE", target = "Lnet/minecraft/block/BlockState;getCollisionShape(Lnet/minecraft/world/BlockView;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/ShapeContext;)Lnet/minecraft/util/shape/VoxelShape;")) + @Redirect(method = "computeNext()Lnet/minecraft/util/shape/VoxelShape;", at = @At(value = "INVOKE", target = "Lnet/minecraft/block/BlockState;getCollisionShape(Lnet/minecraft/world/BlockView;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/ShapeContext;)Lnet/minecraft/util/shape/VoxelShape;")) private VoxelShape onComputeNextCollisionBox(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { VoxelShape shape = state.getCollisionShape(world, pos, context); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBiomeColorCacheMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBiomeColorCacheMixin.java index 3f147c8e58..39366b697f 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBiomeColorCacheMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBiomeColorCacheMixin.java @@ -25,17 +25,17 @@ private void onInit(CallbackInfo info) { ambience = Modules.get().get(Ambience.class); } - @ModifyExpressionValue(method = "updateColorBuffers", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/biome/Biome;getGrassColorAt(DD)I", remap = true)) + @ModifyExpressionValue(method = "updateColorBuffers", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/biome/ColorResolver;getColor(Lnet/minecraft/world/biome/Biome;DD)I", ordinal = 0, remap = true)) private int modify_getGrassColorAt(int color) { return ambience.isActive() && ambience.customGrassColor.get() ? ambience.grassColor.get().getPacked() : color; } - @ModifyExpressionValue(method = "updateColorBuffers", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/biome/Biome;getFoliageColor()I", remap = true)) + @ModifyExpressionValue(method = "updateColorBuffers", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/biome/ColorResolver;getColor(Lnet/minecraft/world/biome/Biome;DD)I", ordinal = 1, remap = true)) private int modify_getFoliageColor(int color) { return ambience.isActive() && ambience.customFoliageColor.get() ? ambience.foliageColor.get().getPacked() : color; } - @ModifyExpressionValue(method = "updateColorBuffers", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/biome/Biome;getWaterColor()I", remap = true)) + @ModifyExpressionValue(method = "updateColorBuffers", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/biome/ColorResolver;getColor(Lnet/minecraft/world/biome/Biome;DD)I", ordinal = 2, remap = true)) private int modify_getWaterColor(int color) { return ambience.isActive() && ambience.customWaterColor.get() ? ambience.waterColor.get().getPacked() : color; } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumFluidRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumFluidRendererMixin.java index 1eb4dbc141..2ac8a24812 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumFluidRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumFluidRendererMixin.java @@ -14,6 +14,7 @@ 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.caffeinemc.mods.sodium.api.util.ColorABGR; import net.minecraft.fluid.FluidState; import net.minecraft.registry.tag.FluidTags; @@ -31,7 +32,8 @@ @Mixin(value = FluidRenderer.class, remap = false) public class SodiumFluidRendererMixin { - @Final @Shadow + @Final + @Shadow private int[] quadColors; @Unique @@ -53,7 +55,8 @@ private void onRender(WorldSlice world, FluidState fluidState, BlockPos blockPos private void onUpdateQuad(ModelQuadView quad, WorldSlice world, BlockPos pos, LightPipeline lighter, Direction dir, float brightness, ColorProvider colorProvider, FluidState fluidState, CallbackInfo info) { // Ambience if (ambience.isActive() && ambience.customLavaColor.get() && fluidState.isIn(FluidTags.LAVA)) { - Arrays.fill(quadColors, ColorABGR.withAlpha(ambience.lavaColor.get().getPacked(), 255)); + Color c = ambience.lavaColor.get(); + Arrays.fill(quadColors, ColorABGR.pack(c.r, c.g, c.b, c.a)); } } } diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/GL.java b/src/main/java/meteordevelopment/meteorclient/renderer/GL.java index 19526684bd..511c1b783c 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/GL.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/GL.java @@ -5,7 +5,6 @@ package meteordevelopment.meteorclient.renderer; -import com.google.common.collect.ImmutableList; import com.mojang.blaze3d.platform.GlStateManager; import meteordevelopment.meteorclient.mixin.BufferRendererAccessor; import meteordevelopment.meteorclient.mixininterface.ICapabilityTracker; @@ -18,6 +17,7 @@ import java.lang.reflect.Field; import java.nio.ByteBuffer; import java.nio.FloatBuffer; +import java.util.List; import static meteordevelopment.meteorclient.MeteorClient.mc; import static org.lwjgl.opengl.GL32C.*; @@ -133,7 +133,7 @@ public static int createShader(int type) { } public static void shaderSource(int shader, String source) { - GlStateManager.glShaderSource(shader, ImmutableList.of(source)); + GlStateManager.glShaderSource(shader, List.of(source)); } public static String compileShader(int shader) { diff --git a/src/main/java/meteordevelopment/meteorclient/settings/BoolSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/BoolSetting.java index cb21ed7035..e42351541a 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/BoolSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/BoolSetting.java @@ -5,14 +5,13 @@ package meteordevelopment.meteorclient.settings; -import com.google.common.collect.ImmutableList; import net.minecraft.nbt.NbtCompound; import java.util.List; import java.util.function.Consumer; public class BoolSetting extends Setting { - private static final List SUGGESTIONS = ImmutableList.of("true", "false", "toggle"); + private static final List SUGGESTIONS = List.of("true", "false", "toggle"); private BoolSetting(String name, String description, Boolean defaultValue, Consumer onChanged, Consumer> onModuleActivated, IVisible visible) { super(name, description, defaultValue, onChanged, onModuleActivated, visible); diff --git a/src/main/java/meteordevelopment/meteorclient/settings/ColorSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/ColorSetting.java index 644028e36f..47ef146303 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/ColorSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/ColorSetting.java @@ -5,7 +5,6 @@ package meteordevelopment.meteorclient.settings; -import com.google.common.collect.ImmutableList; import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.render.color.SettingColor; import net.minecraft.nbt.NbtCompound; @@ -14,7 +13,7 @@ import java.util.function.Consumer; public class ColorSetting extends Setting { - private static final List SUGGESTIONS = ImmutableList.of("0 0 0 255", "225 25 25 255", "25 225 25 255", "25 25 225 255", "255 255 255 255"); + private static final List SUGGESTIONS = List.of("0 0 0 255", "225 25 25 255", "25 225 25 255", "25 25 225 255", "255 255 255 255"); public ColorSetting(String name, String description, SettingColor defaultValue, Consumer onChanged, Consumer> onModuleActivated, IVisible visible) { super(name, description, defaultValue, onChanged, onModuleActivated, visible); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/System.java b/src/main/java/meteordevelopment/meteorclient/systems/System.java index b2d23353ed..60b2fb203d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/System.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/System.java @@ -46,7 +46,7 @@ public void save(File folder) { try { File tempFile = File.createTempFile(MeteorClient.MOD_ID, file.getName()); - NbtIo.write(tag, tempFile); + NbtIo.write(tag, tempFile.toPath()); if (folder != null) file = new File(folder, file.getName()); @@ -71,7 +71,7 @@ public void load(File folder) { if (file.exists()) { try { - fromTag(NbtIo.read(file)); + fromTag(NbtIo.read(file.toPath())); } catch (CrashException e) { String backupName = FilenameUtils.removeExtension(file.getName()) + "-" + ZonedDateTime.now().format(DATE_TIME_FORMATTER) + ".backup.nbt"; File backup = new File(file.getParentFile(), backupName); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/accounts/Account.java b/src/main/java/meteordevelopment/meteorclient/systems/accounts/Account.java index 428a424eb9..70ca1ac710 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/accounts/Account.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/accounts/Account.java @@ -68,11 +68,7 @@ public static void setSession(Session session) { MinecraftClientAccessor mca = (MinecraftClientAccessor) mc; mca.setSession(session); UserApiService apiService; - try { - apiService = mca.getAuthenticationService().createUserApiService(session.getAccessToken()); - } catch (AuthenticationException e) { - apiService = UserApiService.OFFLINE; - } + apiService = mca.getAuthenticationService().createUserApiService(session.getAccessToken()); mca.setUserApiService(apiService); mca.setSocialInteractionsManager(new SocialInteractionsManager(mc, apiService)); mca.setProfileKeys(ProfileKeys.create(apiService, session, mc.runDirectory.toPath())); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/EasyMCAccount.java b/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/EasyMCAccount.java index e6f023df4e..52b1aeeef7 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/EasyMCAccount.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/EasyMCAccount.java @@ -21,7 +21,7 @@ public class EasyMCAccount extends Account { - private static final Environment ENVIRONMENT = new Environment("https://authserver.mojang.com", "https://sessionserver.easymc.io", "https://api.minecraftservices.com", "EasyMC"); + private static final Environment ENVIRONMENT = new Environment("https://sessionserver.easymc.io", "https://authserver.mojang.com", "EasyMC"); private static final YggdrasilAuthenticationService SERVICE = new YggdrasilAuthenticationService(((MinecraftClientAccessor) mc).getProxy(), ENVIRONMENT); public EasyMCAccount(String token) { 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 b1c37466f2..57f2df4bc2 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/TheAlteningAccount.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/TheAlteningAccount.java @@ -21,7 +21,7 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; public class TheAlteningAccount extends Account { - private static final Environment ENVIRONMENT = new Environment("http://authserver.thealtening.com", "http://sessionserver.thealtening.com", "https://api.minecraftservices.com", "The Altening"); + private static final Environment ENVIRONMENT = new Environment("http://sessionserver.thealtening.com", "http://authserver.thealtening.com", "The Altening"); private static final YggdrasilAuthenticationService SERVICE = new YggdrasilAuthenticationService(((MinecraftClientAccessor) mc).getProxy(), ENVIRONMENT); public TheAlteningAccount(String token) { @@ -68,7 +68,7 @@ public boolean login() { } private WaybackAuthLib getAuth() { - WaybackAuthLib auth = new WaybackAuthLib(ENVIRONMENT.accountsHost()); + WaybackAuthLib auth = new WaybackAuthLib(ENVIRONMENT.servicesHost()); auth.setUsername(name); auth.setPassword("Meteor on Crack!"); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/friends/Friend.java b/src/main/java/meteordevelopment/meteorclient/systems/friends/Friend.java index 16476b039a..8003a938f1 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/friends/Friend.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/friends/Friend.java @@ -31,7 +31,7 @@ public Friend(String name, @Nullable UUID id) { } public Friend(PlayerEntity player) { - this(player.getEntityName(), player.getUuid()); + this(player.getName().getString(), player.getUuid()); } public Friend(String name) { this(name, null); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/friends/Friends.java b/src/main/java/meteordevelopment/meteorclient/systems/friends/Friends.java index 7227e58c4d..3642319fa1 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/friends/Friends.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/friends/Friends.java @@ -65,7 +65,7 @@ public Friend get(String name) { } public Friend get(PlayerEntity player) { - return get(player.getEntityName()); + return get(player.getName().getString()); } public Friend get(PlayerListEntry player) { 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 b868e4012c..fe2e31086f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/CombatHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/CombatHud.java @@ -237,7 +237,7 @@ public void render(HudRenderer renderer) { String breakText = " | "; // Name - String nameText = playerEntity.getEntityName(); + String nameText = playerEntity.getName().getString(); Color nameColor = PlayerUtils.getPlayerColor(playerEntity, primaryColor); // Ping 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 2adbde96a8..879a45d708 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PlayerRadarHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PlayerRadarHud.java @@ -153,7 +153,7 @@ public void tick(HudRenderer renderer) { if (entity.equals(mc.player)) continue; if (!friends.get() && Friends.get().isFriend(entity)) continue; - String text = entity.getEntityName(); + String text = entity.getName().getString(); if (distance.get()) text += String.format("(%sm)", Math.round(mc.getCameraEntity().distanceTo(entity))); width = Math.max(width, renderer.textWidth(text, shadow.get(), getScale())); @@ -180,7 +180,7 @@ public void render(HudRenderer renderer) { if (entity.equals(mc.player)) continue; if (!friends.get() && Friends.get().isFriend(entity)) continue; - String text = entity.getEntityName(); + String text = entity.getName().getString(); Color color = PlayerUtils.getPlayerColor(entity, primaryColor.get()); String distanceText = null; 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 8a2e1c699a..5d3f0e99c3 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PotionTimersHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PotionTimersHud.java @@ -241,7 +241,7 @@ public void render(HudRenderer renderer) { } private String getString(StatusEffectInstance statusEffectInstance) { - return String.format("%s %d (%s)", Names.get(statusEffectInstance.getEffectType()), statusEffectInstance.getAmplifier() + 1, statusEffectInstance.isInfinite() ? "inf" : StringHelper.formatTicks(statusEffectInstance.getDuration())); //todo remove "inf" when font rendering can use symbols + return String.format("%s %d (%s)", Names.get(statusEffectInstance.getEffectType()), statusEffectInstance.getAmplifier() + 1, statusEffectInstance.isInfinite() ? "inf" : StringHelper.formatTicks(statusEffectInstance.getDuration(), mc.world.getTickManager().getTickRate())); //todo remove "inf" when font rendering can use symbols } private double getScale() { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java index ac14ca7ddc..c9b07c574d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java @@ -5,7 +5,6 @@ package meteordevelopment.meteorclient.systems.modules; -import com.google.common.collect.Ordering; import com.mojang.datafixers.util.Pair; import com.mojang.serialization.Lifecycle; import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap; @@ -170,7 +169,7 @@ public List getActive() { } public Set searchTitles(String text) { - Map modules = new ValueComparableMap<>(Ordering.natural()); + Map modules = new ValueComparableMap<>(Comparator.naturalOrder()); for (Module module : this.moduleInstances.values()) { int score = Utils.searchLevenshteinDefault(module.title, text, false); @@ -181,7 +180,7 @@ public Set searchTitles(String text) { } public Set searchSettingTitles(String text) { - Map modules = new ValueComparableMap<>(Ordering.natural()); + Map modules = new ValueComparableMap<>(Comparator.naturalOrder()); for (Module module : this.moduleInstances.values()) { int lowest = Integer.MAX_VALUE; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/DiscordPresence.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/DiscordPresence.java index 3750694c38..3ddd3c98ca 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/DiscordPresence.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/DiscordPresence.java @@ -25,13 +25,13 @@ import meteordevelopment.orbit.EventHandler; import meteordevelopment.starscript.Script; import net.minecraft.client.gui.screen.*; +import net.minecraft.client.gui.screen.multiplayer.AddServerScreen; +import net.minecraft.client.gui.screen.multiplayer.ConnectScreen; +import net.minecraft.client.gui.screen.multiplayer.DirectConnectScreen; import net.minecraft.client.gui.screen.multiplayer.MultiplayerScreen; import net.minecraft.client.gui.screen.option.*; import net.minecraft.client.gui.screen.pack.PackScreen; -import net.minecraft.client.gui.screen.world.CreateWorldScreen; -import net.minecraft.client.gui.screen.world.EditGameRulesScreen; -import net.minecraft.client.gui.screen.world.EditWorldScreen; -import net.minecraft.client.gui.screen.world.SelectWorldScreen; +import net.minecraft.client.gui.screen.world.*; import net.minecraft.client.realms.gui.screen.RealmsScreen; import net.minecraft.util.Pair; import net.minecraft.util.Util; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/MessageAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/MessageAura.java index 3c63a48401..23c795b191 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/MessageAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/MessageAura.java @@ -43,7 +43,7 @@ private void onEntityAdded(EntityAddedEvent event) { if (!(event.entity instanceof PlayerEntity) || event.entity.getUuid().equals(mc.player.getUuid())) return; if (!ignoreFriends.get() || (ignoreFriends.get() && !Friends.get().isFriend((PlayerEntity)event.entity))) { - ChatUtils.sendPlayerMsg("/msg " + event.entity.getEntityName() + " " + message.get()); + ChatUtils.sendPlayerMsg("/msg " + event.entity.getName().getString() + " " + message.get()); } } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java index adcbcb2825..4a91c48eee 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java @@ -154,7 +154,7 @@ private void onEntityAdded(EntityAddedEvent event) { if (!event.entity.getUuid().equals(mc.player.getUuid()) && entities.get().contains(event.entity.getType()) && visualRange.get() && this.event.get() != Event.Despawn) { if (event.entity instanceof PlayerEntity) { if ((!visualRangeIgnoreFriends.get() || !Friends.get().isFriend(((PlayerEntity) event.entity))) && (!visualRangeIgnoreFakes.get() || !(event.entity instanceof FakePlayerEntity))) { - ChatUtils.sendMsg(event.entity.getId() + 100, Formatting.GRAY, "(highlight)%s(default) has entered your visual range!", event.entity.getEntityName()); + ChatUtils.sendMsg(event.entity.getId() + 100, Formatting.GRAY, "(highlight)%s(default) has entered your visual range!", event.entity.getName().getString()); if (visualMakeSound.get()) mc.world.playSoundFromEntity(mc.player, mc.player, SoundEvents.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.AMBIENT, 3.0F, 1.0F); @@ -180,7 +180,7 @@ private void onEntityRemoved(EntityRemovedEvent event) { if (!event.entity.getUuid().equals(mc.player.getUuid()) && entities.get().contains(event.entity.getType()) && visualRange.get() && this.event.get() != Event.Spawn) { if (event.entity instanceof PlayerEntity) { if ((!visualRangeIgnoreFriends.get() || !Friends.get().isFriend(((PlayerEntity) event.entity))) && (!visualRangeIgnoreFakes.get() || !(event.entity instanceof FakePlayerEntity))) { - ChatUtils.sendMsg(event.entity.getId() + 100, Formatting.GRAY, "(highlight)%s(default) has left your visual range!", event.entity.getEntityName()); + ChatUtils.sendMsg(event.entity.getId() + 100, Formatting.GRAY, "(highlight)%s(default) has left your visual range!", event.entity.getName().getString()); if (visualMakeSound.get()) mc.world.playSoundFromEntity(mc.player, mc.player, SoundEvents.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.AMBIENT, 3.0F, 1.0F); @@ -202,7 +202,7 @@ private void onEntityRemoved(EntityRemovedEvent event) { if (pearl.getOwner() != null && pearl.getOwner() instanceof PlayerEntity p) { double d = pearlStartPosMap.get(i).distanceTo(e.getPos()); if ((!Friends.get().isFriend(p) || !pearlIgnoreFriends.get()) && (!p.equals(mc.player) || !pearlIgnoreOwn.get())) { - info("(highlight)%s's(default) pearl landed at %d, %d, %d (highlight)(%.1fm away, travelled %.1fm)(default).", pearl.getOwner().getEntityName(), pearl.getBlockPos().getX(), pearl.getBlockPos().getY(), pearl.getBlockPos().getZ(), pearl.distanceTo(mc.player), d); + info("(highlight)%s's(default) pearl landed at %d, %d, %d (highlight)(%.1fm away, travelled %.1fm)(default).", pearl.getOwner().getName().getString(), pearl.getBlockPos().getX(), pearl.getBlockPos().getY(), pearl.getBlockPos().getZ(), pearl.distanceTo(mc.player), d); } } pearlStartPosMap.remove(i); @@ -246,7 +246,7 @@ private void onReceivePacket(PacketEvent.Receive event) { int pops = totemPopMap.getOrDefault(entity.getUuid(), 0); totemPopMap.put(entity.getUuid(), ++pops); - ChatUtils.sendMsg(getChatId(entity), Formatting.GRAY, "(highlight)%s (default)popped (highlight)%d (default)%s.", entity.getEntityName(), pops, pops == 1 ? "totem" : "totems"); + ChatUtils.sendMsg(getChatId(entity), Formatting.GRAY, "(highlight)%s (default)popped (highlight)%d (default)%s.", entity.getName().getString(), pops, pops == 1 ? "totem" : "totems"); } } @@ -260,7 +260,7 @@ private void onTick(TickEvent.Post event) { if (player.deathTime > 0 || player.getHealth() <= 0) { int pops = totemPopMap.removeInt(player.getUuid()); - ChatUtils.sendMsg(getChatId(player), Formatting.GRAY, "(highlight)%s (default)died after popping (highlight)%d (default)%s.", player.getEntityName(), pops, pops == 1 ? "totem" : "totems"); + ChatUtils.sendMsg(getChatId(player), Formatting.GRAY, "(highlight)%s (default)died after popping (highlight)%d (default)%s.", player.getName().getString(), pops, pops == 1 ? "totem" : "totems"); chatIdMap.removeInt(player.getUuid()); } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/ServerSpoof.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/ServerSpoof.java index 94edd3b9b0..dd0b910d15 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/ServerSpoof.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/ServerSpoof.java @@ -100,12 +100,12 @@ private void onPacketRecieve(PacketEvent.Receive event) { if (!(event.packet instanceof ResourcePackSendS2CPacket packet)) return; event.cancel(); MutableText msg = Text.literal("This server has "); - msg.append(packet.isRequired() ? "a required " : "an optional "); + msg.append(packet.required() ? "a required " : "an optional "); MutableText link = Text.literal("resource pack"); link.setStyle(link.getStyle() .withColor(Formatting.BLUE) .withUnderline(true) - .withClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, packet.getUrl())) + .withClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, packet.url())) .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Text.literal("Click to download"))) ); msg.append(link); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java index 7410c1f427..f72e2fa1d0 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java @@ -189,7 +189,7 @@ private boolean shouldStopUsing(ItemStack itemStack) { public static double getScore(ItemStack itemStack, BlockState state, boolean silkTouchEnderChest, boolean fortuneOre, EnchantPreference enchantPreference, Predicate good) { if (!good.test(itemStack) || !isTool(itemStack)) return -1; - if (!itemStack.isSuitableFor(state) && !(itemStack.getItem() instanceof SwordItem && (state.getBlock() instanceof BambooBlock || state.getBlock() instanceof BambooSaplingBlock))) return -1; + if (!itemStack.isSuitableFor(state) && !(itemStack.getItem() instanceof SwordItem && (state.getBlock() instanceof BambooBlock || state.getBlock() instanceof BambooShootBlock))) return -1; if (silkTouchEnderChest && state.getBlock() == Blocks.ENDER_CHEST @@ -213,7 +213,7 @@ && isFortunable(state.getBlock()) if (enchantPreference == EnchantPreference.Fortune) score += EnchantmentHelper.getLevel(Enchantments.FORTUNE, itemStack); if (enchantPreference == EnchantPreference.SilkTouch) score += EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, itemStack); - if (itemStack.getItem() instanceof SwordItem item && (state.getBlock() instanceof BambooBlock || state.getBlock() instanceof BambooSaplingBlock)) + if (itemStack.getItem() instanceof SwordItem item && (state.getBlock() instanceof BambooBlock || state.getBlock() instanceof BambooShootBlock)) score += 9000 + (item.getMaterial().getMiningLevel() * 1000); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/FakePlayer.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/FakePlayer.java index 6946dfddf7..bd4480eea4 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/FakePlayer.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/FakePlayer.java @@ -56,7 +56,7 @@ public WWidget getWidget(GuiTheme theme) { private void fillTable(GuiTheme theme, WTable table) { for (FakePlayerEntity fakePlayer : FakePlayerManager.getFakePlayers()) { - table.add(theme.label(fakePlayer.getEntityName())); + table.add(theme.label(fakePlayer.getName().getString())); WMinus delete = table.add(theme.minus()).expandCellX().right().widget(); delete.action = () -> { FakePlayerManager.remove(fakePlayer); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/MiddleClickExtra.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/MiddleClickExtra.java index 0af7d1116e..6794b7735b 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/MiddleClickExtra.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/MiddleClickExtra.java @@ -98,11 +98,11 @@ private void onMouseButton(MouseButtonEvent event) { if (!Friends.get().isFriend(player)) { Friends.get().add(new Friend(player)); - info("Added %s to friends", player.getEntityName()); - if (message.get()) ChatUtils.sendPlayerMsg("/msg " + player.getEntityName() + " I just friended you on Meteor."); + info("Added %s to friends", player.getName().getString()); + if (message.get()) ChatUtils.sendPlayerMsg("/msg " + player.getName() + " I just friended you on Meteor."); } else { Friends.get().remove(Friends.get().get(player)); - info("Removed %s from friends", player.getEntityName()); + info("Removed %s from friends", player.getName().getString()); } return; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java index 4158e0646e..357dc14986 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java @@ -417,10 +417,10 @@ public void applyCompactShulkerTooltip(ItemStack stack, List tooltip) { private MutableText getStatusText(StatusEffectInstance effect) { MutableText text = Text.translatable(effect.getTranslationKey()); if (effect.getAmplifier() != 0) { - text.append(String.format(" %d (%s)", effect.getAmplifier() + 1, StatusEffectUtil.getDurationText(effect, 1).getString())); + text.append(String.format(" %d (%s)", effect.getAmplifier() + 1, StatusEffectUtil.getDurationText(effect, 1, mc.world.getTickManager().getTickRate()).getString())); } else { - text.append(String.format(" (%s)", StatusEffectUtil.getDurationText(effect, 1).getString())); + text.append(String.format(" (%s)", StatusEffectUtil.getDurationText(effect, 1, mc.world.getTickManager().getTickRate()).getString())); } if (effect.getEffectType().isBeneficial()) return text.formatted(Formatting.BLUE); @@ -436,7 +436,7 @@ private Text getFirstPage(ItemStack stack) { if (stack.getItem() == Items.WRITABLE_BOOK) return Text.literal(pages.getString(0)); try { - return Text.Serializer.fromLenientJson(pages.getString(0)); + return Text.Serialization.fromLenientJson(pages.getString(0)); } catch (JsonParseException e) { return Text.literal("Invalid book data"); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/EntityOwner.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/EntityOwner.java index cc1c4db427..5b2f672650 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/EntityOwner.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/EntityOwner.java @@ -110,7 +110,7 @@ private void renderNametag(String name) { private String getOwnerName(UUID uuid) { // Check if the player is online PlayerEntity player = mc.world.getPlayerByUuid(uuid); - if (player != null) return player.getEntityName(); + if (player != null) return player.getName().getString(); // Check cache String name = uuidToName.get(uuid); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/LogoutSpots.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/LogoutSpots.java index a750a33afb..4bba428fec 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/LogoutSpots.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/LogoutSpots.java @@ -217,7 +217,7 @@ public Entry(PlayerEntity entity) { height = entity.getBoundingBox().getLengthY(); uuid = entity.getUuid(); - name = entity.getEntityName(); + name = entity.getName().getString(); health = Math.round(entity.getHealth() + entity.getAbsorptionAmount()); maxHealth = Math.round(entity.getMaxHealth() + entity.getAbsorptionAmount()); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java index c343ce6bdc..79d51bc625 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java @@ -391,8 +391,8 @@ private void renderNametagPlayer(Render2DEvent event, PlayerEntity player, boole String name; Color nameColor = PlayerUtils.getPlayerColor(player, this.nameColor.get()); - if (player == mc.player) name = Modules.get().get(NameProtect.class).getName(player.getEntityName()); - else name = player.getEntityName(); + if (player == mc.player) name = Modules.get().get(NameProtect.class).getName(player.getName().getString()); + else name = player.getName().getString(); // Health float absorption = player.getAbsorptionAmount(); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Flamethrower.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Flamethrower.java index 3d6585f945..1eb6ff4e5d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Flamethrower.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Flamethrower.java @@ -125,7 +125,7 @@ private void interact() { Block block = mc.world.getBlockState(entity.getBlockPos()).getBlock(); Block bottom = mc.world.getBlockState(entity.getBlockPos().down()).getBlock(); if (block == Blocks.WATER || bottom == Blocks.WATER || bottom == Blocks.DIRT_PATH) return; - if (block == Blocks.GRASS) mc.interactionManager.attackBlock(entity.getBlockPos(), Direction.DOWN); + if (block == Blocks.GRASS_BLOCK) mc.interactionManager.attackBlock(entity.getBlockPos(), Direction.DOWN); if (putOutFire.get() && entity instanceof LivingEntity animal && animal.getHealth() < 1) { mc.interactionManager.attackBlock(entity.getBlockPos(), Direction.DOWN); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java index b3123ee743..ff2eff1a99 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java @@ -275,7 +275,7 @@ private void onRender(Render3DEvent event) { if (enableRenderBounding.get()){ // Render bounding box if cube and should break stuff if (shape.get() != Shape.Sphere && mode.get() != Mode.Smash) { - box = new Box(pos1, pos2); + box = new Box(pos1.toCenterPos(), pos2.toCenterPos()); event.renderer.box(box, sideColorBox.get(), lineColorBox.get(), shapeModeBox.get(), 0); } } @@ -341,7 +341,7 @@ private void onTickPre(TickEvent.Pre event) { if (mode.get() == Mode.Flatten){ pos1.setY((int) Math.floor(pY)); } - box = new Box(pos1, pos2); + box = new Box(pos1.toCenterPos(), pos2.toCenterPos()); // Find blocks to break BlockIterator.register(Math.max((int) Math.ceil(range.get()+1), maxh), Math.max((int) Math.ceil(range.get()), maxv), (blockPos, blockState) -> { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/VeinMiner.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/VeinMiner.java index 36781f8748..ca985ce861 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/VeinMiner.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/VeinMiner.java @@ -5,7 +5,6 @@ package meteordevelopment.meteorclient.systems.modules.world; -import com.google.common.collect.Sets; import meteordevelopment.meteorclient.events.entity.player.StartBreakingBlockEvent; import meteordevelopment.meteorclient.events.render.Render3DEvent; import meteordevelopment.meteorclient.events.world.TickEvent; @@ -37,7 +36,7 @@ public class VeinMiner extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); private final SettingGroup sgRender = settings.createGroup("Render"); - private final Set blockNeighbours = Sets.newHashSet( + private final Set blockNeighbours = Set.of( new Vec3i(1, -1, 1), new Vec3i(0, -1, 1), new Vec3i(-1, -1, 1), new Vec3i(1, -1, 0), new Vec3i(0, -1, 0), new Vec3i(-1, -1, 0), new Vec3i(1, -1, -1), new Vec3i(0, -1, -1), new Vec3i(-1, -1, -1), @@ -56,7 +55,7 @@ public class VeinMiner extends Module { private final Setting> selectedBlocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") .description("Which blocks to select.") - .defaultValue(Blocks.STONE, Blocks.DIRT, Blocks.GRASS) + .defaultValue(Blocks.STONE, Blocks.DIRT, Blocks.GRASS_BLOCK) .build() ); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityUtils.java index c89f3e83e5..3fa73c7704 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityUtils.java @@ -139,7 +139,7 @@ public static BlockPos getCityBlock(PlayerEntity player) { public static String getName(Entity entity) { if (entity == null) return null; - if (entity instanceof PlayerEntity) return entity.getEntityName(); + if (entity instanceof PlayerEntity) return entity.getName().getString(); return entity.getType().getName().getString(); } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/fakeplayer/FakePlayerManager.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/fakeplayer/FakePlayerManager.java index b6fe58d550..b05a47c29a 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/entity/fakeplayer/FakePlayerManager.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/entity/fakeplayer/FakePlayerManager.java @@ -23,7 +23,7 @@ public static List getFakePlayers() { public static FakePlayerEntity get(String name) { for (FakePlayerEntity fp : ENTITIES) { - if (fp.getEntityName().equals(name)) return fp; + if (fp.getName().getString().equals(name)) return fp; } return null; @@ -39,7 +39,7 @@ public static void add(String name, float health, boolean copyInv) { public static void remove(FakePlayerEntity fp) { ENTITIES.removeIf(fp1 -> { - if (fp1.getEntityName().equals(fp.getEntityName())) { + if (fp1.getName().getString().equals(fp.getName().getString())) { fp1.despawn(); return true; } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/NbtUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/NbtUtils.java index 2d961e52b3..9ccca937a3 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/NbtUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/NbtUtils.java @@ -8,10 +8,7 @@ import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.systems.System; import meteordevelopment.meteorclient.utils.render.prompts.OkPrompt; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtElement; -import net.minecraft.nbt.NbtIo; -import net.minecraft.nbt.NbtList; +import net.minecraft.nbt.*; import org.apache.commons.io.output.ByteArrayOutputStream; import java.io.ByteArrayInputStream; @@ -89,7 +86,7 @@ public static NbtCompound fromClipboard(NbtCompound schema) { byte[] data = Base64.getDecoder().decode(mc.keyboard.getClipboard().trim()); ByteArrayInputStream bis = new ByteArrayInputStream(data); - NbtCompound pasted = NbtIo.readCompressed(new DataInputStream(bis)); + NbtCompound pasted = NbtIo.readCompressed(new DataInputStream(bis), NbtTagSizeTracker.ofUnlimitedBytes()); for (String key : schema.getKeys()) if (!pasted.getKeys().contains(key)) return null; if (!pasted.getString("name").equals(schema.getString("name"))) return null; diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/ValueComparableMap.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/ValueComparableMap.java index 04d953a26b..a5046c916e 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/ValueComparableMap.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/ValueComparableMap.java @@ -5,29 +5,31 @@ package meteordevelopment.meteorclient.utils.misc; -import com.google.common.collect.Ordering; - import java.util.Comparator; import java.util.HashMap; import java.util.Map; import java.util.TreeMap; public class ValueComparableMap, V> extends TreeMap { - private final Map valueMap; + private final transient Map valueMap; - public ValueComparableMap(final Ordering partialValueOrdering) { - this(partialValueOrdering, new HashMap()); + public ValueComparableMap(final Comparator partialValueComparator) { + this(partialValueComparator, new HashMap<>()); } - private ValueComparableMap(Ordering partialValueOrdering, HashMap valueMap) { - super(partialValueOrdering.onResultOf(valueMap::get).compound(Comparator.naturalOrder())); + private ValueComparableMap(Comparator partialValueComparator, HashMap valueMap) { + super((k1, k2) -> { + int cmp = partialValueComparator.compare(valueMap.get(k1), valueMap.get(k2)); + return cmp != 0 ? cmp : k1.compareTo(k2); + }); + this.valueMap = valueMap; } @Override public V put(K k, V v) { if (valueMap.containsKey(k)) remove(k); - valueMap.put(k,v); + valueMap.put(k, v); return super.put(k, v); } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtils.java index 76494d2559..f20229eda3 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtils.java @@ -5,7 +5,6 @@ package meteordevelopment.meteorclient.utils.network; -import com.google.common.collect.Iterators; import com.mojang.datafixers.util.Pair; import com.mojang.serialization.Lifecycle; import meteordevelopment.meteorclient.utils.misc.MeteorIdentifier; @@ -19,10 +18,11 @@ import net.minecraft.util.Identifier; import net.minecraft.util.math.random.Random; import org.jetbrains.annotations.NotNull; + import java.util.*; import java.util.stream.Stream; -public class PacketUtils { +public abstract class PacketUtils { public static final Registry>> REGISTRY = new PacketRegistry(); private static final Map>, String> S2C_PACKETS = new HashMap<>(); @@ -38,10 +38,10 @@ public class PacketUtils { C2S_PACKETS_R.put("PlayerInteractItemC2SPacket", net.minecraft.network.packet.c2s.play.PlayerInteractItemC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.login.EnterConfigurationC2SPacket.class, "EnterConfigurationC2SPacket"); C2S_PACKETS_R.put("EnterConfigurationC2SPacket", net.minecraft.network.packet.c2s.login.EnterConfigurationC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket.class, "PlayerActionC2SPacket"); - C2S_PACKETS_R.put("PlayerActionC2SPacket", net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.SelectMerchantTradeC2SPacket.class, "SelectMerchantTradeC2SPacket"); C2S_PACKETS_R.put("SelectMerchantTradeC2SPacket", net.minecraft.network.packet.c2s.play.SelectMerchantTradeC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket.class, "PlayerActionC2SPacket"); + C2S_PACKETS_R.put("PlayerActionC2SPacket", net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.CommandExecutionC2SPacket.class, "CommandExecutionC2SPacket"); C2S_PACKETS_R.put("CommandExecutionC2SPacket", net.minecraft.network.packet.c2s.play.CommandExecutionC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.RenameItemC2SPacket.class, "RenameItemC2SPacket"); @@ -54,30 +54,30 @@ public class PacketUtils { C2S_PACKETS_R.put("QueryBlockNbtC2SPacket", net.minecraft.network.packet.c2s.play.QueryBlockNbtC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.PlayerInteractEntityC2SPacket.class, "PlayerInteractEntityC2SPacket"); C2S_PACKETS_R.put("PlayerInteractEntityC2SPacket", net.minecraft.network.packet.c2s.play.PlayerInteractEntityC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.AcknowledgeReconfigurationC2SPacket.class, "AcknowledgeReconfigurationC2SPacket"); - C2S_PACKETS_R.put("AcknowledgeReconfigurationC2SPacket", net.minecraft.network.packet.c2s.play.AcknowledgeReconfigurationC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.RequestCommandCompletionsC2SPacket.class, "RequestCommandCompletionsC2SPacket"); - C2S_PACKETS_R.put("RequestCommandCompletionsC2SPacket", net.minecraft.network.packet.c2s.play.RequestCommandCompletionsC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdatePlayerAbilitiesC2SPacket.class, "UpdatePlayerAbilitiesC2SPacket"); C2S_PACKETS_R.put("UpdatePlayerAbilitiesC2SPacket", net.minecraft.network.packet.c2s.play.UpdatePlayerAbilitiesC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.RequestCommandCompletionsC2SPacket.class, "RequestCommandCompletionsC2SPacket"); + C2S_PACKETS_R.put("RequestCommandCompletionsC2SPacket", net.minecraft.network.packet.c2s.play.RequestCommandCompletionsC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.AcknowledgeReconfigurationC2SPacket.class, "AcknowledgeReconfigurationC2SPacket"); + C2S_PACKETS_R.put("AcknowledgeReconfigurationC2SPacket", net.minecraft.network.packet.c2s.play.AcknowledgeReconfigurationC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.query.QueryRequestC2SPacket.class, "QueryRequestC2SPacket"); C2S_PACKETS_R.put("QueryRequestC2SPacket", net.minecraft.network.packet.c2s.query.QueryRequestC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdateCommandBlockC2SPacket.class, "UpdateCommandBlockC2SPacket"); C2S_PACKETS_R.put("UpdateCommandBlockC2SPacket", net.minecraft.network.packet.c2s.play.UpdateCommandBlockC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.HandSwingC2SPacket.class, "HandSwingC2SPacket"); C2S_PACKETS_R.put("HandSwingC2SPacket", net.minecraft.network.packet.c2s.play.HandSwingC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.ClickSlotC2SPacket.class, "ClickSlotC2SPacket"); - C2S_PACKETS_R.put("ClickSlotC2SPacket", net.minecraft.network.packet.c2s.play.ClickSlotC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.AdvancementTabC2SPacket.class, "AdvancementTabC2SPacket"); C2S_PACKETS_R.put("AdvancementTabC2SPacket", net.minecraft.network.packet.c2s.play.AdvancementTabC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.ClickSlotC2SPacket.class, "ClickSlotC2SPacket"); + C2S_PACKETS_R.put("ClickSlotC2SPacket", net.minecraft.network.packet.c2s.play.ClickSlotC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.AcknowledgeChunksC2SPacket.class, "AcknowledgeChunksC2SPacket"); C2S_PACKETS_R.put("AcknowledgeChunksC2SPacket", net.minecraft.network.packet.c2s.play.AcknowledgeChunksC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.SpectatorTeleportC2SPacket.class, "SpectatorTeleportC2SPacket"); C2S_PACKETS_R.put("SpectatorTeleportC2SPacket", net.minecraft.network.packet.c2s.play.SpectatorTeleportC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdateDifficultyLockC2SPacket.class, "UpdateDifficultyLockC2SPacket"); - C2S_PACKETS_R.put("UpdateDifficultyLockC2SPacket", net.minecraft.network.packet.c2s.play.UpdateDifficultyLockC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.login.LoginKeyC2SPacket.class, "LoginKeyC2SPacket"); C2S_PACKETS_R.put("LoginKeyC2SPacket", net.minecraft.network.packet.c2s.login.LoginKeyC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdateDifficultyLockC2SPacket.class, "UpdateDifficultyLockC2SPacket"); + C2S_PACKETS_R.put("UpdateDifficultyLockC2SPacket", net.minecraft.network.packet.c2s.play.UpdateDifficultyLockC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.JigsawGeneratingC2SPacket.class, "JigsawGeneratingC2SPacket"); C2S_PACKETS_R.put("JigsawGeneratingC2SPacket", net.minecraft.network.packet.c2s.play.JigsawGeneratingC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.QueryEntityNbtC2SPacket.class, "QueryEntityNbtC2SPacket"); @@ -92,14 +92,16 @@ public class PacketUtils { C2S_PACKETS_R.put("PlayerMoveC2SPacket", net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.common.ClientOptionsC2SPacket.class, "ClientOptionsC2SPacket"); C2S_PACKETS_R.put("ClientOptionsC2SPacket", net.minecraft.network.packet.c2s.common.ClientOptionsC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.common.CustomPayloadC2SPacket.class, "CustomPayloadC2SPacket"); - C2S_PACKETS_R.put("CustomPayloadC2SPacket", net.minecraft.network.packet.c2s.common.CustomPayloadC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.PickFromInventoryC2SPacket.class, "PickFromInventoryC2SPacket"); C2S_PACKETS_R.put("PickFromInventoryC2SPacket", net.minecraft.network.packet.c2s.play.PickFromInventoryC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.common.CustomPayloadC2SPacket.class, "CustomPayloadC2SPacket"); + C2S_PACKETS_R.put("CustomPayloadC2SPacket", net.minecraft.network.packet.c2s.common.CustomPayloadC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.PlayerSessionC2SPacket.class, "PlayerSessionC2SPacket"); C2S_PACKETS_R.put("PlayerSessionC2SPacket", net.minecraft.network.packet.c2s.play.PlayerSessionC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.CloseHandledScreenC2SPacket.class, "CloseHandledScreenC2SPacket"); C2S_PACKETS_R.put("CloseHandledScreenC2SPacket", net.minecraft.network.packet.c2s.play.CloseHandledScreenC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.SlotChangedStateC2SPacket.class, "SlotChangedStateC2SPacket"); + C2S_PACKETS_R.put("SlotChangedStateC2SPacket", net.minecraft.network.packet.c2s.play.SlotChangedStateC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.config.ReadyC2SPacket.class, "ReadyC2SPacket"); C2S_PACKETS_R.put("ReadyC2SPacket", net.minecraft.network.packet.c2s.config.ReadyC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.BoatPaddleStateC2SPacket.class, "BoatPaddleStateC2SPacket"); @@ -110,10 +112,10 @@ public class PacketUtils { C2S_PACKETS_R.put("ButtonClickC2SPacket", net.minecraft.network.packet.c2s.play.ButtonClickC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdateBeaconC2SPacket.class, "UpdateBeaconC2SPacket"); C2S_PACKETS_R.put("UpdateBeaconC2SPacket", net.minecraft.network.packet.c2s.play.UpdateBeaconC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.TeleportConfirmC2SPacket.class, "TeleportConfirmC2SPacket"); - C2S_PACKETS_R.put("TeleportConfirmC2SPacket", net.minecraft.network.packet.c2s.play.TeleportConfirmC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdateSignC2SPacket.class, "UpdateSignC2SPacket"); C2S_PACKETS_R.put("UpdateSignC2SPacket", net.minecraft.network.packet.c2s.play.UpdateSignC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.TeleportConfirmC2SPacket.class, "TeleportConfirmC2SPacket"); + C2S_PACKETS_R.put("TeleportConfirmC2SPacket", net.minecraft.network.packet.c2s.play.TeleportConfirmC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdateStructureBlockC2SPacket.class, "UpdateStructureBlockC2SPacket"); C2S_PACKETS_R.put("UpdateStructureBlockC2SPacket", net.minecraft.network.packet.c2s.play.UpdateStructureBlockC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdateCommandBlockMinecartC2SPacket.class, "UpdateCommandBlockMinecartC2SPacket"); @@ -132,18 +134,18 @@ public class PacketUtils { C2S_PACKETS_R.put("MessageAcknowledgmentC2SPacket", net.minecraft.network.packet.c2s.play.MessageAcknowledgmentC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.common.KeepAliveC2SPacket.class, "KeepAliveC2SPacket"); C2S_PACKETS_R.put("KeepAliveC2SPacket", net.minecraft.network.packet.c2s.common.KeepAliveC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.VehicleMoveC2SPacket.class, "VehicleMoveC2SPacket"); - C2S_PACKETS_R.put("VehicleMoveC2SPacket", net.minecraft.network.packet.c2s.play.VehicleMoveC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.CreativeInventoryActionC2SPacket.class, "CreativeInventoryActionC2SPacket"); C2S_PACKETS_R.put("CreativeInventoryActionC2SPacket", net.minecraft.network.packet.c2s.play.CreativeInventoryActionC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.VehicleMoveC2SPacket.class, "VehicleMoveC2SPacket"); + C2S_PACKETS_R.put("VehicleMoveC2SPacket", net.minecraft.network.packet.c2s.play.VehicleMoveC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.BookUpdateC2SPacket.class, "BookUpdateC2SPacket"); C2S_PACKETS_R.put("BookUpdateC2SPacket", net.minecraft.network.packet.c2s.play.BookUpdateC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.RecipeBookDataC2SPacket.class, "RecipeBookDataC2SPacket"); C2S_PACKETS_R.put("RecipeBookDataC2SPacket", net.minecraft.network.packet.c2s.play.RecipeBookDataC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.handshake.HandshakeC2SPacket.class, "HandshakeC2SPacket"); - C2S_PACKETS_R.put("HandshakeC2SPacket", net.minecraft.network.packet.c2s.handshake.HandshakeC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.login.LoginQueryResponseC2SPacket.class, "LoginQueryResponseC2SPacket"); C2S_PACKETS_R.put("LoginQueryResponseC2SPacket", net.minecraft.network.packet.c2s.login.LoginQueryResponseC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.handshake.HandshakeC2SPacket.class, "HandshakeC2SPacket"); + C2S_PACKETS_R.put("HandshakeC2SPacket", net.minecraft.network.packet.c2s.handshake.HandshakeC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdateDifficultyC2SPacket.class, "UpdateDifficultyC2SPacket"); C2S_PACKETS_R.put("UpdateDifficultyC2SPacket", net.minecraft.network.packet.c2s.play.UpdateDifficultyC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.CraftRequestC2SPacket.class, "CraftRequestC2SPacket"); @@ -181,36 +183,38 @@ public class PacketUtils { S2C_PACKETS_R.put("ResourcePackSendS2CPacket", net.minecraft.network.packet.s2c.common.ResourcePackSendS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.DamageTiltS2CPacket.class, "DamageTiltS2CPacket"); S2C_PACKETS_R.put("DamageTiltS2CPacket", net.minecraft.network.packet.s2c.play.DamageTiltS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.StatisticsS2CPacket.class, "StatisticsS2CPacket"); - S2C_PACKETS_R.put("StatisticsS2CPacket", net.minecraft.network.packet.s2c.play.StatisticsS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.CraftFailedResponseS2CPacket.class, "CraftFailedResponseS2CPacket"); S2C_PACKETS_R.put("CraftFailedResponseS2CPacket", net.minecraft.network.packet.s2c.play.CraftFailedResponseS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.StatisticsS2CPacket.class, "StatisticsS2CPacket"); + S2C_PACKETS_R.put("StatisticsS2CPacket", net.minecraft.network.packet.s2c.play.StatisticsS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.login.LoginQueryRequestS2CPacket.class, "LoginQueryRequestS2CPacket"); S2C_PACKETS_R.put("LoginQueryRequestS2CPacket", net.minecraft.network.packet.s2c.login.LoginQueryRequestS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.VehicleMoveS2CPacket.class, "VehicleMoveS2CPacket"); S2C_PACKETS_R.put("VehicleMoveS2CPacket", net.minecraft.network.packet.s2c.play.VehicleMoveS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityAttributesS2CPacket.class, "EntityAttributesS2CPacket"); S2C_PACKETS_R.put("EntityAttributesS2CPacket", net.minecraft.network.packet.s2c.play.EntityAttributesS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ScoreboardObjectiveUpdateS2CPacket.class, "ScoreboardObjectiveUpdateS2CPacket"); - S2C_PACKETS_R.put("ScoreboardObjectiveUpdateS2CPacket", net.minecraft.network.packet.s2c.play.ScoreboardObjectiveUpdateS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.TickStepS2CPacket.class, "TickStepS2CPacket"); + S2C_PACKETS_R.put("TickStepS2CPacket", net.minecraft.network.packet.s2c.play.TickStepS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.StopSoundS2CPacket.class, "StopSoundS2CPacket"); S2C_PACKETS_R.put("StopSoundS2CPacket", net.minecraft.network.packet.s2c.play.StopSoundS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ScoreboardObjectiveUpdateS2CPacket.class, "ScoreboardObjectiveUpdateS2CPacket"); + S2C_PACKETS_R.put("ScoreboardObjectiveUpdateS2CPacket", net.minecraft.network.packet.s2c.play.ScoreboardObjectiveUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.StartChunkSendS2CPacket.class, "StartChunkSendS2CPacket"); S2C_PACKETS_R.put("StartChunkSendS2CPacket", net.minecraft.network.packet.s2c.play.StartChunkSendS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntitySetHeadYawS2CPacket.class, "EntitySetHeadYawS2CPacket"); S2C_PACKETS_R.put("EntitySetHeadYawS2CPacket", net.minecraft.network.packet.s2c.play.EntitySetHeadYawS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.SetTradeOffersS2CPacket.class, "SetTradeOffersS2CPacket"); - S2C_PACKETS_R.put("SetTradeOffersS2CPacket", net.minecraft.network.packet.s2c.play.SetTradeOffersS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.SelectAdvancementTabS2CPacket.class, "SelectAdvancementTabS2CPacket"); S2C_PACKETS_R.put("SelectAdvancementTabS2CPacket", net.minecraft.network.packet.s2c.play.SelectAdvancementTabS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.SetTradeOffersS2CPacket.class, "SetTradeOffersS2CPacket"); + S2C_PACKETS_R.put("SetTradeOffersS2CPacket", net.minecraft.network.packet.s2c.play.SetTradeOffersS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlaySoundS2CPacket.class, "PlaySoundS2CPacket"); S2C_PACKETS_R.put("PlaySoundS2CPacket", net.minecraft.network.packet.s2c.play.PlaySoundS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.BlockEventS2CPacket.class, "BlockEventS2CPacket"); S2C_PACKETS_R.put("BlockEventS2CPacket", net.minecraft.network.packet.s2c.play.BlockEventS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ChunkSentS2CPacket.class, "ChunkSentS2CPacket"); - S2C_PACKETS_R.put("ChunkSentS2CPacket", net.minecraft.network.packet.s2c.play.ChunkSentS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlayerPositionLookS2CPacket.class, "PlayerPositionLookS2CPacket"); S2C_PACKETS_R.put("PlayerPositionLookS2CPacket", net.minecraft.network.packet.s2c.play.PlayerPositionLookS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ChunkSentS2CPacket.class, "ChunkSentS2CPacket"); + S2C_PACKETS_R.put("ChunkSentS2CPacket", net.minecraft.network.packet.s2c.play.ChunkSentS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.HealthUpdateS2CPacket.class, "HealthUpdateS2CPacket"); S2C_PACKETS_R.put("HealthUpdateS2CPacket", net.minecraft.network.packet.s2c.play.HealthUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.WorldEventS2CPacket.class, "WorldEventS2CPacket"); @@ -229,12 +233,12 @@ public class PacketUtils { S2C_PACKETS_R.put("TeamS2CPacket", net.minecraft.network.packet.s2c.play.TeamS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.CooldownUpdateS2CPacket.class, "CooldownUpdateS2CPacket"); S2C_PACKETS_R.put("CooldownUpdateS2CPacket", net.minecraft.network.packet.s2c.play.CooldownUpdateS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.OpenScreenS2CPacket.class, "OpenScreenS2CPacket"); + S2C_PACKETS_R.put("OpenScreenS2CPacket", net.minecraft.network.packet.s2c.play.OpenScreenS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ExperienceOrbSpawnS2CPacket.class, "ExperienceOrbSpawnS2CPacket"); S2C_PACKETS_R.put("ExperienceOrbSpawnS2CPacket", net.minecraft.network.packet.s2c.play.ExperienceOrbSpawnS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityAnimationS2CPacket.class, "EntityAnimationS2CPacket"); S2C_PACKETS_R.put("EntityAnimationS2CPacket", net.minecraft.network.packet.s2c.play.EntityAnimationS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.OpenScreenS2CPacket.class, "OpenScreenS2CPacket"); - S2C_PACKETS_R.put("OpenScreenS2CPacket", net.minecraft.network.packet.s2c.play.OpenScreenS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlayerAbilitiesS2CPacket.class, "PlayerAbilitiesS2CPacket"); S2C_PACKETS_R.put("PlayerAbilitiesS2CPacket", net.minecraft.network.packet.s2c.play.PlayerAbilitiesS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.WorldBorderWarningBlocksChangedS2CPacket.class, "WorldBorderWarningBlocksChangedS2CPacket"); @@ -247,10 +251,10 @@ public class PacketUtils { S2C_PACKETS_R.put("UnlockRecipesS2CPacket", net.minecraft.network.packet.s2c.play.UnlockRecipesS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.LightUpdateS2CPacket.class, "LightUpdateS2CPacket"); S2C_PACKETS_R.put("LightUpdateS2CPacket", net.minecraft.network.packet.s2c.play.LightUpdateS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.WorldBorderInitializeS2CPacket.class, "WorldBorderInitializeS2CPacket"); - S2C_PACKETS_R.put("WorldBorderInitializeS2CPacket", net.minecraft.network.packet.s2c.play.WorldBorderInitializeS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.OverlayMessageS2CPacket.class, "OverlayMessageS2CPacket"); S2C_PACKETS_R.put("OverlayMessageS2CPacket", net.minecraft.network.packet.s2c.play.OverlayMessageS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.WorldBorderInitializeS2CPacket.class, "WorldBorderInitializeS2CPacket"); + S2C_PACKETS_R.put("WorldBorderInitializeS2CPacket", net.minecraft.network.packet.s2c.play.WorldBorderInitializeS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.WorldBorderCenterChangedS2CPacket.class, "WorldBorderCenterChangedS2CPacket"); S2C_PACKETS_R.put("WorldBorderCenterChangedS2CPacket", net.minecraft.network.packet.s2c.play.WorldBorderCenterChangedS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityVelocityUpdateS2CPacket.class, "EntityVelocityUpdateS2CPacket"); @@ -259,10 +263,12 @@ public class PacketUtils { S2C_PACKETS_R.put("DifficultyS2CPacket", net.minecraft.network.packet.s2c.play.DifficultyS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.LookAtS2CPacket.class, "LookAtS2CPacket"); S2C_PACKETS_R.put("LookAtS2CPacket", net.minecraft.network.packet.s2c.play.LookAtS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ScreenHandlerPropertyUpdateS2CPacket.class, "ScreenHandlerPropertyUpdateS2CPacket"); - S2C_PACKETS_R.put("ScreenHandlerPropertyUpdateS2CPacket", net.minecraft.network.packet.s2c.play.ScreenHandlerPropertyUpdateS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ScoreboardScoreUpdateS2CPacket.class, "ScoreboardScoreUpdateS2CPacket"); + S2C_PACKETS_R.put("ScoreboardScoreUpdateS2CPacket", net.minecraft.network.packet.s2c.play.ScoreboardScoreUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.TitleS2CPacket.class, "TitleS2CPacket"); S2C_PACKETS_R.put("TitleS2CPacket", net.minecraft.network.packet.s2c.play.TitleS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ScreenHandlerPropertyUpdateS2CPacket.class, "ScreenHandlerPropertyUpdateS2CPacket"); + S2C_PACKETS_R.put("ScreenHandlerPropertyUpdateS2CPacket", net.minecraft.network.packet.s2c.play.ScreenHandlerPropertyUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.OpenHorseScreenS2CPacket.class, "OpenHorseScreenS2CPacket"); S2C_PACKETS_R.put("OpenHorseScreenS2CPacket", net.minecraft.network.packet.s2c.play.OpenHorseScreenS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.SimulationDistanceS2CPacket.class, "SimulationDistanceS2CPacket"); @@ -277,36 +283,38 @@ public class PacketUtils { S2C_PACKETS_R.put("DeathMessageS2CPacket", net.minecraft.network.packet.s2c.play.DeathMessageS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.MapUpdateS2CPacket.class, "MapUpdateS2CPacket"); S2C_PACKETS_R.put("MapUpdateS2CPacket", net.minecraft.network.packet.s2c.play.MapUpdateS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.BlockEntityUpdateS2CPacket.class, "BlockEntityUpdateS2CPacket"); - S2C_PACKETS_R.put("BlockEntityUpdateS2CPacket", net.minecraft.network.packet.s2c.play.BlockEntityUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ScreenHandlerSlotUpdateS2CPacket.class, "ScreenHandlerSlotUpdateS2CPacket"); S2C_PACKETS_R.put("ScreenHandlerSlotUpdateS2CPacket", net.minecraft.network.packet.s2c.play.ScreenHandlerSlotUpdateS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.BlockEntityUpdateS2CPacket.class, "BlockEntityUpdateS2CPacket"); + S2C_PACKETS_R.put("BlockEntityUpdateS2CPacket", net.minecraft.network.packet.s2c.play.BlockEntityUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlayerSpawnPositionS2CPacket.class, "PlayerSpawnPositionS2CPacket"); S2C_PACKETS_R.put("PlayerSpawnPositionS2CPacket", net.minecraft.network.packet.s2c.play.PlayerSpawnPositionS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityStatusEffectS2CPacket.class, "EntityStatusEffectS2CPacket"); S2C_PACKETS_R.put("EntityStatusEffectS2CPacket", net.minecraft.network.packet.s2c.play.EntityStatusEffectS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ClearTitleS2CPacket.class, "ClearTitleS2CPacket"); S2C_PACKETS_R.put("ClearTitleS2CPacket", net.minecraft.network.packet.s2c.play.ClearTitleS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.CommandTreeS2CPacket.class, "CommandTreeS2CPacket"); - S2C_PACKETS_R.put("CommandTreeS2CPacket", net.minecraft.network.packet.s2c.play.CommandTreeS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.login.LoginCompressionS2CPacket.class, "LoginCompressionS2CPacket"); S2C_PACKETS_R.put("LoginCompressionS2CPacket", net.minecraft.network.packet.s2c.login.LoginCompressionS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.CommandTreeS2CPacket.class, "CommandTreeS2CPacket"); + S2C_PACKETS_R.put("CommandTreeS2CPacket", net.minecraft.network.packet.s2c.play.CommandTreeS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.common.CommonPingS2CPacket.class, "CommonPingS2CPacket"); S2C_PACKETS_R.put("CommonPingS2CPacket", net.minecraft.network.packet.s2c.common.CommonPingS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ScoreboardScoreResetS2CPacket.class, "ScoreboardScoreResetS2CPacket"); + S2C_PACKETS_R.put("ScoreboardScoreResetS2CPacket", net.minecraft.network.packet.s2c.play.ScoreboardScoreResetS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.TitleFadeS2CPacket.class, "TitleFadeS2CPacket"); S2C_PACKETS_R.put("TitleFadeS2CPacket", net.minecraft.network.packet.s2c.play.TitleFadeS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.query.PingResultS2CPacket.class, "PingResultS2CPacket"); S2C_PACKETS_R.put("PingResultS2CPacket", net.minecraft.network.packet.s2c.query.PingResultS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlayerActionResponseS2CPacket.class, "PlayerActionResponseS2CPacket"); - S2C_PACKETS_R.put("PlayerActionResponseS2CPacket", net.minecraft.network.packet.s2c.play.PlayerActionResponseS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.UpdateTickRateS2CPacket.class, "UpdateTickRateS2CPacket"); + S2C_PACKETS_R.put("UpdateTickRateS2CPacket", net.minecraft.network.packet.s2c.play.UpdateTickRateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.InventoryS2CPacket.class, "InventoryS2CPacket"); S2C_PACKETS_R.put("InventoryS2CPacket", net.minecraft.network.packet.s2c.play.InventoryS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlayerActionResponseS2CPacket.class, "PlayerActionResponseS2CPacket"); + S2C_PACKETS_R.put("PlayerActionResponseS2CPacket", net.minecraft.network.packet.s2c.play.PlayerActionResponseS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ChunkBiomeDataS2CPacket.class, "ChunkBiomeDataS2CPacket"); S2C_PACKETS_R.put("ChunkBiomeDataS2CPacket", net.minecraft.network.packet.s2c.play.ChunkBiomeDataS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.WorldBorderWarningTimeChangedS2CPacket.class, "WorldBorderWarningTimeChangedS2CPacket"); S2C_PACKETS_R.put("WorldBorderWarningTimeChangedS2CPacket", net.minecraft.network.packet.s2c.play.WorldBorderWarningTimeChangedS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ScoreboardPlayerUpdateS2CPacket.class, "ScoreboardPlayerUpdateS2CPacket"); - S2C_PACKETS_R.put("ScoreboardPlayerUpdateS2CPacket", net.minecraft.network.packet.s2c.play.ScoreboardPlayerUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityDamageS2CPacket.class, "EntityDamageS2CPacket"); S2C_PACKETS_R.put("EntityDamageS2CPacket", net.minecraft.network.packet.s2c.play.EntityDamageS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ChatMessageS2CPacket.class, "ChatMessageS2CPacket"); @@ -315,20 +323,22 @@ public class PacketUtils { S2C_PACKETS_R.put("KeepAliveS2CPacket", net.minecraft.network.packet.s2c.common.KeepAliveS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.OpenWrittenBookS2CPacket.class, "OpenWrittenBookS2CPacket"); S2C_PACKETS_R.put("OpenWrittenBookS2CPacket", net.minecraft.network.packet.s2c.play.OpenWrittenBookS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.WorldTimeUpdateS2CPacket.class, "WorldTimeUpdateS2CPacket"); - S2C_PACKETS_R.put("WorldTimeUpdateS2CPacket", net.minecraft.network.packet.s2c.play.WorldTimeUpdateS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.common.ResourcePackRemoveS2CPacket.class, "ResourcePackRemoveS2CPacket"); + S2C_PACKETS_R.put("ResourcePackRemoveS2CPacket", net.minecraft.network.packet.s2c.common.ResourcePackRemoveS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlaySoundFromEntityS2CPacket.class, "PlaySoundFromEntityS2CPacket"); S2C_PACKETS_R.put("PlaySoundFromEntityS2CPacket", net.minecraft.network.packet.s2c.play.PlaySoundFromEntityS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.WorldTimeUpdateS2CPacket.class, "WorldTimeUpdateS2CPacket"); + S2C_PACKETS_R.put("WorldTimeUpdateS2CPacket", net.minecraft.network.packet.s2c.play.WorldTimeUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.config.FeaturesS2CPacket.class, "FeaturesS2CPacket"); S2C_PACKETS_R.put("FeaturesS2CPacket", net.minecraft.network.packet.s2c.config.FeaturesS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.SignEditorOpenS2CPacket.class, "SignEditorOpenS2CPacket"); S2C_PACKETS_R.put("SignEditorOpenS2CPacket", net.minecraft.network.packet.s2c.play.SignEditorOpenS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ExplosionS2CPacket.class, "ExplosionS2CPacket"); S2C_PACKETS_R.put("ExplosionS2CPacket", net.minecraft.network.packet.s2c.play.ExplosionS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.RemoveEntityStatusEffectS2CPacket.class, "RemoveEntityStatusEffectS2CPacket"); - S2C_PACKETS_R.put("RemoveEntityStatusEffectS2CPacket", net.minecraft.network.packet.s2c.play.RemoveEntityStatusEffectS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.login.LoginDisconnectS2CPacket.class, "LoginDisconnectS2CPacket"); S2C_PACKETS_R.put("LoginDisconnectS2CPacket", net.minecraft.network.packet.s2c.login.LoginDisconnectS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.RemoveEntityStatusEffectS2CPacket.class, "RemoveEntityStatusEffectS2CPacket"); + S2C_PACKETS_R.put("RemoveEntityStatusEffectS2CPacket", net.minecraft.network.packet.s2c.play.RemoveEntityStatusEffectS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EndCombatS2CPacket.class, "EndCombatS2CPacket"); S2C_PACKETS_R.put("EndCombatS2CPacket", net.minecraft.network.packet.s2c.play.EndCombatS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlayerListS2CPacket.class, "PlayerListS2CPacket"); @@ -365,10 +375,10 @@ public class PacketUtils { S2C_PACKETS_R.put("SynchronizeRecipesS2CPacket", net.minecraft.network.packet.s2c.play.SynchronizeRecipesS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityS2CPacket.class, "EntityS2CPacket"); S2C_PACKETS_R.put("EntityS2CPacket", net.minecraft.network.packet.s2c.play.EntityS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityStatusS2CPacket.class, "EntityStatusS2CPacket"); - S2C_PACKETS_R.put("EntityStatusS2CPacket", net.minecraft.network.packet.s2c.play.EntityStatusS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityTrackerUpdateS2CPacket.class, "EntityTrackerUpdateS2CPacket"); S2C_PACKETS_R.put("EntityTrackerUpdateS2CPacket", net.minecraft.network.packet.s2c.play.EntityTrackerUpdateS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityStatusS2CPacket.class, "EntityStatusS2CPacket"); + S2C_PACKETS_R.put("EntityStatusS2CPacket", net.minecraft.network.packet.s2c.play.EntityStatusS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.config.DynamicRegistriesS2CPacket.class, "DynamicRegistriesS2CPacket"); S2C_PACKETS_R.put("DynamicRegistriesS2CPacket", net.minecraft.network.packet.s2c.config.DynamicRegistriesS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.common.CustomPayloadS2CPacket.class, "CustomPayloadS2CPacket"); @@ -377,10 +387,10 @@ public class PacketUtils { S2C_PACKETS_R.put("SubtitleS2CPacket", net.minecraft.network.packet.s2c.play.SubtitleS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.NbtQueryResponseS2CPacket.class, "NbtQueryResponseS2CPacket"); S2C_PACKETS_R.put("NbtQueryResponseS2CPacket", net.minecraft.network.packet.s2c.play.NbtQueryResponseS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.UnloadChunkS2CPacket.class, "UnloadChunkS2CPacket"); - S2C_PACKETS_R.put("UnloadChunkS2CPacket", net.minecraft.network.packet.s2c.play.UnloadChunkS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityEquipmentUpdateS2CPacket.class, "EntityEquipmentUpdateS2CPacket"); S2C_PACKETS_R.put("EntityEquipmentUpdateS2CPacket", net.minecraft.network.packet.s2c.play.EntityEquipmentUpdateS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.UnloadChunkS2CPacket.class, "UnloadChunkS2CPacket"); + S2C_PACKETS_R.put("UnloadChunkS2CPacket", net.minecraft.network.packet.s2c.play.UnloadChunkS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.config.ReadyS2CPacket.class, "ReadyS2CPacket"); S2C_PACKETS_R.put("ReadyS2CPacket", net.minecraft.network.packet.s2c.config.ReadyS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EnterReconfigurationS2CPacket.class, "EnterReconfigurationS2CPacket"); @@ -488,7 +498,7 @@ public Class> get(int index) { @NotNull @Override public Iterator>> iterator() { - return Iterators.concat(S2C_PACKETS.keySet().iterator(), C2S_PACKETS.keySet().iterator()); + return Stream.concat(S2C_PACKETS.keySet().stream(), C2S_PACKETS.keySet().stream()).iterator(); } @Override @@ -498,7 +508,7 @@ public boolean contains(RegistryKey>> key) { @Override public Set>>, Class>>> getEntrySet() { - return null; + return Collections.emptySet(); } @Override @@ -559,7 +569,7 @@ public void populateTags(Map>>, List>>> getKeys() { - return null; + return Collections.emptySet(); } } } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtilsUtil.java b/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtilsUtil.java index c56cd6a02b..c296a947e4 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtilsUtil.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtilsUtil.java @@ -16,7 +16,7 @@ import java.io.IOException; import java.util.Set; -public class PacketUtilsUtil { +public abstract class PacketUtilsUtil { private static final String packetRegistryClass = """ private static class PacketRegistry extends SimpleRegistry>> { public PacketRegistry() { @@ -81,7 +81,7 @@ public Class> get(int index) { @NotNull @Override public Iterator>> iterator() { - return Iterators.concat(S2C_PACKETS.keySet().iterator(), C2S_PACKETS.keySet().iterator()); + return Stream.concat(S2C_PACKETS.keySet().stream(), C2S_PACKETS.keySet().stream()).iterator(); } @Override @@ -91,7 +91,7 @@ public boolean contains(RegistryKey>> key) { @Override public Set>>, Class>>> getEntrySet() { - return null; + return Collections.emptySet(); } @Override @@ -152,7 +152,7 @@ public void populateTags(Map>>, List>>> getKeys() { - return null; + return Collections.emptySet(); } } """; @@ -168,114 +168,111 @@ public static void main(String[] args) { public static void init() throws IOException { // Generate PacketUtils.java - File file = new File("src/main/java/" + PacketUtilsUtil.class.getPackageName().replace('.', '/') + "/PacketUtils.java"); + File file = new File("src/main/java/%s/PacketUtils.java".formatted(PacketUtilsUtil.class.getPackageName().replace('.', '/'))); if (!file.exists()) { file.getParentFile().mkdirs(); file.createNewFile(); } - BufferedWriter writer = new BufferedWriter(new FileWriter(file)); - - writer.write("/*\n"); - writer.write(" * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/).\n"); - writer.write(" * Copyright (c) Meteor Development.\n"); - writer.write(" */\n\n"); - - writer.write("package meteordevelopment.meteorclient.utils.network;\n\n"); - - // Write imports - writer.write("import com.google.common.collect.Iterators;\n"); - writer.write("import com.mojang.datafixers.util.Pair;\n"); - writer.write("import com.mojang.serialization.Lifecycle;\n"); - writer.write("import meteordevelopment.meteorclient.utils.misc.MeteorIdentifier;\n"); - writer.write("import net.minecraft.network.packet.Packet;\n"); - writer.write("import net.minecraft.registry.Registry;\n"); - writer.write("import net.minecraft.registry.RegistryKey;\n"); - writer.write("import net.minecraft.registry.SimpleRegistry;\n"); - writer.write("import net.minecraft.registry.entry.RegistryEntry;\n"); - writer.write("import net.minecraft.registry.entry.RegistryEntryList;\n"); - writer.write("import net.minecraft.registry.tag.TagKey;\n"); - writer.write("import net.minecraft.util.Identifier;\n"); - writer.write("import net.minecraft.util.math.random.Random;\n"); - writer.write("import org.jetbrains.annotations.NotNull;\n"); - - writer.write("import java.util.*;\n"); - writer.write("import java.util.stream.Stream;\n"); - - // Write class - writer.write("\npublic class PacketUtils {\n"); - - // Write fields - writer.write(" public static final Registry>> REGISTRY = new PacketRegistry();\n\n"); - writer.write(" private static final Map>, String> S2C_PACKETS = new HashMap<>();\n"); - writer.write(" private static final Map>, String> C2S_PACKETS = new HashMap<>();\n\n"); - writer.write(" private static final Map>> S2C_PACKETS_R = new HashMap<>();\n"); - writer.write(" private static final Map>> C2S_PACKETS_R = new HashMap<>();\n\n"); - - // Write static block - writer.write(" static {\n"); - - // Client -> Sever Packets - Reflections c2s = new Reflections("net.minecraft.network.packet.c2s", Scanners.SubTypes); - Set> c2sPackets = c2s.getSubTypesOf(Packet.class); - - for (Class c2sPacket : c2sPackets) { - String name = c2sPacket.getName(); - String className = name.substring(name.lastIndexOf('.') + 1).replace('$', '.'); - String fullName = name.replace('$', '.'); - - writer.write(String.format(" C2S_PACKETS.put(%s.class, \"%s\");\n", fullName, className)); - writer.write(String.format(" C2S_PACKETS_R.put(\"%s\", %s.class);\n", className, fullName)); - } - - writer.newLine(); - - // Server -> Client Packets - Reflections s2c = new Reflections("net.minecraft.network.packet.s2c", Scanners.SubTypes); - Set> s2cPackets = s2c.getSubTypesOf(Packet.class); - - for (Class s2cPacket : s2cPackets) { - if (s2cPacket == BundlePacket.class) continue; - String name = s2cPacket.getName(); - String className = name.substring(name.lastIndexOf('.') + 1).replace('$', '.'); - String fullName = name.replace('$', '.'); - - writer.write(String.format(" S2C_PACKETS.put(%s.class, \"%s\");\n", fullName, className)); - writer.write(String.format(" S2C_PACKETS_R.put(\"%s\", %s.class);\n", className, fullName)); + try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) { + writer.write("/*\n"); + writer.write(" * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/).\n"); + writer.write(" * Copyright (c) Meteor Development.\n"); + writer.write(" */\n\n"); + + writer.write("package meteordevelopment.meteorclient.utils.network;\n\n"); + + // Write imports + writer.write("import com.mojang.datafixers.util.Pair;\n"); + writer.write("import com.mojang.serialization.Lifecycle;\n"); + writer.write("import meteordevelopment.meteorclient.utils.misc.MeteorIdentifier;\n"); + writer.write("import net.minecraft.network.packet.Packet;\n"); + writer.write("import net.minecraft.registry.Registry;\n"); + writer.write("import net.minecraft.registry.RegistryKey;\n"); + writer.write("import net.minecraft.registry.SimpleRegistry;\n"); + writer.write("import net.minecraft.registry.entry.RegistryEntry;\n"); + writer.write("import net.minecraft.registry.entry.RegistryEntryList;\n"); + writer.write("import net.minecraft.registry.tag.TagKey;\n"); + writer.write("import net.minecraft.util.Identifier;\n"); + writer.write("import net.minecraft.util.math.random.Random;\n"); + writer.write("import org.jetbrains.annotations.NotNull;\n"); + + writer.write("import java.util.*;\n"); + writer.write("import java.util.stream.Stream;\n"); + + // Write class + writer.write("\npublic abstract class PacketUtils {\n"); + + // Write fields + writer.write(" public static final Registry>> REGISTRY = new PacketRegistry();\n\n"); + writer.write(" private static final Map>, String> S2C_PACKETS = new HashMap<>();\n"); + writer.write(" private static final Map>, String> C2S_PACKETS = new HashMap<>();\n\n"); + writer.write(" private static final Map>> S2C_PACKETS_R = new HashMap<>();\n"); + writer.write(" private static final Map>> C2S_PACKETS_R = new HashMap<>();\n\n"); + + // Write static block + writer.write(" static {\n"); + + // Client -> Sever Packets + Reflections c2s = new Reflections("net.minecraft.network.packet.c2s", Scanners.SubTypes); + Set> c2sPackets = c2s.getSubTypesOf(Packet.class); + + for (Class c2sPacket : c2sPackets) { + String name = c2sPacket.getName(); + String className = name.substring(name.lastIndexOf('.') + 1).replace('$', '.'); + String fullName = name.replace('$', '.'); + + writer.write(" C2S_PACKETS.put(%s.class, \"%s\");%n".formatted(fullName, className)); + writer.write(" C2S_PACKETS_R.put(\"%s\", %s.class);%n".formatted(className, fullName)); + } + + writer.newLine(); + + // Server -> Client Packets + Reflections s2c = new Reflections("net.minecraft.network.packet.s2c", Scanners.SubTypes); + Set> s2cPackets = s2c.getSubTypesOf(Packet.class); + + for (Class s2cPacket : s2cPackets) { + if (s2cPacket == BundlePacket.class) continue; + String name = s2cPacket.getName(); + String className = name.substring(name.lastIndexOf('.') + 1).replace('$', '.'); + String fullName = name.replace('$', '.'); + + writer.write(" S2C_PACKETS.put(%s.class, \"%s\");%n".formatted(fullName, className)); + writer.write(" S2C_PACKETS_R.put(\"%s\", %s.class);%n".formatted(className, fullName)); + } + + writer.write(" }\n\n"); + + // Write getName method + writer.write(" public static String getName(Class> packetClass) {\n"); + writer.write(" String name = S2C_PACKETS.get(packetClass);\n"); + writer.write(" if (name != null) return name;\n"); + writer.write(" return C2S_PACKETS.get(packetClass);\n"); + writer.write(" }\n\n"); + + // Write getPacket method + writer.write(" public static Class> getPacket(String name) {\n"); + writer.write(" Class> packet = S2C_PACKETS_R.get(name);\n"); + writer.write(" if (packet != null) return packet;\n"); + writer.write(" return C2S_PACKETS_R.get(name);\n"); + writer.write(" }\n\n"); + + // Write getS2CPackets method + writer.write(" public static Set>> getS2CPackets() {\n"); + writer.write(" return S2C_PACKETS.keySet();\n"); + writer.write(" }\n\n"); + + // Write getC2SPackets method + writer.write(" public static Set>> getC2SPackets() {\n"); + writer.write(" return C2S_PACKETS.keySet();\n"); + writer.write(" }\n\n"); + + // Write PacketRegistry class + writer.write(packetRegistryClass); + + // Write end class + writer.write("}\n"); } - - writer.write(" }\n\n"); - - // Write getName method - writer.write(" public static String getName(Class> packetClass) {\n"); - writer.write(" String name = S2C_PACKETS.get(packetClass);\n"); - writer.write(" if (name != null) return name;\n"); - writer.write(" return C2S_PACKETS.get(packetClass);\n"); - writer.write(" }\n\n"); - - // Write getPacket method - writer.write(" public static Class> getPacket(String name) {\n"); - writer.write(" Class> packet = S2C_PACKETS_R.get(name);\n"); - writer.write(" if (packet != null) return packet;\n"); - writer.write(" return C2S_PACKETS_R.get(name);\n"); - writer.write(" }\n\n"); - - // Write getS2CPackets method - writer.write(" public static Set>> getS2CPackets() {\n"); - writer.write(" return S2C_PACKETS.keySet();\n"); - writer.write(" }\n\n"); - - // Write getC2SPackets method - writer.write(" public static Set>> getC2SPackets() {\n"); - writer.write(" return C2S_PACKETS.keySet();\n"); - writer.write(" }\n\n"); - - // Write PacketRegistry class - writer.write(packetRegistryClass); - - // Write end class - writer.write("}\n"); - - writer.close(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/player/TitleScreenCredits.java b/src/main/java/meteordevelopment/meteorclient/utils/player/TitleScreenCredits.java index f0fc734375..e86b163bd0 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/player/TitleScreenCredits.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/player/TitleScreenCredits.java @@ -13,11 +13,10 @@ import meteordevelopment.meteorclient.gui.screens.CommitsScreen; import meteordevelopment.meteorclient.utils.network.Http; import meteordevelopment.meteorclient.utils.network.MeteorExecutor; -import meteordevelopment.meteorclient.utils.render.color.Color; -import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.render.BufferBuilder; -import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; import java.util.ArrayList; import java.util.Comparator; @@ -25,11 +24,7 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; -public class TitleScreenCredits { - private static final int WHITE = Color.fromRGBA(255, 255, 255, 255); - private static final int GRAY = Color.fromRGBA(175, 175, 175, 255); - private static final int RED = Color.fromRGBA(225, 25, 25, 255); - +public abstract class TitleScreenCredits { private static final List credits = new ArrayList<>(); private static void init() { @@ -38,7 +33,7 @@ private static void init() { for (MeteorAddon addon : AddonManager.ADDONS) add(addon); // Sort by width (Meteor always first) - credits.sort(Comparator.comparingInt(value -> value.sections.get(0).text.equals("Meteor Client ") ? Integer.MIN_VALUE : -value.width)); + credits.sort(Comparator.comparingInt(value -> value.addon == MeteorClient.ADDON ? Integer.MIN_VALUE : -mc.textRenderer.getWidth(value.text))); // Check for latest commits MeteorExecutor.execute(() -> { @@ -46,13 +41,10 @@ private static void init() { if (credit.addon.getRepo() == null || credit.addon.getCommit() == null) continue; GithubRepo repo = credit.addon.getRepo(); - Response res = Http.get(String.format("https://api.github.com/repos/%s/branches/%s", repo.getOwnerName(), repo.branch())).sendJson(Response.class); + Response res = Http.get("https://api.github.com/repos/%s/branches/%s".formatted(repo.getOwnerName(), repo.branch())).sendJson(Response.class); if (res != null && !credit.addon.getCommit().equals(res.commit.sha)) { - synchronized (credit.sections) { - credit.sections.add(1, new Section("*", RED)); - credit.calculateWidth(); - } + credit.text.append(Text.literal("*").formatted(Formatting.RED)); } } }); @@ -61,18 +53,17 @@ private static void init() { private static void add(MeteorAddon addon) { Credit credit = new Credit(addon); - credit.sections.add(new Section(addon.name, addon.color.getPacked())); - credit.sections.add(new Section(" by ", GRAY)); + credit.text.append(Text.literal(addon.name).styled(style -> style.withColor(addon.color.getPacked()))); + credit.text.append(Text.literal(" by ").formatted(Formatting.GRAY)); for (int i = 0; i < addon.authors.length; i++) { if (i > 0) { - credit.sections.add(new Section(i == addon.authors.length - 1 ? " & " : ", ", GRAY)); + credit.text.append(Text.literal(i == addon.authors.length - 1 ? " & " : ", ").formatted(Formatting.GRAY)); } - credit.sections.add(new Section(addon.authors[i], WHITE)); + credit.text.append(Text.literal(addon.authors[i]).formatted(Formatting.WHITE)); } - credit.calculateWidth(); credits.add(credit); } @@ -81,14 +72,9 @@ public static void render(DrawContext context) { int y = 3; for (Credit credit : credits) { - int x = mc.currentScreen.width - 3 - credit.width; + int x = mc.currentScreen.width - 3 - mc.textRenderer.getWidth(credit.text); - synchronized (credit.sections) { - for (Section section : credit.sections) { - context.drawTextWithShadow(mc.textRenderer, section.text, x, y, section.color); - x += section.width; - } - } + context.drawTextWithShadow(mc.textRenderer, credit.text, x, y, -1); y += mc.textRenderer.fontHeight + 2; } @@ -97,9 +83,9 @@ public static void render(DrawContext context) { public static boolean onClicked(double mouseX, double mouseY) { int y = 3; for (Credit credit : credits) { - int x = mc.currentScreen.width - 3 - credit.width; + int x = mc.currentScreen.width - 3 - mc.textRenderer.getWidth(credit.text); - if (mouseX >= x && mouseX <= x + credit.width && mouseY >= y && mouseY <= y + mc.textRenderer.fontHeight + 2) { + if (mouseX >= x && mouseX <= x + mc.textRenderer.getWidth(credit.text) && mouseY >= y && mouseY <= y + mc.textRenderer.fontHeight + 2) { if (credit.addon.getRepo() != null && credit.addon.getCommit() != null) { mc.setScreen(new CommitsScreen(GuiThemes.get(), credit.addon)); return true; @@ -114,28 +100,11 @@ public static boolean onClicked(double mouseX, double mouseY) { private static class Credit { public final MeteorAddon addon; - public final List
sections = new ArrayList<>(); - public int width; + public final MutableText text = Text.empty(); public Credit(MeteorAddon addon) { this.addon = addon; } - - public void calculateWidth() { - width = 0; - for (Section section : sections) width += section.width; - } - } - - private static class Section { - public final String text; - public final int color, width; - - public Section(String text, int color) { - this.text = text; - this.color = color; - this.width = mc.textRenderer.getWidth(text); - } } private static class Response { diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index a6cc83d676..78e9a2accf 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -19,9 +19,6 @@ "icon": "assets/meteor-client/icon.png", "environment": "client", "entrypoints": { - "preLaunch": [ - "com.llamalad7.mixinextras.MixinExtrasBootstrap::init" - ], "client": [ "meteordevelopment.meteorclient.MeteorClient" ] @@ -48,7 +45,7 @@ }, "depends": { "java": ">=17", - "minecraft": "${minecraft_version}", + "minecraft": ["1.20.3", "1.20.4"], "fabricloader": ">=${loader_version}" }, "breaks": { diff --git a/src/main/resources/meteor-client.mixins.json b/src/main/resources/meteor-client.mixins.json index f292be27f9..2e78a2126a 100644 --- a/src/main/resources/meteor-client.mixins.json +++ b/src/main/resources/meteor-client.mixins.json @@ -138,6 +138,7 @@ "ProjectileEntityAccessor", "ProjectileInGroundAccessor", "RaycastContextMixin", + "RegistriesMixin", "ReloadStateAccessor", "RenderLayersMixin", "RenderTickCounterMixin", @@ -149,7 +150,6 @@ "SignBlockEntityRendererMixin", "SimpleEntityLookupAccessor", "SimpleOptionMixin", - "SimpleRegistryMixin", "SlimeBlockMixin", "SlotMixin", "SoundSystemMixin", From 4cc4104d9412f983fcd3edff75e13ec1bbff1c41 Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Fri, 8 Dec 2023 14:20:32 +0100 Subject: [PATCH 158/357] Revert "1.20.4 update (#4249)" This reverts commit b0a927bafc077e9850d6a0d87710ff194c0ac7d4. --- build.gradle | 23 +- gradle.properties | 21 +- .../arguments/FakePlayerArgumentType.java | 2 +- .../arguments/PlayerArgumentType.java | 4 +- .../commands/commands/FakePlayerCommand.java | 4 +- .../commands/commands/SwarmCommand.java | 4 +- .../meteorclient/gui/GuiThemes.java | 8 +- .../gui/widgets/WItemWithLabel.java | 8 +- .../mixin/BookEditScreenMixin.java | 7 +- .../mixin/CapeFeatureRendererMixin.java | 2 +- .../mixin/ConnectScreenMixin.java | 2 +- .../mixin/DisconnectedScreenMixin.java | 2 +- .../mixin/ElytraFeatureRendererMixin.java | 2 +- .../meteorclient/mixin/GameRendererMixin.java | 4 +- .../mixin/LivingEntityRendererMixin.java | 5 +- .../mixin/RaycastContextMixin.java | 4 +- .../meteorclient/mixin/RegistriesMixin.java | 21 -- .../mixin/SimpleRegistryMixin.java | 22 ++ .../ChunkAwareBlockCollisionSweeperMixin.java | 2 +- .../sodium/SodiumBiomeColorCacheMixin.java | 6 +- .../sodium/SodiumFluidRendererMixin.java | 7 +- .../meteorclient/renderer/GL.java | 4 +- .../meteorclient/settings/BoolSetting.java | 3 +- .../meteorclient/settings/ColorSetting.java | 3 +- .../meteorclient/systems/System.java | 4 +- .../systems/accounts/Account.java | 6 +- .../systems/accounts/types/EasyMCAccount.java | 2 +- .../accounts/types/TheAlteningAccount.java | 4 +- .../meteorclient/systems/friends/Friend.java | 2 +- .../meteorclient/systems/friends/Friends.java | 2 +- .../systems/hud/elements/CombatHud.java | 2 +- .../systems/hud/elements/PlayerRadarHud.java | 4 +- .../systems/hud/elements/PotionTimersHud.java | 2 +- .../meteorclient/systems/modules/Modules.java | 5 +- .../systems/modules/misc/DiscordPresence.java | 8 +- .../systems/modules/misc/MessageAura.java | 2 +- .../systems/modules/misc/Notifier.java | 10 +- .../systems/modules/misc/ServerSpoof.java | 4 +- .../systems/modules/player/AutoTool.java | 4 +- .../systems/modules/player/FakePlayer.java | 2 +- .../modules/player/MiddleClickExtra.java | 6 +- .../modules/render/BetterTooltips.java | 6 +- .../systems/modules/render/EntityOwner.java | 2 +- .../systems/modules/render/LogoutSpots.java | 2 +- .../systems/modules/render/Nametags.java | 4 +- .../systems/modules/world/Flamethrower.java | 2 +- .../systems/modules/world/Nuker.java | 4 +- .../systems/modules/world/VeinMiner.java | 5 +- .../utils/entity/EntityUtils.java | 2 +- .../entity/fakeplayer/FakePlayerManager.java | 4 +- .../meteorclient/utils/misc/NbtUtils.java | 7 +- .../utils/misc/ValueComparableMap.java | 18 +- .../utils/network/PacketUtils.java | 116 +++++----- .../utils/network/PacketUtilsUtil.java | 211 +++++++++--------- .../utils/player/TitleScreenCredits.java | 63 ++++-- src/main/resources/fabric.mod.json | 5 +- src/main/resources/meteor-client.mixins.json | 2 +- 57 files changed, 360 insertions(+), 332 deletions(-) delete mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/RegistriesMixin.java create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/SimpleRegistryMixin.java diff --git a/build.gradle b/build.gradle index 17cc649a38..3d97ca35a7 100644 --- a/build.gradle +++ b/build.gradle @@ -58,7 +58,7 @@ dependencies { modCompileOnly("maven.modrinth:indium:${project.indium_version}") { transitive = false } // Baritone (https://github.com/MeteorDevelopment/baritone) - modCompileOnly "meteordevelopment:baritone:${project.baritone_version}-SNAPSHOT" + modCompileOnly "meteordevelopment:baritone:${project.minecraft_version}-SNAPSHOT" // Libraries library "meteordevelopment:orbit:${project.orbit_version}" @@ -67,6 +67,8 @@ dependencies { library "org.reflections:reflections:${project.reflections_version}" library("io.netty:netty-handler-proxy:${project.netty_version}") { transitive = false } library("io.netty:netty-codec-socks:${project.netty_version}") { transitive = false } + library "io.github.llamalad7:mixinextras-fabric:${project.mixin_extras_version}" + annotationProcessor "io.github.llamalad7:mixinextras-fabric:${project.mixin_extras_version}" library "de.florianmichael:WaybackAuthLib:1.0.0" // Launch sub project @@ -94,24 +96,17 @@ shadowJar { } processResources { - def propertyMap = [ - "version" : project.version, - "devbuild" : project.findProperty("devbuild") ?: "", - "commit" : project.findProperty("commit") ?: "", - "minecraft_version": project.minecraft_version, - "loader_version" : project.loader_version - ] - - inputs.properties(propertyMap) filesMatching("fabric.mod.json") { - expand(propertyMap) + expand "version": project.version, + "devbuild": project.findProperty("devbuild") ?: "", + "commit": project.findProperty("commit") ?: "", + "minecraft_version": project.minecraft_version, + "loader_version": project.loader_version } } jar { - from("LICENSE") { - rename { "${it}_${archivesBaseName}" } - } + from "LICENSE" manifest { attributes("Main-Class": "meteordevelopment.meteorclient.Main") diff --git a/gradle.properties b/gradle.properties index cd6681815d..28c426c625 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,30 +1,26 @@ org.gradle.jvmargs=-Xmx2G # Fabric (https://fabricmc.net/develop) -# TODO: when updating to 1.21, revert "minecraft": ["1.20.3", "1.20.4"] to "minecraft": "${minecraft_version}" -minecraft_version=1.20.4 -yarn_mappings=1.20.4+build.1 -loader_version=0.15.0 -fapi_version=0.91.1+1.20.4 +minecraft_version=1.20.2 +yarn_mappings=1.20.2+build.4 +loader_version=0.14.24 +fapi_version=0.90.4+1.20.2 # Mod Properties -mod_version=0.5.6 +mod_version=0.5.5 maven_group=meteordevelopment archives_base_name=meteor-client # Dependency Versions -# Baritone (https://github.com/MeteorDevelopment/baritone) -baritone_version=1.20.2 - # Sodium (https://github.com/CaffeineMC/sodium-fabric) -sodium_version=mc1.20.3-0.5.4 +sodium_version=mc1.20.2-0.5.3 # Lithium (https://github.com/CaffeineMC/lithium-fabric) lithium_version=mc1.20.2-0.12.0 # Iris (https://github.com/IrisShaders/Iris) -iris_version=1.6.12+1.20.3 +iris_version=1.6.10+1.20.2 # Orbit (https://github.com/MeteorDevelopment/orbit) orbit_version=0.2.3 @@ -41,5 +37,8 @@ reflections_version=0.10.2 # Netty (https://github.com/netty/netty) netty_version=4.1.90.Final +# Mixin Extras (https://github.com/LlamaLad7/MixinExtras) +mixin_extras_version=0.2.0 + # Indium (https://github.com/comp500/Indium) indium_version=1.0.27+mc1.20.1 diff --git a/src/main/java/meteordevelopment/meteorclient/commands/arguments/FakePlayerArgumentType.java b/src/main/java/meteordevelopment/meteorclient/commands/arguments/FakePlayerArgumentType.java index 2ba92b3409..fde62bb80d 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/arguments/FakePlayerArgumentType.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/arguments/FakePlayerArgumentType.java @@ -38,7 +38,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 suggestMatching(FakePlayerManager.stream().map(FakePlayerEntity::getEntityName), builder); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/arguments/PlayerArgumentType.java b/src/main/java/meteordevelopment/meteorclient/commands/arguments/PlayerArgumentType.java index 10472f55c6..b9ebc0b1e6 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/arguments/PlayerArgumentType.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/arguments/PlayerArgumentType.java @@ -41,7 +41,7 @@ public PlayerEntity parse(StringReader reader) throws CommandSyntaxException { PlayerEntity playerEntity = null; for (PlayerEntity p : mc.world.getPlayers()) { - if (p.getName().getString().equalsIgnoreCase(argument)) { + if (p.getEntityName().equalsIgnoreCase(argument)) { playerEntity = p; break; } @@ -53,7 +53,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 CommandSource.suggestMatching(mc.world.getPlayers().stream().map(PlayerEntity::getEntityName), builder); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/FakePlayerCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/FakePlayerCommand.java index 4a05f24d14..122e9a13c6 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/FakePlayerCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/FakePlayerCommand.java @@ -50,7 +50,7 @@ public void build(LiteralArgumentBuilder builder) { } FakePlayerManager.remove(fp); - info("Removed Fake Player %s.".formatted(fp.getName().getString())); + info("Removed Fake Player %s.".formatted(fp.getEntityName())); return SINGLE_SUCCESS; }) @@ -67,7 +67,7 @@ public void build(LiteralArgumentBuilder builder) { builder.then(literal("list") .executes(context -> { info("--- Fake Players ((highlight)%s(default)) ---", FakePlayerManager.count()); - FakePlayerManager.forEach(fp -> ChatUtils.info("(highlight)%s".formatted(fp.getName().getString()))); + FakePlayerManager.forEach(fp -> ChatUtils.info("(highlight)%s".formatted(fp.getEntityName()))); return SINGLE_SUCCESS; }) ); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java index 317550eabd..fda2554682 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java @@ -104,7 +104,7 @@ else if (swarm.isWorker()) { Swarm swarm = Modules.get().get(Swarm.class); if (swarm.isActive()) { if (swarm.isHost()) { - swarm.host.sendMessage(context.getInput() + " " + mc.player.getName().getString()); + swarm.host.sendMessage(context.getInput() + " " + mc.player.getEntityName()); } else if (swarm.isWorker()) { error("The follow host command must be used by the host."); @@ -124,7 +124,7 @@ else if (swarm.isWorker()) { swarm.host.sendMessage(context.getInput()); } else if (swarm.isWorker() && playerEntity != null) { - PathManagers.get().follow(entity -> entity.getName().getString().equalsIgnoreCase(playerEntity.getName().getString())); + PathManagers.get().follow(entity -> entity.getEntityName().equalsIgnoreCase(playerEntity.getEntityName())); } } else { diff --git a/src/main/java/meteordevelopment/meteorclient/gui/GuiThemes.java b/src/main/java/meteordevelopment/meteorclient/gui/GuiThemes.java index 2b528f16c7..beb6e164c4 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/GuiThemes.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/GuiThemes.java @@ -35,7 +35,7 @@ public static void init() { public static void postInit() { if (FILE.exists()) { try { - NbtCompound tag = NbtIo.read(FILE.toPath()); + NbtCompound tag = NbtIo.read(FILE); if (tag != null) select(tag.getString("currentTheme")); } catch (IOException e) { @@ -82,7 +82,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()); + NbtCompound tag = NbtIo.read(file); if (tag != null) get().fromTag(tag); } } catch (IOException e) { @@ -116,7 +116,7 @@ private static void saveTheme() { NbtCompound tag = get().toTag(); THEMES_FOLDER.mkdirs(); - NbtIo.write(tag, new File(THEMES_FOLDER, get().name + ".nbt").toPath()); + NbtIo.write(tag, new File(THEMES_FOLDER, get().name + ".nbt")); } catch (IOException e) { e.printStackTrace(); } @@ -129,7 +129,7 @@ private static void saveGlobal() { tag.putString("currentTheme", get().name); FOLDER.mkdirs(); - NbtIo.write(tag, FILE.toPath()); + NbtIo.write(tag, FILE); } catch (IOException e) { e.printStackTrace(); } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItemWithLabel.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItemWithLabel.java index bc8769b7aa..26d3c4ce85 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItemWithLabel.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItemWithLabel.java @@ -14,8 +14,6 @@ import java.util.List; -import static meteordevelopment.meteorclient.MeteorClient.mc; - public class WItemWithLabel extends WHorizontalList { private ItemStack itemStack; private String name; @@ -40,13 +38,13 @@ private String getStringToAppend() { if (itemStack.getItem() == Items.POTION) { List effects = PotionUtil.getPotion(itemStack).getEffects(); - if (!effects.isEmpty()) { + if (effects.size() > 0) { str += " "; StatusEffectInstance effect = effects.get(0); - if (effect.getAmplifier() > 0) str += "%d ".formatted(effect.getAmplifier() + 1); + if (effect.getAmplifier() > 0) str += effect.getAmplifier() + 1 + " "; - str += "(%s)".formatted(StatusEffectUtil.getDurationText(effect, 1, mc.world.getTickManager().getTickRate()).getString()); + str += "(" + StatusEffectUtil.getDurationText(effect, 1).getString() + ")"; } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BookEditScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BookEditScreenMixin.java index 7468bd62b5..a1a1c95cc2 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BookEditScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BookEditScreenMixin.java @@ -9,7 +9,10 @@ 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.nbt.*; +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 org.lwjgl.glfw.GLFW; import org.spongepowered.asm.mixin.Final; @@ -84,7 +87,7 @@ private void onInit(CallbackInfo info) { DataInputStream in = new DataInputStream(new ByteArrayInputStream(bytes)); try { - NbtCompound tag = NbtIo.readCompressed(in, NbtTagSizeTracker.ofUnlimitedBytes()); + NbtCompound tag = NbtIo.readCompressed(in); NbtList listTag = tag.getList("pages", 8).copy(); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/CapeFeatureRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/CapeFeatureRendererMixin.java index 4e9368a904..43751d3d37 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/CapeFeatureRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/CapeFeatureRendererMixin.java @@ -17,7 +17,7 @@ @Mixin(CapeFeatureRenderer.class) public class CapeFeatureRendererMixin { - @ModifyExpressionValue(method = "render(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;ILnet/minecraft/client/network/AbstractClientPlayerEntity;FFFFFF)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/SkinTextures;capeTexture()Lnet/minecraft/util/Identifier;")) + @ModifyExpressionValue(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/SkinTextures;capeTexture()Lnet/minecraft/util/Identifier;")) private Identifier modifyCapeTexture(Identifier original, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, AbstractClientPlayerEntity abstractClientPlayerEntity, float f, float g, float h, float j, float k, float l) { Identifier id = Capes.get(abstractClientPlayerEntity); return id == null ? original : id; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ConnectScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ConnectScreenMixin.java index fac824368d..2fd47394c5 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ConnectScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ConnectScreenMixin.java @@ -8,7 +8,7 @@ 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.gui.screen.ConnectScreen; import net.minecraft.client.network.ServerAddress; import net.minecraft.client.network.ServerInfo; import org.spongepowered.asm.mixin.Mixin; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/DisconnectedScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/DisconnectedScreenMixin.java index 44d87fbacc..3092d3f470 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/DisconnectedScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/DisconnectedScreenMixin.java @@ -7,7 +7,7 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.misc.AutoReconnect; -import net.minecraft.client.gui.screen.multiplayer.ConnectScreen; +import net.minecraft.client.gui.screen.ConnectScreen; import net.minecraft.client.gui.screen.DisconnectedScreen; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.TitleScreen; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ElytraFeatureRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ElytraFeatureRendererMixin.java index 4fd5c52c9e..e7c7a5764c 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ElytraFeatureRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ElytraFeatureRendererMixin.java @@ -25,7 +25,7 @@ public ElytraFeatureRendererMixin(FeatureRendererContext context) { super(context); } - @ModifyExpressionValue(method = "render(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;ILnet/minecraft/entity/LivingEntity;FFFFFF)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/SkinTextures;capeTexture()Lnet/minecraft/util/Identifier;")) + @ModifyExpressionValue(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/SkinTextures;capeTexture()Lnet/minecraft/util/Identifier;")) private Identifier modifyCapeTexture(Identifier original, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, T livingEntity, float f, float g, float h, float j, float k, float l) { if (!(livingEntity instanceof AbstractClientPlayerEntity playerEntity)) return original; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java index da6f192634..23fe559f8a 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java @@ -53,7 +53,7 @@ public abstract class GameRendererMixin { @Unique private Renderer3D renderer; @Inject(method = "renderWorld", at = @At(value = "INVOKE_STRING", target = "Lnet/minecraft/util/profiler/Profiler;swap(Ljava/lang/String;)V", args = { "ldc=hand" }), locals = LocalCapture.CAPTURE_FAILEXCEPTION) - private void onRenderWorld(float tickDelta, long limitTime, MatrixStack matrices, CallbackInfo ci, boolean bl, Camera camera, Entity entity, MatrixStack matrixStack, double d, float f, float g, Matrix4f matrix4f, Matrix3f matrix3f) { + private void onRenderWorld(float tickDelta, long limitTime, MatrixStack matrices, CallbackInfo info, boolean bl, Camera camera, MatrixStack matrixStack, double d, float f, float g, Matrix4f matrix4f, Matrix3f matrix3f) { if (!Utils.canUpdate()) return; client.getProfiler().push(MeteorClient.MOD_ID + "_render"); @@ -169,7 +169,7 @@ private void renderHand(MatrixStack matrices, Camera camera, float tickDelta, Ca info.cancel(); } - @ModifyConstant(method = "updateTargetedEntity", constant = @Constant(doubleValue = 6)) + @ModifyConstant(method = "updateTargetedEntity", constant = @Constant(doubleValue = 3)) private double updateTargetedEntityModifySurvivalReach(double d) { return Modules.get().get(Reach.class).entityReach(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityRendererMixin.java index a69f012d37..21263b00e1 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityRendererMixin.java @@ -22,7 +22,6 @@ import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.scoreboard.AbstractTeam; -import net.minecraft.scoreboard.Team; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -67,8 +66,8 @@ public float changePitch(float oldValue, LivingEntity entity) { // Player model rendering in main menu - @ModifyExpressionValue(method = "hasLabel(Lnet/minecraft/entity/LivingEntity;)Z", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;getScoreboardTeam()Lnet/minecraft/scoreboard/Team;")) - private Team hasLabelClientPlayerEntityGetScoreboardTeamProxy(Team team) { + @ModifyExpressionValue(method = "hasLabel(Lnet/minecraft/entity/LivingEntity;)Z", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;getScoreboardTeam()Lnet/minecraft/scoreboard/AbstractTeam;")) + private AbstractTeam hasLabelClientPlayerEntityGetScoreboardTeamProxy(AbstractTeam team) { return (mc.player == null) ? null : team; } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/RaycastContextMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/RaycastContextMixin.java index 659dc3160d..8bd300912b 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/RaycastContextMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/RaycastContextMixin.java @@ -21,7 +21,7 @@ public class RaycastContextMixin implements IRaycastContext { @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; + @Shadow @Final @Mutable private ShapeContext entityPosition; @Override public void set(Vec3d start, Vec3d end, RaycastContext.ShapeType shapeType, RaycastContext.FluidHandling fluidHandling, Entity entity) { @@ -29,6 +29,6 @@ public void set(Vec3d start, Vec3d end, RaycastContext.ShapeType shapeType, Rayc this.end = end; this.shapeType = shapeType; this.fluid = fluidHandling; - this.shapeContext = ShapeContext.of(entity); + this.entityPosition = 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 625ec10ba5..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;Lcom/mojang/serialization/Lifecycle;)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/SimpleRegistryMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/SimpleRegistryMixin.java new file mode 100644 index 0000000000..aca4582354 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/SimpleRegistryMixin.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.registry.SimpleRegistry; +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(SimpleRegistry.class) +public class SimpleRegistryMixin { + @Redirect(method = "(Lnet/minecraft/registry/RegistryKey;Lcom/mojang/serialization/Lifecycle;Z)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/Bootstrap;ensureBootstrapped(Ljava/util/function/Supplier;)V")) + private void idk(Supplier callerGetter) { + // TODO: Probably extremely retarded but seems to work + // nothing :trolla: + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/lithium/ChunkAwareBlockCollisionSweeperMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/lithium/ChunkAwareBlockCollisionSweeperMixin.java index 0152627779..eb15d0e2b1 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/lithium/ChunkAwareBlockCollisionSweeperMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/lithium/ChunkAwareBlockCollisionSweeperMixin.java @@ -21,7 +21,7 @@ @Mixin(value = ChunkAwareBlockCollisionSweeper.class) public abstract class ChunkAwareBlockCollisionSweeperMixin { - @Redirect(method = "computeNext()Lnet/minecraft/util/shape/VoxelShape;", at = @At(value = "INVOKE", target = "Lnet/minecraft/block/BlockState;getCollisionShape(Lnet/minecraft/world/BlockView;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/ShapeContext;)Lnet/minecraft/util/shape/VoxelShape;")) + @Redirect(method = "computeNext", at = @At(value = "INVOKE", target = "Lnet/minecraft/block/BlockState;getCollisionShape(Lnet/minecraft/world/BlockView;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/ShapeContext;)Lnet/minecraft/util/shape/VoxelShape;")) private VoxelShape onComputeNextCollisionBox(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { VoxelShape shape = state.getCollisionShape(world, pos, context); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBiomeColorCacheMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBiomeColorCacheMixin.java index 39366b697f..3f147c8e58 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBiomeColorCacheMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBiomeColorCacheMixin.java @@ -25,17 +25,17 @@ private void onInit(CallbackInfo info) { ambience = Modules.get().get(Ambience.class); } - @ModifyExpressionValue(method = "updateColorBuffers", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/biome/ColorResolver;getColor(Lnet/minecraft/world/biome/Biome;DD)I", ordinal = 0, remap = true)) + @ModifyExpressionValue(method = "updateColorBuffers", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/biome/Biome;getGrassColorAt(DD)I", remap = true)) private int modify_getGrassColorAt(int color) { return ambience.isActive() && ambience.customGrassColor.get() ? ambience.grassColor.get().getPacked() : color; } - @ModifyExpressionValue(method = "updateColorBuffers", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/biome/ColorResolver;getColor(Lnet/minecraft/world/biome/Biome;DD)I", ordinal = 1, remap = true)) + @ModifyExpressionValue(method = "updateColorBuffers", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/biome/Biome;getFoliageColor()I", remap = true)) private int modify_getFoliageColor(int color) { return ambience.isActive() && ambience.customFoliageColor.get() ? ambience.foliageColor.get().getPacked() : color; } - @ModifyExpressionValue(method = "updateColorBuffers", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/biome/ColorResolver;getColor(Lnet/minecraft/world/biome/Biome;DD)I", ordinal = 2, remap = true)) + @ModifyExpressionValue(method = "updateColorBuffers", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/biome/Biome;getWaterColor()I", remap = true)) private int modify_getWaterColor(int color) { return ambience.isActive() && ambience.customWaterColor.get() ? ambience.waterColor.get().getPacked() : color; } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumFluidRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumFluidRendererMixin.java index 2ac8a24812..1eb4dbc141 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumFluidRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumFluidRendererMixin.java @@ -14,7 +14,6 @@ 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.caffeinemc.mods.sodium.api.util.ColorABGR; import net.minecraft.fluid.FluidState; import net.minecraft.registry.tag.FluidTags; @@ -32,8 +31,7 @@ @Mixin(value = FluidRenderer.class, remap = false) public class SodiumFluidRendererMixin { - @Final - @Shadow + @Final @Shadow private int[] quadColors; @Unique @@ -55,8 +53,7 @@ private void onRender(WorldSlice world, FluidState fluidState, BlockPos blockPos private void onUpdateQuad(ModelQuadView quad, WorldSlice world, BlockPos pos, LightPipeline lighter, Direction dir, float brightness, ColorProvider colorProvider, FluidState fluidState, CallbackInfo info) { // Ambience if (ambience.isActive() && ambience.customLavaColor.get() && fluidState.isIn(FluidTags.LAVA)) { - Color c = ambience.lavaColor.get(); - Arrays.fill(quadColors, ColorABGR.pack(c.r, c.g, c.b, c.a)); + Arrays.fill(quadColors, ColorABGR.withAlpha(ambience.lavaColor.get().getPacked(), 255)); } } } diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/GL.java b/src/main/java/meteordevelopment/meteorclient/renderer/GL.java index 511c1b783c..19526684bd 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/GL.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/GL.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.renderer; +import com.google.common.collect.ImmutableList; import com.mojang.blaze3d.platform.GlStateManager; import meteordevelopment.meteorclient.mixin.BufferRendererAccessor; import meteordevelopment.meteorclient.mixininterface.ICapabilityTracker; @@ -17,7 +18,6 @@ import java.lang.reflect.Field; import java.nio.ByteBuffer; import java.nio.FloatBuffer; -import java.util.List; import static meteordevelopment.meteorclient.MeteorClient.mc; import static org.lwjgl.opengl.GL32C.*; @@ -133,7 +133,7 @@ public static int createShader(int type) { } public static void shaderSource(int shader, String source) { - GlStateManager.glShaderSource(shader, List.of(source)); + GlStateManager.glShaderSource(shader, ImmutableList.of(source)); } public static String compileShader(int shader) { diff --git a/src/main/java/meteordevelopment/meteorclient/settings/BoolSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/BoolSetting.java index e42351541a..cb21ed7035 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/BoolSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/BoolSetting.java @@ -5,13 +5,14 @@ package meteordevelopment.meteorclient.settings; +import com.google.common.collect.ImmutableList; import net.minecraft.nbt.NbtCompound; import java.util.List; import java.util.function.Consumer; public class BoolSetting extends Setting { - private static final List SUGGESTIONS = List.of("true", "false", "toggle"); + private static final List SUGGESTIONS = ImmutableList.of("true", "false", "toggle"); private BoolSetting(String name, String description, Boolean defaultValue, Consumer onChanged, Consumer> onModuleActivated, IVisible visible) { super(name, description, defaultValue, onChanged, onModuleActivated, visible); diff --git a/src/main/java/meteordevelopment/meteorclient/settings/ColorSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/ColorSetting.java index 47ef146303..644028e36f 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/ColorSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/ColorSetting.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.settings; +import com.google.common.collect.ImmutableList; import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.render.color.SettingColor; import net.minecraft.nbt.NbtCompound; @@ -13,7 +14,7 @@ import java.util.function.Consumer; public class ColorSetting extends Setting { - private static final List SUGGESTIONS = List.of("0 0 0 255", "225 25 25 255", "25 225 25 255", "25 25 225 255", "255 255 255 255"); + private static final List SUGGESTIONS = ImmutableList.of("0 0 0 255", "225 25 25 255", "25 225 25 255", "25 25 225 255", "255 255 255 255"); public ColorSetting(String name, String description, SettingColor defaultValue, Consumer onChanged, Consumer> onModuleActivated, IVisible visible) { super(name, description, defaultValue, onChanged, onModuleActivated, visible); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/System.java b/src/main/java/meteordevelopment/meteorclient/systems/System.java index 60b2fb203d..b2d23353ed 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/System.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/System.java @@ -46,7 +46,7 @@ public void save(File folder) { try { File tempFile = File.createTempFile(MeteorClient.MOD_ID, file.getName()); - NbtIo.write(tag, tempFile.toPath()); + NbtIo.write(tag, tempFile); if (folder != null) file = new File(folder, file.getName()); @@ -71,7 +71,7 @@ public void load(File folder) { if (file.exists()) { try { - fromTag(NbtIo.read(file.toPath())); + fromTag(NbtIo.read(file)); } catch (CrashException e) { String backupName = FilenameUtils.removeExtension(file.getName()) + "-" + ZonedDateTime.now().format(DATE_TIME_FORMATTER) + ".backup.nbt"; File backup = new File(file.getParentFile(), backupName); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/accounts/Account.java b/src/main/java/meteordevelopment/meteorclient/systems/accounts/Account.java index 70ca1ac710..428a424eb9 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/accounts/Account.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/accounts/Account.java @@ -68,7 +68,11 @@ public static void setSession(Session session) { MinecraftClientAccessor mca = (MinecraftClientAccessor) mc; mca.setSession(session); UserApiService apiService; - apiService = mca.getAuthenticationService().createUserApiService(session.getAccessToken()); + try { + apiService = mca.getAuthenticationService().createUserApiService(session.getAccessToken()); + } catch (AuthenticationException e) { + apiService = UserApiService.OFFLINE; + } mca.setUserApiService(apiService); mca.setSocialInteractionsManager(new SocialInteractionsManager(mc, apiService)); mca.setProfileKeys(ProfileKeys.create(apiService, session, mc.runDirectory.toPath())); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/EasyMCAccount.java b/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/EasyMCAccount.java index 52b1aeeef7..e6f023df4e 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/EasyMCAccount.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/EasyMCAccount.java @@ -21,7 +21,7 @@ public class EasyMCAccount extends Account { - private static final Environment ENVIRONMENT = new Environment("https://sessionserver.easymc.io", "https://authserver.mojang.com", "EasyMC"); + private static final Environment ENVIRONMENT = new Environment("https://authserver.mojang.com", "https://sessionserver.easymc.io", "https://api.minecraftservices.com", "EasyMC"); private static final YggdrasilAuthenticationService SERVICE = new YggdrasilAuthenticationService(((MinecraftClientAccessor) mc).getProxy(), ENVIRONMENT); public EasyMCAccount(String token) { 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 57f2df4bc2..b1c37466f2 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/TheAlteningAccount.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/TheAlteningAccount.java @@ -21,7 +21,7 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; public class TheAlteningAccount extends Account { - private static final Environment ENVIRONMENT = new Environment("http://sessionserver.thealtening.com", "http://authserver.thealtening.com", "The Altening"); + private static final Environment ENVIRONMENT = new Environment("http://authserver.thealtening.com", "http://sessionserver.thealtening.com", "https://api.minecraftservices.com", "The Altening"); private static final YggdrasilAuthenticationService SERVICE = new YggdrasilAuthenticationService(((MinecraftClientAccessor) mc).getProxy(), ENVIRONMENT); public TheAlteningAccount(String token) { @@ -68,7 +68,7 @@ public boolean login() { } private WaybackAuthLib getAuth() { - WaybackAuthLib auth = new WaybackAuthLib(ENVIRONMENT.servicesHost()); + WaybackAuthLib auth = new WaybackAuthLib(ENVIRONMENT.accountsHost()); auth.setUsername(name); auth.setPassword("Meteor on Crack!"); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/friends/Friend.java b/src/main/java/meteordevelopment/meteorclient/systems/friends/Friend.java index 8003a938f1..16476b039a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/friends/Friend.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/friends/Friend.java @@ -31,7 +31,7 @@ public Friend(String name, @Nullable UUID id) { } public Friend(PlayerEntity player) { - this(player.getName().getString(), player.getUuid()); + this(player.getEntityName(), player.getUuid()); } public Friend(String name) { this(name, null); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/friends/Friends.java b/src/main/java/meteordevelopment/meteorclient/systems/friends/Friends.java index 3642319fa1..7227e58c4d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/friends/Friends.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/friends/Friends.java @@ -65,7 +65,7 @@ public Friend get(String name) { } public Friend get(PlayerEntity player) { - return get(player.getName().getString()); + return get(player.getEntityName()); } public Friend get(PlayerListEntry player) { 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 fe2e31086f..b868e4012c 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/CombatHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/CombatHud.java @@ -237,7 +237,7 @@ public void render(HudRenderer renderer) { String breakText = " | "; // Name - String nameText = playerEntity.getName().getString(); + String nameText = playerEntity.getEntityName(); Color nameColor = PlayerUtils.getPlayerColor(playerEntity, primaryColor); // Ping 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 879a45d708..2adbde96a8 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PlayerRadarHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PlayerRadarHud.java @@ -153,7 +153,7 @@ public void tick(HudRenderer renderer) { if (entity.equals(mc.player)) continue; if (!friends.get() && Friends.get().isFriend(entity)) continue; - String text = entity.getName().getString(); + String text = entity.getEntityName(); if (distance.get()) text += String.format("(%sm)", Math.round(mc.getCameraEntity().distanceTo(entity))); width = Math.max(width, renderer.textWidth(text, shadow.get(), getScale())); @@ -180,7 +180,7 @@ public void render(HudRenderer renderer) { if (entity.equals(mc.player)) continue; if (!friends.get() && Friends.get().isFriend(entity)) continue; - String text = entity.getName().getString(); + String text = entity.getEntityName(); Color color = PlayerUtils.getPlayerColor(entity, primaryColor.get()); String distanceText = null; 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 5d3f0e99c3..8a2e1c699a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PotionTimersHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PotionTimersHud.java @@ -241,7 +241,7 @@ public void render(HudRenderer renderer) { } private String getString(StatusEffectInstance statusEffectInstance) { - return String.format("%s %d (%s)", Names.get(statusEffectInstance.getEffectType()), statusEffectInstance.getAmplifier() + 1, statusEffectInstance.isInfinite() ? "inf" : StringHelper.formatTicks(statusEffectInstance.getDuration(), mc.world.getTickManager().getTickRate())); //todo remove "inf" when font rendering can use symbols + return String.format("%s %d (%s)", Names.get(statusEffectInstance.getEffectType()), statusEffectInstance.getAmplifier() + 1, statusEffectInstance.isInfinite() ? "inf" : StringHelper.formatTicks(statusEffectInstance.getDuration())); //todo remove "inf" when font rendering can use symbols } private double getScale() { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java index c9b07c574d..ac14ca7ddc 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.systems.modules; +import com.google.common.collect.Ordering; import com.mojang.datafixers.util.Pair; import com.mojang.serialization.Lifecycle; import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap; @@ -169,7 +170,7 @@ public List getActive() { } public Set searchTitles(String text) { - Map modules = new ValueComparableMap<>(Comparator.naturalOrder()); + Map modules = new ValueComparableMap<>(Ordering.natural()); for (Module module : this.moduleInstances.values()) { int score = Utils.searchLevenshteinDefault(module.title, text, false); @@ -180,7 +181,7 @@ public Set searchTitles(String text) { } public Set searchSettingTitles(String text) { - Map modules = new ValueComparableMap<>(Comparator.naturalOrder()); + Map modules = new ValueComparableMap<>(Ordering.natural()); for (Module module : this.moduleInstances.values()) { int lowest = Integer.MAX_VALUE; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/DiscordPresence.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/DiscordPresence.java index 3ddd3c98ca..3750694c38 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/DiscordPresence.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/DiscordPresence.java @@ -25,13 +25,13 @@ import meteordevelopment.orbit.EventHandler; import meteordevelopment.starscript.Script; import net.minecraft.client.gui.screen.*; -import net.minecraft.client.gui.screen.multiplayer.AddServerScreen; -import net.minecraft.client.gui.screen.multiplayer.ConnectScreen; -import net.minecraft.client.gui.screen.multiplayer.DirectConnectScreen; import net.minecraft.client.gui.screen.multiplayer.MultiplayerScreen; import net.minecraft.client.gui.screen.option.*; import net.minecraft.client.gui.screen.pack.PackScreen; -import net.minecraft.client.gui.screen.world.*; +import net.minecraft.client.gui.screen.world.CreateWorldScreen; +import net.minecraft.client.gui.screen.world.EditGameRulesScreen; +import net.minecraft.client.gui.screen.world.EditWorldScreen; +import net.minecraft.client.gui.screen.world.SelectWorldScreen; import net.minecraft.client.realms.gui.screen.RealmsScreen; import net.minecraft.util.Pair; import net.minecraft.util.Util; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/MessageAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/MessageAura.java index 23c795b191..3c63a48401 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/MessageAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/MessageAura.java @@ -43,7 +43,7 @@ private void onEntityAdded(EntityAddedEvent event) { if (!(event.entity instanceof PlayerEntity) || event.entity.getUuid().equals(mc.player.getUuid())) return; if (!ignoreFriends.get() || (ignoreFriends.get() && !Friends.get().isFriend((PlayerEntity)event.entity))) { - ChatUtils.sendPlayerMsg("/msg " + event.entity.getName().getString() + " " + message.get()); + ChatUtils.sendPlayerMsg("/msg " + event.entity.getEntityName() + " " + message.get()); } } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java index 4a91c48eee..adcbcb2825 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java @@ -154,7 +154,7 @@ private void onEntityAdded(EntityAddedEvent event) { if (!event.entity.getUuid().equals(mc.player.getUuid()) && entities.get().contains(event.entity.getType()) && visualRange.get() && this.event.get() != Event.Despawn) { if (event.entity instanceof PlayerEntity) { if ((!visualRangeIgnoreFriends.get() || !Friends.get().isFriend(((PlayerEntity) event.entity))) && (!visualRangeIgnoreFakes.get() || !(event.entity instanceof FakePlayerEntity))) { - ChatUtils.sendMsg(event.entity.getId() + 100, Formatting.GRAY, "(highlight)%s(default) has entered your visual range!", event.entity.getName().getString()); + ChatUtils.sendMsg(event.entity.getId() + 100, Formatting.GRAY, "(highlight)%s(default) has entered your visual range!", event.entity.getEntityName()); if (visualMakeSound.get()) mc.world.playSoundFromEntity(mc.player, mc.player, SoundEvents.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.AMBIENT, 3.0F, 1.0F); @@ -180,7 +180,7 @@ private void onEntityRemoved(EntityRemovedEvent event) { if (!event.entity.getUuid().equals(mc.player.getUuid()) && entities.get().contains(event.entity.getType()) && visualRange.get() && this.event.get() != Event.Spawn) { if (event.entity instanceof PlayerEntity) { if ((!visualRangeIgnoreFriends.get() || !Friends.get().isFriend(((PlayerEntity) event.entity))) && (!visualRangeIgnoreFakes.get() || !(event.entity instanceof FakePlayerEntity))) { - ChatUtils.sendMsg(event.entity.getId() + 100, Formatting.GRAY, "(highlight)%s(default) has left your visual range!", event.entity.getName().getString()); + ChatUtils.sendMsg(event.entity.getId() + 100, Formatting.GRAY, "(highlight)%s(default) has left your visual range!", event.entity.getEntityName()); if (visualMakeSound.get()) mc.world.playSoundFromEntity(mc.player, mc.player, SoundEvents.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.AMBIENT, 3.0F, 1.0F); @@ -202,7 +202,7 @@ private void onEntityRemoved(EntityRemovedEvent event) { if (pearl.getOwner() != null && pearl.getOwner() instanceof PlayerEntity p) { double d = pearlStartPosMap.get(i).distanceTo(e.getPos()); if ((!Friends.get().isFriend(p) || !pearlIgnoreFriends.get()) && (!p.equals(mc.player) || !pearlIgnoreOwn.get())) { - info("(highlight)%s's(default) pearl landed at %d, %d, %d (highlight)(%.1fm away, travelled %.1fm)(default).", pearl.getOwner().getName().getString(), pearl.getBlockPos().getX(), pearl.getBlockPos().getY(), pearl.getBlockPos().getZ(), pearl.distanceTo(mc.player), d); + info("(highlight)%s's(default) pearl landed at %d, %d, %d (highlight)(%.1fm away, travelled %.1fm)(default).", pearl.getOwner().getEntityName(), pearl.getBlockPos().getX(), pearl.getBlockPos().getY(), pearl.getBlockPos().getZ(), pearl.distanceTo(mc.player), d); } } pearlStartPosMap.remove(i); @@ -246,7 +246,7 @@ private void onReceivePacket(PacketEvent.Receive event) { int pops = totemPopMap.getOrDefault(entity.getUuid(), 0); totemPopMap.put(entity.getUuid(), ++pops); - ChatUtils.sendMsg(getChatId(entity), Formatting.GRAY, "(highlight)%s (default)popped (highlight)%d (default)%s.", entity.getName().getString(), pops, pops == 1 ? "totem" : "totems"); + ChatUtils.sendMsg(getChatId(entity), Formatting.GRAY, "(highlight)%s (default)popped (highlight)%d (default)%s.", entity.getEntityName(), pops, pops == 1 ? "totem" : "totems"); } } @@ -260,7 +260,7 @@ private void onTick(TickEvent.Post event) { if (player.deathTime > 0 || player.getHealth() <= 0) { int pops = totemPopMap.removeInt(player.getUuid()); - ChatUtils.sendMsg(getChatId(player), Formatting.GRAY, "(highlight)%s (default)died after popping (highlight)%d (default)%s.", player.getName().getString(), pops, pops == 1 ? "totem" : "totems"); + ChatUtils.sendMsg(getChatId(player), Formatting.GRAY, "(highlight)%s (default)died after popping (highlight)%d (default)%s.", player.getEntityName(), pops, pops == 1 ? "totem" : "totems"); chatIdMap.removeInt(player.getUuid()); } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/ServerSpoof.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/ServerSpoof.java index dd0b910d15..94edd3b9b0 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/ServerSpoof.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/ServerSpoof.java @@ -100,12 +100,12 @@ private void onPacketRecieve(PacketEvent.Receive event) { if (!(event.packet instanceof ResourcePackSendS2CPacket packet)) return; event.cancel(); MutableText msg = Text.literal("This server has "); - msg.append(packet.required() ? "a required " : "an optional "); + msg.append(packet.isRequired() ? "a required " : "an optional "); MutableText link = Text.literal("resource pack"); link.setStyle(link.getStyle() .withColor(Formatting.BLUE) .withUnderline(true) - .withClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, packet.url())) + .withClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, packet.getUrl())) .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Text.literal("Click to download"))) ); msg.append(link); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java index f72e2fa1d0..7410c1f427 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java @@ -189,7 +189,7 @@ private boolean shouldStopUsing(ItemStack itemStack) { public static double getScore(ItemStack itemStack, BlockState state, boolean silkTouchEnderChest, boolean fortuneOre, EnchantPreference enchantPreference, Predicate good) { if (!good.test(itemStack) || !isTool(itemStack)) return -1; - if (!itemStack.isSuitableFor(state) && !(itemStack.getItem() instanceof SwordItem && (state.getBlock() instanceof BambooBlock || state.getBlock() instanceof BambooShootBlock))) return -1; + if (!itemStack.isSuitableFor(state) && !(itemStack.getItem() instanceof SwordItem && (state.getBlock() instanceof BambooBlock || state.getBlock() instanceof BambooSaplingBlock))) return -1; if (silkTouchEnderChest && state.getBlock() == Blocks.ENDER_CHEST @@ -213,7 +213,7 @@ && isFortunable(state.getBlock()) if (enchantPreference == EnchantPreference.Fortune) score += EnchantmentHelper.getLevel(Enchantments.FORTUNE, itemStack); if (enchantPreference == EnchantPreference.SilkTouch) score += EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, itemStack); - if (itemStack.getItem() instanceof SwordItem item && (state.getBlock() instanceof BambooBlock || state.getBlock() instanceof BambooShootBlock)) + if (itemStack.getItem() instanceof SwordItem item && (state.getBlock() instanceof BambooBlock || state.getBlock() instanceof BambooSaplingBlock)) score += 9000 + (item.getMaterial().getMiningLevel() * 1000); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/FakePlayer.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/FakePlayer.java index bd4480eea4..6946dfddf7 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/FakePlayer.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/FakePlayer.java @@ -56,7 +56,7 @@ public WWidget getWidget(GuiTheme theme) { private void fillTable(GuiTheme theme, WTable table) { for (FakePlayerEntity fakePlayer : FakePlayerManager.getFakePlayers()) { - table.add(theme.label(fakePlayer.getName().getString())); + table.add(theme.label(fakePlayer.getEntityName())); WMinus delete = table.add(theme.minus()).expandCellX().right().widget(); delete.action = () -> { FakePlayerManager.remove(fakePlayer); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/MiddleClickExtra.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/MiddleClickExtra.java index 6794b7735b..0af7d1116e 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/MiddleClickExtra.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/MiddleClickExtra.java @@ -98,11 +98,11 @@ private void onMouseButton(MouseButtonEvent event) { if (!Friends.get().isFriend(player)) { Friends.get().add(new Friend(player)); - info("Added %s to friends", player.getName().getString()); - if (message.get()) ChatUtils.sendPlayerMsg("/msg " + player.getName() + " I just friended you on Meteor."); + info("Added %s to friends", player.getEntityName()); + if (message.get()) ChatUtils.sendPlayerMsg("/msg " + player.getEntityName() + " I just friended you on Meteor."); } else { Friends.get().remove(Friends.get().get(player)); - info("Removed %s from friends", player.getName().getString()); + info("Removed %s from friends", player.getEntityName()); } return; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java index 357dc14986..4158e0646e 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java @@ -417,10 +417,10 @@ public void applyCompactShulkerTooltip(ItemStack stack, List tooltip) { private MutableText getStatusText(StatusEffectInstance effect) { MutableText text = Text.translatable(effect.getTranslationKey()); if (effect.getAmplifier() != 0) { - text.append(String.format(" %d (%s)", effect.getAmplifier() + 1, StatusEffectUtil.getDurationText(effect, 1, mc.world.getTickManager().getTickRate()).getString())); + text.append(String.format(" %d (%s)", effect.getAmplifier() + 1, StatusEffectUtil.getDurationText(effect, 1).getString())); } else { - text.append(String.format(" (%s)", StatusEffectUtil.getDurationText(effect, 1, mc.world.getTickManager().getTickRate()).getString())); + text.append(String.format(" (%s)", StatusEffectUtil.getDurationText(effect, 1).getString())); } if (effect.getEffectType().isBeneficial()) return text.formatted(Formatting.BLUE); @@ -436,7 +436,7 @@ private Text getFirstPage(ItemStack stack) { if (stack.getItem() == Items.WRITABLE_BOOK) return Text.literal(pages.getString(0)); try { - return Text.Serialization.fromLenientJson(pages.getString(0)); + return Text.Serializer.fromLenientJson(pages.getString(0)); } catch (JsonParseException e) { return Text.literal("Invalid book data"); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/EntityOwner.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/EntityOwner.java index 5b2f672650..cc1c4db427 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/EntityOwner.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/EntityOwner.java @@ -110,7 +110,7 @@ private void renderNametag(String name) { private String getOwnerName(UUID uuid) { // Check if the player is online PlayerEntity player = mc.world.getPlayerByUuid(uuid); - if (player != null) return player.getName().getString(); + if (player != null) return player.getEntityName(); // Check cache String name = uuidToName.get(uuid); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/LogoutSpots.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/LogoutSpots.java index 4bba428fec..a750a33afb 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/LogoutSpots.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/LogoutSpots.java @@ -217,7 +217,7 @@ public Entry(PlayerEntity entity) { height = entity.getBoundingBox().getLengthY(); uuid = entity.getUuid(); - name = entity.getName().getString(); + name = entity.getEntityName(); health = Math.round(entity.getHealth() + entity.getAbsorptionAmount()); maxHealth = Math.round(entity.getMaxHealth() + entity.getAbsorptionAmount()); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java index 79d51bc625..c343ce6bdc 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java @@ -391,8 +391,8 @@ private void renderNametagPlayer(Render2DEvent event, PlayerEntity player, boole String name; Color nameColor = PlayerUtils.getPlayerColor(player, this.nameColor.get()); - if (player == mc.player) name = Modules.get().get(NameProtect.class).getName(player.getName().getString()); - else name = player.getName().getString(); + if (player == mc.player) name = Modules.get().get(NameProtect.class).getName(player.getEntityName()); + else name = player.getEntityName(); // Health float absorption = player.getAbsorptionAmount(); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Flamethrower.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Flamethrower.java index 1eb6ff4e5d..3d6585f945 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Flamethrower.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Flamethrower.java @@ -125,7 +125,7 @@ private void interact() { Block block = mc.world.getBlockState(entity.getBlockPos()).getBlock(); Block bottom = mc.world.getBlockState(entity.getBlockPos().down()).getBlock(); if (block == Blocks.WATER || bottom == Blocks.WATER || bottom == Blocks.DIRT_PATH) return; - if (block == Blocks.GRASS_BLOCK) mc.interactionManager.attackBlock(entity.getBlockPos(), Direction.DOWN); + if (block == Blocks.GRASS) mc.interactionManager.attackBlock(entity.getBlockPos(), Direction.DOWN); if (putOutFire.get() && entity instanceof LivingEntity animal && animal.getHealth() < 1) { mc.interactionManager.attackBlock(entity.getBlockPos(), Direction.DOWN); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java index ff2eff1a99..b3123ee743 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java @@ -275,7 +275,7 @@ private void onRender(Render3DEvent event) { if (enableRenderBounding.get()){ // Render bounding box if cube and should break stuff if (shape.get() != Shape.Sphere && mode.get() != Mode.Smash) { - box = new Box(pos1.toCenterPos(), pos2.toCenterPos()); + box = new Box(pos1, pos2); event.renderer.box(box, sideColorBox.get(), lineColorBox.get(), shapeModeBox.get(), 0); } } @@ -341,7 +341,7 @@ private void onTickPre(TickEvent.Pre event) { if (mode.get() == Mode.Flatten){ pos1.setY((int) Math.floor(pY)); } - box = new Box(pos1.toCenterPos(), pos2.toCenterPos()); + box = new Box(pos1, pos2); // Find blocks to break BlockIterator.register(Math.max((int) Math.ceil(range.get()+1), maxh), Math.max((int) Math.ceil(range.get()), maxv), (blockPos, blockState) -> { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/VeinMiner.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/VeinMiner.java index ca985ce861..36781f8748 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/VeinMiner.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/VeinMiner.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.systems.modules.world; +import com.google.common.collect.Sets; import meteordevelopment.meteorclient.events.entity.player.StartBreakingBlockEvent; import meteordevelopment.meteorclient.events.render.Render3DEvent; import meteordevelopment.meteorclient.events.world.TickEvent; @@ -36,7 +37,7 @@ public class VeinMiner extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); private final SettingGroup sgRender = settings.createGroup("Render"); - private final Set blockNeighbours = Set.of( + private final Set blockNeighbours = Sets.newHashSet( new Vec3i(1, -1, 1), new Vec3i(0, -1, 1), new Vec3i(-1, -1, 1), new Vec3i(1, -1, 0), new Vec3i(0, -1, 0), new Vec3i(-1, -1, 0), new Vec3i(1, -1, -1), new Vec3i(0, -1, -1), new Vec3i(-1, -1, -1), @@ -55,7 +56,7 @@ public class VeinMiner extends Module { private final Setting> selectedBlocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") .description("Which blocks to select.") - .defaultValue(Blocks.STONE, Blocks.DIRT, Blocks.GRASS_BLOCK) + .defaultValue(Blocks.STONE, Blocks.DIRT, Blocks.GRASS) .build() ); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityUtils.java index 3fa73c7704..c89f3e83e5 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityUtils.java @@ -139,7 +139,7 @@ public static BlockPos getCityBlock(PlayerEntity player) { public static String getName(Entity entity) { if (entity == null) return null; - if (entity instanceof PlayerEntity) return entity.getName().getString(); + if (entity instanceof PlayerEntity) return entity.getEntityName(); return entity.getType().getName().getString(); } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/fakeplayer/FakePlayerManager.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/fakeplayer/FakePlayerManager.java index b05a47c29a..b6fe58d550 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/entity/fakeplayer/FakePlayerManager.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/entity/fakeplayer/FakePlayerManager.java @@ -23,7 +23,7 @@ public static List getFakePlayers() { public static FakePlayerEntity get(String name) { for (FakePlayerEntity fp : ENTITIES) { - if (fp.getName().getString().equals(name)) return fp; + if (fp.getEntityName().equals(name)) return fp; } return null; @@ -39,7 +39,7 @@ public static void add(String name, float health, boolean copyInv) { public static void remove(FakePlayerEntity fp) { ENTITIES.removeIf(fp1 -> { - if (fp1.getName().getString().equals(fp.getName().getString())) { + if (fp1.getEntityName().equals(fp.getEntityName())) { fp1.despawn(); return true; } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/NbtUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/NbtUtils.java index 9ccca937a3..2d961e52b3 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/NbtUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/NbtUtils.java @@ -8,7 +8,10 @@ import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.systems.System; import meteordevelopment.meteorclient.utils.render.prompts.OkPrompt; -import net.minecraft.nbt.*; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.NbtElement; +import net.minecraft.nbt.NbtIo; +import net.minecraft.nbt.NbtList; import org.apache.commons.io.output.ByteArrayOutputStream; import java.io.ByteArrayInputStream; @@ -86,7 +89,7 @@ public static NbtCompound fromClipboard(NbtCompound schema) { byte[] data = Base64.getDecoder().decode(mc.keyboard.getClipboard().trim()); ByteArrayInputStream bis = new ByteArrayInputStream(data); - NbtCompound pasted = NbtIo.readCompressed(new DataInputStream(bis), NbtTagSizeTracker.ofUnlimitedBytes()); + NbtCompound pasted = NbtIo.readCompressed(new DataInputStream(bis)); for (String key : schema.getKeys()) if (!pasted.getKeys().contains(key)) return null; if (!pasted.getString("name").equals(schema.getString("name"))) return null; diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/ValueComparableMap.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/ValueComparableMap.java index a5046c916e..04d953a26b 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/ValueComparableMap.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/ValueComparableMap.java @@ -5,31 +5,29 @@ package meteordevelopment.meteorclient.utils.misc; +import com.google.common.collect.Ordering; + import java.util.Comparator; import java.util.HashMap; import java.util.Map; import java.util.TreeMap; public class ValueComparableMap, V> extends TreeMap { - private final transient Map valueMap; + private final Map valueMap; - public ValueComparableMap(final Comparator partialValueComparator) { - this(partialValueComparator, new HashMap<>()); + public ValueComparableMap(final Ordering partialValueOrdering) { + this(partialValueOrdering, new HashMap()); } - private ValueComparableMap(Comparator partialValueComparator, HashMap valueMap) { - super((k1, k2) -> { - int cmp = partialValueComparator.compare(valueMap.get(k1), valueMap.get(k2)); - return cmp != 0 ? cmp : k1.compareTo(k2); - }); - + private ValueComparableMap(Ordering partialValueOrdering, HashMap valueMap) { + super(partialValueOrdering.onResultOf(valueMap::get).compound(Comparator.naturalOrder())); this.valueMap = valueMap; } @Override public V put(K k, V v) { if (valueMap.containsKey(k)) remove(k); - valueMap.put(k, v); + valueMap.put(k,v); return super.put(k, v); } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtils.java index f20229eda3..76494d2559 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtils.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.utils.network; +import com.google.common.collect.Iterators; import com.mojang.datafixers.util.Pair; import com.mojang.serialization.Lifecycle; import meteordevelopment.meteorclient.utils.misc.MeteorIdentifier; @@ -18,11 +19,10 @@ import net.minecraft.util.Identifier; import net.minecraft.util.math.random.Random; import org.jetbrains.annotations.NotNull; - import java.util.*; import java.util.stream.Stream; -public abstract class PacketUtils { +public class PacketUtils { public static final Registry>> REGISTRY = new PacketRegistry(); private static final Map>, String> S2C_PACKETS = new HashMap<>(); @@ -38,10 +38,10 @@ public abstract class PacketUtils { C2S_PACKETS_R.put("PlayerInteractItemC2SPacket", net.minecraft.network.packet.c2s.play.PlayerInteractItemC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.login.EnterConfigurationC2SPacket.class, "EnterConfigurationC2SPacket"); C2S_PACKETS_R.put("EnterConfigurationC2SPacket", net.minecraft.network.packet.c2s.login.EnterConfigurationC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.SelectMerchantTradeC2SPacket.class, "SelectMerchantTradeC2SPacket"); - C2S_PACKETS_R.put("SelectMerchantTradeC2SPacket", net.minecraft.network.packet.c2s.play.SelectMerchantTradeC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket.class, "PlayerActionC2SPacket"); C2S_PACKETS_R.put("PlayerActionC2SPacket", net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.SelectMerchantTradeC2SPacket.class, "SelectMerchantTradeC2SPacket"); + C2S_PACKETS_R.put("SelectMerchantTradeC2SPacket", net.minecraft.network.packet.c2s.play.SelectMerchantTradeC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.CommandExecutionC2SPacket.class, "CommandExecutionC2SPacket"); C2S_PACKETS_R.put("CommandExecutionC2SPacket", net.minecraft.network.packet.c2s.play.CommandExecutionC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.RenameItemC2SPacket.class, "RenameItemC2SPacket"); @@ -54,30 +54,30 @@ public abstract class PacketUtils { C2S_PACKETS_R.put("QueryBlockNbtC2SPacket", net.minecraft.network.packet.c2s.play.QueryBlockNbtC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.PlayerInteractEntityC2SPacket.class, "PlayerInteractEntityC2SPacket"); C2S_PACKETS_R.put("PlayerInteractEntityC2SPacket", net.minecraft.network.packet.c2s.play.PlayerInteractEntityC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdatePlayerAbilitiesC2SPacket.class, "UpdatePlayerAbilitiesC2SPacket"); - C2S_PACKETS_R.put("UpdatePlayerAbilitiesC2SPacket", net.minecraft.network.packet.c2s.play.UpdatePlayerAbilitiesC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.RequestCommandCompletionsC2SPacket.class, "RequestCommandCompletionsC2SPacket"); - C2S_PACKETS_R.put("RequestCommandCompletionsC2SPacket", net.minecraft.network.packet.c2s.play.RequestCommandCompletionsC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.AcknowledgeReconfigurationC2SPacket.class, "AcknowledgeReconfigurationC2SPacket"); C2S_PACKETS_R.put("AcknowledgeReconfigurationC2SPacket", net.minecraft.network.packet.c2s.play.AcknowledgeReconfigurationC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.RequestCommandCompletionsC2SPacket.class, "RequestCommandCompletionsC2SPacket"); + C2S_PACKETS_R.put("RequestCommandCompletionsC2SPacket", net.minecraft.network.packet.c2s.play.RequestCommandCompletionsC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdatePlayerAbilitiesC2SPacket.class, "UpdatePlayerAbilitiesC2SPacket"); + C2S_PACKETS_R.put("UpdatePlayerAbilitiesC2SPacket", net.minecraft.network.packet.c2s.play.UpdatePlayerAbilitiesC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.query.QueryRequestC2SPacket.class, "QueryRequestC2SPacket"); C2S_PACKETS_R.put("QueryRequestC2SPacket", net.minecraft.network.packet.c2s.query.QueryRequestC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdateCommandBlockC2SPacket.class, "UpdateCommandBlockC2SPacket"); C2S_PACKETS_R.put("UpdateCommandBlockC2SPacket", net.minecraft.network.packet.c2s.play.UpdateCommandBlockC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.HandSwingC2SPacket.class, "HandSwingC2SPacket"); C2S_PACKETS_R.put("HandSwingC2SPacket", net.minecraft.network.packet.c2s.play.HandSwingC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.AdvancementTabC2SPacket.class, "AdvancementTabC2SPacket"); - C2S_PACKETS_R.put("AdvancementTabC2SPacket", net.minecraft.network.packet.c2s.play.AdvancementTabC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.ClickSlotC2SPacket.class, "ClickSlotC2SPacket"); C2S_PACKETS_R.put("ClickSlotC2SPacket", net.minecraft.network.packet.c2s.play.ClickSlotC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.AdvancementTabC2SPacket.class, "AdvancementTabC2SPacket"); + C2S_PACKETS_R.put("AdvancementTabC2SPacket", net.minecraft.network.packet.c2s.play.AdvancementTabC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.AcknowledgeChunksC2SPacket.class, "AcknowledgeChunksC2SPacket"); C2S_PACKETS_R.put("AcknowledgeChunksC2SPacket", net.minecraft.network.packet.c2s.play.AcknowledgeChunksC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.SpectatorTeleportC2SPacket.class, "SpectatorTeleportC2SPacket"); C2S_PACKETS_R.put("SpectatorTeleportC2SPacket", net.minecraft.network.packet.c2s.play.SpectatorTeleportC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.login.LoginKeyC2SPacket.class, "LoginKeyC2SPacket"); - C2S_PACKETS_R.put("LoginKeyC2SPacket", net.minecraft.network.packet.c2s.login.LoginKeyC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdateDifficultyLockC2SPacket.class, "UpdateDifficultyLockC2SPacket"); C2S_PACKETS_R.put("UpdateDifficultyLockC2SPacket", net.minecraft.network.packet.c2s.play.UpdateDifficultyLockC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.login.LoginKeyC2SPacket.class, "LoginKeyC2SPacket"); + C2S_PACKETS_R.put("LoginKeyC2SPacket", net.minecraft.network.packet.c2s.login.LoginKeyC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.JigsawGeneratingC2SPacket.class, "JigsawGeneratingC2SPacket"); C2S_PACKETS_R.put("JigsawGeneratingC2SPacket", net.minecraft.network.packet.c2s.play.JigsawGeneratingC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.QueryEntityNbtC2SPacket.class, "QueryEntityNbtC2SPacket"); @@ -92,16 +92,14 @@ public abstract class PacketUtils { C2S_PACKETS_R.put("PlayerMoveC2SPacket", net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.common.ClientOptionsC2SPacket.class, "ClientOptionsC2SPacket"); C2S_PACKETS_R.put("ClientOptionsC2SPacket", net.minecraft.network.packet.c2s.common.ClientOptionsC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.PickFromInventoryC2SPacket.class, "PickFromInventoryC2SPacket"); - C2S_PACKETS_R.put("PickFromInventoryC2SPacket", net.minecraft.network.packet.c2s.play.PickFromInventoryC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.common.CustomPayloadC2SPacket.class, "CustomPayloadC2SPacket"); C2S_PACKETS_R.put("CustomPayloadC2SPacket", net.minecraft.network.packet.c2s.common.CustomPayloadC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.PickFromInventoryC2SPacket.class, "PickFromInventoryC2SPacket"); + C2S_PACKETS_R.put("PickFromInventoryC2SPacket", net.minecraft.network.packet.c2s.play.PickFromInventoryC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.PlayerSessionC2SPacket.class, "PlayerSessionC2SPacket"); C2S_PACKETS_R.put("PlayerSessionC2SPacket", net.minecraft.network.packet.c2s.play.PlayerSessionC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.CloseHandledScreenC2SPacket.class, "CloseHandledScreenC2SPacket"); C2S_PACKETS_R.put("CloseHandledScreenC2SPacket", net.minecraft.network.packet.c2s.play.CloseHandledScreenC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.SlotChangedStateC2SPacket.class, "SlotChangedStateC2SPacket"); - C2S_PACKETS_R.put("SlotChangedStateC2SPacket", net.minecraft.network.packet.c2s.play.SlotChangedStateC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.config.ReadyC2SPacket.class, "ReadyC2SPacket"); C2S_PACKETS_R.put("ReadyC2SPacket", net.minecraft.network.packet.c2s.config.ReadyC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.BoatPaddleStateC2SPacket.class, "BoatPaddleStateC2SPacket"); @@ -112,10 +110,10 @@ public abstract class PacketUtils { C2S_PACKETS_R.put("ButtonClickC2SPacket", net.minecraft.network.packet.c2s.play.ButtonClickC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdateBeaconC2SPacket.class, "UpdateBeaconC2SPacket"); C2S_PACKETS_R.put("UpdateBeaconC2SPacket", net.minecraft.network.packet.c2s.play.UpdateBeaconC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdateSignC2SPacket.class, "UpdateSignC2SPacket"); - C2S_PACKETS_R.put("UpdateSignC2SPacket", net.minecraft.network.packet.c2s.play.UpdateSignC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.TeleportConfirmC2SPacket.class, "TeleportConfirmC2SPacket"); C2S_PACKETS_R.put("TeleportConfirmC2SPacket", net.minecraft.network.packet.c2s.play.TeleportConfirmC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdateSignC2SPacket.class, "UpdateSignC2SPacket"); + C2S_PACKETS_R.put("UpdateSignC2SPacket", net.minecraft.network.packet.c2s.play.UpdateSignC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdateStructureBlockC2SPacket.class, "UpdateStructureBlockC2SPacket"); C2S_PACKETS_R.put("UpdateStructureBlockC2SPacket", net.minecraft.network.packet.c2s.play.UpdateStructureBlockC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdateCommandBlockMinecartC2SPacket.class, "UpdateCommandBlockMinecartC2SPacket"); @@ -134,18 +132,18 @@ public abstract class PacketUtils { C2S_PACKETS_R.put("MessageAcknowledgmentC2SPacket", net.minecraft.network.packet.c2s.play.MessageAcknowledgmentC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.common.KeepAliveC2SPacket.class, "KeepAliveC2SPacket"); C2S_PACKETS_R.put("KeepAliveC2SPacket", net.minecraft.network.packet.c2s.common.KeepAliveC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.CreativeInventoryActionC2SPacket.class, "CreativeInventoryActionC2SPacket"); - C2S_PACKETS_R.put("CreativeInventoryActionC2SPacket", net.minecraft.network.packet.c2s.play.CreativeInventoryActionC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.VehicleMoveC2SPacket.class, "VehicleMoveC2SPacket"); C2S_PACKETS_R.put("VehicleMoveC2SPacket", net.minecraft.network.packet.c2s.play.VehicleMoveC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.CreativeInventoryActionC2SPacket.class, "CreativeInventoryActionC2SPacket"); + C2S_PACKETS_R.put("CreativeInventoryActionC2SPacket", net.minecraft.network.packet.c2s.play.CreativeInventoryActionC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.BookUpdateC2SPacket.class, "BookUpdateC2SPacket"); C2S_PACKETS_R.put("BookUpdateC2SPacket", net.minecraft.network.packet.c2s.play.BookUpdateC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.RecipeBookDataC2SPacket.class, "RecipeBookDataC2SPacket"); C2S_PACKETS_R.put("RecipeBookDataC2SPacket", net.minecraft.network.packet.c2s.play.RecipeBookDataC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.login.LoginQueryResponseC2SPacket.class, "LoginQueryResponseC2SPacket"); - C2S_PACKETS_R.put("LoginQueryResponseC2SPacket", net.minecraft.network.packet.c2s.login.LoginQueryResponseC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.handshake.HandshakeC2SPacket.class, "HandshakeC2SPacket"); C2S_PACKETS_R.put("HandshakeC2SPacket", net.minecraft.network.packet.c2s.handshake.HandshakeC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.login.LoginQueryResponseC2SPacket.class, "LoginQueryResponseC2SPacket"); + C2S_PACKETS_R.put("LoginQueryResponseC2SPacket", net.minecraft.network.packet.c2s.login.LoginQueryResponseC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdateDifficultyC2SPacket.class, "UpdateDifficultyC2SPacket"); C2S_PACKETS_R.put("UpdateDifficultyC2SPacket", net.minecraft.network.packet.c2s.play.UpdateDifficultyC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.CraftRequestC2SPacket.class, "CraftRequestC2SPacket"); @@ -183,38 +181,36 @@ public abstract class PacketUtils { S2C_PACKETS_R.put("ResourcePackSendS2CPacket", net.minecraft.network.packet.s2c.common.ResourcePackSendS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.DamageTiltS2CPacket.class, "DamageTiltS2CPacket"); S2C_PACKETS_R.put("DamageTiltS2CPacket", net.minecraft.network.packet.s2c.play.DamageTiltS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.CraftFailedResponseS2CPacket.class, "CraftFailedResponseS2CPacket"); - S2C_PACKETS_R.put("CraftFailedResponseS2CPacket", net.minecraft.network.packet.s2c.play.CraftFailedResponseS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.StatisticsS2CPacket.class, "StatisticsS2CPacket"); S2C_PACKETS_R.put("StatisticsS2CPacket", net.minecraft.network.packet.s2c.play.StatisticsS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.CraftFailedResponseS2CPacket.class, "CraftFailedResponseS2CPacket"); + S2C_PACKETS_R.put("CraftFailedResponseS2CPacket", net.minecraft.network.packet.s2c.play.CraftFailedResponseS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.login.LoginQueryRequestS2CPacket.class, "LoginQueryRequestS2CPacket"); S2C_PACKETS_R.put("LoginQueryRequestS2CPacket", net.minecraft.network.packet.s2c.login.LoginQueryRequestS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.VehicleMoveS2CPacket.class, "VehicleMoveS2CPacket"); S2C_PACKETS_R.put("VehicleMoveS2CPacket", net.minecraft.network.packet.s2c.play.VehicleMoveS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityAttributesS2CPacket.class, "EntityAttributesS2CPacket"); S2C_PACKETS_R.put("EntityAttributesS2CPacket", net.minecraft.network.packet.s2c.play.EntityAttributesS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.TickStepS2CPacket.class, "TickStepS2CPacket"); - S2C_PACKETS_R.put("TickStepS2CPacket", net.minecraft.network.packet.s2c.play.TickStepS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.StopSoundS2CPacket.class, "StopSoundS2CPacket"); - S2C_PACKETS_R.put("StopSoundS2CPacket", net.minecraft.network.packet.s2c.play.StopSoundS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ScoreboardObjectiveUpdateS2CPacket.class, "ScoreboardObjectiveUpdateS2CPacket"); S2C_PACKETS_R.put("ScoreboardObjectiveUpdateS2CPacket", net.minecraft.network.packet.s2c.play.ScoreboardObjectiveUpdateS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.StopSoundS2CPacket.class, "StopSoundS2CPacket"); + S2C_PACKETS_R.put("StopSoundS2CPacket", net.minecraft.network.packet.s2c.play.StopSoundS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.StartChunkSendS2CPacket.class, "StartChunkSendS2CPacket"); S2C_PACKETS_R.put("StartChunkSendS2CPacket", net.minecraft.network.packet.s2c.play.StartChunkSendS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntitySetHeadYawS2CPacket.class, "EntitySetHeadYawS2CPacket"); S2C_PACKETS_R.put("EntitySetHeadYawS2CPacket", net.minecraft.network.packet.s2c.play.EntitySetHeadYawS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.SelectAdvancementTabS2CPacket.class, "SelectAdvancementTabS2CPacket"); - S2C_PACKETS_R.put("SelectAdvancementTabS2CPacket", net.minecraft.network.packet.s2c.play.SelectAdvancementTabS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.SetTradeOffersS2CPacket.class, "SetTradeOffersS2CPacket"); S2C_PACKETS_R.put("SetTradeOffersS2CPacket", net.minecraft.network.packet.s2c.play.SetTradeOffersS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.SelectAdvancementTabS2CPacket.class, "SelectAdvancementTabS2CPacket"); + S2C_PACKETS_R.put("SelectAdvancementTabS2CPacket", net.minecraft.network.packet.s2c.play.SelectAdvancementTabS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlaySoundS2CPacket.class, "PlaySoundS2CPacket"); S2C_PACKETS_R.put("PlaySoundS2CPacket", net.minecraft.network.packet.s2c.play.PlaySoundS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.BlockEventS2CPacket.class, "BlockEventS2CPacket"); S2C_PACKETS_R.put("BlockEventS2CPacket", net.minecraft.network.packet.s2c.play.BlockEventS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlayerPositionLookS2CPacket.class, "PlayerPositionLookS2CPacket"); - S2C_PACKETS_R.put("PlayerPositionLookS2CPacket", net.minecraft.network.packet.s2c.play.PlayerPositionLookS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ChunkSentS2CPacket.class, "ChunkSentS2CPacket"); S2C_PACKETS_R.put("ChunkSentS2CPacket", net.minecraft.network.packet.s2c.play.ChunkSentS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlayerPositionLookS2CPacket.class, "PlayerPositionLookS2CPacket"); + S2C_PACKETS_R.put("PlayerPositionLookS2CPacket", net.minecraft.network.packet.s2c.play.PlayerPositionLookS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.HealthUpdateS2CPacket.class, "HealthUpdateS2CPacket"); S2C_PACKETS_R.put("HealthUpdateS2CPacket", net.minecraft.network.packet.s2c.play.HealthUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.WorldEventS2CPacket.class, "WorldEventS2CPacket"); @@ -233,12 +229,12 @@ public abstract class PacketUtils { S2C_PACKETS_R.put("TeamS2CPacket", net.minecraft.network.packet.s2c.play.TeamS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.CooldownUpdateS2CPacket.class, "CooldownUpdateS2CPacket"); S2C_PACKETS_R.put("CooldownUpdateS2CPacket", net.minecraft.network.packet.s2c.play.CooldownUpdateS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.OpenScreenS2CPacket.class, "OpenScreenS2CPacket"); - S2C_PACKETS_R.put("OpenScreenS2CPacket", net.minecraft.network.packet.s2c.play.OpenScreenS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ExperienceOrbSpawnS2CPacket.class, "ExperienceOrbSpawnS2CPacket"); S2C_PACKETS_R.put("ExperienceOrbSpawnS2CPacket", net.minecraft.network.packet.s2c.play.ExperienceOrbSpawnS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityAnimationS2CPacket.class, "EntityAnimationS2CPacket"); S2C_PACKETS_R.put("EntityAnimationS2CPacket", net.minecraft.network.packet.s2c.play.EntityAnimationS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.OpenScreenS2CPacket.class, "OpenScreenS2CPacket"); + S2C_PACKETS_R.put("OpenScreenS2CPacket", net.minecraft.network.packet.s2c.play.OpenScreenS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlayerAbilitiesS2CPacket.class, "PlayerAbilitiesS2CPacket"); S2C_PACKETS_R.put("PlayerAbilitiesS2CPacket", net.minecraft.network.packet.s2c.play.PlayerAbilitiesS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.WorldBorderWarningBlocksChangedS2CPacket.class, "WorldBorderWarningBlocksChangedS2CPacket"); @@ -251,10 +247,10 @@ public abstract class PacketUtils { S2C_PACKETS_R.put("UnlockRecipesS2CPacket", net.minecraft.network.packet.s2c.play.UnlockRecipesS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.LightUpdateS2CPacket.class, "LightUpdateS2CPacket"); S2C_PACKETS_R.put("LightUpdateS2CPacket", net.minecraft.network.packet.s2c.play.LightUpdateS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.OverlayMessageS2CPacket.class, "OverlayMessageS2CPacket"); - S2C_PACKETS_R.put("OverlayMessageS2CPacket", net.minecraft.network.packet.s2c.play.OverlayMessageS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.WorldBorderInitializeS2CPacket.class, "WorldBorderInitializeS2CPacket"); S2C_PACKETS_R.put("WorldBorderInitializeS2CPacket", net.minecraft.network.packet.s2c.play.WorldBorderInitializeS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.OverlayMessageS2CPacket.class, "OverlayMessageS2CPacket"); + S2C_PACKETS_R.put("OverlayMessageS2CPacket", net.minecraft.network.packet.s2c.play.OverlayMessageS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.WorldBorderCenterChangedS2CPacket.class, "WorldBorderCenterChangedS2CPacket"); S2C_PACKETS_R.put("WorldBorderCenterChangedS2CPacket", net.minecraft.network.packet.s2c.play.WorldBorderCenterChangedS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityVelocityUpdateS2CPacket.class, "EntityVelocityUpdateS2CPacket"); @@ -263,12 +259,10 @@ public abstract class PacketUtils { S2C_PACKETS_R.put("DifficultyS2CPacket", net.minecraft.network.packet.s2c.play.DifficultyS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.LookAtS2CPacket.class, "LookAtS2CPacket"); S2C_PACKETS_R.put("LookAtS2CPacket", net.minecraft.network.packet.s2c.play.LookAtS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ScoreboardScoreUpdateS2CPacket.class, "ScoreboardScoreUpdateS2CPacket"); - S2C_PACKETS_R.put("ScoreboardScoreUpdateS2CPacket", net.minecraft.network.packet.s2c.play.ScoreboardScoreUpdateS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.TitleS2CPacket.class, "TitleS2CPacket"); - S2C_PACKETS_R.put("TitleS2CPacket", net.minecraft.network.packet.s2c.play.TitleS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ScreenHandlerPropertyUpdateS2CPacket.class, "ScreenHandlerPropertyUpdateS2CPacket"); S2C_PACKETS_R.put("ScreenHandlerPropertyUpdateS2CPacket", net.minecraft.network.packet.s2c.play.ScreenHandlerPropertyUpdateS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.TitleS2CPacket.class, "TitleS2CPacket"); + S2C_PACKETS_R.put("TitleS2CPacket", net.minecraft.network.packet.s2c.play.TitleS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.OpenHorseScreenS2CPacket.class, "OpenHorseScreenS2CPacket"); S2C_PACKETS_R.put("OpenHorseScreenS2CPacket", net.minecraft.network.packet.s2c.play.OpenHorseScreenS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.SimulationDistanceS2CPacket.class, "SimulationDistanceS2CPacket"); @@ -283,38 +277,36 @@ public abstract class PacketUtils { S2C_PACKETS_R.put("DeathMessageS2CPacket", net.minecraft.network.packet.s2c.play.DeathMessageS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.MapUpdateS2CPacket.class, "MapUpdateS2CPacket"); S2C_PACKETS_R.put("MapUpdateS2CPacket", net.minecraft.network.packet.s2c.play.MapUpdateS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ScreenHandlerSlotUpdateS2CPacket.class, "ScreenHandlerSlotUpdateS2CPacket"); - S2C_PACKETS_R.put("ScreenHandlerSlotUpdateS2CPacket", net.minecraft.network.packet.s2c.play.ScreenHandlerSlotUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.BlockEntityUpdateS2CPacket.class, "BlockEntityUpdateS2CPacket"); S2C_PACKETS_R.put("BlockEntityUpdateS2CPacket", net.minecraft.network.packet.s2c.play.BlockEntityUpdateS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ScreenHandlerSlotUpdateS2CPacket.class, "ScreenHandlerSlotUpdateS2CPacket"); + S2C_PACKETS_R.put("ScreenHandlerSlotUpdateS2CPacket", net.minecraft.network.packet.s2c.play.ScreenHandlerSlotUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlayerSpawnPositionS2CPacket.class, "PlayerSpawnPositionS2CPacket"); S2C_PACKETS_R.put("PlayerSpawnPositionS2CPacket", net.minecraft.network.packet.s2c.play.PlayerSpawnPositionS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityStatusEffectS2CPacket.class, "EntityStatusEffectS2CPacket"); S2C_PACKETS_R.put("EntityStatusEffectS2CPacket", net.minecraft.network.packet.s2c.play.EntityStatusEffectS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ClearTitleS2CPacket.class, "ClearTitleS2CPacket"); S2C_PACKETS_R.put("ClearTitleS2CPacket", net.minecraft.network.packet.s2c.play.ClearTitleS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.login.LoginCompressionS2CPacket.class, "LoginCompressionS2CPacket"); - S2C_PACKETS_R.put("LoginCompressionS2CPacket", net.minecraft.network.packet.s2c.login.LoginCompressionS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.CommandTreeS2CPacket.class, "CommandTreeS2CPacket"); S2C_PACKETS_R.put("CommandTreeS2CPacket", net.minecraft.network.packet.s2c.play.CommandTreeS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.login.LoginCompressionS2CPacket.class, "LoginCompressionS2CPacket"); + S2C_PACKETS_R.put("LoginCompressionS2CPacket", net.minecraft.network.packet.s2c.login.LoginCompressionS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.common.CommonPingS2CPacket.class, "CommonPingS2CPacket"); S2C_PACKETS_R.put("CommonPingS2CPacket", net.minecraft.network.packet.s2c.common.CommonPingS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ScoreboardScoreResetS2CPacket.class, "ScoreboardScoreResetS2CPacket"); - S2C_PACKETS_R.put("ScoreboardScoreResetS2CPacket", net.minecraft.network.packet.s2c.play.ScoreboardScoreResetS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.TitleFadeS2CPacket.class, "TitleFadeS2CPacket"); S2C_PACKETS_R.put("TitleFadeS2CPacket", net.minecraft.network.packet.s2c.play.TitleFadeS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.query.PingResultS2CPacket.class, "PingResultS2CPacket"); S2C_PACKETS_R.put("PingResultS2CPacket", net.minecraft.network.packet.s2c.query.PingResultS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.UpdateTickRateS2CPacket.class, "UpdateTickRateS2CPacket"); - S2C_PACKETS_R.put("UpdateTickRateS2CPacket", net.minecraft.network.packet.s2c.play.UpdateTickRateS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.InventoryS2CPacket.class, "InventoryS2CPacket"); - S2C_PACKETS_R.put("InventoryS2CPacket", net.minecraft.network.packet.s2c.play.InventoryS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlayerActionResponseS2CPacket.class, "PlayerActionResponseS2CPacket"); S2C_PACKETS_R.put("PlayerActionResponseS2CPacket", net.minecraft.network.packet.s2c.play.PlayerActionResponseS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.InventoryS2CPacket.class, "InventoryS2CPacket"); + S2C_PACKETS_R.put("InventoryS2CPacket", net.minecraft.network.packet.s2c.play.InventoryS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ChunkBiomeDataS2CPacket.class, "ChunkBiomeDataS2CPacket"); S2C_PACKETS_R.put("ChunkBiomeDataS2CPacket", net.minecraft.network.packet.s2c.play.ChunkBiomeDataS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.WorldBorderWarningTimeChangedS2CPacket.class, "WorldBorderWarningTimeChangedS2CPacket"); S2C_PACKETS_R.put("WorldBorderWarningTimeChangedS2CPacket", net.minecraft.network.packet.s2c.play.WorldBorderWarningTimeChangedS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ScoreboardPlayerUpdateS2CPacket.class, "ScoreboardPlayerUpdateS2CPacket"); + S2C_PACKETS_R.put("ScoreboardPlayerUpdateS2CPacket", net.minecraft.network.packet.s2c.play.ScoreboardPlayerUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityDamageS2CPacket.class, "EntityDamageS2CPacket"); S2C_PACKETS_R.put("EntityDamageS2CPacket", net.minecraft.network.packet.s2c.play.EntityDamageS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ChatMessageS2CPacket.class, "ChatMessageS2CPacket"); @@ -323,22 +315,20 @@ public abstract class PacketUtils { S2C_PACKETS_R.put("KeepAliveS2CPacket", net.minecraft.network.packet.s2c.common.KeepAliveS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.OpenWrittenBookS2CPacket.class, "OpenWrittenBookS2CPacket"); S2C_PACKETS_R.put("OpenWrittenBookS2CPacket", net.minecraft.network.packet.s2c.play.OpenWrittenBookS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.common.ResourcePackRemoveS2CPacket.class, "ResourcePackRemoveS2CPacket"); - S2C_PACKETS_R.put("ResourcePackRemoveS2CPacket", net.minecraft.network.packet.s2c.common.ResourcePackRemoveS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlaySoundFromEntityS2CPacket.class, "PlaySoundFromEntityS2CPacket"); - S2C_PACKETS_R.put("PlaySoundFromEntityS2CPacket", net.minecraft.network.packet.s2c.play.PlaySoundFromEntityS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.WorldTimeUpdateS2CPacket.class, "WorldTimeUpdateS2CPacket"); S2C_PACKETS_R.put("WorldTimeUpdateS2CPacket", net.minecraft.network.packet.s2c.play.WorldTimeUpdateS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlaySoundFromEntityS2CPacket.class, "PlaySoundFromEntityS2CPacket"); + S2C_PACKETS_R.put("PlaySoundFromEntityS2CPacket", net.minecraft.network.packet.s2c.play.PlaySoundFromEntityS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.config.FeaturesS2CPacket.class, "FeaturesS2CPacket"); S2C_PACKETS_R.put("FeaturesS2CPacket", net.minecraft.network.packet.s2c.config.FeaturesS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.SignEditorOpenS2CPacket.class, "SignEditorOpenS2CPacket"); S2C_PACKETS_R.put("SignEditorOpenS2CPacket", net.minecraft.network.packet.s2c.play.SignEditorOpenS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ExplosionS2CPacket.class, "ExplosionS2CPacket"); S2C_PACKETS_R.put("ExplosionS2CPacket", net.minecraft.network.packet.s2c.play.ExplosionS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.login.LoginDisconnectS2CPacket.class, "LoginDisconnectS2CPacket"); - S2C_PACKETS_R.put("LoginDisconnectS2CPacket", net.minecraft.network.packet.s2c.login.LoginDisconnectS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.RemoveEntityStatusEffectS2CPacket.class, "RemoveEntityStatusEffectS2CPacket"); S2C_PACKETS_R.put("RemoveEntityStatusEffectS2CPacket", net.minecraft.network.packet.s2c.play.RemoveEntityStatusEffectS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.login.LoginDisconnectS2CPacket.class, "LoginDisconnectS2CPacket"); + S2C_PACKETS_R.put("LoginDisconnectS2CPacket", net.minecraft.network.packet.s2c.login.LoginDisconnectS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EndCombatS2CPacket.class, "EndCombatS2CPacket"); S2C_PACKETS_R.put("EndCombatS2CPacket", net.minecraft.network.packet.s2c.play.EndCombatS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlayerListS2CPacket.class, "PlayerListS2CPacket"); @@ -375,10 +365,10 @@ public abstract class PacketUtils { S2C_PACKETS_R.put("SynchronizeRecipesS2CPacket", net.minecraft.network.packet.s2c.play.SynchronizeRecipesS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityS2CPacket.class, "EntityS2CPacket"); S2C_PACKETS_R.put("EntityS2CPacket", net.minecraft.network.packet.s2c.play.EntityS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityTrackerUpdateS2CPacket.class, "EntityTrackerUpdateS2CPacket"); - S2C_PACKETS_R.put("EntityTrackerUpdateS2CPacket", net.minecraft.network.packet.s2c.play.EntityTrackerUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityStatusS2CPacket.class, "EntityStatusS2CPacket"); S2C_PACKETS_R.put("EntityStatusS2CPacket", net.minecraft.network.packet.s2c.play.EntityStatusS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityTrackerUpdateS2CPacket.class, "EntityTrackerUpdateS2CPacket"); + S2C_PACKETS_R.put("EntityTrackerUpdateS2CPacket", net.minecraft.network.packet.s2c.play.EntityTrackerUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.config.DynamicRegistriesS2CPacket.class, "DynamicRegistriesS2CPacket"); S2C_PACKETS_R.put("DynamicRegistriesS2CPacket", net.minecraft.network.packet.s2c.config.DynamicRegistriesS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.common.CustomPayloadS2CPacket.class, "CustomPayloadS2CPacket"); @@ -387,10 +377,10 @@ public abstract class PacketUtils { S2C_PACKETS_R.put("SubtitleS2CPacket", net.minecraft.network.packet.s2c.play.SubtitleS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.NbtQueryResponseS2CPacket.class, "NbtQueryResponseS2CPacket"); S2C_PACKETS_R.put("NbtQueryResponseS2CPacket", net.minecraft.network.packet.s2c.play.NbtQueryResponseS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityEquipmentUpdateS2CPacket.class, "EntityEquipmentUpdateS2CPacket"); - S2C_PACKETS_R.put("EntityEquipmentUpdateS2CPacket", net.minecraft.network.packet.s2c.play.EntityEquipmentUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.UnloadChunkS2CPacket.class, "UnloadChunkS2CPacket"); S2C_PACKETS_R.put("UnloadChunkS2CPacket", net.minecraft.network.packet.s2c.play.UnloadChunkS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityEquipmentUpdateS2CPacket.class, "EntityEquipmentUpdateS2CPacket"); + S2C_PACKETS_R.put("EntityEquipmentUpdateS2CPacket", net.minecraft.network.packet.s2c.play.EntityEquipmentUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.config.ReadyS2CPacket.class, "ReadyS2CPacket"); S2C_PACKETS_R.put("ReadyS2CPacket", net.minecraft.network.packet.s2c.config.ReadyS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EnterReconfigurationS2CPacket.class, "EnterReconfigurationS2CPacket"); @@ -498,7 +488,7 @@ public Class> get(int index) { @NotNull @Override public Iterator>> iterator() { - return Stream.concat(S2C_PACKETS.keySet().stream(), C2S_PACKETS.keySet().stream()).iterator(); + return Iterators.concat(S2C_PACKETS.keySet().iterator(), C2S_PACKETS.keySet().iterator()); } @Override @@ -508,7 +498,7 @@ public boolean contains(RegistryKey>> key) { @Override public Set>>, Class>>> getEntrySet() { - return Collections.emptySet(); + return null; } @Override @@ -569,7 +559,7 @@ public void populateTags(Map>>, List>>> getKeys() { - return Collections.emptySet(); + return null; } } } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtilsUtil.java b/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtilsUtil.java index c296a947e4..c56cd6a02b 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtilsUtil.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtilsUtil.java @@ -16,7 +16,7 @@ import java.io.IOException; import java.util.Set; -public abstract class PacketUtilsUtil { +public class PacketUtilsUtil { private static final String packetRegistryClass = """ private static class PacketRegistry extends SimpleRegistry>> { public PacketRegistry() { @@ -81,7 +81,7 @@ public Class> get(int index) { @NotNull @Override public Iterator>> iterator() { - return Stream.concat(S2C_PACKETS.keySet().stream(), C2S_PACKETS.keySet().stream()).iterator(); + return Iterators.concat(S2C_PACKETS.keySet().iterator(), C2S_PACKETS.keySet().iterator()); } @Override @@ -91,7 +91,7 @@ public boolean contains(RegistryKey>> key) { @Override public Set>>, Class>>> getEntrySet() { - return Collections.emptySet(); + return null; } @Override @@ -152,7 +152,7 @@ public void populateTags(Map>>, List>>> getKeys() { - return Collections.emptySet(); + return null; } } """; @@ -168,111 +168,114 @@ public static void main(String[] args) { public static void init() throws IOException { // Generate PacketUtils.java - File file = new File("src/main/java/%s/PacketUtils.java".formatted(PacketUtilsUtil.class.getPackageName().replace('.', '/'))); + File file = new File("src/main/java/" + PacketUtilsUtil.class.getPackageName().replace('.', '/') + "/PacketUtils.java"); if (!file.exists()) { file.getParentFile().mkdirs(); file.createNewFile(); } - try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) { - writer.write("/*\n"); - writer.write(" * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/).\n"); - writer.write(" * Copyright (c) Meteor Development.\n"); - writer.write(" */\n\n"); - - writer.write("package meteordevelopment.meteorclient.utils.network;\n\n"); - - // Write imports - writer.write("import com.mojang.datafixers.util.Pair;\n"); - writer.write("import com.mojang.serialization.Lifecycle;\n"); - writer.write("import meteordevelopment.meteorclient.utils.misc.MeteorIdentifier;\n"); - writer.write("import net.minecraft.network.packet.Packet;\n"); - writer.write("import net.minecraft.registry.Registry;\n"); - writer.write("import net.minecraft.registry.RegistryKey;\n"); - writer.write("import net.minecraft.registry.SimpleRegistry;\n"); - writer.write("import net.minecraft.registry.entry.RegistryEntry;\n"); - writer.write("import net.minecraft.registry.entry.RegistryEntryList;\n"); - writer.write("import net.minecraft.registry.tag.TagKey;\n"); - writer.write("import net.minecraft.util.Identifier;\n"); - writer.write("import net.minecraft.util.math.random.Random;\n"); - writer.write("import org.jetbrains.annotations.NotNull;\n"); - - writer.write("import java.util.*;\n"); - writer.write("import java.util.stream.Stream;\n"); - - // Write class - writer.write("\npublic abstract class PacketUtils {\n"); - - // Write fields - writer.write(" public static final Registry>> REGISTRY = new PacketRegistry();\n\n"); - writer.write(" private static final Map>, String> S2C_PACKETS = new HashMap<>();\n"); - writer.write(" private static final Map>, String> C2S_PACKETS = new HashMap<>();\n\n"); - writer.write(" private static final Map>> S2C_PACKETS_R = new HashMap<>();\n"); - writer.write(" private static final Map>> C2S_PACKETS_R = new HashMap<>();\n\n"); - - // Write static block - writer.write(" static {\n"); - - // Client -> Sever Packets - Reflections c2s = new Reflections("net.minecraft.network.packet.c2s", Scanners.SubTypes); - Set> c2sPackets = c2s.getSubTypesOf(Packet.class); - - for (Class c2sPacket : c2sPackets) { - String name = c2sPacket.getName(); - String className = name.substring(name.lastIndexOf('.') + 1).replace('$', '.'); - String fullName = name.replace('$', '.'); - - writer.write(" C2S_PACKETS.put(%s.class, \"%s\");%n".formatted(fullName, className)); - writer.write(" C2S_PACKETS_R.put(\"%s\", %s.class);%n".formatted(className, fullName)); - } - - writer.newLine(); - - // Server -> Client Packets - Reflections s2c = new Reflections("net.minecraft.network.packet.s2c", Scanners.SubTypes); - Set> s2cPackets = s2c.getSubTypesOf(Packet.class); - - for (Class s2cPacket : s2cPackets) { - if (s2cPacket == BundlePacket.class) continue; - String name = s2cPacket.getName(); - String className = name.substring(name.lastIndexOf('.') + 1).replace('$', '.'); - String fullName = name.replace('$', '.'); - - writer.write(" S2C_PACKETS.put(%s.class, \"%s\");%n".formatted(fullName, className)); - writer.write(" S2C_PACKETS_R.put(\"%s\", %s.class);%n".formatted(className, fullName)); - } - - writer.write(" }\n\n"); - - // Write getName method - writer.write(" public static String getName(Class> packetClass) {\n"); - writer.write(" String name = S2C_PACKETS.get(packetClass);\n"); - writer.write(" if (name != null) return name;\n"); - writer.write(" return C2S_PACKETS.get(packetClass);\n"); - writer.write(" }\n\n"); - - // Write getPacket method - writer.write(" public static Class> getPacket(String name) {\n"); - writer.write(" Class> packet = S2C_PACKETS_R.get(name);\n"); - writer.write(" if (packet != null) return packet;\n"); - writer.write(" return C2S_PACKETS_R.get(name);\n"); - writer.write(" }\n\n"); - - // Write getS2CPackets method - writer.write(" public static Set>> getS2CPackets() {\n"); - writer.write(" return S2C_PACKETS.keySet();\n"); - writer.write(" }\n\n"); - - // Write getC2SPackets method - writer.write(" public static Set>> getC2SPackets() {\n"); - writer.write(" return C2S_PACKETS.keySet();\n"); - writer.write(" }\n\n"); - - // Write PacketRegistry class - writer.write(packetRegistryClass); - - // Write end class - writer.write("}\n"); + BufferedWriter writer = new BufferedWriter(new FileWriter(file)); + + writer.write("/*\n"); + writer.write(" * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/).\n"); + writer.write(" * Copyright (c) Meteor Development.\n"); + writer.write(" */\n\n"); + + writer.write("package meteordevelopment.meteorclient.utils.network;\n\n"); + + // Write imports + writer.write("import com.google.common.collect.Iterators;\n"); + writer.write("import com.mojang.datafixers.util.Pair;\n"); + writer.write("import com.mojang.serialization.Lifecycle;\n"); + writer.write("import meteordevelopment.meteorclient.utils.misc.MeteorIdentifier;\n"); + writer.write("import net.minecraft.network.packet.Packet;\n"); + writer.write("import net.minecraft.registry.Registry;\n"); + writer.write("import net.minecraft.registry.RegistryKey;\n"); + writer.write("import net.minecraft.registry.SimpleRegistry;\n"); + writer.write("import net.minecraft.registry.entry.RegistryEntry;\n"); + writer.write("import net.minecraft.registry.entry.RegistryEntryList;\n"); + writer.write("import net.minecraft.registry.tag.TagKey;\n"); + writer.write("import net.minecraft.util.Identifier;\n"); + writer.write("import net.minecraft.util.math.random.Random;\n"); + writer.write("import org.jetbrains.annotations.NotNull;\n"); + + writer.write("import java.util.*;\n"); + writer.write("import java.util.stream.Stream;\n"); + + // Write class + writer.write("\npublic class PacketUtils {\n"); + + // Write fields + writer.write(" public static final Registry>> REGISTRY = new PacketRegistry();\n\n"); + writer.write(" private static final Map>, String> S2C_PACKETS = new HashMap<>();\n"); + writer.write(" private static final Map>, String> C2S_PACKETS = new HashMap<>();\n\n"); + writer.write(" private static final Map>> S2C_PACKETS_R = new HashMap<>();\n"); + writer.write(" private static final Map>> C2S_PACKETS_R = new HashMap<>();\n\n"); + + // Write static block + writer.write(" static {\n"); + + // Client -> Sever Packets + Reflections c2s = new Reflections("net.minecraft.network.packet.c2s", Scanners.SubTypes); + Set> c2sPackets = c2s.getSubTypesOf(Packet.class); + + for (Class c2sPacket : c2sPackets) { + String name = c2sPacket.getName(); + String className = name.substring(name.lastIndexOf('.') + 1).replace('$', '.'); + String fullName = name.replace('$', '.'); + + writer.write(String.format(" C2S_PACKETS.put(%s.class, \"%s\");\n", fullName, className)); + writer.write(String.format(" C2S_PACKETS_R.put(\"%s\", %s.class);\n", className, fullName)); + } + + writer.newLine(); + + // Server -> Client Packets + Reflections s2c = new Reflections("net.minecraft.network.packet.s2c", Scanners.SubTypes); + Set> s2cPackets = s2c.getSubTypesOf(Packet.class); + + for (Class s2cPacket : s2cPackets) { + if (s2cPacket == BundlePacket.class) continue; + String name = s2cPacket.getName(); + String className = name.substring(name.lastIndexOf('.') + 1).replace('$', '.'); + String fullName = name.replace('$', '.'); + + writer.write(String.format(" S2C_PACKETS.put(%s.class, \"%s\");\n", fullName, className)); + writer.write(String.format(" S2C_PACKETS_R.put(\"%s\", %s.class);\n", className, fullName)); } + + writer.write(" }\n\n"); + + // Write getName method + writer.write(" public static String getName(Class> packetClass) {\n"); + writer.write(" String name = S2C_PACKETS.get(packetClass);\n"); + writer.write(" if (name != null) return name;\n"); + writer.write(" return C2S_PACKETS.get(packetClass);\n"); + writer.write(" }\n\n"); + + // Write getPacket method + writer.write(" public static Class> getPacket(String name) {\n"); + writer.write(" Class> packet = S2C_PACKETS_R.get(name);\n"); + writer.write(" if (packet != null) return packet;\n"); + writer.write(" return C2S_PACKETS_R.get(name);\n"); + writer.write(" }\n\n"); + + // Write getS2CPackets method + writer.write(" public static Set>> getS2CPackets() {\n"); + writer.write(" return S2C_PACKETS.keySet();\n"); + writer.write(" }\n\n"); + + // Write getC2SPackets method + writer.write(" public static Set>> getC2SPackets() {\n"); + writer.write(" return C2S_PACKETS.keySet();\n"); + writer.write(" }\n\n"); + + // Write PacketRegistry class + writer.write(packetRegistryClass); + + // Write end class + writer.write("}\n"); + + writer.close(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/player/TitleScreenCredits.java b/src/main/java/meteordevelopment/meteorclient/utils/player/TitleScreenCredits.java index e86b163bd0..f0fc734375 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/player/TitleScreenCredits.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/player/TitleScreenCredits.java @@ -13,10 +13,11 @@ import meteordevelopment.meteorclient.gui.screens.CommitsScreen; import meteordevelopment.meteorclient.utils.network.Http; import meteordevelopment.meteorclient.utils.network.MeteorExecutor; +import meteordevelopment.meteorclient.utils.render.color.Color; +import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; +import net.minecraft.client.render.BufferBuilder; +import net.minecraft.client.render.VertexConsumerProvider; import java.util.ArrayList; import java.util.Comparator; @@ -24,7 +25,11 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; -public abstract class TitleScreenCredits { +public class TitleScreenCredits { + private static final int WHITE = Color.fromRGBA(255, 255, 255, 255); + private static final int GRAY = Color.fromRGBA(175, 175, 175, 255); + private static final int RED = Color.fromRGBA(225, 25, 25, 255); + private static final List credits = new ArrayList<>(); private static void init() { @@ -33,7 +38,7 @@ private static void init() { for (MeteorAddon addon : AddonManager.ADDONS) add(addon); // Sort by width (Meteor always first) - credits.sort(Comparator.comparingInt(value -> value.addon == MeteorClient.ADDON ? Integer.MIN_VALUE : -mc.textRenderer.getWidth(value.text))); + credits.sort(Comparator.comparingInt(value -> value.sections.get(0).text.equals("Meteor Client ") ? Integer.MIN_VALUE : -value.width)); // Check for latest commits MeteorExecutor.execute(() -> { @@ -41,10 +46,13 @@ private static void init() { if (credit.addon.getRepo() == null || credit.addon.getCommit() == null) continue; GithubRepo repo = credit.addon.getRepo(); - Response res = Http.get("https://api.github.com/repos/%s/branches/%s".formatted(repo.getOwnerName(), repo.branch())).sendJson(Response.class); + Response res = Http.get(String.format("https://api.github.com/repos/%s/branches/%s", repo.getOwnerName(), repo.branch())).sendJson(Response.class); if (res != null && !credit.addon.getCommit().equals(res.commit.sha)) { - credit.text.append(Text.literal("*").formatted(Formatting.RED)); + synchronized (credit.sections) { + credit.sections.add(1, new Section("*", RED)); + credit.calculateWidth(); + } } } }); @@ -53,17 +61,18 @@ private static void init() { private static void add(MeteorAddon addon) { Credit credit = new Credit(addon); - credit.text.append(Text.literal(addon.name).styled(style -> style.withColor(addon.color.getPacked()))); - credit.text.append(Text.literal(" by ").formatted(Formatting.GRAY)); + credit.sections.add(new Section(addon.name, addon.color.getPacked())); + credit.sections.add(new Section(" by ", GRAY)); for (int i = 0; i < addon.authors.length; i++) { if (i > 0) { - credit.text.append(Text.literal(i == addon.authors.length - 1 ? " & " : ", ").formatted(Formatting.GRAY)); + credit.sections.add(new Section(i == addon.authors.length - 1 ? " & " : ", ", GRAY)); } - credit.text.append(Text.literal(addon.authors[i]).formatted(Formatting.WHITE)); + credit.sections.add(new Section(addon.authors[i], WHITE)); } + credit.calculateWidth(); credits.add(credit); } @@ -72,9 +81,14 @@ public static void render(DrawContext context) { int y = 3; for (Credit credit : credits) { - int x = mc.currentScreen.width - 3 - mc.textRenderer.getWidth(credit.text); + int x = mc.currentScreen.width - 3 - credit.width; - context.drawTextWithShadow(mc.textRenderer, credit.text, x, y, -1); + synchronized (credit.sections) { + for (Section section : credit.sections) { + context.drawTextWithShadow(mc.textRenderer, section.text, x, y, section.color); + x += section.width; + } + } y += mc.textRenderer.fontHeight + 2; } @@ -83,9 +97,9 @@ public static void render(DrawContext context) { public static boolean onClicked(double mouseX, double mouseY) { int y = 3; for (Credit credit : credits) { - int x = mc.currentScreen.width - 3 - mc.textRenderer.getWidth(credit.text); + int x = mc.currentScreen.width - 3 - credit.width; - if (mouseX >= x && mouseX <= x + mc.textRenderer.getWidth(credit.text) && mouseY >= y && mouseY <= y + mc.textRenderer.fontHeight + 2) { + if (mouseX >= x && mouseX <= x + credit.width && mouseY >= y && mouseY <= y + mc.textRenderer.fontHeight + 2) { if (credit.addon.getRepo() != null && credit.addon.getCommit() != null) { mc.setScreen(new CommitsScreen(GuiThemes.get(), credit.addon)); return true; @@ -100,11 +114,28 @@ public static boolean onClicked(double mouseX, double mouseY) { private static class Credit { public final MeteorAddon addon; - public final MutableText text = Text.empty(); + public final List
sections = new ArrayList<>(); + public int width; public Credit(MeteorAddon addon) { this.addon = addon; } + + public void calculateWidth() { + width = 0; + for (Section section : sections) width += section.width; + } + } + + private static class Section { + public final String text; + public final int color, width; + + public Section(String text, int color) { + this.text = text; + this.color = color; + this.width = mc.textRenderer.getWidth(text); + } } private static class Response { diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 78e9a2accf..a6cc83d676 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -19,6 +19,9 @@ "icon": "assets/meteor-client/icon.png", "environment": "client", "entrypoints": { + "preLaunch": [ + "com.llamalad7.mixinextras.MixinExtrasBootstrap::init" + ], "client": [ "meteordevelopment.meteorclient.MeteorClient" ] @@ -45,7 +48,7 @@ }, "depends": { "java": ">=17", - "minecraft": ["1.20.3", "1.20.4"], + "minecraft": "${minecraft_version}", "fabricloader": ">=${loader_version}" }, "breaks": { diff --git a/src/main/resources/meteor-client.mixins.json b/src/main/resources/meteor-client.mixins.json index 2e78a2126a..f292be27f9 100644 --- a/src/main/resources/meteor-client.mixins.json +++ b/src/main/resources/meteor-client.mixins.json @@ -138,7 +138,6 @@ "ProjectileEntityAccessor", "ProjectileInGroundAccessor", "RaycastContextMixin", - "RegistriesMixin", "ReloadStateAccessor", "RenderLayersMixin", "RenderTickCounterMixin", @@ -150,6 +149,7 @@ "SignBlockEntityRendererMixin", "SimpleEntityLookupAccessor", "SimpleOptionMixin", + "SimpleRegistryMixin", "SlimeBlockMixin", "SlotMixin", "SoundSystemMixin", From 1b110ab220734d86ed9c19335371581a6ad78e55 Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Fri, 8 Dec 2023 14:25:23 +0100 Subject: [PATCH 159/357] Update Orbit to 0.2.4 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 28c426c625..dd23fd6749 100644 --- a/gradle.properties +++ b/gradle.properties @@ -23,7 +23,7 @@ lithium_version=mc1.20.2-0.12.0 iris_version=1.6.10+1.20.2 # Orbit (https://github.com/MeteorDevelopment/orbit) -orbit_version=0.2.3 +orbit_version=0.2.4 # Starscript (https://github.com/MeteorDevelopment/starscript) starscript_version=0.2.2 From 99fe6c3ed8b816283df458f5b226acd2211bea15 Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Fri, 8 Dec 2023 14:26:12 +0100 Subject: [PATCH 160/357] Future version 0.5.6 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index dd23fd6749..d55e62e6a0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,7 +7,7 @@ loader_version=0.14.24 fapi_version=0.90.4+1.20.2 # Mod Properties -mod_version=0.5.5 +mod_version=0.5.6 maven_group=meteordevelopment archives_base_name=meteor-client From bd11f94df22fd409a02c10b739f6afe92df810a8 Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Fri, 8 Dec 2023 14:39:36 +0100 Subject: [PATCH 161/357] Reapply "1.20.4 update (#4249)" This reverts commit 4cc4104d9412f983fcd3edff75e13ec1bbff1c41. --- build.gradle | 23 +- gradle.properties | 19 +- .../arguments/FakePlayerArgumentType.java | 2 +- .../arguments/PlayerArgumentType.java | 4 +- .../commands/commands/FakePlayerCommand.java | 4 +- .../commands/commands/SwarmCommand.java | 4 +- .../meteorclient/gui/GuiThemes.java | 8 +- .../gui/widgets/WItemWithLabel.java | 8 +- .../mixin/BookEditScreenMixin.java | 7 +- .../mixin/CapeFeatureRendererMixin.java | 2 +- .../mixin/ConnectScreenMixin.java | 2 +- .../mixin/DisconnectedScreenMixin.java | 2 +- .../mixin/ElytraFeatureRendererMixin.java | 2 +- .../meteorclient/mixin/GameRendererMixin.java | 4 +- .../mixin/LivingEntityRendererMixin.java | 5 +- .../mixin/RaycastContextMixin.java | 4 +- .../meteorclient/mixin/RegistriesMixin.java | 21 ++ .../mixin/SimpleRegistryMixin.java | 22 -- .../ChunkAwareBlockCollisionSweeperMixin.java | 2 +- .../sodium/SodiumBiomeColorCacheMixin.java | 6 +- .../sodium/SodiumFluidRendererMixin.java | 7 +- .../meteorclient/renderer/GL.java | 4 +- .../meteorclient/settings/BoolSetting.java | 3 +- .../meteorclient/settings/ColorSetting.java | 3 +- .../meteorclient/systems/System.java | 4 +- .../systems/accounts/Account.java | 6 +- .../systems/accounts/types/EasyMCAccount.java | 2 +- .../accounts/types/TheAlteningAccount.java | 4 +- .../meteorclient/systems/friends/Friend.java | 2 +- .../meteorclient/systems/friends/Friends.java | 2 +- .../systems/hud/elements/CombatHud.java | 2 +- .../systems/hud/elements/PlayerRadarHud.java | 4 +- .../systems/hud/elements/PotionTimersHud.java | 2 +- .../meteorclient/systems/modules/Modules.java | 5 +- .../systems/modules/misc/DiscordPresence.java | 8 +- .../systems/modules/misc/MessageAura.java | 2 +- .../systems/modules/misc/Notifier.java | 10 +- .../systems/modules/misc/ServerSpoof.java | 4 +- .../systems/modules/player/AutoTool.java | 4 +- .../systems/modules/player/FakePlayer.java | 2 +- .../modules/player/MiddleClickExtra.java | 6 +- .../modules/render/BetterTooltips.java | 6 +- .../systems/modules/render/EntityOwner.java | 2 +- .../systems/modules/render/LogoutSpots.java | 2 +- .../systems/modules/render/Nametags.java | 4 +- .../systems/modules/world/Flamethrower.java | 2 +- .../systems/modules/world/Nuker.java | 4 +- .../systems/modules/world/VeinMiner.java | 5 +- .../utils/entity/EntityUtils.java | 2 +- .../entity/fakeplayer/FakePlayerManager.java | 4 +- .../meteorclient/utils/misc/NbtUtils.java | 7 +- .../utils/misc/ValueComparableMap.java | 18 +- .../utils/network/PacketUtils.java | 116 +++++----- .../utils/network/PacketUtilsUtil.java | 211 +++++++++--------- .../utils/player/TitleScreenCredits.java | 63 ++---- src/main/resources/fabric.mod.json | 5 +- src/main/resources/meteor-client.mixins.json | 2 +- 57 files changed, 331 insertions(+), 359 deletions(-) create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/RegistriesMixin.java delete mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/SimpleRegistryMixin.java diff --git a/build.gradle b/build.gradle index 3d97ca35a7..17cc649a38 100644 --- a/build.gradle +++ b/build.gradle @@ -58,7 +58,7 @@ dependencies { modCompileOnly("maven.modrinth:indium:${project.indium_version}") { transitive = false } // Baritone (https://github.com/MeteorDevelopment/baritone) - modCompileOnly "meteordevelopment:baritone:${project.minecraft_version}-SNAPSHOT" + modCompileOnly "meteordevelopment:baritone:${project.baritone_version}-SNAPSHOT" // Libraries library "meteordevelopment:orbit:${project.orbit_version}" @@ -67,8 +67,6 @@ dependencies { library "org.reflections:reflections:${project.reflections_version}" library("io.netty:netty-handler-proxy:${project.netty_version}") { transitive = false } library("io.netty:netty-codec-socks:${project.netty_version}") { transitive = false } - library "io.github.llamalad7:mixinextras-fabric:${project.mixin_extras_version}" - annotationProcessor "io.github.llamalad7:mixinextras-fabric:${project.mixin_extras_version}" library "de.florianmichael:WaybackAuthLib:1.0.0" // Launch sub project @@ -96,17 +94,24 @@ shadowJar { } processResources { + def propertyMap = [ + "version" : project.version, + "devbuild" : project.findProperty("devbuild") ?: "", + "commit" : project.findProperty("commit") ?: "", + "minecraft_version": project.minecraft_version, + "loader_version" : project.loader_version + ] + + inputs.properties(propertyMap) filesMatching("fabric.mod.json") { - expand "version": project.version, - "devbuild": project.findProperty("devbuild") ?: "", - "commit": project.findProperty("commit") ?: "", - "minecraft_version": project.minecraft_version, - "loader_version": project.loader_version + expand(propertyMap) } } jar { - from "LICENSE" + from("LICENSE") { + rename { "${it}_${archivesBaseName}" } + } manifest { attributes("Main-Class": "meteordevelopment.meteorclient.Main") diff --git a/gradle.properties b/gradle.properties index d55e62e6a0..a7f2c079fa 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,10 +1,11 @@ org.gradle.jvmargs=-Xmx2G # Fabric (https://fabricmc.net/develop) -minecraft_version=1.20.2 -yarn_mappings=1.20.2+build.4 -loader_version=0.14.24 -fapi_version=0.90.4+1.20.2 +# TODO: when updating to 1.21, revert "minecraft": ["1.20.3", "1.20.4"] to "minecraft": "${minecraft_version}" +minecraft_version=1.20.4 +yarn_mappings=1.20.4+build.1 +loader_version=0.15.0 +fapi_version=0.91.1+1.20.4 # Mod Properties mod_version=0.5.6 @@ -13,14 +14,17 @@ archives_base_name=meteor-client # Dependency Versions +# Baritone (https://github.com/MeteorDevelopment/baritone) +baritone_version=1.20.2 + # Sodium (https://github.com/CaffeineMC/sodium-fabric) -sodium_version=mc1.20.2-0.5.3 +sodium_version=mc1.20.3-0.5.4 # Lithium (https://github.com/CaffeineMC/lithium-fabric) lithium_version=mc1.20.2-0.12.0 # Iris (https://github.com/IrisShaders/Iris) -iris_version=1.6.10+1.20.2 +iris_version=1.6.12+1.20.3 # Orbit (https://github.com/MeteorDevelopment/orbit) orbit_version=0.2.4 @@ -37,8 +41,5 @@ reflections_version=0.10.2 # Netty (https://github.com/netty/netty) netty_version=4.1.90.Final -# Mixin Extras (https://github.com/LlamaLad7/MixinExtras) -mixin_extras_version=0.2.0 - # Indium (https://github.com/comp500/Indium) indium_version=1.0.27+mc1.20.1 diff --git a/src/main/java/meteordevelopment/meteorclient/commands/arguments/FakePlayerArgumentType.java b/src/main/java/meteordevelopment/meteorclient/commands/arguments/FakePlayerArgumentType.java index fde62bb80d..2ba92b3409 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/arguments/FakePlayerArgumentType.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/arguments/FakePlayerArgumentType.java @@ -38,7 +38,7 @@ public String parse(StringReader reader) throws CommandSyntaxException { @Override public CompletableFuture listSuggestions(CommandContext context, SuggestionsBuilder builder) { - return suggestMatching(FakePlayerManager.stream().map(FakePlayerEntity::getEntityName), builder); + return suggestMatching(FakePlayerManager.stream().map(fakePlayerEntity -> fakePlayerEntity.getName().getString()), builder); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/arguments/PlayerArgumentType.java b/src/main/java/meteordevelopment/meteorclient/commands/arguments/PlayerArgumentType.java index b9ebc0b1e6..10472f55c6 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/arguments/PlayerArgumentType.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/arguments/PlayerArgumentType.java @@ -41,7 +41,7 @@ public PlayerEntity parse(StringReader reader) throws CommandSyntaxException { PlayerEntity playerEntity = null; for (PlayerEntity p : mc.world.getPlayers()) { - if (p.getEntityName().equalsIgnoreCase(argument)) { + if (p.getName().getString().equalsIgnoreCase(argument)) { playerEntity = p; break; } @@ -53,7 +53,7 @@ public PlayerEntity parse(StringReader reader) throws CommandSyntaxException { @Override public CompletableFuture listSuggestions(CommandContext context, SuggestionsBuilder builder) { - return CommandSource.suggestMatching(mc.world.getPlayers().stream().map(PlayerEntity::getEntityName), builder); + return CommandSource.suggestMatching(mc.world.getPlayers().stream().map(abstractClientPlayerEntity -> abstractClientPlayerEntity.getName().getString()), builder); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/FakePlayerCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/FakePlayerCommand.java index 122e9a13c6..4a05f24d14 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/FakePlayerCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/FakePlayerCommand.java @@ -50,7 +50,7 @@ public void build(LiteralArgumentBuilder builder) { } FakePlayerManager.remove(fp); - info("Removed Fake Player %s.".formatted(fp.getEntityName())); + info("Removed Fake Player %s.".formatted(fp.getName().getString())); return SINGLE_SUCCESS; }) @@ -67,7 +67,7 @@ public void build(LiteralArgumentBuilder builder) { builder.then(literal("list") .executes(context -> { info("--- Fake Players ((highlight)%s(default)) ---", FakePlayerManager.count()); - FakePlayerManager.forEach(fp -> ChatUtils.info("(highlight)%s".formatted(fp.getEntityName()))); + FakePlayerManager.forEach(fp -> ChatUtils.info("(highlight)%s".formatted(fp.getName().getString()))); return SINGLE_SUCCESS; }) ); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java index fda2554682..317550eabd 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java @@ -104,7 +104,7 @@ else if (swarm.isWorker()) { Swarm swarm = Modules.get().get(Swarm.class); if (swarm.isActive()) { if (swarm.isHost()) { - swarm.host.sendMessage(context.getInput() + " " + mc.player.getEntityName()); + swarm.host.sendMessage(context.getInput() + " " + mc.player.getName().getString()); } else if (swarm.isWorker()) { error("The follow host command must be used by the host."); @@ -124,7 +124,7 @@ else if (swarm.isWorker()) { swarm.host.sendMessage(context.getInput()); } else if (swarm.isWorker() && playerEntity != null) { - PathManagers.get().follow(entity -> entity.getEntityName().equalsIgnoreCase(playerEntity.getEntityName())); + PathManagers.get().follow(entity -> entity.getName().getString().equalsIgnoreCase(playerEntity.getName().getString())); } } else { diff --git a/src/main/java/meteordevelopment/meteorclient/gui/GuiThemes.java b/src/main/java/meteordevelopment/meteorclient/gui/GuiThemes.java index beb6e164c4..2b528f16c7 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/GuiThemes.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/GuiThemes.java @@ -35,7 +35,7 @@ public static void init() { public static void postInit() { if (FILE.exists()) { try { - NbtCompound tag = NbtIo.read(FILE); + NbtCompound tag = NbtIo.read(FILE.toPath()); if (tag != null) select(tag.getString("currentTheme")); } catch (IOException e) { @@ -82,7 +82,7 @@ public static void select(String name) { File file = new File(THEMES_FOLDER, get().name + ".nbt"); if (file.exists()) { - NbtCompound tag = NbtIo.read(file); + NbtCompound tag = NbtIo.read(file.toPath()); if (tag != null) get().fromTag(tag); } } catch (IOException e) { @@ -116,7 +116,7 @@ private static void saveTheme() { NbtCompound tag = get().toTag(); THEMES_FOLDER.mkdirs(); - NbtIo.write(tag, new File(THEMES_FOLDER, get().name + ".nbt")); + NbtIo.write(tag, new File(THEMES_FOLDER, get().name + ".nbt").toPath()); } catch (IOException e) { e.printStackTrace(); } @@ -129,7 +129,7 @@ private static void saveGlobal() { tag.putString("currentTheme", get().name); FOLDER.mkdirs(); - NbtIo.write(tag, FILE); + NbtIo.write(tag, FILE.toPath()); } catch (IOException e) { e.printStackTrace(); } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItemWithLabel.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItemWithLabel.java index 26d3c4ce85..bc8769b7aa 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItemWithLabel.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItemWithLabel.java @@ -14,6 +14,8 @@ import java.util.List; +import static meteordevelopment.meteorclient.MeteorClient.mc; + public class WItemWithLabel extends WHorizontalList { private ItemStack itemStack; private String name; @@ -38,13 +40,13 @@ private String getStringToAppend() { if (itemStack.getItem() == Items.POTION) { List effects = PotionUtil.getPotion(itemStack).getEffects(); - if (effects.size() > 0) { + if (!effects.isEmpty()) { str += " "; StatusEffectInstance effect = effects.get(0); - if (effect.getAmplifier() > 0) str += effect.getAmplifier() + 1 + " "; + if (effect.getAmplifier() > 0) str += "%d ".formatted(effect.getAmplifier() + 1); - str += "(" + StatusEffectUtil.getDurationText(effect, 1).getString() + ")"; + str += "(%s)".formatted(StatusEffectUtil.getDurationText(effect, 1, mc.world.getTickManager().getTickRate()).getString()); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BookEditScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BookEditScreenMixin.java index a1a1c95cc2..7468bd62b5 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BookEditScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BookEditScreenMixin.java @@ -9,10 +9,7 @@ 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.nbt.NbtCompound; -import net.minecraft.nbt.NbtIo; -import net.minecraft.nbt.NbtList; -import net.minecraft.nbt.NbtString; +import net.minecraft.nbt.*; import net.minecraft.text.Text; import org.lwjgl.glfw.GLFW; import org.spongepowered.asm.mixin.Final; @@ -87,7 +84,7 @@ private void onInit(CallbackInfo info) { DataInputStream in = new DataInputStream(new ByteArrayInputStream(bytes)); try { - NbtCompound tag = NbtIo.readCompressed(in); + NbtCompound tag = NbtIo.readCompressed(in, NbtTagSizeTracker.ofUnlimitedBytes()); NbtList listTag = tag.getList("pages", 8).copy(); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/CapeFeatureRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/CapeFeatureRendererMixin.java index 43751d3d37..4e9368a904 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/CapeFeatureRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/CapeFeatureRendererMixin.java @@ -17,7 +17,7 @@ @Mixin(CapeFeatureRenderer.class) public class CapeFeatureRendererMixin { - @ModifyExpressionValue(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/SkinTextures;capeTexture()Lnet/minecraft/util/Identifier;")) + @ModifyExpressionValue(method = "render(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;ILnet/minecraft/client/network/AbstractClientPlayerEntity;FFFFFF)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/SkinTextures;capeTexture()Lnet/minecraft/util/Identifier;")) private Identifier modifyCapeTexture(Identifier original, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, AbstractClientPlayerEntity abstractClientPlayerEntity, float f, float g, float h, float j, float k, float l) { Identifier id = Capes.get(abstractClientPlayerEntity); return id == null ? original : id; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ConnectScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ConnectScreenMixin.java index 2fd47394c5..fac824368d 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ConnectScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ConnectScreenMixin.java @@ -8,7 +8,7 @@ import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.world.ServerConnectBeginEvent; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.ConnectScreen; +import net.minecraft.client.gui.screen.multiplayer.ConnectScreen; import net.minecraft.client.network.ServerAddress; import net.minecraft.client.network.ServerInfo; import org.spongepowered.asm.mixin.Mixin; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/DisconnectedScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/DisconnectedScreenMixin.java index 3092d3f470..44d87fbacc 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/DisconnectedScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/DisconnectedScreenMixin.java @@ -7,7 +7,7 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.misc.AutoReconnect; -import net.minecraft.client.gui.screen.ConnectScreen; +import net.minecraft.client.gui.screen.multiplayer.ConnectScreen; import net.minecraft.client.gui.screen.DisconnectedScreen; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.TitleScreen; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ElytraFeatureRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ElytraFeatureRendererMixin.java index e7c7a5764c..4fd5c52c9e 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ElytraFeatureRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ElytraFeatureRendererMixin.java @@ -25,7 +25,7 @@ public ElytraFeatureRendererMixin(FeatureRendererContext context) { super(context); } - @ModifyExpressionValue(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/SkinTextures;capeTexture()Lnet/minecraft/util/Identifier;")) + @ModifyExpressionValue(method = "render(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;ILnet/minecraft/entity/LivingEntity;FFFFFF)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/SkinTextures;capeTexture()Lnet/minecraft/util/Identifier;")) private Identifier modifyCapeTexture(Identifier original, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, T livingEntity, float f, float g, float h, float j, float k, float l) { if (!(livingEntity instanceof AbstractClientPlayerEntity playerEntity)) return original; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java index 23fe559f8a..da6f192634 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java @@ -53,7 +53,7 @@ public abstract class GameRendererMixin { @Unique private Renderer3D renderer; @Inject(method = "renderWorld", at = @At(value = "INVOKE_STRING", target = "Lnet/minecraft/util/profiler/Profiler;swap(Ljava/lang/String;)V", args = { "ldc=hand" }), locals = LocalCapture.CAPTURE_FAILEXCEPTION) - private void onRenderWorld(float tickDelta, long limitTime, MatrixStack matrices, CallbackInfo info, boolean bl, Camera camera, MatrixStack matrixStack, double d, float f, float g, Matrix4f matrix4f, Matrix3f matrix3f) { + private void onRenderWorld(float tickDelta, long limitTime, MatrixStack matrices, CallbackInfo ci, boolean bl, Camera camera, Entity entity, MatrixStack matrixStack, double d, float f, float g, Matrix4f matrix4f, Matrix3f matrix3f) { if (!Utils.canUpdate()) return; client.getProfiler().push(MeteorClient.MOD_ID + "_render"); @@ -169,7 +169,7 @@ private void renderHand(MatrixStack matrices, Camera camera, float tickDelta, Ca info.cancel(); } - @ModifyConstant(method = "updateTargetedEntity", constant = @Constant(doubleValue = 3)) + @ModifyConstant(method = "updateTargetedEntity", constant = @Constant(doubleValue = 6)) private double updateTargetedEntityModifySurvivalReach(double d) { return Modules.get().get(Reach.class).entityReach(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityRendererMixin.java index 21263b00e1..a69f012d37 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityRendererMixin.java @@ -22,6 +22,7 @@ import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.scoreboard.AbstractTeam; +import net.minecraft.scoreboard.Team; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -66,8 +67,8 @@ public float changePitch(float oldValue, LivingEntity entity) { // Player model rendering in main menu - @ModifyExpressionValue(method = "hasLabel(Lnet/minecraft/entity/LivingEntity;)Z", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;getScoreboardTeam()Lnet/minecraft/scoreboard/AbstractTeam;")) - private AbstractTeam hasLabelClientPlayerEntityGetScoreboardTeamProxy(AbstractTeam team) { + @ModifyExpressionValue(method = "hasLabel(Lnet/minecraft/entity/LivingEntity;)Z", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;getScoreboardTeam()Lnet/minecraft/scoreboard/Team;")) + private Team hasLabelClientPlayerEntityGetScoreboardTeamProxy(Team team) { return (mc.player == null) ? null : team; } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/RaycastContextMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/RaycastContextMixin.java index 8bd300912b..659dc3160d 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/RaycastContextMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/RaycastContextMixin.java @@ -21,7 +21,7 @@ public class RaycastContextMixin implements IRaycastContext { @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 entityPosition; + @Shadow @Final @Mutable private ShapeContext shapeContext; @Override public void set(Vec3d start, Vec3d end, RaycastContext.ShapeType shapeType, RaycastContext.FluidHandling fluidHandling, Entity entity) { @@ -29,6 +29,6 @@ public void set(Vec3d start, Vec3d end, RaycastContext.ShapeType shapeType, Rayc this.end = end; this.shapeType = shapeType; this.fluid = fluidHandling; - this.entityPosition = ShapeContext.of(entity); + 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 new file mode 100644 index 0000000000..625ec10ba5 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/RegistriesMixin.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.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;Lcom/mojang/serialization/Lifecycle;)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/SimpleRegistryMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/SimpleRegistryMixin.java deleted file mode 100644 index aca4582354..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/SimpleRegistryMixin.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.registry.SimpleRegistry; -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(SimpleRegistry.class) -public class SimpleRegistryMixin { - @Redirect(method = "(Lnet/minecraft/registry/RegistryKey;Lcom/mojang/serialization/Lifecycle;Z)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/Bootstrap;ensureBootstrapped(Ljava/util/function/Supplier;)V")) - private void idk(Supplier callerGetter) { - // TODO: Probably extremely retarded but seems to work - // nothing :trolla: - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/lithium/ChunkAwareBlockCollisionSweeperMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/lithium/ChunkAwareBlockCollisionSweeperMixin.java index eb15d0e2b1..0152627779 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/lithium/ChunkAwareBlockCollisionSweeperMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/lithium/ChunkAwareBlockCollisionSweeperMixin.java @@ -21,7 +21,7 @@ @Mixin(value = ChunkAwareBlockCollisionSweeper.class) public abstract class ChunkAwareBlockCollisionSweeperMixin { - @Redirect(method = "computeNext", at = @At(value = "INVOKE", target = "Lnet/minecraft/block/BlockState;getCollisionShape(Lnet/minecraft/world/BlockView;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/ShapeContext;)Lnet/minecraft/util/shape/VoxelShape;")) + @Redirect(method = "computeNext()Lnet/minecraft/util/shape/VoxelShape;", at = @At(value = "INVOKE", target = "Lnet/minecraft/block/BlockState;getCollisionShape(Lnet/minecraft/world/BlockView;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/ShapeContext;)Lnet/minecraft/util/shape/VoxelShape;")) private VoxelShape onComputeNextCollisionBox(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { VoxelShape shape = state.getCollisionShape(world, pos, context); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBiomeColorCacheMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBiomeColorCacheMixin.java index 3f147c8e58..39366b697f 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBiomeColorCacheMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBiomeColorCacheMixin.java @@ -25,17 +25,17 @@ private void onInit(CallbackInfo info) { ambience = Modules.get().get(Ambience.class); } - @ModifyExpressionValue(method = "updateColorBuffers", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/biome/Biome;getGrassColorAt(DD)I", remap = true)) + @ModifyExpressionValue(method = "updateColorBuffers", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/biome/ColorResolver;getColor(Lnet/minecraft/world/biome/Biome;DD)I", ordinal = 0, remap = true)) private int modify_getGrassColorAt(int color) { return ambience.isActive() && ambience.customGrassColor.get() ? ambience.grassColor.get().getPacked() : color; } - @ModifyExpressionValue(method = "updateColorBuffers", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/biome/Biome;getFoliageColor()I", remap = true)) + @ModifyExpressionValue(method = "updateColorBuffers", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/biome/ColorResolver;getColor(Lnet/minecraft/world/biome/Biome;DD)I", ordinal = 1, remap = true)) private int modify_getFoliageColor(int color) { return ambience.isActive() && ambience.customFoliageColor.get() ? ambience.foliageColor.get().getPacked() : color; } - @ModifyExpressionValue(method = "updateColorBuffers", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/biome/Biome;getWaterColor()I", remap = true)) + @ModifyExpressionValue(method = "updateColorBuffers", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/biome/ColorResolver;getColor(Lnet/minecraft/world/biome/Biome;DD)I", ordinal = 2, remap = true)) private int modify_getWaterColor(int color) { return ambience.isActive() && ambience.customWaterColor.get() ? ambience.waterColor.get().getPacked() : color; } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumFluidRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumFluidRendererMixin.java index 1eb4dbc141..2ac8a24812 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumFluidRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumFluidRendererMixin.java @@ -14,6 +14,7 @@ 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.caffeinemc.mods.sodium.api.util.ColorABGR; import net.minecraft.fluid.FluidState; import net.minecraft.registry.tag.FluidTags; @@ -31,7 +32,8 @@ @Mixin(value = FluidRenderer.class, remap = false) public class SodiumFluidRendererMixin { - @Final @Shadow + @Final + @Shadow private int[] quadColors; @Unique @@ -53,7 +55,8 @@ private void onRender(WorldSlice world, FluidState fluidState, BlockPos blockPos private void onUpdateQuad(ModelQuadView quad, WorldSlice world, BlockPos pos, LightPipeline lighter, Direction dir, float brightness, ColorProvider colorProvider, FluidState fluidState, CallbackInfo info) { // Ambience if (ambience.isActive() && ambience.customLavaColor.get() && fluidState.isIn(FluidTags.LAVA)) { - Arrays.fill(quadColors, ColorABGR.withAlpha(ambience.lavaColor.get().getPacked(), 255)); + Color c = ambience.lavaColor.get(); + Arrays.fill(quadColors, ColorABGR.pack(c.r, c.g, c.b, c.a)); } } } diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/GL.java b/src/main/java/meteordevelopment/meteorclient/renderer/GL.java index 19526684bd..511c1b783c 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/GL.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/GL.java @@ -5,7 +5,6 @@ package meteordevelopment.meteorclient.renderer; -import com.google.common.collect.ImmutableList; import com.mojang.blaze3d.platform.GlStateManager; import meteordevelopment.meteorclient.mixin.BufferRendererAccessor; import meteordevelopment.meteorclient.mixininterface.ICapabilityTracker; @@ -18,6 +17,7 @@ import java.lang.reflect.Field; import java.nio.ByteBuffer; import java.nio.FloatBuffer; +import java.util.List; import static meteordevelopment.meteorclient.MeteorClient.mc; import static org.lwjgl.opengl.GL32C.*; @@ -133,7 +133,7 @@ public static int createShader(int type) { } public static void shaderSource(int shader, String source) { - GlStateManager.glShaderSource(shader, ImmutableList.of(source)); + GlStateManager.glShaderSource(shader, List.of(source)); } public static String compileShader(int shader) { diff --git a/src/main/java/meteordevelopment/meteorclient/settings/BoolSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/BoolSetting.java index cb21ed7035..e42351541a 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/BoolSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/BoolSetting.java @@ -5,14 +5,13 @@ package meteordevelopment.meteorclient.settings; -import com.google.common.collect.ImmutableList; import net.minecraft.nbt.NbtCompound; import java.util.List; import java.util.function.Consumer; public class BoolSetting extends Setting { - private static final List SUGGESTIONS = ImmutableList.of("true", "false", "toggle"); + private static final List SUGGESTIONS = List.of("true", "false", "toggle"); private BoolSetting(String name, String description, Boolean defaultValue, Consumer onChanged, Consumer> onModuleActivated, IVisible visible) { super(name, description, defaultValue, onChanged, onModuleActivated, visible); diff --git a/src/main/java/meteordevelopment/meteorclient/settings/ColorSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/ColorSetting.java index 644028e36f..47ef146303 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/ColorSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/ColorSetting.java @@ -5,7 +5,6 @@ package meteordevelopment.meteorclient.settings; -import com.google.common.collect.ImmutableList; import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.render.color.SettingColor; import net.minecraft.nbt.NbtCompound; @@ -14,7 +13,7 @@ import java.util.function.Consumer; public class ColorSetting extends Setting { - private static final List SUGGESTIONS = ImmutableList.of("0 0 0 255", "225 25 25 255", "25 225 25 255", "25 25 225 255", "255 255 255 255"); + private static final List SUGGESTIONS = List.of("0 0 0 255", "225 25 25 255", "25 225 25 255", "25 25 225 255", "255 255 255 255"); public ColorSetting(String name, String description, SettingColor defaultValue, Consumer onChanged, Consumer> onModuleActivated, IVisible visible) { super(name, description, defaultValue, onChanged, onModuleActivated, visible); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/System.java b/src/main/java/meteordevelopment/meteorclient/systems/System.java index b2d23353ed..60b2fb203d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/System.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/System.java @@ -46,7 +46,7 @@ public void save(File folder) { try { File tempFile = File.createTempFile(MeteorClient.MOD_ID, file.getName()); - NbtIo.write(tag, tempFile); + NbtIo.write(tag, tempFile.toPath()); if (folder != null) file = new File(folder, file.getName()); @@ -71,7 +71,7 @@ public void load(File folder) { if (file.exists()) { try { - fromTag(NbtIo.read(file)); + fromTag(NbtIo.read(file.toPath())); } catch (CrashException e) { String backupName = FilenameUtils.removeExtension(file.getName()) + "-" + ZonedDateTime.now().format(DATE_TIME_FORMATTER) + ".backup.nbt"; File backup = new File(file.getParentFile(), backupName); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/accounts/Account.java b/src/main/java/meteordevelopment/meteorclient/systems/accounts/Account.java index 428a424eb9..70ca1ac710 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/accounts/Account.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/accounts/Account.java @@ -68,11 +68,7 @@ public static void setSession(Session session) { MinecraftClientAccessor mca = (MinecraftClientAccessor) mc; mca.setSession(session); UserApiService apiService; - try { - apiService = mca.getAuthenticationService().createUserApiService(session.getAccessToken()); - } catch (AuthenticationException e) { - apiService = UserApiService.OFFLINE; - } + apiService = mca.getAuthenticationService().createUserApiService(session.getAccessToken()); mca.setUserApiService(apiService); mca.setSocialInteractionsManager(new SocialInteractionsManager(mc, apiService)); mca.setProfileKeys(ProfileKeys.create(apiService, session, mc.runDirectory.toPath())); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/EasyMCAccount.java b/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/EasyMCAccount.java index e6f023df4e..52b1aeeef7 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/EasyMCAccount.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/EasyMCAccount.java @@ -21,7 +21,7 @@ public class EasyMCAccount extends Account { - private static final Environment ENVIRONMENT = new Environment("https://authserver.mojang.com", "https://sessionserver.easymc.io", "https://api.minecraftservices.com", "EasyMC"); + private static final Environment ENVIRONMENT = new Environment("https://sessionserver.easymc.io", "https://authserver.mojang.com", "EasyMC"); private static final YggdrasilAuthenticationService SERVICE = new YggdrasilAuthenticationService(((MinecraftClientAccessor) mc).getProxy(), ENVIRONMENT); public EasyMCAccount(String token) { 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 b1c37466f2..57f2df4bc2 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/TheAlteningAccount.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/TheAlteningAccount.java @@ -21,7 +21,7 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; public class TheAlteningAccount extends Account { - private static final Environment ENVIRONMENT = new Environment("http://authserver.thealtening.com", "http://sessionserver.thealtening.com", "https://api.minecraftservices.com", "The Altening"); + private static final Environment ENVIRONMENT = new Environment("http://sessionserver.thealtening.com", "http://authserver.thealtening.com", "The Altening"); private static final YggdrasilAuthenticationService SERVICE = new YggdrasilAuthenticationService(((MinecraftClientAccessor) mc).getProxy(), ENVIRONMENT); public TheAlteningAccount(String token) { @@ -68,7 +68,7 @@ public boolean login() { } private WaybackAuthLib getAuth() { - WaybackAuthLib auth = new WaybackAuthLib(ENVIRONMENT.accountsHost()); + WaybackAuthLib auth = new WaybackAuthLib(ENVIRONMENT.servicesHost()); auth.setUsername(name); auth.setPassword("Meteor on Crack!"); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/friends/Friend.java b/src/main/java/meteordevelopment/meteorclient/systems/friends/Friend.java index 16476b039a..8003a938f1 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/friends/Friend.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/friends/Friend.java @@ -31,7 +31,7 @@ public Friend(String name, @Nullable UUID id) { } public Friend(PlayerEntity player) { - this(player.getEntityName(), player.getUuid()); + this(player.getName().getString(), player.getUuid()); } public Friend(String name) { this(name, null); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/friends/Friends.java b/src/main/java/meteordevelopment/meteorclient/systems/friends/Friends.java index 7227e58c4d..3642319fa1 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/friends/Friends.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/friends/Friends.java @@ -65,7 +65,7 @@ public Friend get(String name) { } public Friend get(PlayerEntity player) { - return get(player.getEntityName()); + return get(player.getName().getString()); } public Friend get(PlayerListEntry player) { 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 b868e4012c..fe2e31086f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/CombatHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/CombatHud.java @@ -237,7 +237,7 @@ public void render(HudRenderer renderer) { String breakText = " | "; // Name - String nameText = playerEntity.getEntityName(); + String nameText = playerEntity.getName().getString(); Color nameColor = PlayerUtils.getPlayerColor(playerEntity, primaryColor); // Ping 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 2adbde96a8..879a45d708 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PlayerRadarHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PlayerRadarHud.java @@ -153,7 +153,7 @@ public void tick(HudRenderer renderer) { if (entity.equals(mc.player)) continue; if (!friends.get() && Friends.get().isFriend(entity)) continue; - String text = entity.getEntityName(); + String text = entity.getName().getString(); if (distance.get()) text += String.format("(%sm)", Math.round(mc.getCameraEntity().distanceTo(entity))); width = Math.max(width, renderer.textWidth(text, shadow.get(), getScale())); @@ -180,7 +180,7 @@ public void render(HudRenderer renderer) { if (entity.equals(mc.player)) continue; if (!friends.get() && Friends.get().isFriend(entity)) continue; - String text = entity.getEntityName(); + String text = entity.getName().getString(); Color color = PlayerUtils.getPlayerColor(entity, primaryColor.get()); String distanceText = null; 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 8a2e1c699a..5d3f0e99c3 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PotionTimersHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PotionTimersHud.java @@ -241,7 +241,7 @@ public void render(HudRenderer renderer) { } private String getString(StatusEffectInstance statusEffectInstance) { - return String.format("%s %d (%s)", Names.get(statusEffectInstance.getEffectType()), statusEffectInstance.getAmplifier() + 1, statusEffectInstance.isInfinite() ? "inf" : StringHelper.formatTicks(statusEffectInstance.getDuration())); //todo remove "inf" when font rendering can use symbols + return String.format("%s %d (%s)", Names.get(statusEffectInstance.getEffectType()), statusEffectInstance.getAmplifier() + 1, statusEffectInstance.isInfinite() ? "inf" : StringHelper.formatTicks(statusEffectInstance.getDuration(), mc.world.getTickManager().getTickRate())); //todo remove "inf" when font rendering can use symbols } private double getScale() { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java index ac14ca7ddc..c9b07c574d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java @@ -5,7 +5,6 @@ package meteordevelopment.meteorclient.systems.modules; -import com.google.common.collect.Ordering; import com.mojang.datafixers.util.Pair; import com.mojang.serialization.Lifecycle; import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap; @@ -170,7 +169,7 @@ public List getActive() { } public Set searchTitles(String text) { - Map modules = new ValueComparableMap<>(Ordering.natural()); + Map modules = new ValueComparableMap<>(Comparator.naturalOrder()); for (Module module : this.moduleInstances.values()) { int score = Utils.searchLevenshteinDefault(module.title, text, false); @@ -181,7 +180,7 @@ public Set searchTitles(String text) { } public Set searchSettingTitles(String text) { - Map modules = new ValueComparableMap<>(Ordering.natural()); + Map modules = new ValueComparableMap<>(Comparator.naturalOrder()); for (Module module : this.moduleInstances.values()) { int lowest = Integer.MAX_VALUE; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/DiscordPresence.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/DiscordPresence.java index 3750694c38..3ddd3c98ca 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/DiscordPresence.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/DiscordPresence.java @@ -25,13 +25,13 @@ import meteordevelopment.orbit.EventHandler; import meteordevelopment.starscript.Script; import net.minecraft.client.gui.screen.*; +import net.minecraft.client.gui.screen.multiplayer.AddServerScreen; +import net.minecraft.client.gui.screen.multiplayer.ConnectScreen; +import net.minecraft.client.gui.screen.multiplayer.DirectConnectScreen; import net.minecraft.client.gui.screen.multiplayer.MultiplayerScreen; import net.minecraft.client.gui.screen.option.*; import net.minecraft.client.gui.screen.pack.PackScreen; -import net.minecraft.client.gui.screen.world.CreateWorldScreen; -import net.minecraft.client.gui.screen.world.EditGameRulesScreen; -import net.minecraft.client.gui.screen.world.EditWorldScreen; -import net.minecraft.client.gui.screen.world.SelectWorldScreen; +import net.minecraft.client.gui.screen.world.*; import net.minecraft.client.realms.gui.screen.RealmsScreen; import net.minecraft.util.Pair; import net.minecraft.util.Util; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/MessageAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/MessageAura.java index 3c63a48401..23c795b191 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/MessageAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/MessageAura.java @@ -43,7 +43,7 @@ private void onEntityAdded(EntityAddedEvent event) { if (!(event.entity instanceof PlayerEntity) || event.entity.getUuid().equals(mc.player.getUuid())) return; if (!ignoreFriends.get() || (ignoreFriends.get() && !Friends.get().isFriend((PlayerEntity)event.entity))) { - ChatUtils.sendPlayerMsg("/msg " + event.entity.getEntityName() + " " + message.get()); + ChatUtils.sendPlayerMsg("/msg " + event.entity.getName().getString() + " " + message.get()); } } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java index adcbcb2825..4a91c48eee 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java @@ -154,7 +154,7 @@ private void onEntityAdded(EntityAddedEvent event) { if (!event.entity.getUuid().equals(mc.player.getUuid()) && entities.get().contains(event.entity.getType()) && visualRange.get() && this.event.get() != Event.Despawn) { if (event.entity instanceof PlayerEntity) { if ((!visualRangeIgnoreFriends.get() || !Friends.get().isFriend(((PlayerEntity) event.entity))) && (!visualRangeIgnoreFakes.get() || !(event.entity instanceof FakePlayerEntity))) { - ChatUtils.sendMsg(event.entity.getId() + 100, Formatting.GRAY, "(highlight)%s(default) has entered your visual range!", event.entity.getEntityName()); + ChatUtils.sendMsg(event.entity.getId() + 100, Formatting.GRAY, "(highlight)%s(default) has entered your visual range!", event.entity.getName().getString()); if (visualMakeSound.get()) mc.world.playSoundFromEntity(mc.player, mc.player, SoundEvents.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.AMBIENT, 3.0F, 1.0F); @@ -180,7 +180,7 @@ private void onEntityRemoved(EntityRemovedEvent event) { if (!event.entity.getUuid().equals(mc.player.getUuid()) && entities.get().contains(event.entity.getType()) && visualRange.get() && this.event.get() != Event.Spawn) { if (event.entity instanceof PlayerEntity) { if ((!visualRangeIgnoreFriends.get() || !Friends.get().isFriend(((PlayerEntity) event.entity))) && (!visualRangeIgnoreFakes.get() || !(event.entity instanceof FakePlayerEntity))) { - ChatUtils.sendMsg(event.entity.getId() + 100, Formatting.GRAY, "(highlight)%s(default) has left your visual range!", event.entity.getEntityName()); + ChatUtils.sendMsg(event.entity.getId() + 100, Formatting.GRAY, "(highlight)%s(default) has left your visual range!", event.entity.getName().getString()); if (visualMakeSound.get()) mc.world.playSoundFromEntity(mc.player, mc.player, SoundEvents.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.AMBIENT, 3.0F, 1.0F); @@ -202,7 +202,7 @@ private void onEntityRemoved(EntityRemovedEvent event) { if (pearl.getOwner() != null && pearl.getOwner() instanceof PlayerEntity p) { double d = pearlStartPosMap.get(i).distanceTo(e.getPos()); if ((!Friends.get().isFriend(p) || !pearlIgnoreFriends.get()) && (!p.equals(mc.player) || !pearlIgnoreOwn.get())) { - info("(highlight)%s's(default) pearl landed at %d, %d, %d (highlight)(%.1fm away, travelled %.1fm)(default).", pearl.getOwner().getEntityName(), pearl.getBlockPos().getX(), pearl.getBlockPos().getY(), pearl.getBlockPos().getZ(), pearl.distanceTo(mc.player), d); + info("(highlight)%s's(default) pearl landed at %d, %d, %d (highlight)(%.1fm away, travelled %.1fm)(default).", pearl.getOwner().getName().getString(), pearl.getBlockPos().getX(), pearl.getBlockPos().getY(), pearl.getBlockPos().getZ(), pearl.distanceTo(mc.player), d); } } pearlStartPosMap.remove(i); @@ -246,7 +246,7 @@ private void onReceivePacket(PacketEvent.Receive event) { int pops = totemPopMap.getOrDefault(entity.getUuid(), 0); totemPopMap.put(entity.getUuid(), ++pops); - ChatUtils.sendMsg(getChatId(entity), Formatting.GRAY, "(highlight)%s (default)popped (highlight)%d (default)%s.", entity.getEntityName(), pops, pops == 1 ? "totem" : "totems"); + ChatUtils.sendMsg(getChatId(entity), Formatting.GRAY, "(highlight)%s (default)popped (highlight)%d (default)%s.", entity.getName().getString(), pops, pops == 1 ? "totem" : "totems"); } } @@ -260,7 +260,7 @@ private void onTick(TickEvent.Post event) { if (player.deathTime > 0 || player.getHealth() <= 0) { int pops = totemPopMap.removeInt(player.getUuid()); - ChatUtils.sendMsg(getChatId(player), Formatting.GRAY, "(highlight)%s (default)died after popping (highlight)%d (default)%s.", player.getEntityName(), pops, pops == 1 ? "totem" : "totems"); + ChatUtils.sendMsg(getChatId(player), Formatting.GRAY, "(highlight)%s (default)died after popping (highlight)%d (default)%s.", player.getName().getString(), pops, pops == 1 ? "totem" : "totems"); chatIdMap.removeInt(player.getUuid()); } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/ServerSpoof.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/ServerSpoof.java index 94edd3b9b0..dd0b910d15 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/ServerSpoof.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/ServerSpoof.java @@ -100,12 +100,12 @@ private void onPacketRecieve(PacketEvent.Receive event) { if (!(event.packet instanceof ResourcePackSendS2CPacket packet)) return; event.cancel(); MutableText msg = Text.literal("This server has "); - msg.append(packet.isRequired() ? "a required " : "an optional "); + msg.append(packet.required() ? "a required " : "an optional "); MutableText link = Text.literal("resource pack"); link.setStyle(link.getStyle() .withColor(Formatting.BLUE) .withUnderline(true) - .withClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, packet.getUrl())) + .withClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, packet.url())) .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Text.literal("Click to download"))) ); msg.append(link); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java index 7410c1f427..f72e2fa1d0 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java @@ -189,7 +189,7 @@ private boolean shouldStopUsing(ItemStack itemStack) { public static double getScore(ItemStack itemStack, BlockState state, boolean silkTouchEnderChest, boolean fortuneOre, EnchantPreference enchantPreference, Predicate good) { if (!good.test(itemStack) || !isTool(itemStack)) return -1; - if (!itemStack.isSuitableFor(state) && !(itemStack.getItem() instanceof SwordItem && (state.getBlock() instanceof BambooBlock || state.getBlock() instanceof BambooSaplingBlock))) return -1; + if (!itemStack.isSuitableFor(state) && !(itemStack.getItem() instanceof SwordItem && (state.getBlock() instanceof BambooBlock || state.getBlock() instanceof BambooShootBlock))) return -1; if (silkTouchEnderChest && state.getBlock() == Blocks.ENDER_CHEST @@ -213,7 +213,7 @@ && isFortunable(state.getBlock()) if (enchantPreference == EnchantPreference.Fortune) score += EnchantmentHelper.getLevel(Enchantments.FORTUNE, itemStack); if (enchantPreference == EnchantPreference.SilkTouch) score += EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, itemStack); - if (itemStack.getItem() instanceof SwordItem item && (state.getBlock() instanceof BambooBlock || state.getBlock() instanceof BambooSaplingBlock)) + if (itemStack.getItem() instanceof SwordItem item && (state.getBlock() instanceof BambooBlock || state.getBlock() instanceof BambooShootBlock)) score += 9000 + (item.getMaterial().getMiningLevel() * 1000); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/FakePlayer.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/FakePlayer.java index 6946dfddf7..bd4480eea4 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/FakePlayer.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/FakePlayer.java @@ -56,7 +56,7 @@ public WWidget getWidget(GuiTheme theme) { private void fillTable(GuiTheme theme, WTable table) { for (FakePlayerEntity fakePlayer : FakePlayerManager.getFakePlayers()) { - table.add(theme.label(fakePlayer.getEntityName())); + table.add(theme.label(fakePlayer.getName().getString())); WMinus delete = table.add(theme.minus()).expandCellX().right().widget(); delete.action = () -> { FakePlayerManager.remove(fakePlayer); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/MiddleClickExtra.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/MiddleClickExtra.java index 0af7d1116e..6794b7735b 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/MiddleClickExtra.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/MiddleClickExtra.java @@ -98,11 +98,11 @@ private void onMouseButton(MouseButtonEvent event) { if (!Friends.get().isFriend(player)) { Friends.get().add(new Friend(player)); - info("Added %s to friends", player.getEntityName()); - if (message.get()) ChatUtils.sendPlayerMsg("/msg " + player.getEntityName() + " I just friended you on Meteor."); + info("Added %s to friends", player.getName().getString()); + if (message.get()) ChatUtils.sendPlayerMsg("/msg " + player.getName() + " I just friended you on Meteor."); } else { Friends.get().remove(Friends.get().get(player)); - info("Removed %s from friends", player.getEntityName()); + info("Removed %s from friends", player.getName().getString()); } return; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java index 4158e0646e..357dc14986 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java @@ -417,10 +417,10 @@ public void applyCompactShulkerTooltip(ItemStack stack, List tooltip) { private MutableText getStatusText(StatusEffectInstance effect) { MutableText text = Text.translatable(effect.getTranslationKey()); if (effect.getAmplifier() != 0) { - text.append(String.format(" %d (%s)", effect.getAmplifier() + 1, StatusEffectUtil.getDurationText(effect, 1).getString())); + text.append(String.format(" %d (%s)", effect.getAmplifier() + 1, StatusEffectUtil.getDurationText(effect, 1, mc.world.getTickManager().getTickRate()).getString())); } else { - text.append(String.format(" (%s)", StatusEffectUtil.getDurationText(effect, 1).getString())); + text.append(String.format(" (%s)", StatusEffectUtil.getDurationText(effect, 1, mc.world.getTickManager().getTickRate()).getString())); } if (effect.getEffectType().isBeneficial()) return text.formatted(Formatting.BLUE); @@ -436,7 +436,7 @@ private Text getFirstPage(ItemStack stack) { if (stack.getItem() == Items.WRITABLE_BOOK) return Text.literal(pages.getString(0)); try { - return Text.Serializer.fromLenientJson(pages.getString(0)); + return Text.Serialization.fromLenientJson(pages.getString(0)); } catch (JsonParseException e) { return Text.literal("Invalid book data"); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/EntityOwner.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/EntityOwner.java index cc1c4db427..5b2f672650 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/EntityOwner.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/EntityOwner.java @@ -110,7 +110,7 @@ private void renderNametag(String name) { private String getOwnerName(UUID uuid) { // Check if the player is online PlayerEntity player = mc.world.getPlayerByUuid(uuid); - if (player != null) return player.getEntityName(); + if (player != null) return player.getName().getString(); // Check cache String name = uuidToName.get(uuid); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/LogoutSpots.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/LogoutSpots.java index a750a33afb..4bba428fec 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/LogoutSpots.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/LogoutSpots.java @@ -217,7 +217,7 @@ public Entry(PlayerEntity entity) { height = entity.getBoundingBox().getLengthY(); uuid = entity.getUuid(); - name = entity.getEntityName(); + name = entity.getName().getString(); health = Math.round(entity.getHealth() + entity.getAbsorptionAmount()); maxHealth = Math.round(entity.getMaxHealth() + entity.getAbsorptionAmount()); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java index c343ce6bdc..79d51bc625 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java @@ -391,8 +391,8 @@ private void renderNametagPlayer(Render2DEvent event, PlayerEntity player, boole String name; Color nameColor = PlayerUtils.getPlayerColor(player, this.nameColor.get()); - if (player == mc.player) name = Modules.get().get(NameProtect.class).getName(player.getEntityName()); - else name = player.getEntityName(); + if (player == mc.player) name = Modules.get().get(NameProtect.class).getName(player.getName().getString()); + else name = player.getName().getString(); // Health float absorption = player.getAbsorptionAmount(); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Flamethrower.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Flamethrower.java index 3d6585f945..1eb6ff4e5d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Flamethrower.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Flamethrower.java @@ -125,7 +125,7 @@ private void interact() { Block block = mc.world.getBlockState(entity.getBlockPos()).getBlock(); Block bottom = mc.world.getBlockState(entity.getBlockPos().down()).getBlock(); if (block == Blocks.WATER || bottom == Blocks.WATER || bottom == Blocks.DIRT_PATH) return; - if (block == Blocks.GRASS) mc.interactionManager.attackBlock(entity.getBlockPos(), Direction.DOWN); + if (block == Blocks.GRASS_BLOCK) mc.interactionManager.attackBlock(entity.getBlockPos(), Direction.DOWN); if (putOutFire.get() && entity instanceof LivingEntity animal && animal.getHealth() < 1) { mc.interactionManager.attackBlock(entity.getBlockPos(), Direction.DOWN); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java index b3123ee743..ff2eff1a99 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java @@ -275,7 +275,7 @@ private void onRender(Render3DEvent event) { if (enableRenderBounding.get()){ // Render bounding box if cube and should break stuff if (shape.get() != Shape.Sphere && mode.get() != Mode.Smash) { - box = new Box(pos1, pos2); + box = new Box(pos1.toCenterPos(), pos2.toCenterPos()); event.renderer.box(box, sideColorBox.get(), lineColorBox.get(), shapeModeBox.get(), 0); } } @@ -341,7 +341,7 @@ private void onTickPre(TickEvent.Pre event) { if (mode.get() == Mode.Flatten){ pos1.setY((int) Math.floor(pY)); } - box = new Box(pos1, pos2); + box = new Box(pos1.toCenterPos(), pos2.toCenterPos()); // Find blocks to break BlockIterator.register(Math.max((int) Math.ceil(range.get()+1), maxh), Math.max((int) Math.ceil(range.get()), maxv), (blockPos, blockState) -> { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/VeinMiner.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/VeinMiner.java index 36781f8748..ca985ce861 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/VeinMiner.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/VeinMiner.java @@ -5,7 +5,6 @@ package meteordevelopment.meteorclient.systems.modules.world; -import com.google.common.collect.Sets; import meteordevelopment.meteorclient.events.entity.player.StartBreakingBlockEvent; import meteordevelopment.meteorclient.events.render.Render3DEvent; import meteordevelopment.meteorclient.events.world.TickEvent; @@ -37,7 +36,7 @@ public class VeinMiner extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); private final SettingGroup sgRender = settings.createGroup("Render"); - private final Set blockNeighbours = Sets.newHashSet( + private final Set blockNeighbours = Set.of( new Vec3i(1, -1, 1), new Vec3i(0, -1, 1), new Vec3i(-1, -1, 1), new Vec3i(1, -1, 0), new Vec3i(0, -1, 0), new Vec3i(-1, -1, 0), new Vec3i(1, -1, -1), new Vec3i(0, -1, -1), new Vec3i(-1, -1, -1), @@ -56,7 +55,7 @@ public class VeinMiner extends Module { private final Setting> selectedBlocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") .description("Which blocks to select.") - .defaultValue(Blocks.STONE, Blocks.DIRT, Blocks.GRASS) + .defaultValue(Blocks.STONE, Blocks.DIRT, Blocks.GRASS_BLOCK) .build() ); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityUtils.java index c89f3e83e5..3fa73c7704 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityUtils.java @@ -139,7 +139,7 @@ public static BlockPos getCityBlock(PlayerEntity player) { public static String getName(Entity entity) { if (entity == null) return null; - if (entity instanceof PlayerEntity) return entity.getEntityName(); + if (entity instanceof PlayerEntity) return entity.getName().getString(); return entity.getType().getName().getString(); } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/fakeplayer/FakePlayerManager.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/fakeplayer/FakePlayerManager.java index b6fe58d550..b05a47c29a 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/entity/fakeplayer/FakePlayerManager.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/entity/fakeplayer/FakePlayerManager.java @@ -23,7 +23,7 @@ public static List getFakePlayers() { public static FakePlayerEntity get(String name) { for (FakePlayerEntity fp : ENTITIES) { - if (fp.getEntityName().equals(name)) return fp; + if (fp.getName().getString().equals(name)) return fp; } return null; @@ -39,7 +39,7 @@ public static void add(String name, float health, boolean copyInv) { public static void remove(FakePlayerEntity fp) { ENTITIES.removeIf(fp1 -> { - if (fp1.getEntityName().equals(fp.getEntityName())) { + if (fp1.getName().getString().equals(fp.getName().getString())) { fp1.despawn(); return true; } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/NbtUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/NbtUtils.java index 2d961e52b3..9ccca937a3 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/NbtUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/NbtUtils.java @@ -8,10 +8,7 @@ import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.systems.System; import meteordevelopment.meteorclient.utils.render.prompts.OkPrompt; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtElement; -import net.minecraft.nbt.NbtIo; -import net.minecraft.nbt.NbtList; +import net.minecraft.nbt.*; import org.apache.commons.io.output.ByteArrayOutputStream; import java.io.ByteArrayInputStream; @@ -89,7 +86,7 @@ public static NbtCompound fromClipboard(NbtCompound schema) { byte[] data = Base64.getDecoder().decode(mc.keyboard.getClipboard().trim()); ByteArrayInputStream bis = new ByteArrayInputStream(data); - NbtCompound pasted = NbtIo.readCompressed(new DataInputStream(bis)); + NbtCompound pasted = NbtIo.readCompressed(new DataInputStream(bis), NbtTagSizeTracker.ofUnlimitedBytes()); for (String key : schema.getKeys()) if (!pasted.getKeys().contains(key)) return null; if (!pasted.getString("name").equals(schema.getString("name"))) return null; diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/ValueComparableMap.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/ValueComparableMap.java index 04d953a26b..a5046c916e 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/ValueComparableMap.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/ValueComparableMap.java @@ -5,29 +5,31 @@ package meteordevelopment.meteorclient.utils.misc; -import com.google.common.collect.Ordering; - import java.util.Comparator; import java.util.HashMap; import java.util.Map; import java.util.TreeMap; public class ValueComparableMap, V> extends TreeMap { - private final Map valueMap; + private final transient Map valueMap; - public ValueComparableMap(final Ordering partialValueOrdering) { - this(partialValueOrdering, new HashMap()); + public ValueComparableMap(final Comparator partialValueComparator) { + this(partialValueComparator, new HashMap<>()); } - private ValueComparableMap(Ordering partialValueOrdering, HashMap valueMap) { - super(partialValueOrdering.onResultOf(valueMap::get).compound(Comparator.naturalOrder())); + private ValueComparableMap(Comparator partialValueComparator, HashMap valueMap) { + super((k1, k2) -> { + int cmp = partialValueComparator.compare(valueMap.get(k1), valueMap.get(k2)); + return cmp != 0 ? cmp : k1.compareTo(k2); + }); + this.valueMap = valueMap; } @Override public V put(K k, V v) { if (valueMap.containsKey(k)) remove(k); - valueMap.put(k,v); + valueMap.put(k, v); return super.put(k, v); } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtils.java index 76494d2559..f20229eda3 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtils.java @@ -5,7 +5,6 @@ package meteordevelopment.meteorclient.utils.network; -import com.google.common.collect.Iterators; import com.mojang.datafixers.util.Pair; import com.mojang.serialization.Lifecycle; import meteordevelopment.meteorclient.utils.misc.MeteorIdentifier; @@ -19,10 +18,11 @@ import net.minecraft.util.Identifier; import net.minecraft.util.math.random.Random; import org.jetbrains.annotations.NotNull; + import java.util.*; import java.util.stream.Stream; -public class PacketUtils { +public abstract class PacketUtils { public static final Registry>> REGISTRY = new PacketRegistry(); private static final Map>, String> S2C_PACKETS = new HashMap<>(); @@ -38,10 +38,10 @@ public class PacketUtils { C2S_PACKETS_R.put("PlayerInteractItemC2SPacket", net.minecraft.network.packet.c2s.play.PlayerInteractItemC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.login.EnterConfigurationC2SPacket.class, "EnterConfigurationC2SPacket"); C2S_PACKETS_R.put("EnterConfigurationC2SPacket", net.minecraft.network.packet.c2s.login.EnterConfigurationC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket.class, "PlayerActionC2SPacket"); - C2S_PACKETS_R.put("PlayerActionC2SPacket", net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.SelectMerchantTradeC2SPacket.class, "SelectMerchantTradeC2SPacket"); C2S_PACKETS_R.put("SelectMerchantTradeC2SPacket", net.minecraft.network.packet.c2s.play.SelectMerchantTradeC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket.class, "PlayerActionC2SPacket"); + C2S_PACKETS_R.put("PlayerActionC2SPacket", net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.CommandExecutionC2SPacket.class, "CommandExecutionC2SPacket"); C2S_PACKETS_R.put("CommandExecutionC2SPacket", net.minecraft.network.packet.c2s.play.CommandExecutionC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.RenameItemC2SPacket.class, "RenameItemC2SPacket"); @@ -54,30 +54,30 @@ public class PacketUtils { C2S_PACKETS_R.put("QueryBlockNbtC2SPacket", net.minecraft.network.packet.c2s.play.QueryBlockNbtC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.PlayerInteractEntityC2SPacket.class, "PlayerInteractEntityC2SPacket"); C2S_PACKETS_R.put("PlayerInteractEntityC2SPacket", net.minecraft.network.packet.c2s.play.PlayerInteractEntityC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.AcknowledgeReconfigurationC2SPacket.class, "AcknowledgeReconfigurationC2SPacket"); - C2S_PACKETS_R.put("AcknowledgeReconfigurationC2SPacket", net.minecraft.network.packet.c2s.play.AcknowledgeReconfigurationC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.RequestCommandCompletionsC2SPacket.class, "RequestCommandCompletionsC2SPacket"); - C2S_PACKETS_R.put("RequestCommandCompletionsC2SPacket", net.minecraft.network.packet.c2s.play.RequestCommandCompletionsC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdatePlayerAbilitiesC2SPacket.class, "UpdatePlayerAbilitiesC2SPacket"); C2S_PACKETS_R.put("UpdatePlayerAbilitiesC2SPacket", net.minecraft.network.packet.c2s.play.UpdatePlayerAbilitiesC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.RequestCommandCompletionsC2SPacket.class, "RequestCommandCompletionsC2SPacket"); + C2S_PACKETS_R.put("RequestCommandCompletionsC2SPacket", net.minecraft.network.packet.c2s.play.RequestCommandCompletionsC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.AcknowledgeReconfigurationC2SPacket.class, "AcknowledgeReconfigurationC2SPacket"); + C2S_PACKETS_R.put("AcknowledgeReconfigurationC2SPacket", net.minecraft.network.packet.c2s.play.AcknowledgeReconfigurationC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.query.QueryRequestC2SPacket.class, "QueryRequestC2SPacket"); C2S_PACKETS_R.put("QueryRequestC2SPacket", net.minecraft.network.packet.c2s.query.QueryRequestC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdateCommandBlockC2SPacket.class, "UpdateCommandBlockC2SPacket"); C2S_PACKETS_R.put("UpdateCommandBlockC2SPacket", net.minecraft.network.packet.c2s.play.UpdateCommandBlockC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.HandSwingC2SPacket.class, "HandSwingC2SPacket"); C2S_PACKETS_R.put("HandSwingC2SPacket", net.minecraft.network.packet.c2s.play.HandSwingC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.ClickSlotC2SPacket.class, "ClickSlotC2SPacket"); - C2S_PACKETS_R.put("ClickSlotC2SPacket", net.minecraft.network.packet.c2s.play.ClickSlotC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.AdvancementTabC2SPacket.class, "AdvancementTabC2SPacket"); C2S_PACKETS_R.put("AdvancementTabC2SPacket", net.minecraft.network.packet.c2s.play.AdvancementTabC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.ClickSlotC2SPacket.class, "ClickSlotC2SPacket"); + C2S_PACKETS_R.put("ClickSlotC2SPacket", net.minecraft.network.packet.c2s.play.ClickSlotC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.AcknowledgeChunksC2SPacket.class, "AcknowledgeChunksC2SPacket"); C2S_PACKETS_R.put("AcknowledgeChunksC2SPacket", net.minecraft.network.packet.c2s.play.AcknowledgeChunksC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.SpectatorTeleportC2SPacket.class, "SpectatorTeleportC2SPacket"); C2S_PACKETS_R.put("SpectatorTeleportC2SPacket", net.minecraft.network.packet.c2s.play.SpectatorTeleportC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdateDifficultyLockC2SPacket.class, "UpdateDifficultyLockC2SPacket"); - C2S_PACKETS_R.put("UpdateDifficultyLockC2SPacket", net.minecraft.network.packet.c2s.play.UpdateDifficultyLockC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.login.LoginKeyC2SPacket.class, "LoginKeyC2SPacket"); C2S_PACKETS_R.put("LoginKeyC2SPacket", net.minecraft.network.packet.c2s.login.LoginKeyC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdateDifficultyLockC2SPacket.class, "UpdateDifficultyLockC2SPacket"); + C2S_PACKETS_R.put("UpdateDifficultyLockC2SPacket", net.minecraft.network.packet.c2s.play.UpdateDifficultyLockC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.JigsawGeneratingC2SPacket.class, "JigsawGeneratingC2SPacket"); C2S_PACKETS_R.put("JigsawGeneratingC2SPacket", net.minecraft.network.packet.c2s.play.JigsawGeneratingC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.QueryEntityNbtC2SPacket.class, "QueryEntityNbtC2SPacket"); @@ -92,14 +92,16 @@ public class PacketUtils { C2S_PACKETS_R.put("PlayerMoveC2SPacket", net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.common.ClientOptionsC2SPacket.class, "ClientOptionsC2SPacket"); C2S_PACKETS_R.put("ClientOptionsC2SPacket", net.minecraft.network.packet.c2s.common.ClientOptionsC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.common.CustomPayloadC2SPacket.class, "CustomPayloadC2SPacket"); - C2S_PACKETS_R.put("CustomPayloadC2SPacket", net.minecraft.network.packet.c2s.common.CustomPayloadC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.PickFromInventoryC2SPacket.class, "PickFromInventoryC2SPacket"); C2S_PACKETS_R.put("PickFromInventoryC2SPacket", net.minecraft.network.packet.c2s.play.PickFromInventoryC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.common.CustomPayloadC2SPacket.class, "CustomPayloadC2SPacket"); + C2S_PACKETS_R.put("CustomPayloadC2SPacket", net.minecraft.network.packet.c2s.common.CustomPayloadC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.PlayerSessionC2SPacket.class, "PlayerSessionC2SPacket"); C2S_PACKETS_R.put("PlayerSessionC2SPacket", net.minecraft.network.packet.c2s.play.PlayerSessionC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.CloseHandledScreenC2SPacket.class, "CloseHandledScreenC2SPacket"); C2S_PACKETS_R.put("CloseHandledScreenC2SPacket", net.minecraft.network.packet.c2s.play.CloseHandledScreenC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.SlotChangedStateC2SPacket.class, "SlotChangedStateC2SPacket"); + C2S_PACKETS_R.put("SlotChangedStateC2SPacket", net.minecraft.network.packet.c2s.play.SlotChangedStateC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.config.ReadyC2SPacket.class, "ReadyC2SPacket"); C2S_PACKETS_R.put("ReadyC2SPacket", net.minecraft.network.packet.c2s.config.ReadyC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.BoatPaddleStateC2SPacket.class, "BoatPaddleStateC2SPacket"); @@ -110,10 +112,10 @@ public class PacketUtils { C2S_PACKETS_R.put("ButtonClickC2SPacket", net.minecraft.network.packet.c2s.play.ButtonClickC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdateBeaconC2SPacket.class, "UpdateBeaconC2SPacket"); C2S_PACKETS_R.put("UpdateBeaconC2SPacket", net.minecraft.network.packet.c2s.play.UpdateBeaconC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.TeleportConfirmC2SPacket.class, "TeleportConfirmC2SPacket"); - C2S_PACKETS_R.put("TeleportConfirmC2SPacket", net.minecraft.network.packet.c2s.play.TeleportConfirmC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdateSignC2SPacket.class, "UpdateSignC2SPacket"); C2S_PACKETS_R.put("UpdateSignC2SPacket", net.minecraft.network.packet.c2s.play.UpdateSignC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.TeleportConfirmC2SPacket.class, "TeleportConfirmC2SPacket"); + C2S_PACKETS_R.put("TeleportConfirmC2SPacket", net.minecraft.network.packet.c2s.play.TeleportConfirmC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdateStructureBlockC2SPacket.class, "UpdateStructureBlockC2SPacket"); C2S_PACKETS_R.put("UpdateStructureBlockC2SPacket", net.minecraft.network.packet.c2s.play.UpdateStructureBlockC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdateCommandBlockMinecartC2SPacket.class, "UpdateCommandBlockMinecartC2SPacket"); @@ -132,18 +134,18 @@ public class PacketUtils { C2S_PACKETS_R.put("MessageAcknowledgmentC2SPacket", net.minecraft.network.packet.c2s.play.MessageAcknowledgmentC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.common.KeepAliveC2SPacket.class, "KeepAliveC2SPacket"); C2S_PACKETS_R.put("KeepAliveC2SPacket", net.minecraft.network.packet.c2s.common.KeepAliveC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.VehicleMoveC2SPacket.class, "VehicleMoveC2SPacket"); - C2S_PACKETS_R.put("VehicleMoveC2SPacket", net.minecraft.network.packet.c2s.play.VehicleMoveC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.CreativeInventoryActionC2SPacket.class, "CreativeInventoryActionC2SPacket"); C2S_PACKETS_R.put("CreativeInventoryActionC2SPacket", net.minecraft.network.packet.c2s.play.CreativeInventoryActionC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.VehicleMoveC2SPacket.class, "VehicleMoveC2SPacket"); + C2S_PACKETS_R.put("VehicleMoveC2SPacket", net.minecraft.network.packet.c2s.play.VehicleMoveC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.BookUpdateC2SPacket.class, "BookUpdateC2SPacket"); C2S_PACKETS_R.put("BookUpdateC2SPacket", net.minecraft.network.packet.c2s.play.BookUpdateC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.RecipeBookDataC2SPacket.class, "RecipeBookDataC2SPacket"); C2S_PACKETS_R.put("RecipeBookDataC2SPacket", net.minecraft.network.packet.c2s.play.RecipeBookDataC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.handshake.HandshakeC2SPacket.class, "HandshakeC2SPacket"); - C2S_PACKETS_R.put("HandshakeC2SPacket", net.minecraft.network.packet.c2s.handshake.HandshakeC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.login.LoginQueryResponseC2SPacket.class, "LoginQueryResponseC2SPacket"); C2S_PACKETS_R.put("LoginQueryResponseC2SPacket", net.minecraft.network.packet.c2s.login.LoginQueryResponseC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.handshake.HandshakeC2SPacket.class, "HandshakeC2SPacket"); + C2S_PACKETS_R.put("HandshakeC2SPacket", net.minecraft.network.packet.c2s.handshake.HandshakeC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdateDifficultyC2SPacket.class, "UpdateDifficultyC2SPacket"); C2S_PACKETS_R.put("UpdateDifficultyC2SPacket", net.minecraft.network.packet.c2s.play.UpdateDifficultyC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.CraftRequestC2SPacket.class, "CraftRequestC2SPacket"); @@ -181,36 +183,38 @@ public class PacketUtils { S2C_PACKETS_R.put("ResourcePackSendS2CPacket", net.minecraft.network.packet.s2c.common.ResourcePackSendS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.DamageTiltS2CPacket.class, "DamageTiltS2CPacket"); S2C_PACKETS_R.put("DamageTiltS2CPacket", net.minecraft.network.packet.s2c.play.DamageTiltS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.StatisticsS2CPacket.class, "StatisticsS2CPacket"); - S2C_PACKETS_R.put("StatisticsS2CPacket", net.minecraft.network.packet.s2c.play.StatisticsS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.CraftFailedResponseS2CPacket.class, "CraftFailedResponseS2CPacket"); S2C_PACKETS_R.put("CraftFailedResponseS2CPacket", net.minecraft.network.packet.s2c.play.CraftFailedResponseS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.StatisticsS2CPacket.class, "StatisticsS2CPacket"); + S2C_PACKETS_R.put("StatisticsS2CPacket", net.minecraft.network.packet.s2c.play.StatisticsS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.login.LoginQueryRequestS2CPacket.class, "LoginQueryRequestS2CPacket"); S2C_PACKETS_R.put("LoginQueryRequestS2CPacket", net.minecraft.network.packet.s2c.login.LoginQueryRequestS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.VehicleMoveS2CPacket.class, "VehicleMoveS2CPacket"); S2C_PACKETS_R.put("VehicleMoveS2CPacket", net.minecraft.network.packet.s2c.play.VehicleMoveS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityAttributesS2CPacket.class, "EntityAttributesS2CPacket"); S2C_PACKETS_R.put("EntityAttributesS2CPacket", net.minecraft.network.packet.s2c.play.EntityAttributesS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ScoreboardObjectiveUpdateS2CPacket.class, "ScoreboardObjectiveUpdateS2CPacket"); - S2C_PACKETS_R.put("ScoreboardObjectiveUpdateS2CPacket", net.minecraft.network.packet.s2c.play.ScoreboardObjectiveUpdateS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.TickStepS2CPacket.class, "TickStepS2CPacket"); + S2C_PACKETS_R.put("TickStepS2CPacket", net.minecraft.network.packet.s2c.play.TickStepS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.StopSoundS2CPacket.class, "StopSoundS2CPacket"); S2C_PACKETS_R.put("StopSoundS2CPacket", net.minecraft.network.packet.s2c.play.StopSoundS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ScoreboardObjectiveUpdateS2CPacket.class, "ScoreboardObjectiveUpdateS2CPacket"); + S2C_PACKETS_R.put("ScoreboardObjectiveUpdateS2CPacket", net.minecraft.network.packet.s2c.play.ScoreboardObjectiveUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.StartChunkSendS2CPacket.class, "StartChunkSendS2CPacket"); S2C_PACKETS_R.put("StartChunkSendS2CPacket", net.minecraft.network.packet.s2c.play.StartChunkSendS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntitySetHeadYawS2CPacket.class, "EntitySetHeadYawS2CPacket"); S2C_PACKETS_R.put("EntitySetHeadYawS2CPacket", net.minecraft.network.packet.s2c.play.EntitySetHeadYawS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.SetTradeOffersS2CPacket.class, "SetTradeOffersS2CPacket"); - S2C_PACKETS_R.put("SetTradeOffersS2CPacket", net.minecraft.network.packet.s2c.play.SetTradeOffersS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.SelectAdvancementTabS2CPacket.class, "SelectAdvancementTabS2CPacket"); S2C_PACKETS_R.put("SelectAdvancementTabS2CPacket", net.minecraft.network.packet.s2c.play.SelectAdvancementTabS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.SetTradeOffersS2CPacket.class, "SetTradeOffersS2CPacket"); + S2C_PACKETS_R.put("SetTradeOffersS2CPacket", net.minecraft.network.packet.s2c.play.SetTradeOffersS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlaySoundS2CPacket.class, "PlaySoundS2CPacket"); S2C_PACKETS_R.put("PlaySoundS2CPacket", net.minecraft.network.packet.s2c.play.PlaySoundS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.BlockEventS2CPacket.class, "BlockEventS2CPacket"); S2C_PACKETS_R.put("BlockEventS2CPacket", net.minecraft.network.packet.s2c.play.BlockEventS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ChunkSentS2CPacket.class, "ChunkSentS2CPacket"); - S2C_PACKETS_R.put("ChunkSentS2CPacket", net.minecraft.network.packet.s2c.play.ChunkSentS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlayerPositionLookS2CPacket.class, "PlayerPositionLookS2CPacket"); S2C_PACKETS_R.put("PlayerPositionLookS2CPacket", net.minecraft.network.packet.s2c.play.PlayerPositionLookS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ChunkSentS2CPacket.class, "ChunkSentS2CPacket"); + S2C_PACKETS_R.put("ChunkSentS2CPacket", net.minecraft.network.packet.s2c.play.ChunkSentS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.HealthUpdateS2CPacket.class, "HealthUpdateS2CPacket"); S2C_PACKETS_R.put("HealthUpdateS2CPacket", net.minecraft.network.packet.s2c.play.HealthUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.WorldEventS2CPacket.class, "WorldEventS2CPacket"); @@ -229,12 +233,12 @@ public class PacketUtils { S2C_PACKETS_R.put("TeamS2CPacket", net.minecraft.network.packet.s2c.play.TeamS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.CooldownUpdateS2CPacket.class, "CooldownUpdateS2CPacket"); S2C_PACKETS_R.put("CooldownUpdateS2CPacket", net.minecraft.network.packet.s2c.play.CooldownUpdateS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.OpenScreenS2CPacket.class, "OpenScreenS2CPacket"); + S2C_PACKETS_R.put("OpenScreenS2CPacket", net.minecraft.network.packet.s2c.play.OpenScreenS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ExperienceOrbSpawnS2CPacket.class, "ExperienceOrbSpawnS2CPacket"); S2C_PACKETS_R.put("ExperienceOrbSpawnS2CPacket", net.minecraft.network.packet.s2c.play.ExperienceOrbSpawnS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityAnimationS2CPacket.class, "EntityAnimationS2CPacket"); S2C_PACKETS_R.put("EntityAnimationS2CPacket", net.minecraft.network.packet.s2c.play.EntityAnimationS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.OpenScreenS2CPacket.class, "OpenScreenS2CPacket"); - S2C_PACKETS_R.put("OpenScreenS2CPacket", net.minecraft.network.packet.s2c.play.OpenScreenS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlayerAbilitiesS2CPacket.class, "PlayerAbilitiesS2CPacket"); S2C_PACKETS_R.put("PlayerAbilitiesS2CPacket", net.minecraft.network.packet.s2c.play.PlayerAbilitiesS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.WorldBorderWarningBlocksChangedS2CPacket.class, "WorldBorderWarningBlocksChangedS2CPacket"); @@ -247,10 +251,10 @@ public class PacketUtils { S2C_PACKETS_R.put("UnlockRecipesS2CPacket", net.minecraft.network.packet.s2c.play.UnlockRecipesS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.LightUpdateS2CPacket.class, "LightUpdateS2CPacket"); S2C_PACKETS_R.put("LightUpdateS2CPacket", net.minecraft.network.packet.s2c.play.LightUpdateS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.WorldBorderInitializeS2CPacket.class, "WorldBorderInitializeS2CPacket"); - S2C_PACKETS_R.put("WorldBorderInitializeS2CPacket", net.minecraft.network.packet.s2c.play.WorldBorderInitializeS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.OverlayMessageS2CPacket.class, "OverlayMessageS2CPacket"); S2C_PACKETS_R.put("OverlayMessageS2CPacket", net.minecraft.network.packet.s2c.play.OverlayMessageS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.WorldBorderInitializeS2CPacket.class, "WorldBorderInitializeS2CPacket"); + S2C_PACKETS_R.put("WorldBorderInitializeS2CPacket", net.minecraft.network.packet.s2c.play.WorldBorderInitializeS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.WorldBorderCenterChangedS2CPacket.class, "WorldBorderCenterChangedS2CPacket"); S2C_PACKETS_R.put("WorldBorderCenterChangedS2CPacket", net.minecraft.network.packet.s2c.play.WorldBorderCenterChangedS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityVelocityUpdateS2CPacket.class, "EntityVelocityUpdateS2CPacket"); @@ -259,10 +263,12 @@ public class PacketUtils { S2C_PACKETS_R.put("DifficultyS2CPacket", net.minecraft.network.packet.s2c.play.DifficultyS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.LookAtS2CPacket.class, "LookAtS2CPacket"); S2C_PACKETS_R.put("LookAtS2CPacket", net.minecraft.network.packet.s2c.play.LookAtS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ScreenHandlerPropertyUpdateS2CPacket.class, "ScreenHandlerPropertyUpdateS2CPacket"); - S2C_PACKETS_R.put("ScreenHandlerPropertyUpdateS2CPacket", net.minecraft.network.packet.s2c.play.ScreenHandlerPropertyUpdateS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ScoreboardScoreUpdateS2CPacket.class, "ScoreboardScoreUpdateS2CPacket"); + S2C_PACKETS_R.put("ScoreboardScoreUpdateS2CPacket", net.minecraft.network.packet.s2c.play.ScoreboardScoreUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.TitleS2CPacket.class, "TitleS2CPacket"); S2C_PACKETS_R.put("TitleS2CPacket", net.minecraft.network.packet.s2c.play.TitleS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ScreenHandlerPropertyUpdateS2CPacket.class, "ScreenHandlerPropertyUpdateS2CPacket"); + S2C_PACKETS_R.put("ScreenHandlerPropertyUpdateS2CPacket", net.minecraft.network.packet.s2c.play.ScreenHandlerPropertyUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.OpenHorseScreenS2CPacket.class, "OpenHorseScreenS2CPacket"); S2C_PACKETS_R.put("OpenHorseScreenS2CPacket", net.minecraft.network.packet.s2c.play.OpenHorseScreenS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.SimulationDistanceS2CPacket.class, "SimulationDistanceS2CPacket"); @@ -277,36 +283,38 @@ public class PacketUtils { S2C_PACKETS_R.put("DeathMessageS2CPacket", net.minecraft.network.packet.s2c.play.DeathMessageS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.MapUpdateS2CPacket.class, "MapUpdateS2CPacket"); S2C_PACKETS_R.put("MapUpdateS2CPacket", net.minecraft.network.packet.s2c.play.MapUpdateS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.BlockEntityUpdateS2CPacket.class, "BlockEntityUpdateS2CPacket"); - S2C_PACKETS_R.put("BlockEntityUpdateS2CPacket", net.minecraft.network.packet.s2c.play.BlockEntityUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ScreenHandlerSlotUpdateS2CPacket.class, "ScreenHandlerSlotUpdateS2CPacket"); S2C_PACKETS_R.put("ScreenHandlerSlotUpdateS2CPacket", net.minecraft.network.packet.s2c.play.ScreenHandlerSlotUpdateS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.BlockEntityUpdateS2CPacket.class, "BlockEntityUpdateS2CPacket"); + S2C_PACKETS_R.put("BlockEntityUpdateS2CPacket", net.minecraft.network.packet.s2c.play.BlockEntityUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlayerSpawnPositionS2CPacket.class, "PlayerSpawnPositionS2CPacket"); S2C_PACKETS_R.put("PlayerSpawnPositionS2CPacket", net.minecraft.network.packet.s2c.play.PlayerSpawnPositionS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityStatusEffectS2CPacket.class, "EntityStatusEffectS2CPacket"); S2C_PACKETS_R.put("EntityStatusEffectS2CPacket", net.minecraft.network.packet.s2c.play.EntityStatusEffectS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ClearTitleS2CPacket.class, "ClearTitleS2CPacket"); S2C_PACKETS_R.put("ClearTitleS2CPacket", net.minecraft.network.packet.s2c.play.ClearTitleS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.CommandTreeS2CPacket.class, "CommandTreeS2CPacket"); - S2C_PACKETS_R.put("CommandTreeS2CPacket", net.minecraft.network.packet.s2c.play.CommandTreeS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.login.LoginCompressionS2CPacket.class, "LoginCompressionS2CPacket"); S2C_PACKETS_R.put("LoginCompressionS2CPacket", net.minecraft.network.packet.s2c.login.LoginCompressionS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.CommandTreeS2CPacket.class, "CommandTreeS2CPacket"); + S2C_PACKETS_R.put("CommandTreeS2CPacket", net.minecraft.network.packet.s2c.play.CommandTreeS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.common.CommonPingS2CPacket.class, "CommonPingS2CPacket"); S2C_PACKETS_R.put("CommonPingS2CPacket", net.minecraft.network.packet.s2c.common.CommonPingS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ScoreboardScoreResetS2CPacket.class, "ScoreboardScoreResetS2CPacket"); + S2C_PACKETS_R.put("ScoreboardScoreResetS2CPacket", net.minecraft.network.packet.s2c.play.ScoreboardScoreResetS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.TitleFadeS2CPacket.class, "TitleFadeS2CPacket"); S2C_PACKETS_R.put("TitleFadeS2CPacket", net.minecraft.network.packet.s2c.play.TitleFadeS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.query.PingResultS2CPacket.class, "PingResultS2CPacket"); S2C_PACKETS_R.put("PingResultS2CPacket", net.minecraft.network.packet.s2c.query.PingResultS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlayerActionResponseS2CPacket.class, "PlayerActionResponseS2CPacket"); - S2C_PACKETS_R.put("PlayerActionResponseS2CPacket", net.minecraft.network.packet.s2c.play.PlayerActionResponseS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.UpdateTickRateS2CPacket.class, "UpdateTickRateS2CPacket"); + S2C_PACKETS_R.put("UpdateTickRateS2CPacket", net.minecraft.network.packet.s2c.play.UpdateTickRateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.InventoryS2CPacket.class, "InventoryS2CPacket"); S2C_PACKETS_R.put("InventoryS2CPacket", net.minecraft.network.packet.s2c.play.InventoryS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlayerActionResponseS2CPacket.class, "PlayerActionResponseS2CPacket"); + S2C_PACKETS_R.put("PlayerActionResponseS2CPacket", net.minecraft.network.packet.s2c.play.PlayerActionResponseS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ChunkBiomeDataS2CPacket.class, "ChunkBiomeDataS2CPacket"); S2C_PACKETS_R.put("ChunkBiomeDataS2CPacket", net.minecraft.network.packet.s2c.play.ChunkBiomeDataS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.WorldBorderWarningTimeChangedS2CPacket.class, "WorldBorderWarningTimeChangedS2CPacket"); S2C_PACKETS_R.put("WorldBorderWarningTimeChangedS2CPacket", net.minecraft.network.packet.s2c.play.WorldBorderWarningTimeChangedS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ScoreboardPlayerUpdateS2CPacket.class, "ScoreboardPlayerUpdateS2CPacket"); - S2C_PACKETS_R.put("ScoreboardPlayerUpdateS2CPacket", net.minecraft.network.packet.s2c.play.ScoreboardPlayerUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityDamageS2CPacket.class, "EntityDamageS2CPacket"); S2C_PACKETS_R.put("EntityDamageS2CPacket", net.minecraft.network.packet.s2c.play.EntityDamageS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ChatMessageS2CPacket.class, "ChatMessageS2CPacket"); @@ -315,20 +323,22 @@ public class PacketUtils { S2C_PACKETS_R.put("KeepAliveS2CPacket", net.minecraft.network.packet.s2c.common.KeepAliveS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.OpenWrittenBookS2CPacket.class, "OpenWrittenBookS2CPacket"); S2C_PACKETS_R.put("OpenWrittenBookS2CPacket", net.minecraft.network.packet.s2c.play.OpenWrittenBookS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.WorldTimeUpdateS2CPacket.class, "WorldTimeUpdateS2CPacket"); - S2C_PACKETS_R.put("WorldTimeUpdateS2CPacket", net.minecraft.network.packet.s2c.play.WorldTimeUpdateS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.common.ResourcePackRemoveS2CPacket.class, "ResourcePackRemoveS2CPacket"); + S2C_PACKETS_R.put("ResourcePackRemoveS2CPacket", net.minecraft.network.packet.s2c.common.ResourcePackRemoveS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlaySoundFromEntityS2CPacket.class, "PlaySoundFromEntityS2CPacket"); S2C_PACKETS_R.put("PlaySoundFromEntityS2CPacket", net.minecraft.network.packet.s2c.play.PlaySoundFromEntityS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.WorldTimeUpdateS2CPacket.class, "WorldTimeUpdateS2CPacket"); + S2C_PACKETS_R.put("WorldTimeUpdateS2CPacket", net.minecraft.network.packet.s2c.play.WorldTimeUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.config.FeaturesS2CPacket.class, "FeaturesS2CPacket"); S2C_PACKETS_R.put("FeaturesS2CPacket", net.minecraft.network.packet.s2c.config.FeaturesS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.SignEditorOpenS2CPacket.class, "SignEditorOpenS2CPacket"); S2C_PACKETS_R.put("SignEditorOpenS2CPacket", net.minecraft.network.packet.s2c.play.SignEditorOpenS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ExplosionS2CPacket.class, "ExplosionS2CPacket"); S2C_PACKETS_R.put("ExplosionS2CPacket", net.minecraft.network.packet.s2c.play.ExplosionS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.RemoveEntityStatusEffectS2CPacket.class, "RemoveEntityStatusEffectS2CPacket"); - S2C_PACKETS_R.put("RemoveEntityStatusEffectS2CPacket", net.minecraft.network.packet.s2c.play.RemoveEntityStatusEffectS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.login.LoginDisconnectS2CPacket.class, "LoginDisconnectS2CPacket"); S2C_PACKETS_R.put("LoginDisconnectS2CPacket", net.minecraft.network.packet.s2c.login.LoginDisconnectS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.RemoveEntityStatusEffectS2CPacket.class, "RemoveEntityStatusEffectS2CPacket"); + S2C_PACKETS_R.put("RemoveEntityStatusEffectS2CPacket", net.minecraft.network.packet.s2c.play.RemoveEntityStatusEffectS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EndCombatS2CPacket.class, "EndCombatS2CPacket"); S2C_PACKETS_R.put("EndCombatS2CPacket", net.minecraft.network.packet.s2c.play.EndCombatS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlayerListS2CPacket.class, "PlayerListS2CPacket"); @@ -365,10 +375,10 @@ public class PacketUtils { S2C_PACKETS_R.put("SynchronizeRecipesS2CPacket", net.minecraft.network.packet.s2c.play.SynchronizeRecipesS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityS2CPacket.class, "EntityS2CPacket"); S2C_PACKETS_R.put("EntityS2CPacket", net.minecraft.network.packet.s2c.play.EntityS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityStatusS2CPacket.class, "EntityStatusS2CPacket"); - S2C_PACKETS_R.put("EntityStatusS2CPacket", net.minecraft.network.packet.s2c.play.EntityStatusS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityTrackerUpdateS2CPacket.class, "EntityTrackerUpdateS2CPacket"); S2C_PACKETS_R.put("EntityTrackerUpdateS2CPacket", net.minecraft.network.packet.s2c.play.EntityTrackerUpdateS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityStatusS2CPacket.class, "EntityStatusS2CPacket"); + S2C_PACKETS_R.put("EntityStatusS2CPacket", net.minecraft.network.packet.s2c.play.EntityStatusS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.config.DynamicRegistriesS2CPacket.class, "DynamicRegistriesS2CPacket"); S2C_PACKETS_R.put("DynamicRegistriesS2CPacket", net.minecraft.network.packet.s2c.config.DynamicRegistriesS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.common.CustomPayloadS2CPacket.class, "CustomPayloadS2CPacket"); @@ -377,10 +387,10 @@ public class PacketUtils { S2C_PACKETS_R.put("SubtitleS2CPacket", net.minecraft.network.packet.s2c.play.SubtitleS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.NbtQueryResponseS2CPacket.class, "NbtQueryResponseS2CPacket"); S2C_PACKETS_R.put("NbtQueryResponseS2CPacket", net.minecraft.network.packet.s2c.play.NbtQueryResponseS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.UnloadChunkS2CPacket.class, "UnloadChunkS2CPacket"); - S2C_PACKETS_R.put("UnloadChunkS2CPacket", net.minecraft.network.packet.s2c.play.UnloadChunkS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityEquipmentUpdateS2CPacket.class, "EntityEquipmentUpdateS2CPacket"); S2C_PACKETS_R.put("EntityEquipmentUpdateS2CPacket", net.minecraft.network.packet.s2c.play.EntityEquipmentUpdateS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.UnloadChunkS2CPacket.class, "UnloadChunkS2CPacket"); + S2C_PACKETS_R.put("UnloadChunkS2CPacket", net.minecraft.network.packet.s2c.play.UnloadChunkS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.config.ReadyS2CPacket.class, "ReadyS2CPacket"); S2C_PACKETS_R.put("ReadyS2CPacket", net.minecraft.network.packet.s2c.config.ReadyS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EnterReconfigurationS2CPacket.class, "EnterReconfigurationS2CPacket"); @@ -488,7 +498,7 @@ public Class> get(int index) { @NotNull @Override public Iterator>> iterator() { - return Iterators.concat(S2C_PACKETS.keySet().iterator(), C2S_PACKETS.keySet().iterator()); + return Stream.concat(S2C_PACKETS.keySet().stream(), C2S_PACKETS.keySet().stream()).iterator(); } @Override @@ -498,7 +508,7 @@ public boolean contains(RegistryKey>> key) { @Override public Set>>, Class>>> getEntrySet() { - return null; + return Collections.emptySet(); } @Override @@ -559,7 +569,7 @@ public void populateTags(Map>>, List>>> getKeys() { - return null; + return Collections.emptySet(); } } } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtilsUtil.java b/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtilsUtil.java index c56cd6a02b..c296a947e4 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtilsUtil.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtilsUtil.java @@ -16,7 +16,7 @@ import java.io.IOException; import java.util.Set; -public class PacketUtilsUtil { +public abstract class PacketUtilsUtil { private static final String packetRegistryClass = """ private static class PacketRegistry extends SimpleRegistry>> { public PacketRegistry() { @@ -81,7 +81,7 @@ public Class> get(int index) { @NotNull @Override public Iterator>> iterator() { - return Iterators.concat(S2C_PACKETS.keySet().iterator(), C2S_PACKETS.keySet().iterator()); + return Stream.concat(S2C_PACKETS.keySet().stream(), C2S_PACKETS.keySet().stream()).iterator(); } @Override @@ -91,7 +91,7 @@ public boolean contains(RegistryKey>> key) { @Override public Set>>, Class>>> getEntrySet() { - return null; + return Collections.emptySet(); } @Override @@ -152,7 +152,7 @@ public void populateTags(Map>>, List>>> getKeys() { - return null; + return Collections.emptySet(); } } """; @@ -168,114 +168,111 @@ public static void main(String[] args) { public static void init() throws IOException { // Generate PacketUtils.java - File file = new File("src/main/java/" + PacketUtilsUtil.class.getPackageName().replace('.', '/') + "/PacketUtils.java"); + File file = new File("src/main/java/%s/PacketUtils.java".formatted(PacketUtilsUtil.class.getPackageName().replace('.', '/'))); if (!file.exists()) { file.getParentFile().mkdirs(); file.createNewFile(); } - BufferedWriter writer = new BufferedWriter(new FileWriter(file)); - - writer.write("/*\n"); - writer.write(" * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/).\n"); - writer.write(" * Copyright (c) Meteor Development.\n"); - writer.write(" */\n\n"); - - writer.write("package meteordevelopment.meteorclient.utils.network;\n\n"); - - // Write imports - writer.write("import com.google.common.collect.Iterators;\n"); - writer.write("import com.mojang.datafixers.util.Pair;\n"); - writer.write("import com.mojang.serialization.Lifecycle;\n"); - writer.write("import meteordevelopment.meteorclient.utils.misc.MeteorIdentifier;\n"); - writer.write("import net.minecraft.network.packet.Packet;\n"); - writer.write("import net.minecraft.registry.Registry;\n"); - writer.write("import net.minecraft.registry.RegistryKey;\n"); - writer.write("import net.minecraft.registry.SimpleRegistry;\n"); - writer.write("import net.minecraft.registry.entry.RegistryEntry;\n"); - writer.write("import net.minecraft.registry.entry.RegistryEntryList;\n"); - writer.write("import net.minecraft.registry.tag.TagKey;\n"); - writer.write("import net.minecraft.util.Identifier;\n"); - writer.write("import net.minecraft.util.math.random.Random;\n"); - writer.write("import org.jetbrains.annotations.NotNull;\n"); - - writer.write("import java.util.*;\n"); - writer.write("import java.util.stream.Stream;\n"); - - // Write class - writer.write("\npublic class PacketUtils {\n"); - - // Write fields - writer.write(" public static final Registry>> REGISTRY = new PacketRegistry();\n\n"); - writer.write(" private static final Map>, String> S2C_PACKETS = new HashMap<>();\n"); - writer.write(" private static final Map>, String> C2S_PACKETS = new HashMap<>();\n\n"); - writer.write(" private static final Map>> S2C_PACKETS_R = new HashMap<>();\n"); - writer.write(" private static final Map>> C2S_PACKETS_R = new HashMap<>();\n\n"); - - // Write static block - writer.write(" static {\n"); - - // Client -> Sever Packets - Reflections c2s = new Reflections("net.minecraft.network.packet.c2s", Scanners.SubTypes); - Set> c2sPackets = c2s.getSubTypesOf(Packet.class); - - for (Class c2sPacket : c2sPackets) { - String name = c2sPacket.getName(); - String className = name.substring(name.lastIndexOf('.') + 1).replace('$', '.'); - String fullName = name.replace('$', '.'); - - writer.write(String.format(" C2S_PACKETS.put(%s.class, \"%s\");\n", fullName, className)); - writer.write(String.format(" C2S_PACKETS_R.put(\"%s\", %s.class);\n", className, fullName)); - } - - writer.newLine(); - - // Server -> Client Packets - Reflections s2c = new Reflections("net.minecraft.network.packet.s2c", Scanners.SubTypes); - Set> s2cPackets = s2c.getSubTypesOf(Packet.class); - - for (Class s2cPacket : s2cPackets) { - if (s2cPacket == BundlePacket.class) continue; - String name = s2cPacket.getName(); - String className = name.substring(name.lastIndexOf('.') + 1).replace('$', '.'); - String fullName = name.replace('$', '.'); - - writer.write(String.format(" S2C_PACKETS.put(%s.class, \"%s\");\n", fullName, className)); - writer.write(String.format(" S2C_PACKETS_R.put(\"%s\", %s.class);\n", className, fullName)); + try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) { + writer.write("/*\n"); + writer.write(" * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/).\n"); + writer.write(" * Copyright (c) Meteor Development.\n"); + writer.write(" */\n\n"); + + writer.write("package meteordevelopment.meteorclient.utils.network;\n\n"); + + // Write imports + writer.write("import com.mojang.datafixers.util.Pair;\n"); + writer.write("import com.mojang.serialization.Lifecycle;\n"); + writer.write("import meteordevelopment.meteorclient.utils.misc.MeteorIdentifier;\n"); + writer.write("import net.minecraft.network.packet.Packet;\n"); + writer.write("import net.minecraft.registry.Registry;\n"); + writer.write("import net.minecraft.registry.RegistryKey;\n"); + writer.write("import net.minecraft.registry.SimpleRegistry;\n"); + writer.write("import net.minecraft.registry.entry.RegistryEntry;\n"); + writer.write("import net.minecraft.registry.entry.RegistryEntryList;\n"); + writer.write("import net.minecraft.registry.tag.TagKey;\n"); + writer.write("import net.minecraft.util.Identifier;\n"); + writer.write("import net.minecraft.util.math.random.Random;\n"); + writer.write("import org.jetbrains.annotations.NotNull;\n"); + + writer.write("import java.util.*;\n"); + writer.write("import java.util.stream.Stream;\n"); + + // Write class + writer.write("\npublic abstract class PacketUtils {\n"); + + // Write fields + writer.write(" public static final Registry>> REGISTRY = new PacketRegistry();\n\n"); + writer.write(" private static final Map>, String> S2C_PACKETS = new HashMap<>();\n"); + writer.write(" private static final Map>, String> C2S_PACKETS = new HashMap<>();\n\n"); + writer.write(" private static final Map>> S2C_PACKETS_R = new HashMap<>();\n"); + writer.write(" private static final Map>> C2S_PACKETS_R = new HashMap<>();\n\n"); + + // Write static block + writer.write(" static {\n"); + + // Client -> Sever Packets + Reflections c2s = new Reflections("net.minecraft.network.packet.c2s", Scanners.SubTypes); + Set> c2sPackets = c2s.getSubTypesOf(Packet.class); + + for (Class c2sPacket : c2sPackets) { + String name = c2sPacket.getName(); + String className = name.substring(name.lastIndexOf('.') + 1).replace('$', '.'); + String fullName = name.replace('$', '.'); + + writer.write(" C2S_PACKETS.put(%s.class, \"%s\");%n".formatted(fullName, className)); + writer.write(" C2S_PACKETS_R.put(\"%s\", %s.class);%n".formatted(className, fullName)); + } + + writer.newLine(); + + // Server -> Client Packets + Reflections s2c = new Reflections("net.minecraft.network.packet.s2c", Scanners.SubTypes); + Set> s2cPackets = s2c.getSubTypesOf(Packet.class); + + for (Class s2cPacket : s2cPackets) { + if (s2cPacket == BundlePacket.class) continue; + String name = s2cPacket.getName(); + String className = name.substring(name.lastIndexOf('.') + 1).replace('$', '.'); + String fullName = name.replace('$', '.'); + + writer.write(" S2C_PACKETS.put(%s.class, \"%s\");%n".formatted(fullName, className)); + writer.write(" S2C_PACKETS_R.put(\"%s\", %s.class);%n".formatted(className, fullName)); + } + + writer.write(" }\n\n"); + + // Write getName method + writer.write(" public static String getName(Class> packetClass) {\n"); + writer.write(" String name = S2C_PACKETS.get(packetClass);\n"); + writer.write(" if (name != null) return name;\n"); + writer.write(" return C2S_PACKETS.get(packetClass);\n"); + writer.write(" }\n\n"); + + // Write getPacket method + writer.write(" public static Class> getPacket(String name) {\n"); + writer.write(" Class> packet = S2C_PACKETS_R.get(name);\n"); + writer.write(" if (packet != null) return packet;\n"); + writer.write(" return C2S_PACKETS_R.get(name);\n"); + writer.write(" }\n\n"); + + // Write getS2CPackets method + writer.write(" public static Set>> getS2CPackets() {\n"); + writer.write(" return S2C_PACKETS.keySet();\n"); + writer.write(" }\n\n"); + + // Write getC2SPackets method + writer.write(" public static Set>> getC2SPackets() {\n"); + writer.write(" return C2S_PACKETS.keySet();\n"); + writer.write(" }\n\n"); + + // Write PacketRegistry class + writer.write(packetRegistryClass); + + // Write end class + writer.write("}\n"); } - - writer.write(" }\n\n"); - - // Write getName method - writer.write(" public static String getName(Class> packetClass) {\n"); - writer.write(" String name = S2C_PACKETS.get(packetClass);\n"); - writer.write(" if (name != null) return name;\n"); - writer.write(" return C2S_PACKETS.get(packetClass);\n"); - writer.write(" }\n\n"); - - // Write getPacket method - writer.write(" public static Class> getPacket(String name) {\n"); - writer.write(" Class> packet = S2C_PACKETS_R.get(name);\n"); - writer.write(" if (packet != null) return packet;\n"); - writer.write(" return C2S_PACKETS_R.get(name);\n"); - writer.write(" }\n\n"); - - // Write getS2CPackets method - writer.write(" public static Set>> getS2CPackets() {\n"); - writer.write(" return S2C_PACKETS.keySet();\n"); - writer.write(" }\n\n"); - - // Write getC2SPackets method - writer.write(" public static Set>> getC2SPackets() {\n"); - writer.write(" return C2S_PACKETS.keySet();\n"); - writer.write(" }\n\n"); - - // Write PacketRegistry class - writer.write(packetRegistryClass); - - // Write end class - writer.write("}\n"); - - writer.close(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/player/TitleScreenCredits.java b/src/main/java/meteordevelopment/meteorclient/utils/player/TitleScreenCredits.java index f0fc734375..e86b163bd0 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/player/TitleScreenCredits.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/player/TitleScreenCredits.java @@ -13,11 +13,10 @@ import meteordevelopment.meteorclient.gui.screens.CommitsScreen; import meteordevelopment.meteorclient.utils.network.Http; import meteordevelopment.meteorclient.utils.network.MeteorExecutor; -import meteordevelopment.meteorclient.utils.render.color.Color; -import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.render.BufferBuilder; -import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; import java.util.ArrayList; import java.util.Comparator; @@ -25,11 +24,7 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; -public class TitleScreenCredits { - private static final int WHITE = Color.fromRGBA(255, 255, 255, 255); - private static final int GRAY = Color.fromRGBA(175, 175, 175, 255); - private static final int RED = Color.fromRGBA(225, 25, 25, 255); - +public abstract class TitleScreenCredits { private static final List credits = new ArrayList<>(); private static void init() { @@ -38,7 +33,7 @@ private static void init() { for (MeteorAddon addon : AddonManager.ADDONS) add(addon); // Sort by width (Meteor always first) - credits.sort(Comparator.comparingInt(value -> value.sections.get(0).text.equals("Meteor Client ") ? Integer.MIN_VALUE : -value.width)); + credits.sort(Comparator.comparingInt(value -> value.addon == MeteorClient.ADDON ? Integer.MIN_VALUE : -mc.textRenderer.getWidth(value.text))); // Check for latest commits MeteorExecutor.execute(() -> { @@ -46,13 +41,10 @@ private static void init() { if (credit.addon.getRepo() == null || credit.addon.getCommit() == null) continue; GithubRepo repo = credit.addon.getRepo(); - Response res = Http.get(String.format("https://api.github.com/repos/%s/branches/%s", repo.getOwnerName(), repo.branch())).sendJson(Response.class); + Response res = Http.get("https://api.github.com/repos/%s/branches/%s".formatted(repo.getOwnerName(), repo.branch())).sendJson(Response.class); if (res != null && !credit.addon.getCommit().equals(res.commit.sha)) { - synchronized (credit.sections) { - credit.sections.add(1, new Section("*", RED)); - credit.calculateWidth(); - } + credit.text.append(Text.literal("*").formatted(Formatting.RED)); } } }); @@ -61,18 +53,17 @@ private static void init() { private static void add(MeteorAddon addon) { Credit credit = new Credit(addon); - credit.sections.add(new Section(addon.name, addon.color.getPacked())); - credit.sections.add(new Section(" by ", GRAY)); + credit.text.append(Text.literal(addon.name).styled(style -> style.withColor(addon.color.getPacked()))); + credit.text.append(Text.literal(" by ").formatted(Formatting.GRAY)); for (int i = 0; i < addon.authors.length; i++) { if (i > 0) { - credit.sections.add(new Section(i == addon.authors.length - 1 ? " & " : ", ", GRAY)); + credit.text.append(Text.literal(i == addon.authors.length - 1 ? " & " : ", ").formatted(Formatting.GRAY)); } - credit.sections.add(new Section(addon.authors[i], WHITE)); + credit.text.append(Text.literal(addon.authors[i]).formatted(Formatting.WHITE)); } - credit.calculateWidth(); credits.add(credit); } @@ -81,14 +72,9 @@ public static void render(DrawContext context) { int y = 3; for (Credit credit : credits) { - int x = mc.currentScreen.width - 3 - credit.width; + int x = mc.currentScreen.width - 3 - mc.textRenderer.getWidth(credit.text); - synchronized (credit.sections) { - for (Section section : credit.sections) { - context.drawTextWithShadow(mc.textRenderer, section.text, x, y, section.color); - x += section.width; - } - } + context.drawTextWithShadow(mc.textRenderer, credit.text, x, y, -1); y += mc.textRenderer.fontHeight + 2; } @@ -97,9 +83,9 @@ public static void render(DrawContext context) { public static boolean onClicked(double mouseX, double mouseY) { int y = 3; for (Credit credit : credits) { - int x = mc.currentScreen.width - 3 - credit.width; + int x = mc.currentScreen.width - 3 - mc.textRenderer.getWidth(credit.text); - if (mouseX >= x && mouseX <= x + credit.width && mouseY >= y && mouseY <= y + mc.textRenderer.fontHeight + 2) { + if (mouseX >= x && mouseX <= x + mc.textRenderer.getWidth(credit.text) && mouseY >= y && mouseY <= y + mc.textRenderer.fontHeight + 2) { if (credit.addon.getRepo() != null && credit.addon.getCommit() != null) { mc.setScreen(new CommitsScreen(GuiThemes.get(), credit.addon)); return true; @@ -114,28 +100,11 @@ public static boolean onClicked(double mouseX, double mouseY) { private static class Credit { public final MeteorAddon addon; - public final List
sections = new ArrayList<>(); - public int width; + public final MutableText text = Text.empty(); public Credit(MeteorAddon addon) { this.addon = addon; } - - public void calculateWidth() { - width = 0; - for (Section section : sections) width += section.width; - } - } - - private static class Section { - public final String text; - public final int color, width; - - public Section(String text, int color) { - this.text = text; - this.color = color; - this.width = mc.textRenderer.getWidth(text); - } } private static class Response { diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index a6cc83d676..78e9a2accf 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -19,9 +19,6 @@ "icon": "assets/meteor-client/icon.png", "environment": "client", "entrypoints": { - "preLaunch": [ - "com.llamalad7.mixinextras.MixinExtrasBootstrap::init" - ], "client": [ "meteordevelopment.meteorclient.MeteorClient" ] @@ -48,7 +45,7 @@ }, "depends": { "java": ">=17", - "minecraft": "${minecraft_version}", + "minecraft": ["1.20.3", "1.20.4"], "fabricloader": ">=${loader_version}" }, "breaks": { diff --git a/src/main/resources/meteor-client.mixins.json b/src/main/resources/meteor-client.mixins.json index f292be27f9..2e78a2126a 100644 --- a/src/main/resources/meteor-client.mixins.json +++ b/src/main/resources/meteor-client.mixins.json @@ -138,6 +138,7 @@ "ProjectileEntityAccessor", "ProjectileInGroundAccessor", "RaycastContextMixin", + "RegistriesMixin", "ReloadStateAccessor", "RenderLayersMixin", "RenderTickCounterMixin", @@ -149,7 +150,6 @@ "SignBlockEntityRendererMixin", "SimpleEntityLookupAccessor", "SimpleOptionMixin", - "SimpleRegistryMixin", "SlimeBlockMixin", "SlotMixin", "SoundSystemMixin", From 98fc2f191377350fa60cee82daadd9b1cfc9df91 Mon Sep 17 00:00:00 2001 From: maxsupermanhd Date: Sun, 10 Dec 2023 03:58:31 +0300 Subject: [PATCH 162/357] Make chest swap close inventory because anticheats --- .../systems/modules/player/ChestSwap.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/ChestSwap.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/ChestSwap.java index f9b123a40d..02baa93623 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/ChestSwap.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/ChestSwap.java @@ -17,6 +17,7 @@ import net.minecraft.item.ArmorItem; import net.minecraft.item.Item; import net.minecraft.item.Items; +import net.minecraft.network.packet.c2s.play.CloseHandledScreenC2SPacket; public class ChestSwap extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); @@ -35,6 +36,13 @@ public class ChestSwap extends Module { .build() ); + private final Setting closeInventory = sgGeneral.add(new BoolSetting.Builder() + .name("close-inventory") + .description("Sends inventory close after swap.") + .defaultValue(false) + .build() + ); + public ChestSwap() { super(Categories.Player, "chest-swap", "Automatically swaps between a chestplate and an elytra."); } @@ -120,6 +128,10 @@ private void equipElytra() { private void equip(int slot) { InvUtils.move().from(slot).toArmor(2); + if (closeInventory.get()) { + // Notchian clients send a Close Window packet with Window ID 0 to close their inventory even though there is never an Open Screen packet for the inventory. + mc.getNetworkHandler().sendPacket(new CloseHandledScreenC2SPacket(0)); + } } @Override From 6093eaf88630aef8ede51dd31bf3176910a1ff52 Mon Sep 17 00:00:00 2001 From: Maxim Zhuchkov Date: Wed, 13 Dec 2023 01:02:57 +0300 Subject: [PATCH 163/357] Sort the favorites category (#4265) --- .../meteorclient/gui/screens/ModulesScreen.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/ModulesScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/ModulesScreen.java index c9c82710cd..908e9f34b5 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/ModulesScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/ModulesScreen.java @@ -164,16 +164,21 @@ protected Cell createFavorites(WContainer c) { } protected boolean createFavoritesW(WWindow w) { - boolean hasFavorites = false; + List modules = new ArrayList<>(); for (Module module : Modules.get().getAll()) { if (module.favorite) { - w.add(theme.module(module)).expandX(); - hasFavorites = true; + modules.add(module); } } - return hasFavorites; + modules.sort((o1, o2) -> String.CASE_INSENSITIVE_ORDER.compare(o1.name, o2.name)); + + for (Module module : modules) { + w.add(theme.module(module)).expandX(); + } + + return !modules.isEmpty(); } @Override From ac21ddf46d7396578038836560645b209270be86 Mon Sep 17 00:00:00 2001 From: Big Iron <52252627+Big-Iron-Cheems@users.noreply.github.com> Date: Sat, 16 Dec 2023 21:37:22 +0100 Subject: [PATCH 164/357] Autonametag patch. (#4278) --- .../meteorclient/systems/modules/world/AutoNametag.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoNametag.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoNametag.java index d9e92c68ef..3e1ea5576a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoNametag.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoNametag.java @@ -86,9 +86,9 @@ private void onTick(TickEvent.Pre event) { if (!PlayerUtils.isWithin(entity, range.get())) return false; if (!entities.get().contains(entity.getType())) return false; if (entity.hasCustomName()) { - return renametag.get() && entity.getCustomName() != mc.player.getInventory().getStack(findNametag.slot()).getName(); + return renametag.get() && !entity.getCustomName().equals(mc.player.getInventory().getStack(findNametag.slot()).getName()); } - return false; + return true; }, priority.get()); if (target == null) return; From 8754f389820311ec64466cbcf37c1ac2b02afc50 Mon Sep 17 00:00:00 2001 From: Big-Iron-Cheems <52252627+Big-Iron-Cheems@users.noreply.github.com> Date: Mon, 18 Dec 2023 11:33:29 +0100 Subject: [PATCH 165/357] Dropping 1.20.3 support Addons are already developing for 1.20.4 since our template targets that version. Also, the critical decorated pots bug makes 1.20.3 unappealing to use overall. --- gradle.properties | 11 +++++------ .../meteorclient/mixin/BookEditScreenMixin.java | 2 +- .../meteorclient/mixin/PacketByteBufMixin.java | 11 +++++------ .../meteorclient/utils/misc/NbtUtils.java | 2 +- src/main/resources/fabric.mod.json | 2 +- 5 files changed, 13 insertions(+), 15 deletions(-) diff --git a/gradle.properties b/gradle.properties index a7f2c079fa..a6c1dbd281 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,11 +1,10 @@ org.gradle.jvmargs=-Xmx2G # Fabric (https://fabricmc.net/develop) -# TODO: when updating to 1.21, revert "minecraft": ["1.20.3", "1.20.4"] to "minecraft": "${minecraft_version}" minecraft_version=1.20.4 -yarn_mappings=1.20.4+build.1 -loader_version=0.15.0 -fapi_version=0.91.1+1.20.4 +yarn_mappings=1.20.4+build.3 +loader_version=0.15.2 +fapi_version=0.91.3+1.20.4 # Mod Properties mod_version=0.5.6 @@ -18,13 +17,13 @@ archives_base_name=meteor-client baritone_version=1.20.2 # Sodium (https://github.com/CaffeineMC/sodium-fabric) -sodium_version=mc1.20.3-0.5.4 +sodium_version=mc1.20.3-0.5.5 # Lithium (https://github.com/CaffeineMC/lithium-fabric) lithium_version=mc1.20.2-0.12.0 # Iris (https://github.com/IrisShaders/Iris) -iris_version=1.6.12+1.20.3 +iris_version=1.6.13+1.20.4 # Orbit (https://github.com/MeteorDevelopment/orbit) orbit_version=0.2.4 diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BookEditScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BookEditScreenMixin.java index 7468bd62b5..5a2491bed4 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BookEditScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BookEditScreenMixin.java @@ -84,7 +84,7 @@ private void onInit(CallbackInfo info) { DataInputStream in = new DataInputStream(new ByteArrayInputStream(bytes)); try { - NbtCompound tag = NbtIo.readCompressed(in, NbtTagSizeTracker.ofUnlimitedBytes()); + NbtCompound tag = NbtIo.readCompressed(in, NbtSizeTracker.ofUnlimitedBytes()); NbtList listTag = tag.getList("pages", 8).copy(); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PacketByteBufMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/PacketByteBufMixin.java index 1dd8a1fdf2..2a6083c6bf 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PacketByteBufMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/PacketByteBufMixin.java @@ -7,17 +7,16 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.misc.AntiPacketKick; -import net.minecraft.nbt.NbtTagSizeTracker; +import net.minecraft.nbt.NbtSizeTracker; import net.minecraft.network.PacketByteBuf; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyArg; @Mixin(PacketByteBuf.class) -public class PacketByteBufMixin { - - @ModifyArg(method = "readNbt()Lnet/minecraft/nbt/NbtCompound;", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/PacketByteBuf;readNbt(Lnet/minecraft/nbt/NbtTagSizeTracker;)Lnet/minecraft/nbt/NbtElement;")) - private NbtTagSizeTracker xlPackets(NbtTagSizeTracker sizeTracker) { - return Modules.get().isActive(AntiPacketKick.class) ? NbtTagSizeTracker.ofUnlimitedBytes() : sizeTracker; +public abstract class PacketByteBufMixin { + @ModifyArg(method = "readNbt()Lnet/minecraft/nbt/NbtCompound;", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/PacketByteBuf;readNbt(Lnet/minecraft/nbt/NbtSizeTracker;)Lnet/minecraft/nbt/NbtElement;")) + private NbtSizeTracker xlPackets(NbtSizeTracker sizeTracker) { + return Modules.get().isActive(AntiPacketKick.class) ? NbtSizeTracker.ofUnlimitedBytes() : sizeTracker; } } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/NbtUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/NbtUtils.java index 9ccca937a3..1b266d7fee 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/NbtUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/NbtUtils.java @@ -86,7 +86,7 @@ public static NbtCompound fromClipboard(NbtCompound schema) { byte[] data = Base64.getDecoder().decode(mc.keyboard.getClipboard().trim()); ByteArrayInputStream bis = new ByteArrayInputStream(data); - NbtCompound pasted = NbtIo.readCompressed(new DataInputStream(bis), NbtTagSizeTracker.ofUnlimitedBytes()); + NbtCompound pasted = NbtIo.readCompressed(new DataInputStream(bis), NbtSizeTracker.ofUnlimitedBytes()); for (String key : schema.getKeys()) if (!pasted.getKeys().contains(key)) return null; if (!pasted.getString("name").equals(schema.getString("name"))) return null; diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 78e9a2accf..e050d2408d 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -45,7 +45,7 @@ }, "depends": { "java": ">=17", - "minecraft": ["1.20.3", "1.20.4"], + "minecraft": "${minecraft_version}", "fabricloader": ">=${loader_version}" }, "breaks": { From 8e0c06ad5b4f59856668995a2446144e130d9cd4 Mon Sep 17 00:00:00 2001 From: Big-Iron-Cheems <52252627+Big-Iron-Cheems@users.noreply.github.com> Date: Sun, 17 Dec 2023 23:20:19 +0100 Subject: [PATCH 166/357] KillAura mob age filter Add the option to target only babies, adults, or both. Also, retrieve `CrystalAura`'s status via the `Modules` getter. --- .../systems/modules/combat/KillAura.java | 28 +++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java index 3ec357a68f..ba3a57e159 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java @@ -149,10 +149,10 @@ public class KillAura extends Module { .build() ); - private final Setting ignoreBabies = sgTargeting.add(new BoolSetting.Builder() - .name("ignore-babies") - .description("Whether or not to attack baby variants of the entity.") - .defaultValue(true) + private final Setting mobAgeFilter = sgTargeting.add(new EnumSetting.Builder() + .name("mob-age-filter") + .description("Determines the age of the mobs to target (baby, adult, or both).") + .defaultValue(EntityAge.Adult) .build() ); @@ -233,7 +233,6 @@ public class KillAura extends Module { .build() ); - CrystalAura ca = Modules.get().get(CrystalAura.class); private final List targets = new ArrayList<>(); private int switchTimer, hitTimer; private boolean wasPathing = false; @@ -253,7 +252,7 @@ private void onTick(TickEvent.Pre event) { if (pauseOnUse.get() && (mc.interactionManager.isBreakingBlock() || mc.player.isUsingItem())) return; if (onlyOnClick.get() && !mc.options.attackKey.isPressed()) return; if (TickRate.INSTANCE.getTimeSinceLastTick() >= 1f && pauseOnLag.get()) return; - if (pauseOnCA.get() && ca.isActive() && ca.kaTimer > 0) return; + if (pauseOnCA.get() && Modules.get().get(CrystalAura.class).isActive() && Modules.get().get(CrystalAura.class).kaTimer > 0) return; if (onlyOnLook.get()) { Entity targeted = mc.targetedEntity; @@ -327,7 +326,7 @@ private boolean shouldShieldBreak() { private boolean entityCheck(Entity entity) { if (entity.equals(mc.player) || entity.equals(mc.cameraEntity)) return false; - if ((entity instanceof LivingEntity && ((LivingEntity) entity).isDead()) || !entity.isAlive()) return false; + if ((entity instanceof LivingEntity livingEntity && livingEntity.isDead()) || !entity.isAlive()) return false; Box hitbox = entity.getBoundingBox(); if (!PlayerUtils.isWithin( @@ -357,7 +356,14 @@ private boolean entityCheck(Entity entity) { if (!Friends.get().shouldAttack(player)) return false; if (shieldMode.get() == ShieldMode.Ignore && player.blockedByShield(mc.world.getDamageSources().playerAttack(mc.player))) return false; } - return !(entity instanceof AnimalEntity animal) || !ignoreBabies.get() || !animal.isBaby(); + if (entity instanceof AnimalEntity animal) { + return switch (mobAgeFilter.get()) { + case Baby -> animal.isBaby(); + case Adult -> !animal.isBaby(); + case Both -> true; + }; + } + return true; } private boolean delayCheck() { @@ -426,4 +432,10 @@ public enum ShieldMode { Break, None } + + public enum EntityAge { + Baby, + Adult, + Both + } } From bd48b54d1814d904fb07b4e57cf1714752dd9208 Mon Sep 17 00:00:00 2001 From: Big-Iron-Cheems <52252627+Big-Iron-Cheems@users.noreply.github.com> Date: Mon, 18 Dec 2023 18:59:29 +0100 Subject: [PATCH 167/357] AutoBreed mob age filter Add the option to target only babies, adults, or both. --- .../systems/modules/world/AutoBreed.java | 32 ++++++++++++------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoBreed.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoBreed.java index 224a96eaf2..1aab0f9a7c 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoBreed.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoBreed.java @@ -50,10 +50,10 @@ public class AutoBreed extends Module { .build() ); - private final Setting ignoreBabies = sgGeneral.add(new BoolSetting.Builder() - .name("ignore-babies") - .description("Whether or not to ignore the baby variants of the specified entity.") - .defaultValue(true) + private final Setting mobAgeFilter = sgGeneral.add(new EnumSetting.Builder() + .name("mob-age-filter") + .description("Determines the age of the mobs to target (baby, adult, or both).") + .defaultValue(EntityAge.Adult) .build() ); @@ -71,16 +71,18 @@ public void onActivate() { @EventHandler private void onTick(TickEvent.Pre event) { for (Entity entity : mc.world.getEntities()) { - AnimalEntity animal; - - if (!(entity instanceof AnimalEntity)) continue; - else animal = (AnimalEntity) entity; + if (!(entity instanceof AnimalEntity animal)) continue; if (!entities.get().contains(animal.getType()) - || (animal.isBaby() && !ignoreBabies.get()) - || animalsFed.contains(animal) - || !PlayerUtils.isWithin(animal, range.get()) - || !animal.isBreedingItem(hand.get() == Hand.MAIN_HAND ? mc.player.getMainHandStack() : mc.player.getOffHandStack())) continue; + || !switch (mobAgeFilter.get()) { + case Baby -> animal.isBaby(); + case Adult -> !animal.isBaby(); + case Both -> true; + } + || animalsFed.contains(animal) + || !PlayerUtils.isWithin(animal, range.get()) + || !animal.isBreedingItem(hand.get() == Hand.MAIN_HAND ? mc.player.getMainHandStack() : mc.player.getOffHandStack())) + continue; Rotations.rotate(Rotations.getYaw(entity), Rotations.getPitch(entity), -100, () -> { mc.interactionManager.interactEntity(mc.player, animal, hand.get()); @@ -91,4 +93,10 @@ private void onTick(TickEvent.Pre event) { return; } } + + public enum EntityAge { + Baby, + Adult, + Both + } } From c4e28fbce02bff7c99a082458f81c8054884070c Mon Sep 17 00:00:00 2001 From: Damian <43420467+DAMcraft@users.noreply.github.com> Date: Thu, 21 Dec 2023 19:31:04 +0100 Subject: [PATCH 168/357] Fix Better Tooltips with suspicious stew (#4291) --- .../meteorclient/systems/modules/render/BetterTooltips.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java index 357dc14986..dd22f2b97f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java @@ -229,7 +229,7 @@ private void appendTooltip(ItemStackTooltipEvent event) { NbtCompound tag = event.itemStack.getNbt(); if (tag != null) { - NbtList effects = tag.getList("Effects", 10); + NbtList effects = tag.getList("effects", 10); if (effects != null) { for (int i = 0; i < effects.size(); i++) { From 133283f5d3dc932208fedc0809c3f41c315e17fc Mon Sep 17 00:00:00 2001 From: crazycat256 <63475640+crazycat256@users.noreply.github.com> Date: Fri, 22 Dec 2023 14:36:12 +0100 Subject: [PATCH 169/357] Fix Flight underwater movement (#4288) --- .../meteordevelopment/meteorclient/mixin/EntityMixin.java | 4 ++++ .../meteorclient/systems/modules/movement/Flight.java | 2 -- .../meteorclient/systems/modules/movement/Jesus.java | 3 +++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/EntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/EntityMixin.java index 13991eab93..74e4af8f4f 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/EntityMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/EntityMixin.java @@ -13,6 +13,7 @@ import meteordevelopment.meteorclient.events.entity.player.PlayerMoveEvent; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.combat.Hitboxes; +import meteordevelopment.meteorclient.systems.modules.movement.Flight; import meteordevelopment.meteorclient.systems.modules.movement.NoFall; import meteordevelopment.meteorclient.systems.modules.movement.NoSlow; import meteordevelopment.meteorclient.systems.modules.movement.Velocity; @@ -58,17 +59,20 @@ private Vec3d updateMovementInFluidFluidStateGetVelocity(Vec3d vec) { @Inject(method = "isTouchingWater", at = @At(value = "HEAD"), cancellable = true) private void isTouchingWater(CallbackInfoReturnable info) { + if ((Object) this == mc.player && Modules.get().get(Flight.class).isActive()) info.setReturnValue(false); if ((Object) this == mc.player && Modules.get().get(NoSlow.class).fluidDrag()) info.setReturnValue(false); } @Inject(method = "isInLava", at = @At(value = "HEAD"), cancellable = true) private void isInLava(CallbackInfoReturnable info) { + if ((Object) this == mc.player && Modules.get().get(Flight.class).isActive()) info.setReturnValue(false); if ((Object) this == mc.player && Modules.get().get(NoSlow.class).fluidDrag()) info.setReturnValue(false); } @ModifyExpressionValue(method = "updateSwimming", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;isSubmergedInWater()Z")) private boolean isSubmergedInWater(boolean submerged) { if ((Object) this == mc.player && Modules.get().get(NoSlow.class).fluidDrag()) return false; + if ((Object) this == mc.player && Modules.get().get(Flight.class).isActive()) return false; return submerged; } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Flight.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Flight.java index 33a74f2eb2..bd0d1b6599 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Flight.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Flight.java @@ -146,8 +146,6 @@ private void onPostTick(TickEvent.Post event) { switch (mode.get()) { case Velocity -> { - // TODO: deal with underwater movement, find a way to "spoof" not being in water - mc.player.getAbilities().flying = false; mc.player.setVelocity(0, 0, 0); Vec3d initialVelocity = mc.player.getVelocity(); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Jesus.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Jesus.java index b4cb52f0e6..659be9d8cd 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Jesus.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Jesus.java @@ -16,6 +16,7 @@ import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; +import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.utils.entity.EntityUtils; import meteordevelopment.orbit.EventHandler; import net.minecraft.block.BlockState; @@ -269,6 +270,8 @@ private void onSendPacket(PacketEvent.Send event) { private boolean waterShouldBeSolid() { if (EntityUtils.getGameMode(mc.player) == GameMode.SPECTATOR || mc.player.getAbilities().flying) return false; + if (Modules.get().get(Flight.class).isActive()) return false; + if (dipIfBurning.get() && mc.player.isOnFire()) return false; if (dipOnSneakWater.get() && mc.options.sneakKey.isPressed()) return false; From e0f42e10ae7f7e9b9741b02fad0b8332738644a2 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Fri, 22 Dec 2023 14:19:49 +0000 Subject: [PATCH 170/357] update incompatibilities --- src/main/resources/fabric.mod.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index e050d2408d..172ab48957 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -53,6 +53,7 @@ "feather": "*", "origins": "*", "wurst": "*", - "sodium": "<0.5.0" + "sodium": "<0.5.4", + "morechathistory": "*" } } From d22bc730863aea43fd93c2bed67f453811632e8e Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Thu, 28 Dec 2023 16:16:28 -0500 Subject: [PATCH 171/357] Stuff (#4301) - destroy mesh buffers when switching fonts - only flip font buffer once - turn CharData into a record - fail-fast when game would crash due to side effects - use getEnumConstants() instead of reflection - fix typos --- .../meteorclient/gui/GuiTheme.java | 8 +------ .../meteorclient/renderer/Fonts.java | 5 +++- .../meteorclient/renderer/GL.java | 3 +-- .../meteorclient/renderer/Mesh.java | 2 +- .../meteorclient/renderer/Shader.java | 3 +-- .../meteorclient/renderer/text/CharData.java | 24 ------------------- .../renderer/text/CustomTextRenderer.java | 8 ++++--- .../meteorclient/renderer/text/Font.java | 2 ++ .../meteorclient/settings/EnumSetting.java | 10 ++------ .../meteorclient/utils/ReflectInit.java | 2 +- .../meteorclient/utils/network/Capes.java | 2 +- 11 files changed, 19 insertions(+), 50 deletions(-) delete mode 100644 src/main/java/meteordevelopment/meteorclient/renderer/text/CharData.java diff --git a/src/main/java/meteordevelopment/meteorclient/gui/GuiTheme.java b/src/main/java/meteordevelopment/meteorclient/gui/GuiTheme.java index 0168bbdd85..90b7958459 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/GuiTheme.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/GuiTheme.java @@ -116,13 +116,7 @@ public WTextBox textBox(String text) { public abstract WDropdown dropdown(T[] values, T value); public > WDropdown dropdown(T value) { Class klass = value.getClass(); - T[] values = null; - try { - values = (T[]) klass.getDeclaredMethod("values").invoke(null); - } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { - e.printStackTrace(); - } - + T[] values = (T[]) klass.getEnumConstants(); return dropdown(values, value); } diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/Fonts.java b/src/main/java/meteordevelopment/meteorclient/renderer/Fonts.java index d59b1677b3..d14498f0cc 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/Fonts.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/Fonts.java @@ -56,7 +56,10 @@ public static void refresh() { } public static void load(FontFace fontFace) { - if (RENDERER != null && RENDERER.fontFace.equals(fontFace)) return; + if (RENDERER != null) { + if (RENDERER.fontFace.equals(fontFace)) return; + else RENDERER.destroy(); + } try { RENDERER = new CustomTextRenderer(fontFace); diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/GL.java b/src/main/java/meteordevelopment/meteorclient/renderer/GL.java index 511c1b783c..6047ac64c9 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/GL.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/GL.java @@ -338,8 +338,7 @@ private static ICapabilityTracker getTracker(String fieldName) { capStateField.setAccessible(true); return (ICapabilityTracker) capStateField.get(state); } catch (NoSuchFieldException | IllegalAccessException e) { - e.printStackTrace(); - return null; + throw new IllegalStateException("Could not find GL state tracker '" + fieldName + "'", e); } } } diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/Mesh.java b/src/main/java/meteordevelopment/meteorclient/renderer/Mesh.java index 930ea6044e..4ac1b2a396 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/Mesh.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/Mesh.java @@ -103,7 +103,7 @@ public void destroy() { } public void begin() { - if (building) throw new IllegalStateException("Mesh.end() called while already building."); + if (building) throw new IllegalStateException("Mesh.begin() called while already building."); verticesPointer = verticesPointerStart; vertexI = 0; diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/Shader.java b/src/main/java/meteordevelopment/meteorclient/renderer/Shader.java index 46d308cde9..dd3cf4aecc 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/Shader.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/Shader.java @@ -61,8 +61,7 @@ private String read(String path) { try { return IOUtils.toString(mc.getResourceManager().getResource(new MeteorIdentifier("shaders/" + path)).get().getInputStream(), StandardCharsets.UTF_8); } catch (IOException e) { - e.printStackTrace(); - return ""; + throw new IllegalStateException("Could not read shader '" + path + "'", e); } } diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/text/CharData.java b/src/main/java/meteordevelopment/meteorclient/renderer/text/CharData.java deleted file mode 100644 index b2ea63aed9..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/renderer/text/CharData.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.renderer.text; - -public class CharData { - public final float x0, y0, x1, y1; - public final float u0, v0, u1, v1; - public final float xAdvance; - - public CharData(float x0, float y0, float x1, float y1, float u0, float v0, float u1, float v1, float xAdvance) { - this.x0 = x0; - this.y0 = y0; - this.x1 = x1; - this.y1 = y1; - this.u0 = u0; - this.v0 = v0; - this.u1 = u1; - this.v1 = v1; - this.xAdvance = xAdvance; - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/text/CustomTextRenderer.java b/src/main/java/meteordevelopment/meteorclient/renderer/text/CustomTextRenderer.java index a7c52dac92..447b17753d 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/text/CustomTextRenderer.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/text/CustomTextRenderer.java @@ -11,7 +11,6 @@ import net.minecraft.client.util.math.MatrixStack; import org.lwjgl.BufferUtils; -import java.nio.Buffer; import java.nio.ByteBuffer; public class CustomTextRenderer implements TextRenderer { @@ -33,11 +32,10 @@ public CustomTextRenderer(FontFace fontFace) { this.fontFace = fontFace; byte[] bytes = Utils.readBytes(fontFace.toStream()); - ByteBuffer buffer = BufferUtils.createByteBuffer(bytes.length).put(bytes); + ByteBuffer buffer = BufferUtils.createByteBuffer(bytes.length).put(bytes).flip(); fonts = new Font[5]; for (int i = 0; i < fonts.length; i++) { - ((Buffer) buffer).flip(); fonts[i] = new Font(buffer, (int) Math.round(18 * ((i * 0.5) + 1))); } } @@ -132,4 +130,8 @@ public void end(MatrixStack matrices) { building = false; scale = 1; } + + public void destroy() { + mesh.destroy(); + } } diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/text/Font.java b/src/main/java/meteordevelopment/meteorclient/renderer/text/Font.java index 4489824c15..dfa0654dd8 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/text/Font.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/text/Font.java @@ -116,4 +116,6 @@ public double render(Mesh mesh, String string, double x, double y, Color color, return x; } + + private record CharData(float x0, float y0, float x1, float y1, float u0, float v0, float u1, float v1, float xAdvance) {} } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/EnumSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/EnumSetting.java index 4838f77c8c..9813d056ef 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/EnumSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/EnumSetting.java @@ -7,25 +7,19 @@ import net.minecraft.nbt.NbtCompound; -import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; public class EnumSetting> extends Setting { - private T[] values; + private final T[] values; private final List suggestions; public EnumSetting(String name, String description, T defaultValue, Consumer onChanged, Consumer> onModuleActivated, IVisible visible) { super(name, description, defaultValue, onChanged, onModuleActivated, visible); - try { - values = (T[]) defaultValue.getClass().getMethod("values").invoke(null); - } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { - e.printStackTrace(); - } - + values = (T[]) defaultValue.getClass().getEnumConstants(); suggestions = new ArrayList<>(values.length); for (T value : values) suggestions.add(value.toString()); } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/ReflectInit.java b/src/main/java/meteordevelopment/meteorclient/utils/ReflectInit.java index 1baf3b15ad..ae88b3f8bc 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/ReflectInit.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/ReflectInit.java @@ -66,7 +66,7 @@ private static void reflectInit(Method task, Class ann try { task.invoke(null); } catch (IllegalAccessException | InvocationTargetException e) { - e.printStackTrace(); + throw new IllegalStateException("Error running @%s task '%s.%s'".formatted(annotation.getSimpleName(), task.getClass().getSimpleName(), task.getName()), e); } catch (NullPointerException e) { throw new RuntimeException("Method \"%s\" using Init annotations from non-static context".formatted(task.getName()), e); } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/network/Capes.java b/src/main/java/meteordevelopment/meteorclient/utils/network/Capes.java index 81f44a413f..40dfccaa19 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/network/Capes.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/network/Capes.java @@ -133,7 +133,7 @@ public void download() { try { String url = URLS.get(name); if (url == null) { - synchronized (TO_RETRY) { + synchronized (TO_REMOVE) { TO_REMOVE.add(this); downloading = false; return; From 1d56555094739aa06b72516a84b2fdeae43c01e6 Mon Sep 17 00:00:00 2001 From: crazycat256 <63475640+crazycat256@users.noreply.github.com> Date: Sun, 31 Dec 2023 17:39:30 -0500 Subject: [PATCH 172/357] Fix Jesus preventing players from using a boat (#4277) --- .../meteorclient/systems/modules/movement/Jesus.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Jesus.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Jesus.java index 659be9d8cd..ff0ab134df 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Jesus.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Jesus.java @@ -22,6 +22,7 @@ import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.enchantment.ProtectionEnchantment; +import net.minecraft.entity.EntityType; import net.minecraft.entity.effect.StatusEffects; import net.minecraft.fluid.Fluids; import net.minecraft.network.packet.Packet; @@ -270,8 +271,15 @@ private void onSendPacket(PacketEvent.Send event) { private boolean waterShouldBeSolid() { if (EntityUtils.getGameMode(mc.player) == GameMode.SPECTATOR || mc.player.getAbilities().flying) return false; + + if (mc.player.getVehicle() != null) { + EntityType vehicle = mc.player.getVehicle().getType(); + if (vehicle == EntityType.BOAT || vehicle == EntityType.CHEST_BOAT) return false; + } + if (Modules.get().get(Flight.class).isActive()) return false; + if (dipIfBurning.get() && mc.player.isOnFire()) return false; if (dipOnSneakWater.get() && mc.options.sneakKey.isPressed()) return false; From 2c5e8edc29e84d4f07e5534c8b0c967bb6696379 Mon Sep 17 00:00:00 2001 From: bruh1273 <93637182+bruh1273@users.noreply.github.com> Date: Sat, 6 Jan 2024 11:41:34 -0700 Subject: [PATCH 173/357] Fix scrolling with freecam (#4312) --- .../meteorclient/systems/modules/render/Freecam.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Freecam.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Freecam.java index 9bb2e9ad20..e43d8d6fd5 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Freecam.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Freecam.java @@ -335,7 +335,7 @@ else if (mc.options.sneakKey.matchesMouse(event.button)) { @EventHandler(priority = EventPriority.LOW) private void onMouseScroll(MouseScrollEvent event) { - if (speedScrollSensitivity.get() > 0) { + if (speedScrollSensitivity.get() > 0 && mc.currentScreen == null) { speedValue += event.value * 0.25 * (speedScrollSensitivity.get() * speedValue); if (speedValue < 0.1) speedValue = 0.1; From 94882979e42c7a5788e3b7d25cb36909a35b829a Mon Sep 17 00:00:00 2001 From: Big-Iron-Cheems <52252627+Big-Iron-Cheems@users.noreply.github.com> Date: Mon, 18 Dec 2023 17:19:08 +0100 Subject: [PATCH 174/357] Add Disconnect command Allows users to disconnect from a server, and specify a `reason` message too. --- .../meteorclient/commands/Commands.java | 1 + .../commands/commands/DisconnectCommand.java | 39 +++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 src/main/java/meteordevelopment/meteorclient/commands/commands/DisconnectCommand.java diff --git a/src/main/java/meteordevelopment/meteorclient/commands/Commands.java b/src/main/java/meteordevelopment/meteorclient/commands/Commands.java index 6550ce95d9..c01a2cfe43 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/Commands.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/Commands.java @@ -29,6 +29,7 @@ public static void init() { add(new VClipCommand()); add(new HClipCommand()); add(new DismountCommand()); + add(new DisconnectCommand()); add(new DamageCommand()); add(new DropCommand()); add(new EnchantCommand()); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/DisconnectCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/DisconnectCommand.java new file mode 100644 index 0000000000..227ac3ae77 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/DisconnectCommand.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.commands.commands; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.brigadier.arguments.ArgumentType; +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import meteordevelopment.meteorclient.commands.Command; +import net.minecraft.client.gui.screen.DisconnectedScreen; +import net.minecraft.command.CommandSource; +import net.minecraft.network.packet.s2c.common.DisconnectS2CPacket; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +import static com.mojang.brigadier.Command.SINGLE_SUCCESS; +import static meteordevelopment.meteorclient.MeteorClient.mc; + +public class DisconnectCommand extends Command { + public DisconnectCommand() { + super("disconnect", "Disconnect from the server", "dc"); + } + + @Override + 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)))); + return SINGLE_SUCCESS; + }); + + builder.then(argument("reason", StringArgumentType.greedyString()).executes(context -> { + mc.player.networkHandler.onDisconnect(new DisconnectS2CPacket(Text.literal(StringArgumentType.getString(context, "reason")))); + return SINGLE_SUCCESS; + })); + } +} From ea418641b25d5d7ddec15e0a3ec659e5c8cc3862 Mon Sep 17 00:00:00 2001 From: crazycat256 <63475640+crazycat256@users.noreply.github.com> Date: Sun, 7 Jan 2024 19:23:07 +0100 Subject: [PATCH 175/357] Freecam improvements --- .../systems/modules/render/Freecam.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Freecam.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Freecam.java index e43d8d6fd5..3d85e15f92 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Freecam.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Freecam.java @@ -144,15 +144,20 @@ public void onActivate() { Utils.set(pos, mc.gameRenderer.getCamera().getPos()); Utils.set(prevPos, mc.gameRenderer.getCamera().getPos()); + if (mc.options.getPerspective() == Perspective.THIRD_PERSON_FRONT) { + yaw += 180; + pitch *= -1; + } + prevYaw = yaw; prevPitch = pitch; - forward = false; - backward = false; - right = false; - left = false; - up = false; - down = false; + forward = mc.options.forwardKey.isPressed(); + backward = mc.options.backKey.isPressed(); + right = mc.options.rightKey.isPressed(); + left = mc.options.leftKey.isPressed(); + up = mc.options.jumpKey.isPressed(); + down = mc.options.sneakKey.isPressed(); unpress(); if (reloadChunks.get()) mc.worldRenderer.reload(); From 64bc865f78996659358be794276b9f1ac30b607f Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Tue, 9 Jan 2024 19:24:32 -0500 Subject: [PATCH 176/357] Fix ReflectInit exception message (#4317) --- .../java/meteordevelopment/meteorclient/utils/ReflectInit.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/utils/ReflectInit.java b/src/main/java/meteordevelopment/meteorclient/utils/ReflectInit.java index ae88b3f8bc..1a2564fefa 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/ReflectInit.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/ReflectInit.java @@ -66,7 +66,7 @@ private static void reflectInit(Method task, Class ann try { task.invoke(null); } catch (IllegalAccessException | InvocationTargetException e) { - throw new IllegalStateException("Error running @%s task '%s.%s'".formatted(annotation.getSimpleName(), task.getClass().getSimpleName(), task.getName()), e); + throw new IllegalStateException("Error running @%s task '%s.%s'".formatted(annotation.getSimpleName(), task.getDeclaringClass().getSimpleName(), task.getName()), e); } catch (NullPointerException e) { throw new RuntimeException("Method \"%s\" using Init annotations from non-static context".formatted(task.getName()), e); } From 0b95c140b0d7f02cb46f1d60133f5ba8d7350820 Mon Sep 17 00:00:00 2001 From: DAM <43420467+DAMcraft@users.noreply.github.com> Date: Thu, 11 Jan 2024 07:19:52 +0100 Subject: [PATCH 177/357] Allow any characters in cracked names --- .../gui/screens/accounts/AddCrackedAccountScreen.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 7a61275aa7..856b231961 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/accounts/AddCrackedAccountScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/accounts/AddCrackedAccountScreen.java @@ -32,7 +32,7 @@ public void initWidgets() { // Add add = t.add(theme.button("Add")).expandX().widget(); add.action = () -> { - if (!name.get().isEmpty() && (name.get().length() < 17) && name.get().matches("^[a-zA-Z0-9_]+$")) { + if (!name.get().isEmpty() && name.get().length() < 17) { CrackedAccount account = new CrackedAccount(name.get()); if (!(Accounts.get().exists(account))) { AccountsScreen.addAccount(this, parent, account); From 8e914fbdd48107dbdae3f9128e85072a167d904d Mon Sep 17 00:00:00 2001 From: Mersid Date: Mon, 15 Jan 2024 12:35:36 -0800 Subject: [PATCH 178/357] Fix PlayerModelHud not rendering when minecraft GUI scale is not 1 (#4332) --- .../systems/hud/elements/PlayerModelHud.java | 87 +++++++++++++++++-- 1 file changed, 78 insertions(+), 9 deletions(-) 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 d431e46b9a..a311bb135f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PlayerModelHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PlayerModelHud.java @@ -12,9 +12,13 @@ import meteordevelopment.meteorclient.systems.hud.HudRenderer; import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.render.color.SettingColor; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.ingame.InventoryScreen; +import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.math.MathHelper; +import org.joml.Quaternionf; +import org.joml.Vector3f; import static meteordevelopment.meteorclient.MeteorClient.mc; @@ -42,13 +46,6 @@ public class PlayerModelHud extends HudElement { .build() ); - private final Setting copyPitch = sgGeneral.add(new BoolSetting.Builder() - .name("copy-pitch") - .description("Makes the player model's pitch equal to yours.") - .defaultValue(true) - .build() - ); - private final Setting customYaw = sgGeneral.add(new IntSetting.Builder() .name("custom-yaw") .description("Custom yaw for when copy yaw is off.") @@ -59,6 +56,13 @@ public class PlayerModelHud extends HudElement { .build() ); + private final Setting copyPitch = sgGeneral.add(new BoolSetting.Builder() + .name("copy-pitch") + .description("Makes the player model's pitch equal to yours.") + .defaultValue(true) + .build() + ); + private final Setting customPitch = sgGeneral.add(new IntSetting.Builder() .name("custom-pitch") .description("Custom pitch for when copy pitch is off.") @@ -69,6 +73,13 @@ public class PlayerModelHud extends HudElement { .build() ); + private final Setting centerOrientation = sgGeneral.add(new EnumSetting.Builder() + .name("center-orientation") + .description("Which direction the player faces when the HUD model faces directly forward.") + .defaultValue(CenterOrientation.South) + .build() + ); + // Background private final Setting background = sgBackground.add(new BoolSetting.Builder() @@ -98,10 +109,12 @@ public void render(HudRenderer renderer) { PlayerEntity player = mc.player; if (player == null) return; - float yaw = copyYaw.get() ? MathHelper.wrapDegrees(player.prevYaw + (player.getYaw() - player.prevYaw) * mc.getTickDelta()) : (float) customYaw.get(); + float offset = centerOrientation.get() == CenterOrientation.North ? 180 : 0; + + float yaw = copyYaw.get() ? MathHelper.wrapDegrees(player.prevYaw + (player.getYaw() - player.prevYaw) * mc.getTickDelta() + offset) : (float) customYaw.get(); float pitch = copyPitch.get() ? player.getPitch() : (float) customPitch.get(); - InventoryScreen.drawEntity(renderer.drawContext, x, y, (int) (x + (25 * scale.get())), (int) (y + (66 * scale.get())), (int) (30 * scale.get()), 0, -yaw, -pitch, player); + drawEntity(renderer.drawContext, x, y, (int) (30 * scale.get()), -yaw, -pitch, player); }); if (background.get()) { @@ -116,4 +129,60 @@ public void render(HudRenderer renderer) { private void calculateSize() { setSize(50 * scale.get(), 75 * scale.get()); } + + /** + * Draws an entity to the screen. The default version provided by InventoryScreen has had its parameters changed + * such that it's no longer appropriate for this use case. As the new version uses rotation based on the mouse + * position relative to itself, it causes some odd angle positioning that may also look "stuck" to one corner, + * and the model's facing may change depending on how we reposition the element. + * Additionally, it uses OpenGL scissors, which causes the player model to get cut when the Minecraft GUI scale is not 1x. + * This version of drawEntity should fix these issues. + */ + private void drawEntity(DrawContext context, int x, int y, int size, float yaw, float pitch, LivingEntity entity) { + + float tanYaw = (float) Math.atan((yaw) / 40.0f); + float tanPitch = (float) Math.atan((pitch) / 40.0f); + + // By default, the origin of the drawEntity command is the top-center, facing down and straight to the south. + // This means that the player model is upside-down. We'll apply a rotation of PI radians (180 degrees) to fix this. + // This does have the downside of setting the origin to the bottom-center corner, though, so we'll have + // to compensate for this later. + Quaternionf quaternion = new Quaternionf().rotateZ((float) Math.PI); + + // The drawEntity command draws the entity using some entity parameters, so we'll have to manipulate some of + // those to draw as we want. But first, we'll save the previous values, so we can restore them later. + float previousBodyYaw = entity.bodyYaw; + float previousYaw = entity.getYaw(); + float previousPitch = entity.getPitch(); + float previousPrevHeadYaw = entity.prevHeadYaw; // A perplexing name, I know! + float prevHeadYaw = entity.headYaw; + + // Apply the rotation parameters + entity.bodyYaw = 180.0f + tanYaw * 20.0f; + entity.setYaw(180.0f + tanYaw * 40.0f); + entity.setPitch(-tanPitch * 20.0f); + entity.headYaw = entity.getYaw(); + entity.prevHeadYaw = entity.getYaw(); + + // Recall the player's origin is now the bottom-center corner, so we'll have to offset the draw by half the width + // to get it to render in the center. + // As for the y parameter, adding the element's height draws it at the bottom, but in practice we want the player + // to "float" somewhat, so we'll multiply it by some constant to have it hover. It turns out 0.9 is a good value. + // The vector3 parameter applies a translation to the player's model. Given that we're simply offsetting + // the draw in the x and y parameters, we won't really need this, so we'll set it to default. + // It doesn't seem like quaternionf2 does anything, so we'll leave it null to save some computation. + InventoryScreen.drawEntity(context, x + getWidth() / 2, y + getHeight() * 0.9f, size, new Vector3f(), quaternion, null, entity); + + // Restore the previous values + entity.bodyYaw = previousBodyYaw; + entity.setYaw(previousYaw); + entity.setPitch(previousPitch); + entity.prevHeadYaw = previousPrevHeadYaw; + entity.headYaw = prevHeadYaw; + } + + private enum CenterOrientation { + North, + South + } } From 8b28db8880e8b4ef1da2b05271f4626afc97f95d Mon Sep 17 00:00:00 2001 From: Wide-Cat <74723656+Wide-Cat@users.noreply.github.com> Date: Mon, 29 Jan 2024 19:36:35 +0000 Subject: [PATCH 179/357] Extend range of characters rendered by the custom font renderer (#4362) --- .../meteorclient/renderer/text/Font.java | 73 ++++++++++++------- .../systems/hud/elements/PotionTimersHud.java | 4 +- 2 files changed, 48 insertions(+), 29 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/text/Font.java b/src/main/java/meteordevelopment/meteorclient/renderer/text/Font.java index dfa0654dd8..5a7a71d32f 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/text/Font.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/text/Font.java @@ -5,15 +5,13 @@ package meteordevelopment.meteorclient.renderer.text; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import meteordevelopment.meteorclient.renderer.Mesh; import meteordevelopment.meteorclient.utils.render.ByteTexture; import meteordevelopment.meteorclient.utils.render.color.Color; import net.minecraft.client.texture.AbstractTexture; import org.lwjgl.BufferUtils; -import org.lwjgl.stb.STBTTFontinfo; -import org.lwjgl.stb.STBTTPackContext; -import org.lwjgl.stb.STBTTPackedchar; -import org.lwjgl.stb.STBTruetype; +import org.lwjgl.stb.*; import org.lwjgl.system.MemoryStack; import java.nio.ByteBuffer; @@ -21,11 +19,11 @@ public class Font { public AbstractTexture texture; - private final int height; private final float scale; private final float ascent; - private final CharData[] charData; + private final Int2ObjectOpenHashMap charMap = new Int2ObjectOpenHashMap<>(); + private final static int size = 2048; public Font(ByteBuffer buffer, int height) { this.height = height; @@ -34,20 +32,37 @@ public Font(ByteBuffer buffer, int height) { STBTTFontinfo fontInfo = STBTTFontinfo.create(); STBTruetype.stbtt_InitFont(fontInfo, buffer); - // Allocate STBTTPackedchar buffer - charData = new CharData[128]; - STBTTPackedchar.Buffer cdata = STBTTPackedchar.create(charData.length); - ByteBuffer bitmap = BufferUtils.createByteBuffer(2048 * 2048); - - // Create font texture + // Allocate buffers + ByteBuffer bitmap = BufferUtils.createByteBuffer(size * size); + STBTTPackedchar.Buffer[] cdata = { + STBTTPackedchar.create(95), // Basic Latin + STBTTPackedchar.create(96), // Latin 1 Supplement + STBTTPackedchar.create(128), // Latin Extended-A + STBTTPackedchar.create(144), // Greek and Coptic + STBTTPackedchar.create(256), // Cyrillic + STBTTPackedchar.create(1) // infinity symbol + }; + + // create and initialise packing context STBTTPackContext packContext = STBTTPackContext.create(); - STBTruetype.stbtt_PackBegin(packContext, bitmap, 2048, 2048, 0, 1); - STBTruetype.stbtt_PackSetOversampling(packContext, 2, 2); - STBTruetype.stbtt_PackFontRange(packContext, buffer, 0, height, 32, cdata); + STBTruetype.stbtt_PackBegin(packContext, bitmap, size, size, 0 ,1); + + // create the pack range, populate with the specific packing ranges + STBTTPackRange.Buffer packRange = STBTTPackRange.create(cdata.length); + packRange.put(STBTTPackRange.create().set(height, 32, null, 95, cdata[0], (byte) 2, (byte) 2)); + packRange.put(STBTTPackRange.create().set(height, 160, null, 96, cdata[1], (byte) 2, (byte) 2)); + packRange.put(STBTTPackRange.create().set(height, 256, null, 128, cdata[2], (byte) 2, (byte) 2)); + packRange.put(STBTTPackRange.create().set(height, 880, null, 144, cdata[3], (byte) 2, (byte) 2)); + packRange.put(STBTTPackRange.create().set(height, 1024, null, 256, cdata[4], (byte) 2, (byte) 2)); + packRange.put(STBTTPackRange.create().set(height, 8734, null, 1, cdata[5], (byte) 2, (byte) 2)); // lol + packRange.flip(); + + // write and finish + STBTruetype.stbtt_PackFontRanges(packContext, buffer, 0, packRange); STBTruetype.stbtt_PackEnd(packContext); // Create texture object and get font scale - texture = new ByteTexture(2048, 2048, bitmap, ByteTexture.Format.A, ByteTexture.Filter.Linear, ByteTexture.Filter.Linear); + texture = new ByteTexture(size, size, bitmap, ByteTexture.Format.A, ByteTexture.Filter.Linear, ByteTexture.Filter.Linear); scale = STBTruetype.stbtt_ScaleForPixelHeight(fontInfo, height); // Get font vertical ascent @@ -57,14 +72,17 @@ public Font(ByteBuffer buffer, int height) { this.ascent = ascent.get(0); } - // Populate charData array - for (int i = 0; i < charData.length; i++) { - STBTTPackedchar packedChar = cdata.get(i); + for (int i = 0; i < cdata.length; i++) { + STBTTPackedchar.Buffer cbuf = cdata[i]; + int offset = packRange.get(i).first_unicode_codepoint_in_range(); - float ipw = 1f / 2048; - float iph = 1f / 2048; + for (int j = 0; j < cbuf.capacity(); j++) { + STBTTPackedchar packedChar = cbuf.get(j); - charData[i] = new CharData( + float ipw = 1f / size; // pixel width and height + float iph = 1f / size; + + charMap.put(j + offset, new CharData( packedChar.xoff(), packedChar.yoff(), packedChar.xoff2(), @@ -74,7 +92,8 @@ public Font(ByteBuffer buffer, int height) { packedChar.x1() * ipw, packedChar.y1() * iph, packedChar.xadvance() - ); + )); + } } } @@ -83,8 +102,8 @@ public double getWidth(String string, int length) { for (int i = 0; i < length; i++) { int cp = string.charAt(i); - if (cp < 32 || cp > 128) cp = 32; - CharData c = charData[cp - 32]; + CharData c = charMap.get(cp); + if (c == null) c = charMap.get(32); width += c.xAdvance; } @@ -101,8 +120,8 @@ public double render(Mesh mesh, String string, double x, double y, Color color, for (int i = 0; i < string.length(); i++) { int cp = string.charAt(i); - if (cp < 32 || cp > 128) cp = 32; - CharData c = charData[cp - 32]; + CharData c = charMap.get(cp); + if (c == null) c = charMap.get(32); mesh.quad( mesh.vec2(x + c.x0 * scale, y + c.y0 * scale).vec2(c.u0, c.v0).color(color).next(), 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 5d3f0e99c3..332c9ef4a0 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PotionTimersHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PotionTimersHud.java @@ -14,7 +14,7 @@ import meteordevelopment.meteorclient.utils.render.color.SettingColor; import net.minecraft.entity.effect.StatusEffect; import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.util.StringHelper; +import net.minecraft.entity.effect.StatusEffectUtil; import java.util.ArrayList; import java.util.List; @@ -241,7 +241,7 @@ public void render(HudRenderer renderer) { } private String getString(StatusEffectInstance statusEffectInstance) { - return String.format("%s %d (%s)", Names.get(statusEffectInstance.getEffectType()), statusEffectInstance.getAmplifier() + 1, statusEffectInstance.isInfinite() ? "inf" : StringHelper.formatTicks(statusEffectInstance.getDuration(), mc.world.getTickManager().getTickRate())); //todo remove "inf" when font rendering can use symbols + return String.format("%s %d (%s)", Names.get(statusEffectInstance.getEffectType()), statusEffectInstance.getAmplifier() + 1, StatusEffectUtil.getDurationText(statusEffectInstance, 1, mc.world.getTickManager().getTickRate()).getString()); } private double getScale() { From 990e155d7f0f11f669f946b9d79dc528010287bd Mon Sep 17 00:00:00 2001 From: Big-Iron-Cheems <52252627+Big-Iron-Cheems@users.noreply.github.com> Date: Mon, 29 Jan 2024 19:11:40 +0100 Subject: [PATCH 180/357] Sodium 0.5.7 compat + bump dependencies Marked <0.5.6 as breaking, seeing the mixin changes. --- build.gradle | 2 +- gradle.properties | 18 +++++++++--------- gradle/wrapper/gradle-wrapper.properties | 2 +- .../sodium/SodiumBiomeColorCacheMixin.java | 6 +++--- src/main/resources/fabric.mod.json | 2 +- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/build.gradle b/build.gradle index 17cc649a38..ca9435e84f 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id "fabric-loom" version "1.4-SNAPSHOT" + id "fabric-loom" version "1.5-SNAPSHOT" id "maven-publish" id "com.github.johnrengelman.shadow" version "8.1.1" } diff --git a/gradle.properties b/gradle.properties index a6c1dbd281..685d2525e1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,8 +3,8 @@ org.gradle.jvmargs=-Xmx2G # Fabric (https://fabricmc.net/develop) minecraft_version=1.20.4 yarn_mappings=1.20.4+build.3 -loader_version=0.15.2 -fapi_version=0.91.3+1.20.4 +loader_version=0.15.6 +fapi_version=0.95.3+1.20.4 # Mod Properties mod_version=0.5.6 @@ -14,16 +14,19 @@ archives_base_name=meteor-client # Dependency Versions # Baritone (https://github.com/MeteorDevelopment/baritone) -baritone_version=1.20.2 +baritone_version=1.20.4 # Sodium (https://github.com/CaffeineMC/sodium-fabric) -sodium_version=mc1.20.3-0.5.5 +sodium_version=mc1.20.3-0.5.7 # Lithium (https://github.com/CaffeineMC/lithium-fabric) -lithium_version=mc1.20.2-0.12.0 +lithium_version=mc1.20.4-0.12.1 # Iris (https://github.com/IrisShaders/Iris) -iris_version=1.6.13+1.20.4 +iris_version=1.6.14+1.20.4 + +# Indium (https://github.com/comp500/Indium) +indium_version=1.0.28+mc1.20.4 # Orbit (https://github.com/MeteorDevelopment/orbit) orbit_version=0.2.4 @@ -39,6 +42,3 @@ reflections_version=0.10.2 # Netty (https://github.com/netty/netty) netty_version=4.1.90.Final - -# Indium (https://github.com/comp500/Indium) -indium_version=1.0.27+mc1.20.1 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index db9a6b825d..a595206642 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBiomeColorCacheMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBiomeColorCacheMixin.java index 39366b697f..92af282d68 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBiomeColorCacheMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBiomeColorCacheMixin.java @@ -25,17 +25,17 @@ private void onInit(CallbackInfo info) { ambience = Modules.get().get(Ambience.class); } - @ModifyExpressionValue(method = "updateColorBuffers", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/biome/ColorResolver;getColor(Lnet/minecraft/world/biome/Biome;DD)I", ordinal = 0, remap = true)) + @ModifyExpressionValue(method = "getColor(Lme/jellysquid/mods/sodium/client/world/biome/BiomeColorSource;III)I", at = @At(value = "INVOKE", target = "Lme/jellysquid/mods/sodium/client/world/biome/BiomeColorCache;getColor(Lnet/minecraft/world/biome/ColorResolver;III)I", ordinal = 0, remap = true)) private int modify_getGrassColorAt(int color) { return ambience.isActive() && ambience.customGrassColor.get() ? ambience.grassColor.get().getPacked() : color; } - @ModifyExpressionValue(method = "updateColorBuffers", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/biome/ColorResolver;getColor(Lnet/minecraft/world/biome/Biome;DD)I", ordinal = 1, remap = true)) + @ModifyExpressionValue(method = "getColor(Lme/jellysquid/mods/sodium/client/world/biome/BiomeColorSource;III)I", at = @At(value = "INVOKE", target = "Lme/jellysquid/mods/sodium/client/world/biome/BiomeColorCache;getColor(Lnet/minecraft/world/biome/ColorResolver;III)I", ordinal = 1, remap = true)) private int modify_getFoliageColor(int color) { return ambience.isActive() && ambience.customFoliageColor.get() ? ambience.foliageColor.get().getPacked() : color; } - @ModifyExpressionValue(method = "updateColorBuffers", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/biome/ColorResolver;getColor(Lnet/minecraft/world/biome/Biome;DD)I", ordinal = 2, remap = true)) + @ModifyExpressionValue(method = "getColor(Lme/jellysquid/mods/sodium/client/world/biome/BiomeColorSource;III)I", at = @At(value = "INVOKE", target = "Lme/jellysquid/mods/sodium/client/world/biome/BiomeColorCache;getColor(Lnet/minecraft/world/biome/ColorResolver;III)I", ordinal = 2, remap = true)) private int modify_getWaterColor(int color) { return ambience.isActive() && ambience.customWaterColor.get() ? ambience.waterColor.get().getPacked() : color; } diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 172ab48957..bb2846244b 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -53,7 +53,7 @@ "feather": "*", "origins": "*", "wurst": "*", - "sodium": "<0.5.4", + "sodium": "<0.5.6", "morechathistory": "*" } } From 399ccc66dbfe3009afdb2f15d94efa25145a68d8 Mon Sep 17 00:00:00 2001 From: Big Iron <52252627+Big-Iron-Cheems@users.noreply.github.com> Date: Mon, 29 Jan 2024 19:29:56 +0100 Subject: [PATCH 181/357] Revert Fabric loader bump --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 685d2525e1..b200c88762 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ org.gradle.jvmargs=-Xmx2G # Fabric (https://fabricmc.net/develop) minecraft_version=1.20.4 yarn_mappings=1.20.4+build.3 -loader_version=0.15.6 +loader_version=0.15.2 fapi_version=0.95.3+1.20.4 # Mod Properties From 42c972acc98bd6905bf903dc6e663d1fd706ee18 Mon Sep 17 00:00:00 2001 From: crazycat256 <63475640+crazycat256@users.noreply.github.com> Date: Mon, 29 Jan 2024 20:39:02 +0100 Subject: [PATCH 182/357] Fix Notebot align center on a slab (#4354) --- .../meteorclient/systems/modules/misc/Notebot.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notebot.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notebot.java index 772b97bbb5..00caf88242 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notebot.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notebot.java @@ -571,7 +571,8 @@ public WWidget getWidget(GuiTheme theme) { WButton alignCenter = table.add(theme.button("Align Center")).expandX().minWidth(100).widget(); alignCenter.action = () -> { if (mc.player == null) return; - mc.player.setPosition(Vec3d.ofBottomCenter(mc.player.getBlockPos())); + Vec3d pos = Vec3d.ofBottomCenter(mc.player.getBlockPos()); + mc.player.setPosition(pos.x, mc.player.getY(), pos.z); }; table.row(); From 9980e92977164857a70d6f0d245df26c405ece43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=80=E8=88=AC=E8=B7=AF=E8=BF=87=E7=9A=84=E6=BE=AA?= Date: Tue, 30 Jan 2024 05:44:58 +0800 Subject: [PATCH 183/357] fix bow aimbot not working in creative mode --- .../meteorclient/systems/modules/combat/BowAimbot.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BowAimbot.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BowAimbot.java index 7a3a86f667..5c586bba44 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BowAimbot.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BowAimbot.java @@ -93,7 +93,7 @@ public void onDeactivate() { @EventHandler private void onRender(Render3DEvent event) { if (!PlayerUtils.isAlive() || !itemInHand()) return; - if (!InvUtils.find(itemStack -> itemStack.getItem() instanceof ArrowItem).found()) return; + if (!mc.player.getAbilities().creativeMode && !InvUtils.find(itemStack -> itemStack.getItem() instanceof ArrowItem).found()) return; target = TargetUtils.get(entity -> { if (entity == mc.player || entity == mc.cameraEntity) return false; From 9bc0cabb3d67694c2c2adf728a8dc7c7288af8bc Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Tue, 30 Jan 2024 13:56:49 -0500 Subject: [PATCH 184/357] Correct BlockUtils#isValidMobSpawn (#4367) --- .../meteorclient/utils/world/BlockUtils.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java index 365fd8acb2..abd4cff993 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java @@ -260,10 +260,10 @@ public static MobSpawn isValidMobSpawn(BlockPos blockPos, BlockState blockState, if (downState.isTransparent(mc.world, down)) return MobSpawn.Never; } - if (mc.world.getLightLevel(blockPos, 0) <= spawnLightLimit) return MobSpawn.Potential; - else if (mc.world.getLightLevel(LightType.BLOCK, blockPos) <= spawnLightLimit) return MobSpawn.Always; + if (mc.world.getLightLevel(LightType.BLOCK, blockPos) > spawnLightLimit) return MobSpawn.Never; + else if (mc.world.getLightLevel(LightType.SKY, blockPos) > spawnLightLimit) return MobSpawn.Potential; - return MobSpawn.Never; + return MobSpawn.Always; } public static boolean topSurface(BlockState blockState) { From 3d05485b781ce73d6a03f7fc2d53e8adb72f8d8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=80=E8=88=AC=E8=B7=AF=E8=BF=87=E7=9A=84=E6=BE=AA?= Date: Wed, 31 Jan 2024 03:44:43 +0800 Subject: [PATCH 185/357] Implement ColorListSetting text parser (#4365) --- .../meteorclient/settings/ColorListSetting.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/settings/ColorListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/ColorListSetting.java index be39b26039..eb5c3c2fdc 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/ColorListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/ColorListSetting.java @@ -21,8 +21,16 @@ public ColorListSetting(String name, String description, List defa @Override protected List parseImpl(String str) { - // TODO: I cba to write a text parser for this - return new ArrayList<>(); + List colors = new ArrayList<>(); + try { + String[] colorsStr = str.replaceAll("\\s+", "").split(";"); + for (String colorStr : colorsStr) { + 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) { + } + return colors; } @Override From bb50c18b5b1fa4f90ab3fa00c8f6a37b73526416 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Tue, 30 Jan 2024 16:19:07 -0500 Subject: [PATCH 186/357] Damage utils refactor (#4083) --- .../events/entity/DamageEvent.java | 4 +- .../mixin/AttributeContainerMixin.java | 38 +++ .../mixin/ClientPlayerEntityMixin.java | 2 +- .../mixin/EntityAttributeInstanceMixin.java | 39 +++ .../mixin/LivingEntityAccessor.java | 11 + .../meteorclient/mixin/LivingEntityMixin.java | 2 +- .../mixin/ShulkerEntityAccessor.java | 25 ++ .../mixininterface/IAttributeContainer.java | 16 + .../IEntityAttributeInstance.java | 15 + .../systems/modules/combat/AnchorAura.java | 91 +++--- .../systems/modules/combat/BedAura.java | 5 +- .../systems/modules/combat/CrystalAura.java | 37 +-- .../systems/modules/combat/Surround.java | 1 + .../systems/modules/misc/AutoLog.java | 8 +- .../systems/modules/movement/Step.java | 15 +- .../utils/entity/DamageUtils.java | 258 +++++++++++++++++ .../utils/entity/EntityAttributeHelper.java | 98 +++++++ .../utils/entity/StatusEffectHelper.java | 44 +++ .../effects/EffectAttributeModifier.java | 30 ++ .../entity/effects/EntityEffectCache.java | 25 ++ .../entity/effects/MutableParticleColor.java | 43 +++ .../effects/StatusEffectBruteForce.java | 242 ++++++++++++++++ .../entity/fakeplayer/FakePlayerEntity.java | 3 +- .../utils/player/DamageUtils.java | 274 ------------------ .../utils/player/PlayerUtils.java | 31 +- .../meteorclient/utils/world/BlockUtils.java | 7 + src/main/resources/meteor-client.mixins.json | 3 + 27 files changed, 993 insertions(+), 374 deletions(-) create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/AttributeContainerMixin.java create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/EntityAttributeInstanceMixin.java create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/ShulkerEntityAccessor.java create mode 100644 src/main/java/meteordevelopment/meteorclient/mixininterface/IAttributeContainer.java create mode 100644 src/main/java/meteordevelopment/meteorclient/mixininterface/IEntityAttributeInstance.java create mode 100644 src/main/java/meteordevelopment/meteorclient/utils/entity/DamageUtils.java create mode 100644 src/main/java/meteordevelopment/meteorclient/utils/entity/EntityAttributeHelper.java create mode 100644 src/main/java/meteordevelopment/meteorclient/utils/entity/StatusEffectHelper.java create mode 100644 src/main/java/meteordevelopment/meteorclient/utils/entity/effects/EffectAttributeModifier.java create mode 100644 src/main/java/meteordevelopment/meteorclient/utils/entity/effects/EntityEffectCache.java create mode 100644 src/main/java/meteordevelopment/meteorclient/utils/entity/effects/MutableParticleColor.java create mode 100644 src/main/java/meteordevelopment/meteorclient/utils/entity/effects/StatusEffectBruteForce.java delete mode 100644 src/main/java/meteordevelopment/meteorclient/utils/player/DamageUtils.java diff --git a/src/main/java/meteordevelopment/meteorclient/events/entity/DamageEvent.java b/src/main/java/meteordevelopment/meteorclient/events/entity/DamageEvent.java index ce3463e843..9ac7d75595 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/entity/DamageEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/entity/DamageEvent.java @@ -13,12 +13,10 @@ public class DamageEvent { public LivingEntity entity; public DamageSource source; - public float amount; - public static DamageEvent get(LivingEntity entity, DamageSource source, float amount) { + public static DamageEvent get(LivingEntity entity, DamageSource source) { INSTANCE.entity = entity; INSTANCE.source = source; - INSTANCE.amount = amount; return INSTANCE; } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/AttributeContainerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/AttributeContainerMixin.java new file mode 100644 index 0000000000..cad576fb1e --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/AttributeContainerMixin.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 meteordevelopment.meteorclient.mixininterface.IAttributeContainer; +import meteordevelopment.meteorclient.mixininterface.IEntityAttributeInstance; +import net.minecraft.entity.attribute.AttributeContainer; +import net.minecraft.entity.attribute.EntityAttribute; +import net.minecraft.entity.attribute.EntityAttributeInstance; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.Map; +import java.util.Set; + +@Mixin(AttributeContainer.class) +public abstract class AttributeContainerMixin implements IAttributeContainer { + @Shadow @Final private Map custom; + @Shadow @Final private Set tracked; + + @Override + public void meteor$copyFrom(AttributeContainer other) { + for (var otherInstance : ((AttributeContainerMixin) (Object) other).custom.values()) { + @Nullable EntityAttributeInstance instance = custom.get(otherInstance.getAttribute()); + if (instance != null) { + ((IEntityAttributeInstance) instance).meteor$copyFrom(otherInstance); + } else { + custom.put(otherInstance.getAttribute(), otherInstance); + if (otherInstance.getAttribute().isTracked()) tracked.add(otherInstance); + } + } + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityMixin.java index 35bad2d758..c971bd64c4 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityMixin.java @@ -74,7 +74,7 @@ private void onPushOutOfBlocks(double x, double d, CallbackInfo info) { @Inject(method = "damage", at = @At("HEAD")) private void onDamage(DamageSource source, float amount, CallbackInfoReturnable info) { - if (Utils.canUpdate() && getWorld().isClient && canTakeDamage()) MeteorClient.EVENT_BUS.post(DamageEvent.get(this, source, amount)); + if (Utils.canUpdate() && getWorld().isClient && canTakeDamage()) MeteorClient.EVENT_BUS.post(DamageEvent.get(this, source)); } @ModifyConstant(method = "canSprint", constant = @Constant(floatValue = 6.0f)) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/EntityAttributeInstanceMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/EntityAttributeInstanceMixin.java new file mode 100644 index 0000000000..58cf2eb80c --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/EntityAttributeInstanceMixin.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 meteordevelopment.meteorclient.mixininterface.IEntityAttributeInstance; +import net.minecraft.entity.attribute.EntityAttributeInstance; +import net.minecraft.entity.attribute.EntityAttributeModifier; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.Map; +import java.util.Set; +import java.util.UUID; + +@Mixin(EntityAttributeInstance.class) +public abstract class EntityAttributeInstanceMixin implements IEntityAttributeInstance { + @Shadow @Final private Map idToModifiers; + @Shadow @Final private Set persistentModifiers; + @Shadow public abstract Set getModifiers(EntityAttributeModifier.Operation operation); + @Shadow protected abstract void onUpdate(); + + @Override + public void meteor$copyFrom(EntityAttributeInstance other) { + for (var modifier : other.getModifiers()) { + @Nullable EntityAttributeModifier old = idToModifiers.put(modifier.getId(), modifier); + if (old != null) { + getModifiers(old.getOperation()).remove(old); + persistentModifiers.remove(old); + } + getModifiers(modifier.getOperation()).add(modifier); + } + onUpdate(); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityAccessor.java index c7d4630c92..63d613eeec 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityAccessor.java @@ -6,6 +6,7 @@ package meteordevelopment.meteorclient.mixin; import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.data.TrackedData; import net.minecraft.fluid.Fluid; import net.minecraft.registry.tag.TagKey; import org.spongepowered.asm.mixin.Mixin; @@ -25,4 +26,14 @@ public interface LivingEntityAccessor { @Accessor("jumpingCooldown") void setJumpCooldown(int cooldown); + + @Accessor("POTION_SWIRLS_COLOR") + static TrackedData meteor$getPotionSwirlsColor() { + throw new AssertionError(); + } + + @Accessor("POTION_SWIRLS_AMBIENT") + static TrackedData meteor$getPotionSwirlsAmbient() { + throw new AssertionError(); + } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java index b4bccd5aa8..5b5f763453 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java @@ -54,7 +54,7 @@ public LivingEntityMixin(EntityType type, World world) { @Inject(method = "damage", at = @At("HEAD")) private void onDamageHead(DamageSource source, float amount, CallbackInfoReturnable info) { if (Utils.canUpdate() && getWorld().isClient) - MeteorClient.EVENT_BUS.post(DamageEvent.get((LivingEntity) (Object) this, source, amount)); + MeteorClient.EVENT_BUS.post(DamageEvent.get((LivingEntity) (Object) this, source)); } @ModifyReturnValue(method = "canWalkOnFluid", at = @At("RETURN")) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ShulkerEntityAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/ShulkerEntityAccessor.java new file mode 100644 index 0000000000..715dfab8b5 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ShulkerEntityAccessor.java @@ -0,0 +1,25 @@ +/* + * 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.attribute.EntityAttributeModifier; +import net.minecraft.entity.data.TrackedData; +import net.minecraft.entity.mob.ShulkerEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(ShulkerEntity.class) +public interface ShulkerEntityAccessor { + @Accessor("PEEK_AMOUNT") + static TrackedData meteor$getPeekAmount() { + throw new AssertionError(); + } + + @Accessor("COVERED_ARMOR_BONUS") + static EntityAttributeModifier meteor$getCoveredArmorBonus() { + throw new AssertionError(); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixininterface/IAttributeContainer.java b/src/main/java/meteordevelopment/meteorclient/mixininterface/IAttributeContainer.java new file mode 100644 index 0000000000..019578179c --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixininterface/IAttributeContainer.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.mixininterface; + +import net.minecraft.entity.attribute.AttributeContainer; +import net.minecraft.entity.attribute.EntityAttributeInstance; + +public interface IAttributeContainer { + /** + * Copy the {@link EntityAttributeInstance} of the other {@link AttributeContainer} into this one, copying their modifiers if there's a duplicate + */ + void meteor$copyFrom(AttributeContainer other); +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixininterface/IEntityAttributeInstance.java b/src/main/java/meteordevelopment/meteorclient/mixininterface/IEntityAttributeInstance.java new file mode 100644 index 0000000000..558a0a42cc --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixininterface/IEntityAttributeInstance.java @@ -0,0 +1,15 @@ +/* + * 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.attribute.EntityAttributeInstance; + +public interface IEntityAttributeInstance { + /** + * Adds the modifiers of the other {@link EntityAttributeInstance} to this one, replacing them if there's a duplicate + */ + void meteor$copyFrom(EntityAttributeInstance other); +} diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java index 38b1a947da..69541d75e7 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java @@ -11,6 +11,7 @@ import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; +import meteordevelopment.meteorclient.utils.entity.DamageUtils; import meteordevelopment.meteorclient.utils.entity.EntityUtils; import meteordevelopment.meteorclient.utils.entity.SortPriority; import meteordevelopment.meteorclient.utils.entity.TargetUtils; @@ -20,13 +21,13 @@ import meteordevelopment.orbit.EventHandler; import net.minecraft.block.Blocks; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.fluid.FlowableFluid; import net.minecraft.item.Items; import net.minecraft.util.Hand; import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.util.math.Vec3d; +import org.jetbrains.annotations.Nullable; public class AnchorAura extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); @@ -225,6 +226,7 @@ public class AnchorAura extends Module { private int placeDelayLeft; private int breakDelayLeft; private PlayerEntity target; + private final BlockPos.Mutable mutable = new BlockPos.Mutable(); public AnchorAura() { super(Categories.Combat, "anchor-aura", "Automatically places and breaks Respawn Anchors to harm entities."); @@ -264,7 +266,8 @@ private void onTick(TickEvent.Post event) { breakDelayLeft = 0; if (rotationMode.get() == RotationMode.Both || rotationMode.get() == RotationMode.Break) { - Rotations.rotate(Rotations.getYaw(breakPos), Rotations.getPitch(breakPos), 50, () -> breakAnchor(breakPos, anchor, glowStone)); + BlockPos immutableBreakPos = breakPos.toImmutable(); + Rotations.rotate(Rotations.getYaw(breakPos), Rotations.getPitch(breakPos), 50, () -> breakAnchor(immutableBreakPos, anchor, glowStone)); } else breakAnchor(breakPos, anchor, glowStone); } } @@ -274,7 +277,7 @@ private void onTick(TickEvent.Post event) { if (placePos != null) { placeDelayLeft = 0; - BlockUtils.place(placePos, anchor, (rotationMode.get() == RotationMode.Place || rotationMode.get() == RotationMode.Both), 50); + BlockUtils.place(placePos.toImmutable(), anchor, (rotationMode.get() == RotationMode.Place || rotationMode.get() == RotationMode.Both), 50); } } @@ -301,48 +304,50 @@ private void onRender(Render3DEvent event) { } } + @Nullable private BlockPos findPlacePos(BlockPos targetPlacePos) { switch (placePositions.get()) { - case All: - if (isValidPlace(targetPlacePos.down())) return targetPlacePos.down(); - else if (isValidPlace(targetPlacePos.up(2))) return targetPlacePos.up(2); - else if (isValidPlace(targetPlacePos.add(1, 0, 0))) return targetPlacePos.add(1, 0, 0); - else if (isValidPlace(targetPlacePos.add(-1, 0, 0))) return targetPlacePos.add(-1, 0, 0); - else if (isValidPlace(targetPlacePos.add(0, 0, 1))) return targetPlacePos.add(0, 0, 1); - else if (isValidPlace(targetPlacePos.add(0, 0, -1))) return targetPlacePos.add(0, 0, -1); - else if (isValidPlace(targetPlacePos.add(1, 1, 0))) return targetPlacePos.add(1, 1, 0); - else if (isValidPlace(targetPlacePos.add(-1, -1, 0))) return targetPlacePos.add(-1, -1, 0); - else if (isValidPlace(targetPlacePos.add(0, 1, 1))) return targetPlacePos.add(0, 1, 1); - else if (isValidPlace(targetPlacePos.add(0, 0, -1))) return targetPlacePos.add(0, 0, -1); - break; - case Above: - if (isValidPlace(targetPlacePos.up(2))) return targetPlacePos.up(2); - break; - case AboveAndBelow: - if (isValidPlace(targetPlacePos.down())) return targetPlacePos.down(); - else if (isValidPlace(targetPlacePos.up(2))) return targetPlacePos.up(2); - break; - case Around: - if (isValidPlace(targetPlacePos.north())) return targetPlacePos.north(); - else if (isValidPlace(targetPlacePos.east())) return targetPlacePos.east(); - else if (isValidPlace(targetPlacePos.west())) return targetPlacePos.west(); - else if (isValidPlace(targetPlacePos.south())) return targetPlacePos.south(); - break; + case All -> { + if (isValidPlace(targetPlacePos, 0, -1, 0)) return mutable; + else if (isValidPlace(targetPlacePos, 0, 2, 0)) return mutable; + else if (isValidPlace(targetPlacePos, 1, 0, 0)) return mutable; + else if (isValidPlace(targetPlacePos, -1, 0, 0)) return mutable; + else if (isValidPlace(targetPlacePos, 0, 0, 1)) return mutable; + else if (isValidPlace(targetPlacePos, 0, 0, -1)) return mutable; + else if (isValidPlace(targetPlacePos, 1, 1, 0)) return mutable; + else if (isValidPlace(targetPlacePos, -1, -1, 0)) return mutable; + else if (isValidPlace(targetPlacePos, 0, 1, 1)) return mutable; + else if (isValidPlace(targetPlacePos, 0, 0, -1)) return mutable; + } + case Above -> { + if (isValidPlace(targetPlacePos, 0, 2, 0)) return mutable; + } + case AboveAndBelow -> { + if (isValidPlace(targetPlacePos, 0, -1, 0)) return mutable; + else if (isValidPlace(targetPlacePos, 0, 2, 0)) return mutable; + } + case Around -> { + if (isValidPlace(targetPlacePos, 0, 0, -1)) return mutable; + else if (isValidPlace(targetPlacePos, 1, 0, 0)) return mutable; + else if (isValidPlace(targetPlacePos, -1, 0, 0)) return mutable; + else if (isValidPlace(targetPlacePos, 0, 0, 1)) return mutable; + } } return null; } + @Nullable private BlockPos findBreakPos(BlockPos targetPos) { - if (isValidBreak(targetPos.down())) return targetPos.down(); - else if (isValidBreak(targetPos.up(2))) return targetPos.up(2); - else if (isValidBreak(targetPos.add(1, 0, 0))) return targetPos.add(1, 0, 0); - else if (isValidBreak(targetPos.add(-1, 0, 0))) return targetPos.add(-1, 0, 0); - else if (isValidBreak(targetPos.add(0, 0, 1))) return targetPos.add(0, 0, 1); - else if (isValidBreak(targetPos.add(0, 0, -1))) return targetPos.add(0, 0, -1); - else if (isValidBreak(targetPos.add(1, 1, 0))) return targetPos.add(1, 1, 0); - else if (isValidBreak(targetPos.add(-1, -1, 0))) return targetPos.add(-1, -1, 0); - else if (isValidBreak(targetPos.add(0, 1, 1))) return targetPos.add(0, 1, 1); - else if (isValidBreak(targetPos.add(0, 0, -1))) return targetPos.add(0, 0, -1); + if (isValidBreak(targetPos, 0, -1, 0)) return mutable; + else if (isValidBreak(targetPos, 0, 2, 0)) return mutable; + else if (isValidBreak(targetPos, 1, 0, 0)) return mutable; + else if (isValidBreak(targetPos, -1, 0, 0)) return mutable; + else if (isValidBreak(targetPos, 0, 0, 1)) return mutable; + else if (isValidBreak(targetPos, 0, 0, -1)) return mutable; + else if (isValidBreak(targetPos, 1, 1, 0)) return mutable; + else if (isValidBreak(targetPos, -1, -1, 0)) return mutable; + else if (isValidBreak(targetPos, 0, 1, 1)) return mutable; + else if (isValidBreak(targetPos, 0, 0, -1)) return mutable; return null; } @@ -354,12 +359,14 @@ private boolean getDamageBreak(BlockPos pos) { return breakMode.get() == Safety.Suicide || DamageUtils.anchorDamage(mc.player, pos.toCenterPos()) <= maxDamage.get(); } - private boolean isValidPlace(BlockPos pos) { - return Math.sqrt(mc.player.getBlockPos().getSquaredDistance(pos)) <= placeRange.get() && getDamagePlace(pos) && BlockUtils.canPlace(pos, true); + private boolean isValidPlace(BlockPos origin, int xOffset, int yOffset, int zOffset) { + BlockUtils.mutateAround(mutable, origin, xOffset, yOffset, zOffset); + return Math.sqrt(mc.player.getBlockPos().getSquaredDistance(mutable)) <= placeRange.get() && getDamagePlace(mutable) && BlockUtils.canPlace(mutable); } - private boolean isValidBreak(BlockPos pos) { - return mc.world.getBlockState(pos).getBlock() == Blocks.RESPAWN_ANCHOR && Math.sqrt(mc.player.getBlockPos().getSquaredDistance(pos)) <= breakRange.get() && getDamageBreak(pos); + private boolean isValidBreak(BlockPos origin, int xOffset, int yOffset, int zOffset) { + BlockUtils.mutateAround(mutable, origin, xOffset, yOffset, zOffset); + return mc.world.getBlockState(mutable).getBlock() == Blocks.RESPAWN_ANCHOR && Math.sqrt(mc.player.getBlockPos().getSquaredDistance(mutable)) <= breakRange.get() && getDamageBreak(mutable); } private void breakAnchor(BlockPos pos, FindItemResult anchor, FindItemResult glowStone) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BedAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BedAura.java index 522bde5d40..366a95cf4c 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BedAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BedAura.java @@ -12,6 +12,7 @@ import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.Utils; +import meteordevelopment.meteorclient.utils.entity.DamageUtils; import meteordevelopment.meteorclient.utils.entity.EntityUtils; import meteordevelopment.meteorclient.utils.entity.SortPriority; import meteordevelopment.meteorclient.utils.entity.TargetUtils; @@ -258,8 +259,8 @@ private BlockPos findPlace(PlayerEntity target) { BlockPos centerPos = target.getBlockPos().up(i); - double headSelfDamage = DamageUtils.bedDamage(mc.player, Utils.vec3d(centerPos)); - double offsetSelfDamage = DamageUtils.bedDamage(mc.player, Utils.vec3d(centerPos.offset(dir.toDirection()))); + float headSelfDamage = DamageUtils.bedDamage(mc.player, Utils.vec3d(centerPos)); + float offsetSelfDamage = DamageUtils.bedDamage(mc.player, Utils.vec3d(centerPos.offset(dir.toDirection()))); if (mc.world.getBlockState(centerPos).isReplaceable() && BlockUtils.canPlace(centerPos.offset(dir.toDirection())) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/CrystalAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/CrystalAura.java index a0d23f8ea7..af9915d787 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/CrystalAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/CrystalAura.java @@ -22,6 +22,7 @@ import meteordevelopment.meteorclient.systems.friends.Friends; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; +import meteordevelopment.meteorclient.utils.entity.DamageUtils; import meteordevelopment.meteorclient.utils.entity.EntityUtils; import meteordevelopment.meteorclient.utils.entity.Target; import meteordevelopment.meteorclient.utils.misc.Keybind; @@ -82,14 +83,6 @@ public class CrystalAura extends Module { .build() ); - private final Setting ignoreTerrain = sgGeneral.add(new BoolSetting.Builder() - .name("ignore-terrain") - .description("Completely ignores terrain if it can be blown up by end crystals.") - .defaultValue(true) - .build() - ); - - private final Setting minDamage = sgGeneral.add(new DoubleSetting.Builder() .name("min-damage") .description("Minimum damage the crystal needs to deal to your target.") @@ -717,7 +710,7 @@ private void onEntityAdded(EntityAddedEvent event) { } if (fastBreak.get() && !didRotateThisTick && attacks < attackFrequency.get()) { - double damage = getBreakDamage(event.entity, true); + float damage = getBreakDamage(event.entity, true); if (damage > minDamage.get()) doBreak(event.entity); } } @@ -750,12 +743,12 @@ private void doBreak() { if (!doBreak.get() || breakTimer > 0 || switchTimer > 0 || attacks >= attackFrequency.get()) return; if (shouldPause(PauseMode.Break)) return; - double bestDamage = 0; + float bestDamage = 0; Entity crystal = null; // Find best crystal to break for (Entity entity : mc.world.getEntities()) { - double damage = getBreakDamage(entity, true); + float damage = getBreakDamage(entity, true); if (damage > bestDamage) { bestDamage = damage; @@ -767,7 +760,7 @@ private void doBreak() { if (crystal != null) doBreak(crystal); } - private double getBreakDamage(Entity entity, boolean checkCrystalAge) { + private float getBreakDamage(Entity entity, boolean checkCrystalAge) { if (!(entity instanceof EndCrystalEntity)) return 0; // Check only break own @@ -787,15 +780,15 @@ private double getBreakDamage(Entity entity, boolean checkCrystalAge) { // Check damage to self and anti suicide blockPos.set(entity.getBlockPos()).move(0, -1, 0); - double selfDamage = DamageUtils.crystalDamage(mc.player, entity.getPos(), predictMovement.get(), blockPos, ignoreTerrain.get()); + float selfDamage = DamageUtils.crystalDamage(mc.player, entity.getPos(), predictMovement.get(), blockPos); if (selfDamage > maxDamage.get() || (antiSuicide.get() && selfDamage >= EntityUtils.getTotalHealth(mc.player))) return 0; // Check damage to targets and face place - double damage = getDamageToTargets(entity.getPos(), blockPos, true, false); + float damage = getDamageToTargets(entity.getPos(), blockPos, true, false); boolean shouldFacePlace = shouldFacePlace(); - double minimumDamage = Math.min(minDamage.get(), shouldFacePlace ? 1.5 : minDamage.get()); + double minimumDamage = shouldFacePlace ? Math.min(minDamage.get(), 1.5d) : minDamage.get(); - if (damage < minimumDamage) return 0; + if (damage < minimumDamage) return 0f; return damage; } @@ -931,11 +924,11 @@ private void doPlace() { if (isOutOfRange(vec3d, blockPos, true)) return; // Check damage to self and anti suicide - double selfDamage = DamageUtils.crystalDamage(mc.player, vec3d, predictMovement.get(), bp, ignoreTerrain.get()); + float selfDamage = DamageUtils.crystalDamage(mc.player, vec3d, predictMovement.get(), bp); if (selfDamage > maxDamage.get() || (antiSuicide.get() && selfDamage >= EntityUtils.getTotalHealth(mc.player))) return; // Check damage to targets and face place - double damage = getDamageToTargets(vec3d, bp, false, !hasBlock && support.get() == SupportMode.Fast); + float damage = getDamageToTargets(vec3d, bp, false, !hasBlock && support.get() == SupportMode.Fast); boolean shouldFacePlace = shouldFacePlace(); double minimumDamage = Math.min(minDamage.get(), shouldFacePlace ? 1.5 : minDamage.get()); @@ -1167,18 +1160,18 @@ private PlayerEntity getNearestTarget() { return nearestTarget; } - private double getDamageToTargets(Vec3d vec3d, BlockPos obsidianPos, boolean breaking, boolean fast) { - double damage = 0; + private float getDamageToTargets(Vec3d vec3d, BlockPos obsidianPos, boolean breaking, boolean fast) { + float damage = 0; if (fast) { PlayerEntity target = getNearestTarget(); - if (!(smartDelay.get() && breaking && target.hurtTime > 0)) damage = DamageUtils.crystalDamage(target, vec3d, predictMovement.get(), obsidianPos, ignoreTerrain.get()); + if (!(smartDelay.get() && breaking && target.hurtTime > 0)) damage = DamageUtils.crystalDamage(target, vec3d, predictMovement.get(), obsidianPos); } else { for (PlayerEntity target : targets) { if (smartDelay.get() && breaking && target.hurtTime > 0) continue; - double dmg = DamageUtils.crystalDamage(target, vec3d, predictMovement.get(), obsidianPos, ignoreTerrain.get()); + float dmg = DamageUtils.crystalDamage(target, vec3d, predictMovement.get(), obsidianPos); // Update best target if (dmg > bestTargetDamage) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java index cb08019359..2584880c19 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java @@ -13,6 +13,7 @@ import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; +import meteordevelopment.meteorclient.utils.entity.DamageUtils; import meteordevelopment.meteorclient.utils.player.*; import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.render.color.SettingColor; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/AutoLog.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/AutoLog.java index b76d882d68..8e9f1ba7e5 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/AutoLog.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/AutoLog.java @@ -15,7 +15,7 @@ import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.Utils; -import meteordevelopment.meteorclient.utils.player.DamageUtils; +import meteordevelopment.meteorclient.utils.entity.DamageUtils; import meteordevelopment.meteorclient.utils.player.PlayerUtils; import meteordevelopment.orbit.EventHandler; import net.minecraft.entity.Entity; @@ -116,13 +116,13 @@ private void onTick(TickEvent.Post event) { if (!onlyTrusted.get() && !instantDeath.get() && !crystalLog.get()) return; // only check all entities if needed for (Entity entity : mc.world.getEntities()) { - if (entity instanceof PlayerEntity && entity.getUuid() != mc.player.getUuid()) { - if (onlyTrusted.get() && entity != mc.player && !Friends.get().isFriend((PlayerEntity) entity)) { + if (entity instanceof PlayerEntity player && player.getUuid() != mc.player.getUuid()) { + if (onlyTrusted.get() && player != mc.player && !Friends.get().isFriend(player)) { disconnect("A non-trusted player appeared in your render distance."); if (toggleOff.get()) this.toggle(); break; } - if (instantDeath.get() && PlayerUtils.isWithin(entity, 8) && DamageUtils.getSwordDamage((PlayerEntity) entity, true) + if (instantDeath.get() && PlayerUtils.isWithin(entity, 8) && DamageUtils.getAttackDamage(player, mc.player) > playerHealth + mc.player.getAbsorptionAmount()) { disconnect("Anti-32k measures."); if (toggleOff.get()) this.toggle(); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Step.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Step.java index 785df81932..04a9f24bf9 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Step.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Step.java @@ -11,13 +11,12 @@ import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; -import meteordevelopment.meteorclient.utils.player.DamageUtils; +import meteordevelopment.meteorclient.utils.entity.DamageUtils; import meteordevelopment.orbit.EventHandler; import net.minecraft.entity.Entity; import net.minecraft.entity.decoration.EndCrystalEntity; -import java.util.Comparator; -import java.util.Optional; +import java.util.OptionalDouble; public class Step extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); @@ -92,13 +91,13 @@ private float getHealth(){ return mc.player.getHealth() + mc.player.getAbsorptionAmount(); } - private double getExplosionDamage(){ - Optional crystal = Streams.stream(mc.world.getEntities()) + private double getExplosionDamage() { + OptionalDouble crystalDamage = Streams.stream(mc.world.getEntities()) .filter(entity -> entity instanceof EndCrystalEntity) .filter(Entity::isAlive) - .max(Comparator.comparingDouble(o -> DamageUtils.crystalDamage(mc.player, o.getPos()))) - .map(entity -> (EndCrystalEntity) entity); - return crystal.map(endCrystalEntity -> DamageUtils.crystalDamage(mc.player, endCrystalEntity.getPos())).orElse(0.0); + .mapToDouble(entity -> DamageUtils.crystalDamage(mc.player, entity.getPos())) + .max(); + return crystalDamage.orElse(0.0); } public enum ActiveWhen { diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/DamageUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/DamageUtils.java new file mode 100644 index 0000000000..21eea15e72 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/utils/entity/DamageUtils.java @@ -0,0 +1,258 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.utils.entity; + +import meteordevelopment.meteorclient.mixininterface.IVec3d; +import meteordevelopment.meteorclient.utils.entity.fakeplayer.FakePlayerEntity; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.entity.*; +import net.minecraft.entity.attribute.*; +import net.minecraft.entity.damage.DamageSource; +import net.minecraft.entity.effect.StatusEffectInstance; +import net.minecraft.entity.effect.StatusEffects; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.*; +import net.minecraft.util.hit.BlockHitResult; +import net.minecraft.util.hit.HitResult; +import net.minecraft.util.math.*; +import net.minecraft.world.BlockView; +import net.minecraft.world.GameMode; +import net.minecraft.world.Heightmap; +import net.minecraft.world.RaycastContext; +import net.minecraft.world.explosion.Explosion; +import org.jetbrains.annotations.Nullable; + +import static meteordevelopment.meteorclient.MeteorClient.mc; + +public class DamageUtils { + // Explosion damage + + public static float explosionDamage(LivingEntity target, Vec3d origin, float power, boolean predictMovement, BlockPos override, BlockState overrideState) { + if (target == null) return 0f; + if (target instanceof PlayerEntity player && EntityUtils.getGameMode(player) == GameMode.CREATIVE && !(player instanceof FakePlayerEntity)) return 0f; + + Vec3d position = predictMovement ? target.getPos().add(target.getVelocity()) : target.getPos(); + + double modDistance = position.distanceTo(origin); + if (modDistance > power) return 0f; + + Box box = target.getBoundingBox(); + if (predictMovement) box = box.offset(target.getVelocity()); + + double exposure = getExposure(origin, box, override, overrideState); + double impact = (1 - (modDistance / power)) * exposure; + float damage = (int) ((impact * impact + impact) / 2 * 7 * 12 + 1); + + return calculateReductions(damage, target, mc.world.getDamageSources().explosion(null)); + } + + public static float crystalDamage(LivingEntity target, Vec3d crystal, boolean predictMovement, BlockPos obsidianPos) { + return explosionDamage(target, crystal, 12f, predictMovement, obsidianPos, Blocks.OBSIDIAN.getDefaultState()); + } + + public static float crystalDamage(LivingEntity target, Vec3d crystal) { + return explosionDamage(target, crystal, 12f, false, null, null); + } + + public static float bedDamage(LivingEntity target, Vec3d bed) { + return explosionDamage(target, bed, 10f, false, null, null); + } + + public static float anchorDamage(LivingEntity target, Vec3d anchor) { + return explosionDamage(target, anchor, 10f, false, BlockPos.ofFloored(anchor), Blocks.AIR.getDefaultState()); + } + + // Sword damage + + /** + * @see PlayerEntity#attack(Entity) + */ + public static float getAttackDamage(LivingEntity attacker, LivingEntity target) { + float itemDamage = (float) EntityAttributeHelper.getAttributeValue(attacker, EntityAttributes.GENERIC_ATTACK_DAMAGE); + + // Get enchant damage + ItemStack stack = attacker.getStackInHand(attacker.getActiveHand()); + float enchantDamage = EnchantmentHelper.getAttackDamage(stack, target.getGroup()); + + // Factor charge + if (attacker instanceof PlayerEntity playerEntity) { + float charge = playerEntity.getAttackCooldownProgress(0.5f); + itemDamage *= 0.2f + charge * charge * 0.8f; + enchantDamage *= charge; + + // Factor critical hit + if (charge > 0.9f && attacker.fallDistance > 0f && !attacker.isOnGround() && !attacker.isClimbing() && !attacker.isTouchingWater() && !attacker.hasStatusEffect(StatusEffects.BLINDNESS) && !attacker.hasVehicle()) { + itemDamage *= 1.5f; + } + } + + float damage = itemDamage + enchantDamage; + + damage = calculateReductions(damage, target, attacker instanceof PlayerEntity player ? mc.world.getDamageSources().playerAttack(player) : mc.world.getDamageSources().mobAttack(attacker)); + + // Factor Fire Aspect + if (EnchantmentHelper.getFireAspect(attacker) > 0 && !StatusEffectHelper.hasStatusEffect(target, StatusEffects.FIRE_RESISTANCE)) { + damage++; + } + + return damage; + } + + // Fall Damage + + /** + * @see LivingEntity#computeFallDamage(float, float) (float, float, DamageSource) + */ + @SuppressWarnings("JavadocReference") + public static float fallDamage(LivingEntity entity) { + if (entity instanceof PlayerEntity player && player.getAbilities().flying) return 0f; + if (StatusEffectHelper.hasStatusEffect(entity, StatusEffects.SLOW_FALLING) || StatusEffectHelper.hasStatusEffect(entity, StatusEffects.LEVITATION)) return 0f; + + // Fast path - Above the surface + int surface = mc.world.getWorldChunk(entity.getBlockPos()).getHeightmap(Heightmap.Type.MOTION_BLOCKING).get(entity.getBlockX(), entity.getBlockZ()); + if (entity.getBlockY() >= surface) return fallDamageReductions(entity, surface); + + // Under the surface + BlockHitResult raycastResult = mc.world.raycast(new RaycastContext(entity.getPos(), new Vec3d(entity.getX(), mc.world.getBottomY(), entity.getZ()), RaycastContext.ShapeType.COLLIDER, RaycastContext.FluidHandling.WATER, entity)); + if (raycastResult.getType() == HitResult.Type.MISS) return 0; + + return fallDamageReductions(entity, raycastResult.getBlockPos().getY()); + } + + private static float fallDamageReductions(LivingEntity entity, int surface) { + int fallHeight = (int) (entity.getY() - surface + entity.fallDistance - 3d); + @Nullable StatusEffectInstance jumpBoostInstance = StatusEffectHelper.getStatusEffect(entity, StatusEffects.JUMP_BOOST); + if (jumpBoostInstance != null) fallHeight -= jumpBoostInstance.getAmplifier() + 1; + + return calculateReductions(fallHeight, entity, mc.world.getDamageSources().fall()); + } + + // Utils + + private static float calculateReductions(float damage, LivingEntity entity, DamageSource damageSource) { + if (damageSource.isScaledWithDifficulty()) { + switch (mc.world.getDifficulty()) { + case PEACEFUL -> { + return 0; + } + case EASY -> damage = Math.min(damage / 2 + 1, damage); + case HARD -> damage *= 1.5f; + } + } + + // Armor reduction + damage = DamageUtil.getDamageLeft(damage, getArmor(entity), (float) EntityAttributeHelper.getAttributeValue(entity, EntityAttributes.GENERIC_ARMOR_TOUGHNESS)); + + // Resistance reduction + damage = resistanceReduction(entity, damage); + + // Protection reduction + damage = protectionReduction(entity, damage, damageSource); + + return Math.max(damage, 0); + } + + private static float getArmor(LivingEntity entity) { + return (float) Math.floor(EntityAttributeHelper.getAttributeValue(entity, EntityAttributes.GENERIC_ARMOR)); + } + + /** + * @see LivingEntity#modifyAppliedDamage(DamageSource, float) + */ + @SuppressWarnings("JavadocReference") + private static float protectionReduction(Entity player, float damage, DamageSource source) { + int protLevel = EnchantmentHelper.getProtectionAmount(player.getArmorItems(), source); + return DamageUtil.getInflictedDamage(damage, protLevel); + } + + /** + * @see LivingEntity#modifyAppliedDamage(DamageSource, float) + */ + @SuppressWarnings("JavadocReference") + private static float resistanceReduction(LivingEntity player, float damage) { + StatusEffectInstance resistance = StatusEffectHelper.getStatusEffect(player, StatusEffects.RESISTANCE); + if (resistance != null) { + int lvl = resistance.getAmplifier() + 1; + damage *= (1 - (lvl * 0.2f)); + } + + return Math.max(damage, 0); + } + + /** + * @see Explosion#getExposure(Vec3d, Entity) + */ + private static float getExposure(Vec3d source, Box box, @Nullable BlockPos override, @Nullable BlockState overrideState) { + double xStep = 1 / ((box.maxX - box.minX) * 2 + 1); + double yStep = 1 / ((box.maxY - box.minY) * 2 + 1); + + if (xStep > 0 && yStep > 0) { + int misses = 0; + int hits = 0; + + xStep = xStep * (box.maxX - box.minX); + yStep = yStep * (box.maxY - box.minY); + + double xOffset = (1 - Math.floor(1 / xStep) * xStep) / 2; + double zOffset = (1 - Math.floor(1 / yStep) * yStep) / 2; + + double startX = box.minX + xOffset; + double startY = box.minY; + double startZ = box.minZ + zOffset; + double endX = box.maxX + xOffset; + double endY = box.maxY; + double endZ = box.maxZ + zOffset; + + Vec3d position = new Vec3d(0, 0, 0); + + for (double x = startX; x <= endX; x += xStep) { + for (double y = startY; y <= endY; y += yStep) { + for (double z = startZ; z <= endZ; z += xStep) { + ((IVec3d) position).set(x, y, z); + + if ((override != null ? raycast(position, source, override, overrideState) : raycast(position, source)) == HitResult.Type.MISS) misses++; + + hits++; + } + } + } + + return (float) misses / hits; + } + + return 0f; + } + + /** + * @see BlockView#raycast(RaycastContext) + */ + private static HitResult.Type raycast(Vec3d start, Vec3d end) { + return BlockView.raycast(start, end, null, (_null, blockPos) -> { + BlockState blockState = mc.world.getBlockState(blockPos); + if (blockState.getBlock().getBlastResistance() < 600) return null; + + BlockHitResult hitResult = blockState.getCollisionShape(mc.world, blockPos).raycast(start, end, blockPos); + return hitResult == null ? null : hitResult.getType(); + }, (_null) -> HitResult.Type.MISS); + } + + + private static HitResult.Type raycast(Vec3d start, Vec3d end, BlockPos override, BlockState overrideState) { + return BlockView.raycast(start, end, null, (_null, blockPos) -> { + BlockState blockState; + if (blockPos.equals(override)) blockState = overrideState; + else { + blockState = mc.world.getBlockState(blockPos); + if (blockState.getBlock().getBlastResistance() < 600) return null; + } + + BlockHitResult hitResult = blockState.getCollisionShape(mc.world, blockPos).raycast(start, end, blockPos); + return hitResult == null ? null : hitResult.getType(); + }, (_null) -> HitResult.Type.MISS); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityAttributeHelper.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityAttributeHelper.java new file mode 100644 index 0000000000..367ce2dcf4 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityAttributeHelper.java @@ -0,0 +1,98 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.utils.entity; + +import com.google.common.collect.Multimap; +import meteordevelopment.meteorclient.mixin.ShulkerEntityAccessor; +import meteordevelopment.meteorclient.mixininterface.IAttributeContainer; +import meteordevelopment.meteorclient.mixininterface.IEntityAttributeInstance; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.EquipmentSlot; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.attribute.*; +import net.minecraft.entity.mob.ShulkerEntity; +import net.minecraft.item.ItemStack; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Function; + +public class EntityAttributeHelper { + /** + * @see LivingEntity#getAttributes() + */ + public static AttributeContainer getAttributes(LivingEntity entity) { + AttributeContainer attributes = new AttributeContainer(getDefaultForEntity(entity)); + + // Equipment + for (var equipmentSlot : EquipmentSlot.values()) { + ItemStack stack = entity.getEquippedStack(equipmentSlot); + attributes.addTemporaryModifiers(stack.getAttributeModifiers(equipmentSlot)); + } + + // Status effects + for (var statusEffect : StatusEffectHelper.getStatusEffects(entity)) { + statusEffect.getEffectType().onApplied(attributes, statusEffect.getAmplifier()); + } + + handleSpecialCases(entity, attributes::getCustomInstance); + + // Copy tracked attributes + ((IAttributeContainer) attributes).meteor$copyFrom(entity.getAttributes()); + + return attributes; + } + + /** + * @see LivingEntity#getAttributeInstance(EntityAttribute) + */ + public static EntityAttributeInstance getAttributeInstance(LivingEntity entity, EntityAttribute attribute) { + double baseValue = getDefaultForEntity(entity).getBaseValue(attribute); + EntityAttributeInstance attributeInstance = new EntityAttributeInstance(attribute, o1 -> {}); + attributeInstance.setBaseValue(baseValue); + + // Equipment + for (var equipmentSlot : EquipmentSlot.values()) { + ItemStack stack = entity.getEquippedStack(equipmentSlot); + Multimap modifiers = stack.getAttributeModifiers(equipmentSlot); + for (var modifier : modifiers.get(attribute)) attributeInstance.addTemporaryModifier(modifier); + } + + // Status effects + for (var statusEffect : StatusEffectHelper.getStatusEffects(entity)) { + AttributeModifierCreator factory = statusEffect.getEffectType().getAttributeModifiers().get(attribute); + if (factory != null) attributeInstance.addPersistentModifier(factory.createAttributeModifier(statusEffect.getAmplifier())); + } + + handleSpecialCases(entity, someAttribute -> someAttribute == attribute ? attributeInstance : null); + + // Copy tracked modifiers + EntityAttributeInstance trackedInstance = entity.getAttributeInstance(attribute); + if (trackedInstance != null) ((IEntityAttributeInstance) attributeInstance).meteor$copyFrom(trackedInstance); + + return attributeInstance; + } + + /** + * @see LivingEntity#getAttributeValue(EntityAttribute) + */ + public static double getAttributeValue(LivingEntity entity, EntityAttribute attribute) { + return getAttributeInstance(entity, attribute).getValue(); + } + + private static void handleSpecialCases(LivingEntity entity, Function consumer) { + if (entity instanceof ShulkerEntity shulkerEntity) { + if (shulkerEntity.getDataTracker().get(ShulkerEntityAccessor.meteor$getPeekAmount()) == 0) { + @Nullable EntityAttributeInstance attributeInstance = consumer.apply(EntityAttributes.GENERIC_ARMOR); + if (attributeInstance != null) attributeInstance.addPersistentModifier(ShulkerEntityAccessor.meteor$getCoveredArmorBonus()); + } + } + } + + @SuppressWarnings("unchecked") + private static DefaultAttributeContainer getDefaultForEntity(T entity) { + return DefaultAttributeRegistry.get((EntityType) entity.getType()); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/StatusEffectHelper.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/StatusEffectHelper.java new file mode 100644 index 0000000000..d809b89c87 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/utils/entity/StatusEffectHelper.java @@ -0,0 +1,44 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.utils.entity; + +import meteordevelopment.meteorclient.utils.entity.effects.EntityEffectCache; +import meteordevelopment.meteorclient.utils.entity.effects.StatusEffectBruteForce; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.effect.StatusEffect; +import net.minecraft.entity.effect.StatusEffectInstance; +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +import static meteordevelopment.meteorclient.MeteorClient.mc; + +public class StatusEffectHelper { + @Nullable + public static StatusEffectInstance getStatusEffect(LivingEntity entity, StatusEffect effect) { + if (entity == mc.player) return entity.getStatusEffect(effect); + EntityEffectCache container = StatusEffectBruteForce.fetch(entity); + return container == null ? null : container.statusEffects.get(effect); + } + + public static boolean hasStatusEffect(LivingEntity entity, StatusEffect effect) { + if (entity == mc.player) return entity.hasStatusEffect(effect); + EntityEffectCache container = StatusEffectBruteForce.fetch(entity); + return container != null && container.statusEffects.containsKey(effect); + } + + public static Collection getStatusEffects(LivingEntity entity) { + if (entity == mc.player) return entity.getStatusEffects(); + EntityEffectCache container = StatusEffectBruteForce.fetch(entity); + return container == null ? List.of() : container.statusEffects.values(); + } + + public static Map getActiveStatusEffects(LivingEntity entity) { + if (entity == mc.player) return entity.getActiveStatusEffects(); + EntityEffectCache container = StatusEffectBruteForce.fetch(entity); + return container == null ? Map.of() : container.statusEffects; + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/effects/EffectAttributeModifier.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/effects/EffectAttributeModifier.java new file mode 100644 index 0000000000..6245228704 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/utils/entity/effects/EffectAttributeModifier.java @@ -0,0 +1,30 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.utils.entity.effects; + +import net.minecraft.entity.attribute.EntityAttribute; +import net.minecraft.entity.attribute.EntityAttributes; +import net.minecraft.entity.effect.StatusEffect; +import net.minecraft.entity.effect.StatusEffects; + +import java.util.UUID; + +public record EffectAttributeModifier(StatusEffect effect, EntityAttribute attribute, UUID id, double value) { + private static final EffectAttributeModifier SPEED = new EffectAttributeModifier(StatusEffects.SPEED, EntityAttributes.GENERIC_MOVEMENT_SPEED, "91AEAA56-376B-4498-935B-2F7F68070635", 0.20000000298023224d); + private static final EffectAttributeModifier SLOWNESS = new EffectAttributeModifier(StatusEffects.SLOWNESS, EntityAttributes.GENERIC_MOVEMENT_SPEED, "7107DE5E-7CE8-4030-940E-514C1F160890", -0.15000000596046448d); + private static final EffectAttributeModifier HASTE = new EffectAttributeModifier(StatusEffects.HASTE, EntityAttributes.GENERIC_ATTACK_SPEED, "AF8B6E3F-3328-4C0A-AA36-5BA2BB9DBEF3", 0.10000000149011612d); + private static final EffectAttributeModifier MINING_FATIGUE = new EffectAttributeModifier(StatusEffects.MINING_FATIGUE, EntityAttributes.GENERIC_ATTACK_SPEED, "55FCED67-E92A-486E-9800-B47F202C4386", -0.10000000149011612d); + private static final EffectAttributeModifier HEALTH_BOOST = new EffectAttributeModifier(StatusEffects.HEALTH_BOOST, EntityAttributes.GENERIC_MAX_HEALTH, "5D6F0BA2-1186-46AC-B896-C61C5CEE99CC", 4d); + private static final EffectAttributeModifier LUCK = new EffectAttributeModifier(StatusEffects.LUCK, EntityAttributes.GENERIC_LUCK, "03C3C89D-7037-4B42-869F-B146BCB64D2E", 1d); + private static final EffectAttributeModifier UNLUCK = new EffectAttributeModifier(StatusEffects.UNLUCK, EntityAttributes.GENERIC_LUCK, "CC5AF142-2BD2-4215-B636-2605AED11727", -1d); + + public static final EffectAttributeModifier[] ALL = new EffectAttributeModifier[]{SPEED, SLOWNESS, HASTE, MINING_FATIGUE, HEALTH_BOOST, LUCK, UNLUCK}; + public static final EffectAttributeModifier[] BEACON = new EffectAttributeModifier[]{SPEED, HASTE}; + + private EffectAttributeModifier(StatusEffect effect, EntityAttribute attribute, String id, double value) { + this(effect, attribute, UUID.fromString(id), value); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/effects/EntityEffectCache.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/effects/EntityEffectCache.java new file mode 100644 index 0000000000..77a1993697 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/utils/entity/effects/EntityEffectCache.java @@ -0,0 +1,25 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.utils.entity.effects; + +import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap; +import net.minecraft.entity.effect.StatusEffect; +import net.minecraft.entity.effect.StatusEffectInstance; + +import java.util.Map; + +public class EntityEffectCache { + public final Map statusEffects = new Reference2ReferenceOpenHashMap<>(); + public int particleColor; + + public void add(StatusEffect effect, int amplifier) { + statusEffects.put(effect, new StatusEffectInstance(effect, amplifier - 1)); + } + + public void add(StatusEffect effect) { + add(effect, 1); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/effects/MutableParticleColor.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/effects/MutableParticleColor.java new file mode 100644 index 0000000000..779f5910e2 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/utils/entity/effects/MutableParticleColor.java @@ -0,0 +1,43 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.utils.entity.effects; + +import net.minecraft.entity.effect.StatusEffect; + +import java.util.Objects; + +public class MutableParticleColor { + public static final MutableParticleColor EMPTY = new MutableParticleColor(); + + public float r, g, b; + public int a; + + public void add(StatusEffect effect, int amplifier) { + int color = effect.getColor(); + r += (float)(amplifier * (color >> 16 & 255)) / 255.0F; + g += (float)(amplifier * (color >> 8 & 255)) / 255.0F; + b += (float)(amplifier * (color & 255)) / 255.0F; + a += amplifier; + } + + public void add(StatusEffect effect) { + add(effect, 1); + } + + @Override + public int hashCode() { + return Objects.hash(r, g, b, a); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj instanceof MutableParticleColor other) { + return r == other.r && g == other.g && b == other.b && a == other.a; + } + return false; + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/effects/StatusEffectBruteForce.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/effects/StatusEffectBruteForce.java new file mode 100644 index 0000000000..82a6522054 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/utils/entity/effects/StatusEffectBruteForce.java @@ -0,0 +1,242 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.utils.entity.effects; + +import com.google.common.collect.Sets; +import it.unimi.dsi.fastutil.ints.IntObjectImmutablePair; +import it.unimi.dsi.fastutil.ints.IntObjectPair; +import it.unimi.dsi.fastutil.objects.*; +import meteordevelopment.meteorclient.MeteorClient; +import meteordevelopment.meteorclient.events.game.GameLeftEvent; +import meteordevelopment.meteorclient.mixin.LivingEntityAccessor; +import meteordevelopment.meteorclient.utils.PreInit; +import meteordevelopment.meteorclient.utils.entity.StatusEffectHelper; +import meteordevelopment.orbit.EventHandler; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.attribute.AttributeContainer; +import net.minecraft.entity.data.TrackedData; +import net.minecraft.entity.effect.StatusEffect; +import net.minecraft.entity.effect.StatusEffectInstance; +import net.minecraft.entity.effect.StatusEffects; +import net.minecraft.registry.Registries; +import org.jetbrains.annotations.Nullable; + +import java.util.Map; +import java.util.Set; + +/** + * @implNote status effect amplifiers, which are usually zero-indexed, are one-indexed here for ease of maths :thumbs_up: + * @author Crosby + */ +public class StatusEffectBruteForce { + private static final TrackedData POTION_SWIRLS_COLOR = LivingEntityAccessor.meteor$getPotionSwirlsColor(); + private static final TrackedData POTION_SWRISL_AMBIENT = LivingEntityAccessor.meteor$getPotionSwirlsAmbient(); + private static final int EMPTY_COLOR = 3694022; + private static final int MAX_DEPTH = 4; + public static final Set ALL_ENTRIES = new ReferenceOpenHashSet<>(); + public static final Set BEACON_ENTRIES = new ReferenceOpenHashSet<>(); + private static final Map PLAYER_EFFECT_MAP = new Object2ObjectOpenHashMap<>(); + private static final Object2ObjectMap, Map> EFFECT_CACHE_MAP = new Object2ObjectOpenHashMap<>(); + private static final Set> NULL_COLORS = new ObjectOpenHashSet<>(); + + // status effects + + private static final StatusEffectEntry ABSORPTION = StatusEffectEntry.of(StatusEffects.ABSORPTION, 1); + private static final StatusEffectEntry ABSORPTION_STRONG = StatusEffectEntry.of(StatusEffects.ABSORPTION, 4); + + @PreInit + public static void initEntries() { + MeteorClient.EVENT_BUS.subscribe(StatusEffectHelper.class); + + BEACON_ENTRIES.add(StatusEffectEntry.of(StatusEffects.STRENGTH, 1)); + BEACON_ENTRIES.add(StatusEffectEntry.of(StatusEffects.STRENGTH, 2)); + BEACON_ENTRIES.add(StatusEffectEntry.of(StatusEffects.JUMP_BOOST, 1)); + BEACON_ENTRIES.add(StatusEffectEntry.of(StatusEffects.JUMP_BOOST, 2)); + BEACON_ENTRIES.add(StatusEffectEntry.of(StatusEffects.REGENERATION, 1)); + BEACON_ENTRIES.add(StatusEffectEntry.of(StatusEffects.REGENERATION, 2)); + BEACON_ENTRIES.add(StatusEffectEntry.of(StatusEffects.RESISTANCE, 1)); + BEACON_ENTRIES.add(StatusEffectEntry.of(StatusEffects.RESISTANCE, 2)); + + ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.SPEED, 1)); + ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.SPEED, 2)); + ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.SLOWNESS, 1)); + ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.SLOWNESS, 4)); + ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.SLOWNESS, 6)); + ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.HASTE, 1)); + ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.HASTE, 2)); + ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.MINING_FATIGUE, 1)); + ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.STRENGTH, 1)); + ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.STRENGTH, 2)); + ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.JUMP_BOOST, 1)); + ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.JUMP_BOOST, 2)); + ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.NAUSEA, 1)); + ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.REGENERATION, 1)); + ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.REGENERATION, 2)); + ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.RESISTANCE, 1)); + ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.RESISTANCE, 2)); + ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.FIRE_RESISTANCE, 1)); + ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.WATER_BREATHING, 1)); + ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.INVISIBILITY, 1)); + ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.BLINDNESS, 1)); + ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.NIGHT_VISION, 1)); + ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.HUNGER, 1)); + ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.WEAKNESS, 1)); + ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.POISON, 1)); + ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.POISON, 2)); + ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.WITHER, 1)); + ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.HEALTH_BOOST, 1)); + ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.ABSORPTION, 1)); + ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.ABSORPTION, 4)); + ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.GLOWING, 1)); + ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.LEVITATION, 1)); + ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.LUCK, 1)); + ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.UNLUCK, 1)); + ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.SLOW_FALLING, 1)); + ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.CONDUIT_POWER, 1)); + ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.DOLPHINS_GRACE, 1)); + ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.BAD_OMEN, 1)); + ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.HERO_OF_THE_VILLAGE, 1)); + ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.DARKNESS, 1)); + + for (var statusEffectEntry : Registries.STATUS_EFFECT.getEntrySet()) { + if (statusEffectEntry.getValue().isInstant()) continue; + IntObjectPair cacheKey = new IntObjectImmutablePair<>(statusEffectEntry.getValue().getColor(), MutableParticleColor.EMPTY); + EFFECT_CACHE_MAP.put(cacheKey, Map.of(statusEffectEntry.getValue(), new StatusEffectInstance(statusEffectEntry.getValue()))); + + // Primitive modded compat + if (!statusEffectEntry.getKey().getValue().getNamespace().equals("minecraft")) { + ALL_ENTRIES.add(StatusEffectEntry.of(statusEffectEntry.getValue(), 1)); + } + } + } + + /** + * Creates {@link EntityEffectCache} if missing, updates it if required. + */ + public static EntityEffectCache fetch(LivingEntity entity) { + int particleColor = entity.getDataTracker().get(POTION_SWIRLS_COLOR); + if (isEmpty(particleColor)) return null; + EntityEffectCache container = PLAYER_EFFECT_MAP.computeIfAbsent(entity, o -> new EntityEffectCache()); + if (particleColor != container.particleColor) update(particleColor, entity, container); + return container; + } + + @SuppressWarnings("UnstableApiUsage") + private static void update(int particleColor, LivingEntity entity, EntityEffectCache container) { + container.statusEffects.clear(); + container.particleColor = particleColor; + + MutableParticleColor initialColor = new MutableParticleColor(); + Set possibleEntries; + EffectAttributeModifier[] possibleModifiers; + + if (entity.getDataTracker().get(POTION_SWRISL_AMBIENT)) { // entity is only affected by effects from beacons + possibleEntries = BEACON_ENTRIES; + possibleModifiers = EffectAttributeModifier.BEACON; + } else { + // find status effects based on entity flags + if (entity.isGlowing()) { + initialColor.add(StatusEffects.GLOWING); + container.add(StatusEffects.GLOWING); + } + if (entity.isInvisible()) { + initialColor.add(StatusEffects.INVISIBILITY); + container.add(StatusEffects.INVISIBILITY); + } + + // find status effects based on tracked data + int absorptionLevel = Math.round(entity.getAbsorptionAmount() / 4f); + if (absorptionLevel <= 4) { + possibleEntries = new ReferenceOpenHashSet<>(ALL_ENTRIES); + possibleEntries.add(ABSORPTION_STRONG); + if (absorptionLevel <= 1) possibleEntries.add(ABSORPTION); + } else { + possibleEntries = ALL_ENTRIES; + } + + possibleModifiers = EffectAttributeModifier.ALL; + } + + // find status effects based on tracked attributes + AttributeContainer attributes = entity.getAttributes(); + for (var modifier : possibleModifiers) { + if (attributes.hasModifierForAttribute(modifier.attribute(), modifier.id())) { + double value = attributes.getModifierValue(modifier.attribute(), modifier.id()); + int amplifier = (int) Math.round(value / modifier.value()); + initialColor.add(modifier.effect(), amplifier); + container.add(modifier.effect(), amplifier); + } + } + + // In order to minimize collisions, we hash both the particle color, and the initial state (attributes, tracked data, etc.) via the initial color + IntObjectPair cacheKey = new IntObjectImmutablePair<>(particleColor, initialColor); + + // Map#computeIfAbsent(Object, Function) cannot cache null return values, so we use a separate cache for those + if (NULL_COLORS.contains(cacheKey)) return; + + @Nullable Map match = EFFECT_CACHE_MAP.computeIfAbsent(cacheKey, key -> { + for (int depth = 2; depth <= MAX_DEPTH; depth++) { + for (var combination : Sets.combinations(possibleEntries, depth)) { + int color = blend(initialColor, combination); + if (color == particleColor) { + // If the amplifiers of all applied effects match, then it cannot be inferred and should be assumed to be 1 + boolean assumeLowestAmplifier = combination.stream().mapToInt(o -> o.amplifier).reduce((i1, i2) -> i1 == i2 ? i1 : -1).orElse(-1) != -1; + + Map map = new Reference2ObjectOpenHashMap<>(); + + for (var entry : combination) { + map.put(entry.effect, new StatusEffectInstance(entry.effect, 0, assumeLowestAmplifier ? 0 : entry.amplifier - 1)); + } + + return map; + } + } + } + return null; + }); + if (match != null) container.statusEffects.putAll(match); + else NULL_COLORS.add(cacheKey); + } + + @EventHandler + private static void onLeave(GameLeftEvent event) { + PLAYER_EFFECT_MAP.clear(); + } + + private static boolean isEmpty(int particleColor) { + return particleColor == 0 || particleColor == EMPTY_COLOR; + } + + private static int blend(MutableParticleColor color, Iterable entries) { + float r = color.r; + float g = color.g; + float b = color.b; + int a = color.a; + + for (var entry : entries) { + r += entry.r; + g += entry.g; + b += entry.b; + a += entry.amplifier; + } + + r = r / (float) a * 255.0F; + g = g / (float) a * 255.0F; + b = b / (float) a * 255.0F; + + return (int) r << 16 | (int) g << 8 | (int) b; + } + + public record StatusEffectEntry(StatusEffect effect, int amplifier, float r, float g, float b) { + public static StatusEffectEntry of(StatusEffect effect, int amplifier) { + int color = effect.getColor(); + float r = (float)(amplifier * (color >> 16 & 255)) / 255.0F; + float g = (float)(amplifier * (color >> 8 & 255)) / 255.0F; + float b = (float)(amplifier * (color & 255)) / 255.0F; + return new StatusEffectEntry(effect, amplifier, r, g, b); + } + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/fakeplayer/FakePlayerEntity.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/fakeplayer/FakePlayerEntity.java index 381968a25a..858e65e862 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/entity/fakeplayer/FakePlayerEntity.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/entity/fakeplayer/FakePlayerEntity.java @@ -6,6 +6,7 @@ package meteordevelopment.meteorclient.utils.entity.fakeplayer; import com.mojang.authlib.GameProfile; +import meteordevelopment.meteorclient.utils.entity.EntityAttributeHelper; import net.minecraft.client.network.OtherClientPlayerEntity; import net.minecraft.client.network.PlayerListEntry; import net.minecraft.entity.player.PlayerEntity; @@ -33,7 +34,7 @@ public FakePlayerEntity(PlayerEntity player, String name, float health, boolean Byte playerModel = player.getDataTracker().get(PlayerEntity.PLAYER_MODEL_PARTS); dataTracker.set(PlayerEntity.PLAYER_MODEL_PARTS, playerModel); - getAttributes().setFrom(player.getAttributes()); + getAttributes().setFrom(EntityAttributeHelper.getAttributes(player)); setPose(player.getPose()); capeX = getX(); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/player/DamageUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/player/DamageUtils.java deleted file mode 100644 index 4c5870ce17..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/utils/player/DamageUtils.java +++ /dev/null @@ -1,274 +0,0 @@ -/* - * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). - * Copyright (c) Meteor Development. - */ - -package meteordevelopment.meteorclient.utils.player; - -import meteordevelopment.meteorclient.MeteorClient; -import meteordevelopment.meteorclient.events.game.GameJoinedEvent; -import meteordevelopment.meteorclient.mixininterface.IExplosion; -import meteordevelopment.meteorclient.mixininterface.IRaycastContext; -import meteordevelopment.meteorclient.mixininterface.IVec3d; -import meteordevelopment.meteorclient.utils.PreInit; -import meteordevelopment.meteorclient.utils.entity.EntityUtils; -import meteordevelopment.meteorclient.utils.entity.fakeplayer.FakePlayerEntity; -import meteordevelopment.orbit.EventHandler; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.entity.DamageUtil; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.attribute.EntityAttributes; -import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Items; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.hit.HitResult; -import net.minecraft.util.math.*; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.util.shape.VoxelShapes; -import net.minecraft.world.BlockView; -import net.minecraft.world.GameMode; -import net.minecraft.world.RaycastContext; -import net.minecraft.world.explosion.Explosion; - -import java.util.Objects; - -import static meteordevelopment.meteorclient.MeteorClient.mc; - -public class DamageUtils { - private static final Vec3d vec3d = new Vec3d(0, 0, 0); - private static Explosion explosion; - private static RaycastContext raycastContext; - - @PreInit - public static void init() { - MeteorClient.EVENT_BUS.subscribe(DamageUtils.class); - } - - @EventHandler - private static void onGameJoined(GameJoinedEvent event) { - explosion = new Explosion(mc.world, null, 0, 0, 0, 6, false, Explosion.DestructionType.DESTROY); - raycastContext = new RaycastContext(null, null, RaycastContext.ShapeType.COLLIDER, RaycastContext.FluidHandling.ANY, mc.player); - } - - // Crystal damage - - public static double crystalDamage(PlayerEntity player, Vec3d crystal, boolean predictMovement, BlockPos obsidianPos, boolean ignoreTerrain) { - if (player == null) return 0; - if (EntityUtils.getGameMode(player) == GameMode.CREATIVE && !(player instanceof FakePlayerEntity)) return 0; - - ((IVec3d) vec3d).set(player.getPos().x, player.getPos().y, player.getPos().z); - if (predictMovement) ((IVec3d) vec3d).set(vec3d.x + player.getVelocity().x, vec3d.y + player.getVelocity().y, vec3d.z + player.getVelocity().z); - - double modDistance = Math.sqrt(vec3d.squaredDistanceTo(crystal)); - if (modDistance > 12) return 0; - - double exposure = getExposure(crystal, player, predictMovement, raycastContext, obsidianPos, ignoreTerrain); - double impact = (1 - (modDistance / 12)) * exposure; - double damage = ((impact * impact + impact) / 2 * 7 * (6 * 2) + 1); - - damage = getDamageForDifficulty(damage); - damage = DamageUtil.getDamageLeft((float) damage, (float) player.getArmor(), (float) player.getAttributeInstance(EntityAttributes.GENERIC_ARMOR_TOUGHNESS).getValue()); - damage = resistanceReduction(player, damage); - - ((IExplosion) explosion).set(crystal, 6, false); - damage = blastProtReduction(player, damage, explosion); - - return damage < 0 ? 0 : damage; - } - - public static double crystalDamage(PlayerEntity player, Vec3d crystal) { - return crystalDamage(player, crystal, false, null, false); - } - - // Sword damage - - public static double getSwordDamage(PlayerEntity entity, boolean charged) { - // Get sword damage - double damage = 0; - if (charged) { - if (entity.getActiveItem().getItem() == Items.NETHERITE_SWORD) { - damage += 8; - } else if (entity.getActiveItem().getItem() == Items.DIAMOND_SWORD) { - damage += 7; - } else if (entity.getActiveItem().getItem() == Items.GOLDEN_SWORD) { - damage += 4; - } else if (entity.getActiveItem().getItem() == Items.IRON_SWORD) { - damage += 6; - } else if (entity.getActiveItem().getItem() == Items.STONE_SWORD) { - damage += 5; - } else if (entity.getActiveItem().getItem() == Items.WOODEN_SWORD) { - damage += 4; - } - damage *= 1.5; - } - - if (entity.getActiveItem().getEnchantments() != null) { - if (EnchantmentHelper.get(entity.getActiveItem()).containsKey(Enchantments.SHARPNESS)) { - int level = EnchantmentHelper.getLevel(Enchantments.SHARPNESS, entity.getActiveItem()); - damage += (0.5 * level) + 0.5; - } - } - - if (entity.getActiveStatusEffects().containsKey(StatusEffects.STRENGTH)) { - int strength = Objects.requireNonNull(entity.getStatusEffect(StatusEffects.STRENGTH)).getAmplifier() + 1; - damage += 3 * strength; - } - - // Reduce by resistance - damage = resistanceReduction(entity, damage); - - // Reduce by armour - damage = DamageUtil.getDamageLeft((float) damage, (float) entity.getArmor(), (float) entity.getAttributeInstance(EntityAttributes.GENERIC_ARMOR_TOUGHNESS).getValue()); - - // Reduce by enchants - damage = normalProtReduction(entity, damage); - - return damage < 0 ? 0 : damage; - } - - // Bed damage - - public static double bedDamage(LivingEntity player, Vec3d bed) { - if (player instanceof PlayerEntity && ((PlayerEntity) player).getAbilities().creativeMode) return 0; - - double modDistance = Math.sqrt(player.squaredDistanceTo(bed)); - if (modDistance > 10) return 0; - - double exposure = Explosion.getExposure(bed, player); - double impact = (1.0 - (modDistance / 10.0)) * exposure; - double damage = (impact * impact + impact) / 2 * 7 * (5 * 2) + 1; - - // Multiply damage by difficulty - damage = getDamageForDifficulty(damage); - - // Reduce by resistance - damage = resistanceReduction(player, damage); - - // Reduce by armour - damage = DamageUtil.getDamageLeft((float) damage, (float) player.getArmor(), (float) player.getAttributeInstance(EntityAttributes.GENERIC_ARMOR_TOUGHNESS).getValue()); - - // Reduce by enchants - ((IExplosion) explosion).set(bed, 5, true); - damage = blastProtReduction(player, damage, explosion); - - if (damage < 0) damage = 0; - return damage; - } - - // Anchor damage - - public static double anchorDamage(LivingEntity player, Vec3d anchor) { - mc.world.removeBlock(BlockPos.ofFloored(anchor), false); - double damage = bedDamage(player, anchor); - mc.world.setBlockState(BlockPos.ofFloored(anchor), Blocks.RESPAWN_ANCHOR.getDefaultState()); - return damage; - } - - // Utils - - private static double getDamageForDifficulty(double damage) { - return switch (mc.world.getDifficulty()) { - case PEACEFUL -> 0; - case EASY -> Math.min(damage / 2 + 1, damage); - case HARD -> damage * 3 / 2; - default -> damage; - }; - } - - private static double normalProtReduction(Entity player, double damage) { - int protLevel = EnchantmentHelper.getProtectionAmount(player.getArmorItems(), mc.world.getDamageSources().generic()); - if (protLevel > 20) protLevel = 20; - - damage *= 1 - (protLevel / 25.0); - return damage < 0 ? 0 : damage; - } - - private static double blastProtReduction(Entity player, double damage, Explosion explosion) { - int protLevel = EnchantmentHelper.getProtectionAmount(player.getArmorItems(), mc.world.getDamageSources().explosion(explosion)); - if (protLevel > 20) protLevel = 20; - - damage *= (1 - (protLevel / 25.0)); - return damage < 0 ? 0 : damage; - } - - private static double resistanceReduction(LivingEntity player, double damage) { - if (player.hasStatusEffect(StatusEffects.RESISTANCE)) { - int lvl = (player.getStatusEffect(StatusEffects.RESISTANCE).getAmplifier() + 1); - damage *= (1 - (lvl * 0.2)); - } - - return damage < 0 ? 0 : damage; - } - - private static double getExposure(Vec3d source, Entity entity, boolean predictMovement, RaycastContext raycastContext, BlockPos obsidianPos, boolean ignoreTerrain) { - Box box = entity.getBoundingBox(); - if (predictMovement) { - Vec3d v = entity.getVelocity(); - box = box.offset(v.x, v.y, v.z); - } - - double d = 1 / ((box.maxX - box.minX) * 2 + 1); - double e = 1 / ((box.maxY - box.minY) * 2 + 1); - double f = 1 / ((box.maxZ - box.minZ) * 2 + 1); - double g = (1 - Math.floor(1 / d) * d) / 2; - double h = (1 - Math.floor(1 / f) * f) / 2; - - if (!(d < 0) && !(e < 0) && !(f < 0)) { - int i = 0; - int j = 0; - - for (double k = 0; k <= 1; k += d) { - for (double l = 0; l <= 1; l += e) { - for (double m = 0; m <= 1; m += f) { - double n = MathHelper.lerp(k, box.minX, box.maxX); - double o = MathHelper.lerp(l, box.minY, box.maxY); - double p = MathHelper.lerp(m, box.minZ, box.maxZ); - - ((IVec3d) vec3d).set(n + g, o, p + h); - ((IRaycastContext) raycastContext).set(vec3d, source, RaycastContext.ShapeType.COLLIDER, RaycastContext.FluidHandling.NONE, entity); - - if (raycast(raycastContext, obsidianPos, ignoreTerrain).getType() == HitResult.Type.MISS) i++; - - j++; - } - } - } - - return (double) i / j; - } - - return 0; - } - - private static BlockHitResult raycast(RaycastContext context, BlockPos obsidianPos, boolean ignoreTerrain) { - return BlockView.raycast(context.getStart(), context.getEnd(), context, (raycastContext, blockPos) -> { - BlockState blockState; - if (blockPos.equals(obsidianPos)) blockState = Blocks.OBSIDIAN.getDefaultState(); - else { - blockState = mc.world.getBlockState(blockPos); - if (blockState.getBlock().getBlastResistance() < 600 && ignoreTerrain) blockState = Blocks.AIR.getDefaultState(); - } - - Vec3d vec3d = raycastContext.getStart(); - Vec3d vec3d2 = raycastContext.getEnd(); - - VoxelShape voxelShape = raycastContext.getBlockShape(blockState, mc.world, blockPos); - BlockHitResult blockHitResult = mc.world.raycastBlock(vec3d, vec3d2, blockPos, voxelShape, blockState); - VoxelShape voxelShape2 = VoxelShapes.empty(); - BlockHitResult blockHitResult2 = voxelShape2.raycast(vec3d, vec3d2, blockPos); - - double d = blockHitResult == null ? Double.MAX_VALUE : raycastContext.getStart().squaredDistanceTo(blockHitResult.getPos()); - double e = blockHitResult2 == null ? Double.MAX_VALUE : raycastContext.getStart().squaredDistanceTo(blockHitResult2.getPos()); - - return d <= e ? blockHitResult : blockHitResult2; - }, (raycastContext) -> { - Vec3d vec3d = raycastContext.getStart().subtract(raycastContext.getEnd()); - return BlockHitResult.createMissed(raycastContext.getEnd(), Direction.getFacing(vec3d.x, vec3d.y, vec3d.z), BlockPos.ofFloored(raycastContext.getEnd())); - }); - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/utils/player/PlayerUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/player/PlayerUtils.java index df40bf5cb3..203cd5340f 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/player/PlayerUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/player/PlayerUtils.java @@ -12,6 +12,7 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.movement.NoFall; import meteordevelopment.meteorclient.utils.Utils; +import meteordevelopment.meteorclient.utils.entity.DamageUtils; import meteordevelopment.meteorclient.utils.entity.EntityUtils; import meteordevelopment.meteorclient.utils.misc.text.TextUtils; import meteordevelopment.meteorclient.utils.render.color.Color; @@ -24,7 +25,6 @@ import net.minecraft.entity.decoration.EndCrystalEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.PotionItem; -import net.minecraft.item.SwordItem; import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket; import net.minecraft.util.hit.HitResult; import net.minecraft.util.math.BlockPos; @@ -178,26 +178,24 @@ public static boolean isInHole(boolean doubles) { return air < 2; } - public static double possibleHealthReductions() { + public static float possibleHealthReductions() { return possibleHealthReductions(true, true); } - public static double possibleHealthReductions(boolean entities, boolean fall) { - double damageTaken = 0; + public static float possibleHealthReductions(boolean entities, boolean fall) { + float damageTaken = 0; if (entities) { for (Entity entity : mc.world.getEntities()) { // Check for end crystals - if (entity instanceof EndCrystalEntity && damageTaken < DamageUtils.crystalDamage(mc.player, entity.getPos())) { - damageTaken = DamageUtils.crystalDamage(mc.player, entity.getPos()); + if (entity instanceof EndCrystalEntity) { + float crystalDamage = DamageUtils.crystalDamage(mc.player, entity.getPos()); + if (crystalDamage > damageTaken) damageTaken = crystalDamage; } // Check for players holding swords - else if (entity instanceof PlayerEntity && damageTaken < DamageUtils.getSwordDamage((PlayerEntity) entity, true)) { - if (!Friends.get().isFriend((PlayerEntity) entity) && isWithin(entity, 5)) { - if (((PlayerEntity) entity).getActiveItem().getItem() instanceof SwordItem) { - damageTaken = DamageUtils.getSwordDamage((PlayerEntity) entity, true); - } - } + else if (entity instanceof PlayerEntity player && !Friends.get().isFriend(player) && isWithin(entity, 5)) { + float attackDamage = DamageUtils.getAttackDamage(player, mc.player); + if (attackDamage > damageTaken) damageTaken = attackDamage; } } @@ -207,8 +205,9 @@ else if (entity instanceof PlayerEntity && damageTaken < DamageUtils.getSwordDam BlockPos bp = blockEntity.getPos(); Vec3d pos = new Vec3d(bp.getX(), bp.getY(), bp.getZ()); - if (blockEntity instanceof BedBlockEntity && damageTaken < DamageUtils.bedDamage(mc.player, pos)) { - damageTaken = DamageUtils.bedDamage(mc.player, pos); + if (blockEntity instanceof BedBlockEntity) { + float explosionDamage = DamageUtils.bedDamage(mc.player, pos); + if (explosionDamage > damageTaken) damageTaken = explosionDamage; } } } @@ -217,7 +216,7 @@ else if (entity instanceof PlayerEntity && damageTaken < DamageUtils.getSwordDam // Check for fall distance with water check if (fall) { if (!Modules.get().isActive(NoFall.class) && mc.player.fallDistance > 3) { - double damage = mc.player.fallDistance * 0.5; + float damage = DamageUtils.fallDamage(mc.player); if (damage > damageTaken && !EntityUtils.isAboveWater(mc.player)) { damageTaken = damage; @@ -344,7 +343,7 @@ public static GameMode getGameMode() { return playerListEntry.getGameMode(); } - public static double getTotalHealth() { + public static float getTotalHealth() { return mc.player.getHealth() + mc.player.getAbsorptionAmount(); } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java index abd4cff993..5e193df0ce 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java @@ -342,4 +342,11 @@ private static double getBlockBreakingSpeed(int slot, BlockState block) { return speed; } + + /** + * Mutates a {@link BlockPos.Mutable} around an origin + */ + public static BlockPos.Mutable mutateAround(BlockPos.Mutable mutable, BlockPos origin, int xOffset, int yOffset, int zOffset) { + return mutable.set(origin.getX() + xOffset, origin.getY() + yOffset, origin.getZ() + zOffset); + } } diff --git a/src/main/resources/meteor-client.mixins.json b/src/main/resources/meteor-client.mixins.json index 2e78a2126a..9b7cf81096 100644 --- a/src/main/resources/meteor-client.mixins.json +++ b/src/main/resources/meteor-client.mixins.json @@ -12,6 +12,7 @@ "AbstractFurnaceScreenMixin", "AbstractSignEditScreenAccessor", "ArmorFeatureRendererMixin", + "AttributeContainerMixin", "BackgroundRendererMixin", "BakedQuadMixin", "BannerBlockEntityRendererMixin", @@ -75,6 +76,7 @@ "EnchantingTableBlockEntityRendererMixin", "EndCrystalEntityRendererMixin", "EntityAccessor", + "EntityAttributeInstanceMixin", "EntityBucketItemAccessor", "EntityMixin", "EntityRenderDispatcherMixin", @@ -147,6 +149,7 @@ "SectionedEntityCacheAccessor", "ShapeIndexBufferAccessor", "ShulkerBoxBlockMixin", + "ShulkerEntityAccessor", "SignBlockEntityRendererMixin", "SimpleEntityLookupAccessor", "SimpleOptionMixin", From 4b2d1f3f98b6ecead41f2a44465eb49147a683d6 Mon Sep 17 00:00:00 2001 From: Big Iron <52252627+Big-Iron-Cheems@users.noreply.github.com> Date: Fri, 2 Feb 2024 22:40:45 +0100 Subject: [PATCH 187/357] Fix AutoBrewer crash (#4329) --- .../meteorclient/gui/widgets/WItemWithLabel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItemWithLabel.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItemWithLabel.java index bc8769b7aa..d41771301a 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItemWithLabel.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItemWithLabel.java @@ -46,7 +46,7 @@ private String getStringToAppend() { StatusEffectInstance effect = effects.get(0); if (effect.getAmplifier() > 0) str += "%d ".formatted(effect.getAmplifier() + 1); - str += "(%s)".formatted(StatusEffectUtil.getDurationText(effect, 1, mc.world.getTickManager().getTickRate()).getString()); + str += "(%s)".formatted(StatusEffectUtil.getDurationText(effect, 1, mc.world != null ? mc.world.getTickManager().getTickRate() : 20.0F).getString()); } } From a8e9dd7c4a23ee921b96ca7cbeeb4a389f3ba51b Mon Sep 17 00:00:00 2001 From: crazycat256 <63475640+crazycat256@users.noreply.github.com> Date: Sat, 3 Feb 2024 02:39:08 +0100 Subject: [PATCH 188/357] GuiMove improvements (#4282) --- .../meteorclient/mixin/ScreenMixin.java | 16 ++++++++++ .../systems/modules/movement/GUIMove.java | 31 ++++++++++++++----- 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ScreenMixin.java index ee67c6bdb5..3fb6f8ecc2 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ScreenMixin.java @@ -9,8 +9,10 @@ import meteordevelopment.meteorclient.commands.Commands; import meteordevelopment.meteorclient.systems.config.Config; import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.movement.GUIMove; import meteordevelopment.meteorclient.systems.modules.render.NoRender; import meteordevelopment.meteorclient.utils.Utils; +import net.minecraft.client.gui.screen.ChatScreen; import net.minecraft.client.gui.screen.Screen; import net.minecraft.text.Style; import org.spongepowered.asm.mixin.Mixin; @@ -19,6 +21,10 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import java.util.List; + +import static net.minecraft.client.util.InputUtil.*; + @Mixin(value = Screen.class, priority = 500) // needs to be before baritone public abstract class ScreenMixin { @Inject(method = "renderBackground", at = @At("HEAD"), cancellable = true) @@ -38,4 +44,14 @@ private void onRunCommand(Style style, CallbackInfoReturnable cir) { } } } + + @Inject(method = "keyPressed", at = @At("HEAD"), cancellable = true) + private void onKeyPressed(int keyCode, int scanCode, int modifiers, CallbackInfoReturnable info) { + 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(keyCode)) || (guiMove.disableSpace() && keyCode == GLFW_KEY_SPACE)) { + info.cancel(); + } + } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/GUIMove.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/GUIMove.java index 0c3bc94cca..f9ed75835a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/GUIMove.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/GUIMove.java @@ -7,6 +7,7 @@ import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.meteor.KeyEvent; +import meteordevelopment.meteorclient.events.render.Render3DEvent; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.gui.WidgetScreen; import meteordevelopment.meteorclient.mixin.CreativeInventoryScreenAccessor; @@ -86,7 +87,7 @@ public enum Screens { .min(0) .build() ); - + public GUIMove() { super(Categories.Movement, "gui-move", "Allows you to perform various actions while in GUIs."); } @@ -103,6 +104,13 @@ public void onDeactivate() { if (sprint.get()) set(mc.options.sprintKey, false); } + public boolean disableSpace() { + return isActive() && jump.get() && mc.options.jumpKey.isDefault(); + } + public boolean disableArrows() { + return isActive() && arrowsRotate.get(); + } + @EventHandler private void onTick(TickEvent.Pre event) { if (skip()) return; @@ -118,16 +126,25 @@ private void onTick(TickEvent.Pre event) { if (sneak.get()) set(mc.options.sneakKey, Input.isPressed(mc.options.sneakKey)); if (sprint.get()) set(mc.options.sprintKey, Input.isPressed(mc.options.sprintKey)); + } + + @EventHandler + private void onRender3D(Render3DEvent event) { + if (skip()) return; + if (screens.get() == Screens.GUI && !(mc.currentScreen instanceof WidgetScreen)) return; + if (screens.get() == Screens.Inventory && mc.currentScreen instanceof WidgetScreen) return; + + float rotationDelta = Math.min((float) (rotateSpeed.get() * event.frameTime * 20f), 100); + if (arrowsRotate.get()) { float yaw = mc.player.getYaw(); float pitch = mc.player.getPitch(); - for (int i = 0; i < (rotateSpeed.get() * 2); i++) { - if (Input.isKeyPressed(GLFW_KEY_LEFT)) yaw -= 0.5; - if (Input.isKeyPressed(GLFW_KEY_RIGHT)) yaw += 0.5; - if (Input.isKeyPressed(GLFW_KEY_UP)) pitch -= 0.5; - if (Input.isKeyPressed(GLFW_KEY_DOWN)) pitch += 0.5; - } + if (Input.isKeyPressed(GLFW_KEY_LEFT)) yaw -= rotationDelta; + if (Input.isKeyPressed(GLFW_KEY_RIGHT)) yaw += rotationDelta; + if (Input.isKeyPressed(GLFW_KEY_UP)) pitch -= rotationDelta; + if (Input.isKeyPressed(GLFW_KEY_DOWN)) pitch += rotationDelta; + pitch = MathHelper.clamp(pitch, -90, 90); From 20d44c17daf2614bbf9c3b5ff3b9be294ec6b378 Mon Sep 17 00:00:00 2001 From: crazycat256 <63475640+crazycat256@users.noreply.github.com> Date: Mon, 5 Feb 2024 01:02:50 +0100 Subject: [PATCH 189/357] Fix and improvement of the Scaffold module (#4326) --- .../meteorclient/mixin/PlayerEntityMixin.java | 2 + .../systems/modules/movement/Scaffold.java | 168 +++++++++--------- .../meteorclient/utils/world/BlockUtils.java | 27 +++ 3 files changed, 117 insertions(+), 80 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityMixin.java index ca2e96ba8a..66916b2273 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityMixin.java @@ -13,6 +13,7 @@ import meteordevelopment.meteorclient.systems.modules.movement.Anchor; import meteordevelopment.meteorclient.systems.modules.movement.Flight; import meteordevelopment.meteorclient.systems.modules.movement.NoSlow; +import meteordevelopment.meteorclient.systems.modules.movement.Scaffold; import meteordevelopment.meteorclient.systems.modules.player.SpeedMine; import meteordevelopment.meteorclient.utils.world.BlockUtils; import net.minecraft.block.BlockState; @@ -85,6 +86,7 @@ public void dontJump(CallbackInfo info) { Anchor module = Modules.get().get(Anchor.class); if (module.isActive() && module.cancelJump) info.cancel(); + else if (Modules.get().get(Scaffold.class).towering()) info.cancel(); } @ModifyReturnValue(method = "getMovementSpeed", at = @At("RETURN")) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Scaffold.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Scaffold.java index 6b009ec89a..ed77f35ab9 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Scaffold.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Scaffold.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.systems.modules.movement; +import com.google.common.collect.Streams; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.renderer.ShapeMode; import meteordevelopment.meteorclient.settings.*; @@ -22,7 +23,7 @@ import net.minecraft.item.BlockItem; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.util.math.Box; import net.minecraft.util.math.Vec3d; import java.util.ArrayList; @@ -53,9 +54,19 @@ public class Scaffold extends Module { .build() ); - private final Setting cancelVelocity = sgGeneral.add(new BoolSetting.Builder() - .name("cancel-velocity") - .description("Whether or not to cancel velocity when towering.") + private final Setting towerSpeed = sgGeneral.add(new DoubleSetting.Builder() + .name("tower-speed") + .description("The speed at which to tower.") + .defaultValue(0.5) + .min(0) + .sliderMax(1) + .visible(fastTower::get) + .build() + ); + + private final Setting whileMoving = sgGeneral.add(new BoolSetting.Builder() + .name("while-moving") + .description("Allows you to tower while moving.") .defaultValue(false) .visible(fastTower::get) .build() @@ -96,6 +107,16 @@ public class Scaffold extends Module { .build() ); + private final Setting aheadDistance = sgGeneral.add(new DoubleSetting.Builder() + .name("ahead-distance") + .description("How far ahead to place blocks.") + .defaultValue(0) + .min(0) + .sliderMax(1) + .visible(() -> !airPlace.get()) + .build() + ); + private final Setting placeRange = sgGeneral.add(new DoubleSetting.Builder() .name("closest-block-range") .description("How far can scaffold place blocks when you are in air.") @@ -159,88 +180,72 @@ public class Scaffold extends Module { ); private final BlockPos.Mutable bp = new BlockPos.Mutable(); - private final BlockPos.Mutable prevBp = new BlockPos.Mutable(); - - private boolean lastWasSneaking; - private double lastSneakingY; public Scaffold() { super(Categories.Movement, "scaffold", "Automatically places blocks under you."); } - @Override - public void onActivate() { - lastWasSneaking = mc.options.sneakKey.isPressed(); - if (lastWasSneaking) lastSneakingY = mc.player.getY(); - } @EventHandler private void onTick(TickEvent.Pre event) { if (onlyOnClick.get() && !mc.options.useKey.isPressed()) return; + Vec3d vec = mc.player.getPos().add(mc.player.getVelocity()).add(0, -0.75, 0); if (airPlace.get()) { - Vec3d vec = mc.player.getPos().add(mc.player.getVelocity()).add(0, -0.5f, 0); bp.set(vec.getX(), vec.getY(), vec.getZ()); - } else if (BlockUtils.getPlaceSide(mc.player.getBlockPos().down()) != null) { - bp.set(mc.player.getBlockPos().down()); } else { + Vec3d pos = mc.player.getPos(); + if (aheadDistance.get() != 0 && !towering() && !mc.world.getBlockState(mc.player.getBlockPos().down()).getCollisionShape(mc.world, mc.player.getBlockPos()).isEmpty()) { + Vec3d dir = Vec3d.fromPolar(0, mc.player.getYaw()).multiply(aheadDistance.get(), 0, aheadDistance.get()); + if (mc.options.forwardKey.isPressed()) pos = pos.add(dir.x, 0, dir.z); + if (mc.options.backKey.isPressed()) pos = pos.add(-dir.x, 0, -dir.z); + if (mc.options.leftKey.isPressed()) pos = pos.add(dir.z, 0, -dir.x); + if (mc.options.rightKey.isPressed()) pos = pos.add(-dir.z, 0, dir.x); + } + bp.set(pos.x, vec.y, pos.z); + } + if (mc.options.sneakKey.isPressed() && !mc.options.jumpKey.isPressed() && mc.player.getY() + vec.y > -1) { + bp.setY(bp.getY() - 1); + } + if (bp.getY() >= mc.player.getBlockPos().getY()) { + bp.setY(mc.player.getBlockPos().getY() - 1); + } + BlockPos targetBlock = bp.toImmutable(); + + if (!airPlace.get() && (BlockUtils.getPlaceSide(bp) == null)) { Vec3d pos = mc.player.getPos(); pos = pos.add(0, -0.98f, 0); pos.add(mc.player.getVelocity()); - if (!PlayerUtils.isWithin(prevBp, placeRange.get())) { - List blockPosArray = new ArrayList<>(); - - for (int x = (int) (mc.player.getX() - placeRange.get()); x < mc.player.getX() + placeRange.get(); x++) { - for (int z = (int) (mc.player.getZ() - placeRange.get()); z < mc.player.getZ() + placeRange.get(); z++) { - for (int y = (int) Math.max(mc.world.getBottomY(), mc.player.getY() - placeRange.get()); y < Math.min(mc.world.getTopY(), mc.player.getY() + placeRange.get()); y++) { - bp.set(x, y, z); - if (!mc.world.getBlockState(bp).isAir()) blockPosArray.add(new BlockPos(bp)); - } + List blockPosArray = new ArrayList<>(); + for (int x = (int) (mc.player.getX() - placeRange.get()); x < mc.player.getX() + placeRange.get(); x++) { + for (int z = (int) (mc.player.getZ() - placeRange.get()); z < mc.player.getZ() + placeRange.get(); z++) { + for (int y = (int) Math.max(mc.world.getBottomY(), mc.player.getY() - placeRange.get()); y < Math.min(mc.world.getTopY(), mc.player.getY() + placeRange.get()); y++) { + bp.set(x, y, z); + if (BlockUtils.getPlaceSide(bp) == null) continue; + if (!BlockUtils.canPlace(bp)) continue; + if (mc.player.getEyePos().squaredDistanceTo(Vec3d.ofCenter(bp.offset(BlockUtils.getClosestPlaceSide(bp)))) > 36) continue; + blockPosArray.add(new BlockPos(bp)); } } - if (blockPosArray.size() == 0) { - return; - } - - blockPosArray.sort(Comparator.comparingDouble(PlayerUtils::squaredDistanceTo)); - - prevBp.set(blockPosArray.get(0)); } - - Vec3d vecPrevBP = new Vec3d((double) prevBp.getX() + 0.5f, - (double) prevBp.getY() + 0.5f, - (double) prevBp.getZ() + 0.5f); - - Vec3d sub = pos.subtract(vecPrevBP); - Direction facing; - if (sub.getY() < -0.5f) { - facing = Direction.DOWN; - } else if (sub.getY() > 0.5f) { - facing = Direction.UP; - } else facing = Direction.getFacing(sub.getX(), 0, sub.getZ()); - - bp.set(prevBp.offset(facing)); - } - - // Move down if shifting - if (mc.options.sneakKey.isPressed() && !mc.options.jumpKey.isPressed()) { - if (lastSneakingY - mc.player.getY() < 0.1) { - lastWasSneaking = false; + if (blockPosArray.size() == 0) { return; } - } else { - lastWasSneaking = false; - } - if (!lastWasSneaking) lastSneakingY = mc.player.getY(); - fastTower(false, null); + blockPosArray.sort(Comparator.comparingDouble((blockPos) -> blockPos.getSquaredDistance(targetBlock))); + + bp.set(blockPosArray.get(0)); + } if (airPlace.get()) { List blocks = new ArrayList<>(); - for (int x = (int) (mc.player.getX() - radius.get()); x < mc.player.getX() + radius.get(); x++) { - for (int z = (int) (mc.player.getZ() - radius.get()); z < mc.player.getZ() + radius.get(); z++) { - blocks.add(BlockPos.ofFloored(x, mc.player.getY() - 0.5, z)); + for (int x = (int) (bp.getX() - radius.get()); x <= bp.getX() + radius.get(); x++) { + for (int z = (int) (bp.getZ() - radius.get()); z <= bp.getZ() + radius.get(); z++) { + BlockPos blockPos = BlockPos.ofFloored(x, bp.getY(), z); + if (mc.player.getPos().distanceTo(Vec3d.ofCenter(blockPos)) <= radius.get() || (x == bp.getX() && z == bp.getZ())) { + blocks.add(blockPos); + } } } @@ -249,7 +254,6 @@ private void onTick(TickEvent.Pre event) { int counter = 0; for (BlockPos block : blocks) { if (place(block)) { - fastTower(true, block); counter++; } @@ -259,9 +263,23 @@ private void onTick(TickEvent.Pre event) { } } } else { - if (place(bp)) fastTower(true, bp); - if (!mc.world.getBlockState(bp).isAir()) { - prevBp.set(bp); + place(bp); + } + + FindItemResult result = InvUtils.findInHotbar(itemStack -> validItem(itemStack, bp)); + if (fastTower.get() && mc.options.jumpKey.isPressed() && !mc.options.sneakKey.isPressed() && result.found() && (autoSwitch.get() || result.getHand() != null)) { + Vec3d velocity = mc.player.getVelocity(); + Box playerBox = mc.player.getBoundingBox(); + if (Streams.stream(mc.world.getBlockCollisions(mc.player, playerBox.offset(0, 1, 0))).toList().isEmpty()) { + // If there is no block above the player: move the player up, so he can place another block + if (whileMoving.get() || !PlayerUtils.isMoving()) { + velocity = new Vec3d(velocity.x, towerSpeed.get(), velocity.z); + } + mc.player.setVelocity(velocity); + } else { + // If there is a block above the player: move the player down, so he's on top of the placed block + mc.player.setVelocity(velocity.x, Math.ceil(mc.player.getY()) - mc.player.getY(), velocity.z); + mc.player.setOnGround(true); } } } @@ -270,6 +288,12 @@ public boolean scaffolding() { return isActive() && (!onlyOnClick.get() || (onlyOnClick.get() && mc.options.useKey.isPressed())); } + public boolean towering() { + FindItemResult result = InvUtils.findInHotbar(itemStack -> validItem(itemStack, bp)); + return scaffolding() && fastTower.get() && mc.options.jumpKey.isPressed() && !mc.options.sneakKey.isPressed() && + (whileMoving.get() || !PlayerUtils.isMoving()) && result.found() && (autoSwitch.get() || result.getHand() != null); + } + private boolean validItem(ItemStack itemStack, BlockPos pos) { if (!(itemStack.getItem() instanceof BlockItem)) return false; @@ -297,22 +321,6 @@ private boolean place(BlockPos bp) { return false; } - private void fastTower(boolean down, BlockPos checkBlock) { - if (down) { - // Move player down so they are on top of the placed block ready to jump again - if (fastTower.get() && mc.options.jumpKey.isPressed() && !mc.options.sneakKey.isPressed() && !mc.player.isOnGround()) { - // The chunk hasn't updated yet so we check the block we were standing on - if (!mc.world.getBlockState(checkBlock.down()).isReplaceable()) - mc.player.setVelocity(0, -0.28f, 0); - } - } else { - if (mc.options.jumpKey.isPressed() && !mc.options.sneakKey.isPressed() && fastTower.get() && InvUtils.testInHotbar(stack -> validItem(stack, mc.player.getBlockPos()))) { - Vec3d vel = mc.player.getVelocity(); - mc.player.setVelocity(cancelVelocity.get() ? 0 : vel.x, 0.42, cancelVelocity.get() ? 0 : vel.z); - } - } - } - public enum ListMode { Whitelist, Blacklist diff --git a/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java index 5e193df0ce..4149068d9b 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java @@ -162,6 +162,33 @@ public static Direction getPlaceSide(BlockPos blockPos) { return null; } + public static Direction getClosestPlaceSide(BlockPos blockPos) { + return getClosestPlaceSide(blockPos, mc.player.getEyePos()); + } + public static Direction getClosestPlaceSide(BlockPos blockPos, Vec3d pos) { + Direction closestSide = null; + double closestDistance = Double.MAX_VALUE; + + for (Direction side : Direction.values()) { + BlockPos neighbor = blockPos.offset(side); + BlockState state = mc.world.getBlockState(neighbor); + + // Check if neighbour isn't empty + if (state.isAir() || isClickable(state.getBlock())) continue; + + // Check if neighbour is a fluid + if (!state.getFluidState().isEmpty()) continue; + + double distance = pos.squaredDistanceTo(neighbor.getX(), neighbor.getY(), neighbor.getZ()); + if (distance < closestDistance) { + closestDistance = distance; + closestSide = side; + } + } + + return closestSide; + } + // Breaking @EventHandler(priority = EventPriority.HIGHEST + 100) From 4260f7c0af660a9aba81b787ef5e547393c235bd Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Mon, 5 Feb 2024 07:37:31 -0500 Subject: [PATCH 190/357] Damage utils patch 1 (#4384) --- .../meteorclient/utils/entity/DamageUtils.java | 2 +- .../utils/entity/effects/StatusEffectBruteForce.java | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/DamageUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/DamageUtils.java index 21eea15e72..55479ff535 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/entity/DamageUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/entity/DamageUtils.java @@ -114,7 +114,7 @@ public static float fallDamage(LivingEntity entity) { if (StatusEffectHelper.hasStatusEffect(entity, StatusEffects.SLOW_FALLING) || StatusEffectHelper.hasStatusEffect(entity, StatusEffects.LEVITATION)) return 0f; // Fast path - Above the surface - int surface = mc.world.getWorldChunk(entity.getBlockPos()).getHeightmap(Heightmap.Type.MOTION_BLOCKING).get(entity.getBlockX(), entity.getBlockZ()); + int surface = mc.world.getWorldChunk(entity.getBlockPos()).getHeightmap(Heightmap.Type.MOTION_BLOCKING).get(entity.getBlockX() & 15, entity.getBlockZ() & 15); if (entity.getBlockY() >= surface) return fallDamageReductions(entity, surface); // Under the surface diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/effects/StatusEffectBruteForce.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/effects/StatusEffectBruteForce.java index 82a6522054..5fc8ab19a6 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/entity/effects/StatusEffectBruteForce.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/entity/effects/StatusEffectBruteForce.java @@ -88,8 +88,6 @@ public static void initEntries() { ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.POISON, 2)); ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.WITHER, 1)); ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.HEALTH_BOOST, 1)); - ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.ABSORPTION, 1)); - ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.ABSORPTION, 4)); ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.GLOWING, 1)); ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.LEVITATION, 1)); ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.LUCK, 1)); @@ -124,7 +122,6 @@ public static EntityEffectCache fetch(LivingEntity entity) { return container; } - @SuppressWarnings("UnstableApiUsage") private static void update(int particleColor, LivingEntity entity, EntityEffectCache container) { container.statusEffects.clear(); container.particleColor = particleColor; From e5fc8e689eacf9e18bb266a703f1044c0d981303 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Mon, 15 Jan 2024 12:25:42 -0500 Subject: [PATCH 191/357] singleton command arguments --- .../commands/arguments/CompoundNbtTagArgumentType.java | 5 ++++- .../commands/arguments/DirectionArgumentType.java | 4 +++- .../commands/arguments/FakePlayerArgumentType.java | 5 ++++- .../meteorclient/commands/arguments/FriendArgumentType.java | 5 ++++- .../meteorclient/commands/arguments/MacroArgumentType.java | 5 ++++- .../meteorclient/commands/arguments/ModuleArgumentType.java | 5 ++++- .../commands/arguments/NotebotSongArgumentType.java | 6 +++++- .../meteorclient/commands/arguments/PlayerArgumentType.java | 5 ++++- .../commands/arguments/PlayerListEntryArgumentType.java | 5 ++++- .../commands/arguments/ProfileArgumentType.java | 5 ++++- .../commands/arguments/SettingArgumentType.java | 5 ++++- .../commands/arguments/SettingValueArgumentType.java | 6 +++++- .../commands/arguments/WaypointArgumentType.java | 6 ++++-- .../meteorclient/commands/commands/NbtCommand.java | 2 +- 14 files changed, 54 insertions(+), 15 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/arguments/CompoundNbtTagArgumentType.java b/src/main/java/meteordevelopment/meteorclient/commands/arguments/CompoundNbtTagArgumentType.java index b31e69d7ae..4a36a93677 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/arguments/CompoundNbtTagArgumentType.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/arguments/CompoundNbtTagArgumentType.java @@ -18,16 +18,19 @@ import static net.minecraft.nbt.StringNbtReader.EXPECTED_VALUE; public class CompoundNbtTagArgumentType implements ArgumentType { + private static final CompoundNbtTagArgumentType INSTANCE = new CompoundNbtTagArgumentType(); private static final Collection EXAMPLES = Arrays.asList("{foo:bar}", "{foo:[aa, bb],bar:15}"); public static CompoundNbtTagArgumentType create() { - return new CompoundNbtTagArgumentType(); + return INSTANCE; } public static NbtCompound get(CommandContext context) { return context.getArgument("nbt", NbtCompound.class); } + private CompoundNbtTagArgumentType() {} + @Override public NbtCompound parse(StringReader reader) throws CommandSyntaxException { reader.skipWhitespace(); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/arguments/DirectionArgumentType.java b/src/main/java/meteordevelopment/meteorclient/commands/arguments/DirectionArgumentType.java index 8cb2cb1932..d50efe6797 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/arguments/DirectionArgumentType.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/arguments/DirectionArgumentType.java @@ -9,11 +9,13 @@ import net.minecraft.util.math.Direction; public class DirectionArgumentType extends EnumArgumentType { + private static final DirectionArgumentType INSTANCE = new DirectionArgumentType(); + private DirectionArgumentType() { super(Direction.CODEC, Direction::values); } public static DirectionArgumentType create() { - return new DirectionArgumentType(); + return INSTANCE; } } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/arguments/FakePlayerArgumentType.java b/src/main/java/meteordevelopment/meteorclient/commands/arguments/FakePlayerArgumentType.java index 2ba92b3409..948447377d 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/arguments/FakePlayerArgumentType.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/arguments/FakePlayerArgumentType.java @@ -21,16 +21,19 @@ import static net.minecraft.command.CommandSource.suggestMatching; public class FakePlayerArgumentType implements ArgumentType { + private static final FakePlayerArgumentType INSTANCE = new FakePlayerArgumentType(); private static final Collection EXAMPLES = List.of("seasnail8169", "MineGame159"); public static FakePlayerArgumentType create() { - return new FakePlayerArgumentType(); + return INSTANCE; } public static FakePlayerEntity get(CommandContext context) { return FakePlayerManager.get(context.getArgument("fp", String.class)); } + private FakePlayerArgumentType() {} + @Override public String parse(StringReader reader) throws CommandSyntaxException { return reader.readString(); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/arguments/FriendArgumentType.java b/src/main/java/meteordevelopment/meteorclient/commands/arguments/FriendArgumentType.java index c306fdd51c..e236bdf789 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/arguments/FriendArgumentType.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/arguments/FriendArgumentType.java @@ -22,16 +22,19 @@ import static net.minecraft.command.CommandSource.suggestMatching; public class FriendArgumentType implements ArgumentType { + private static final FriendArgumentType INSTANCE = new FriendArgumentType(); private static final Collection EXAMPLES = List.of("seasnail8169", "MineGame159"); public static FriendArgumentType create() { - return new FriendArgumentType(); + return INSTANCE; } public static Friend get(CommandContext context) { return Friends.get().get(context.getArgument("friend", String.class)); } + private FriendArgumentType() {} + @Override public String parse(StringReader reader) throws CommandSyntaxException { return reader.readString(); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/arguments/MacroArgumentType.java b/src/main/java/meteordevelopment/meteorclient/commands/arguments/MacroArgumentType.java index 9307451c6b..09a3d6ee58 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/arguments/MacroArgumentType.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/arguments/MacroArgumentType.java @@ -22,16 +22,19 @@ import java.util.stream.Collectors; 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.")); public static MacroArgumentType create() { - return new MacroArgumentType(); + return INSTANCE; } public static Macro get(CommandContext context) { return context.getArgument("macro", Macro.class); } + private MacroArgumentType() {} + @Override public Macro parse(StringReader reader) throws CommandSyntaxException { String argument = reader.readString(); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/arguments/ModuleArgumentType.java b/src/main/java/meteordevelopment/meteorclient/commands/arguments/ModuleArgumentType.java index 5c24f6c79b..727cedcdcc 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/arguments/ModuleArgumentType.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/arguments/ModuleArgumentType.java @@ -22,6 +22,7 @@ import java.util.stream.Collectors; 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 Collection EXAMPLES = Modules.get().getAll() @@ -31,13 +32,15 @@ public class ModuleArgumentType implements ArgumentType { .collect(Collectors.toList()); public static ModuleArgumentType create() { - return new ModuleArgumentType(); + return INSTANCE; } public static Module get(CommandContext context) { return context.getArgument("module", Module.class); } + private ModuleArgumentType() {} + @Override public Module parse(StringReader reader) throws CommandSyntaxException { String argument = reader.readString(); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/arguments/NotebotSongArgumentType.java b/src/main/java/meteordevelopment/meteorclient/commands/arguments/NotebotSongArgumentType.java index a746f98de1..370689917c 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/arguments/NotebotSongArgumentType.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/arguments/NotebotSongArgumentType.java @@ -21,10 +21,14 @@ import java.util.concurrent.CompletableFuture; public class NotebotSongArgumentType implements ArgumentType { + private static final NotebotSongArgumentType INSTANCE = new NotebotSongArgumentType(); + public static NotebotSongArgumentType create() { - return new NotebotSongArgumentType(); + return INSTANCE; } + private NotebotSongArgumentType() {} + @Override public Path parse(StringReader reader) throws CommandSyntaxException { final String text = reader.getRemaining(); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/arguments/PlayerArgumentType.java b/src/main/java/meteordevelopment/meteorclient/commands/arguments/PlayerArgumentType.java index 10472f55c6..d579ac27bc 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/arguments/PlayerArgumentType.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/arguments/PlayerArgumentType.java @@ -23,18 +23,21 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; 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 Collection EXAMPLES = List.of("seasnail8169", "MineGame159"); public static PlayerArgumentType create() { - return new PlayerArgumentType(); + return INSTANCE; } public static PlayerEntity get(CommandContext context) { return context.getArgument("player", PlayerEntity.class); } + private PlayerArgumentType() {} + @Override public PlayerEntity parse(StringReader reader) throws CommandSyntaxException { String argument = reader.readString(); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/arguments/PlayerListEntryArgumentType.java b/src/main/java/meteordevelopment/meteorclient/commands/arguments/PlayerListEntryArgumentType.java index 9bf46dee7c..db7c3eae36 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/arguments/PlayerListEntryArgumentType.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/arguments/PlayerListEntryArgumentType.java @@ -23,18 +23,21 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; 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 Collection EXAMPLES = List.of("seasnail8169", "MineGame159"); public static PlayerListEntryArgumentType create() { - return new PlayerListEntryArgumentType(); + return INSTANCE; } public static PlayerListEntry get(CommandContext context) { return context.getArgument("player", PlayerListEntry.class); } + private PlayerListEntryArgumentType() {} + @Override public PlayerListEntry parse(StringReader reader) throws CommandSyntaxException { String argument = reader.readString(); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/arguments/ProfileArgumentType.java b/src/main/java/meteordevelopment/meteorclient/commands/arguments/ProfileArgumentType.java index 6c996e42f5..56fb09e8dd 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/arguments/ProfileArgumentType.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/arguments/ProfileArgumentType.java @@ -24,18 +24,21 @@ import static net.minecraft.command.CommandSource.suggestMatching; 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 Collection EXAMPLES = List.of("pvp.meteorclient.com", "anarchy"); public static ProfileArgumentType create() { - return new ProfileArgumentType(); + return INSTANCE; } public static Profile get(CommandContext context) { return Profiles.get().get(context.getArgument("profile", String.class)); } + private ProfileArgumentType() {} + @Override public String parse(StringReader reader) throws CommandSyntaxException { String argument = reader.getRemaining(); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/arguments/SettingArgumentType.java b/src/main/java/meteordevelopment/meteorclient/commands/arguments/SettingArgumentType.java index 0d3cc90204..2bfc08c3a6 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/arguments/SettingArgumentType.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/arguments/SettingArgumentType.java @@ -22,10 +22,11 @@ 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 + "'.")); public static SettingArgumentType create() { - return new SettingArgumentType(); + return INSTANCE; } public static Setting get(CommandContext context) throws CommandSyntaxException { @@ -38,6 +39,8 @@ public static Setting get(CommandContext context) throws CommandSyntaxExce return setting; } + private SettingArgumentType() {} + @Override public String parse(StringReader reader) throws CommandSyntaxException { return reader.readString(); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/arguments/SettingValueArgumentType.java b/src/main/java/meteordevelopment/meteorclient/commands/arguments/SettingValueArgumentType.java index b464846c58..e7267dce71 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/arguments/SettingValueArgumentType.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/arguments/SettingValueArgumentType.java @@ -18,14 +18,18 @@ import java.util.concurrent.CompletableFuture; public class SettingValueArgumentType implements ArgumentType { + private static final SettingValueArgumentType INSTANCE = new SettingValueArgumentType(); + public static SettingValueArgumentType create() { - return new SettingValueArgumentType(); + return INSTANCE; } public static String get(CommandContext context) { return context.getArgument("value", String.class); } + private SettingValueArgumentType() {} + @Override public String parse(StringReader reader) throws CommandSyntaxException { String text = reader.getRemaining(); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/arguments/WaypointArgumentType.java b/src/main/java/meteordevelopment/meteorclient/commands/arguments/WaypointArgumentType.java index ef5d6231c6..ee5d2cbce5 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/arguments/WaypointArgumentType.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/arguments/WaypointArgumentType.java @@ -23,6 +23,8 @@ import java.util.concurrent.CompletableFuture; 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 final boolean greedyString; @@ -31,11 +33,11 @@ private WaypointArgumentType(boolean greedyString) { } public static WaypointArgumentType create() { - return new WaypointArgumentType(true); + return GREEDY; } public static WaypointArgumentType create(boolean greedy) { - return new WaypointArgumentType(greedy); + return greedy ? GREEDY : QUOTED; } public static Waypoint get(CommandContext context) { diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/NbtCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/NbtCommand.java index b1890925f8..49ee8d36a1 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/NbtCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/NbtCommand.java @@ -135,7 +135,7 @@ public void build(LiteralArgumentBuilder builder) { ItemStack stack = mc.player.getInventory().getMainHandStack(); if (validBasic(stack)) { - stack.setNbt(new CompoundNbtTagArgumentType().parse(new StringReader(mc.keyboard.getClipboard()))); + stack.setNbt(CompoundNbtTagArgumentType.create().parse(new StringReader(mc.keyboard.getClipboard()))); setStack(stack); } From d7ad6bba3e9acbfe20dd7e7a5e5a199ce118069d Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Mon, 5 Feb 2024 20:38:41 +0000 Subject: [PATCH 192/357] Clean up anti hunger Made it always disable in water because it's impossible to avoid taking hunger while moving in water --- .../systems/modules/player/AntiHunger.java | 45 ++++++------------- 1 file changed, 13 insertions(+), 32 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AntiHunger.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AntiHunger.java index 3365d6203f..d54354cab0 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AntiHunger.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AntiHunger.java @@ -34,16 +34,7 @@ public class AntiHunger extends Module { .build() ); - private final Setting waterCheck = sgGeneral.add(new BoolSetting.Builder() - .name("water-check") - .description("Pauses the module if you are in water") - .defaultValue(true) - .build() - ); - - private boolean lastOnGround; - private boolean sendOnGroundTruePacket; - private boolean ignorePacket; + private boolean lastOnGround, ignorePacket; public AntiHunger() { super(Categories.Player, "anti-hunger", "Reduces (does NOT remove) hunger consumption."); @@ -52,40 +43,30 @@ public AntiHunger() { @Override public void onActivate() { lastOnGround = mc.player.isOnGround(); - sendOnGroundTruePacket = true; } @EventHandler private void onSendPacket(PacketEvent.Send event) { - if (ignorePacket) return; + if (ignorePacket) { + ignorePacket = false; + return; + } - if (event.packet instanceof ClientCommandC2SPacket && sprint.get()) { - ClientCommandC2SPacket.Mode mode = ((ClientCommandC2SPacket) event.packet).getMode(); + if (mc.player.hasVehicle() || mc.player.isTouchingWater() || mc.player.isSubmergedInWater()) return; - if (mode == ClientCommandC2SPacket.Mode.START_SPRINTING) { - event.cancel(); - } + if (event.packet instanceof ClientCommandC2SPacket packet && sprint.get()) { + if (packet.getMode() == ClientCommandC2SPacket.Mode.START_SPRINTING) event.cancel(); } - if (event.packet instanceof PlayerMoveC2SPacket && onGround.get() && mc.player.isOnGround() && mc.player.fallDistance <= 0.0 && !mc.interactionManager.isBreakingBlock()) { - ((PlayerMoveC2SPacketAccessor) event.packet).setOnGround(false); + if (event.packet instanceof PlayerMoveC2SPacket packet && onGround.get() && mc.player.isOnGround() && mc.player.fallDistance <= 0.0 && !mc.interactionManager.isBreakingBlock()) { + ((PlayerMoveC2SPacketAccessor) packet).setOnGround(false); } } @EventHandler - private void onTick(TickEvent.Post event) { - if (waterCheck.get() && mc.player.isTouchingWater()) { - ignorePacket = true; - return; - } - if (mc.player.isOnGround() && !lastOnGround && !sendOnGroundTruePacket) sendOnGroundTruePacket = true; - - if (mc.player.isOnGround() && sendOnGroundTruePacket && onGround.get()) { - ignorePacket = true; - mc.getNetworkHandler().sendPacket(new PlayerMoveC2SPacket.OnGroundOnly(true)); - ignorePacket = false; - - sendOnGroundTruePacket = false; + private void onTick(TickEvent.Pre event) { + if (mc.player.isOnGround() && !lastOnGround && onGround.get()) { + ignorePacket = true; // prevents you from not taking fall damage } lastOnGround = mc.player.isOnGround(); From 7aa93ab712dad21fe3d43911146d03cd603a71df Mon Sep 17 00:00:00 2001 From: Wide-Cat <74723656+Wide-Cat@users.noreply.github.com> Date: Thu, 8 Feb 2024 19:54:48 +0000 Subject: [PATCH 193/357] Update installation link --- launch/src/main/java/meteordevelopment/meteorclient/Main.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launch/src/main/java/meteordevelopment/meteorclient/Main.java b/launch/src/main/java/meteordevelopment/meteorclient/Main.java index b65233ae08..b58a11a321 100644 --- a/launch/src/main/java/meteordevelopment/meteorclient/Main.java +++ b/launch/src/main/java/meteordevelopment/meteorclient/Main.java @@ -28,7 +28,7 @@ public static void main(String[] args) throws UnsupportedLookAndFeelException, C ); switch (option) { - case 0: getOS().open("https://meteorclient.com/installation"); break; + case 0: getOS().open("https://meteorclient.com/faq/installation"); break; case 1: { String path; From 3fcbc3d1b7d9b23706b5098aeb9aab4425f8303e Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Thu, 8 Feb 2024 15:00:20 -0500 Subject: [PATCH 194/357] Optimize names (#4393) --- .../gui/DefaultSettingsWidgetFactory.java | 3 ++- .../screens/settings/PotionSettingScreen.java | 3 ++- .../gui/widgets/WItemWithLabel.java | 3 ++- .../systems/modules/render/Nametags.java | 3 ++- .../systems/modules/world/AutoBrewer.java | 3 ++- .../meteorclient/utils/Utils.java | 3 ++- .../meteorclient/utils/misc/Names.java | 17 ++++++++++++----- 7 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java b/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java index 6b2d2152fc..094c9629b0 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java @@ -24,6 +24,7 @@ import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.render.color.SettingColor; +import net.minecraft.client.resource.language.I18n; import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; @@ -343,7 +344,7 @@ 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, setting.get().potion.getName().getString())).widget(); + WItemWithLabel item = list.add(theme.itemWithLabel(setting.get().potion, I18n.translate(setting.get().potion.getTranslationKey()))).widget(); WButton button = list.add(theme.button("Select")).expandCellX().widget(); button.action = () -> { 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 36a2868246..db4612882e 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/PotionSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/PotionSettingScreen.java @@ -11,6 +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; public class PotionSettingScreen extends WindowScreen { private final PotionSetting setting; @@ -26,7 +27,7 @@ public void initWidgets() { WTable table = add(theme.table()).expandX().widget(); for (MyPotion potion : MyPotion.values()) { - table.add(theme.itemWithLabel(potion.potion, potion.potion.getName().getString())); + table.add(theme.itemWithLabel(potion.potion, I18n.translate(potion.potion.getTranslationKey()))); WButton select = table.add(theme.button("Select")).widget(); select.action = () -> { diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItemWithLabel.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItemWithLabel.java index d41771301a..017ae3ffca 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItemWithLabel.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItemWithLabel.java @@ -6,6 +6,7 @@ package meteordevelopment.meteorclient.gui.widgets; import meteordevelopment.meteorclient.gui.widgets.containers.WHorizontalList; +import meteordevelopment.meteorclient.utils.misc.Names; import net.minecraft.entity.effect.StatusEffectInstance; import net.minecraft.entity.effect.StatusEffectUtil; import net.minecraft.item.ItemStack; @@ -57,7 +58,7 @@ public void set(ItemStack itemStack) { this.itemStack = itemStack; item.itemStack = itemStack; - name = itemStack.getName().getString(); + name = Names.get(itemStack); label.set(name + getStringToAppend()); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java index 79d51bc625..56ffb1e503 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java @@ -18,6 +18,7 @@ import meteordevelopment.meteorclient.systems.modules.misc.NameProtect; import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.entity.EntityUtils; +import meteordevelopment.meteorclient.utils.misc.Names; import meteordevelopment.meteorclient.utils.player.PlayerUtils; import meteordevelopment.meteorclient.utils.render.NametagUtils; import meteordevelopment.meteorclient.utils.render.RenderUtils; @@ -550,7 +551,7 @@ private void renderNametagItem(ItemStack stack, boolean shadow) { TextRenderer text = TextRenderer.get(); NametagUtils.begin(pos); - String name = stack.getName().getString(); + String name = Names.get(stack); String count = " x" + stack.getCount(); double nameWidth = text.getWidth(name, shadow); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoBrewer.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoBrewer.java index 4384ee17ce..e184be0104 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoBrewer.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoBrewer.java @@ -12,6 +12,7 @@ import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.misc.MyPotion; import meteordevelopment.meteorclient.utils.player.InvUtils; +import net.minecraft.client.resource.language.I18n; import net.minecraft.item.Item; import net.minecraft.item.Items; import net.minecraft.potion.Potion; @@ -94,7 +95,7 @@ private boolean insertIngredient(BrewingStandScreenHandler c, Item ingredient) { } if (slot == -1) { - error("You do not have any %s left in your inventory... disabling.", ingredient.getName().getString()); + error("You do not have any %s left in your inventory... disabling.", I18n.translate(ingredient.getTranslationKey())); toggle(); return true; } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/Utils.java b/src/main/java/meteordevelopment/meteorclient/utils/Utils.java index 3cbead6f0c..35e9dbb004 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/Utils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/Utils.java @@ -32,6 +32,7 @@ import net.minecraft.client.gui.screen.multiplayer.MultiplayerScreen; import net.minecraft.client.gui.screen.world.SelectWorldScreen; import net.minecraft.client.resource.ResourceReloadLogger; +import net.minecraft.client.resource.language.I18n; import net.minecraft.enchantment.Enchantment; import net.minecraft.entity.Entity; import net.minecraft.entity.effect.StatusEffect; @@ -250,7 +251,7 @@ public static Object2IntMap createStatusEffectMap() { } public static String getEnchantSimpleName(Enchantment enchantment, int length) { - return enchantment.getName(0).getString().substring(0, length); + return I18n.translate(enchantment.getTranslationKey()).substring(0, length); } public static boolean searchTextDefault(String text, String filter, boolean caseSensitive) { diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/Names.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/Names.java index 02eadbac79..b8f0d611d8 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/Names.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/Names.java @@ -11,11 +11,14 @@ import meteordevelopment.meteorclient.utils.PreInit; import meteordevelopment.orbit.EventHandler; import net.minecraft.block.Block; +import net.minecraft.client.resource.language.I18n; import net.minecraft.client.sound.WeightedSoundSet; import net.minecraft.enchantment.Enchantment; import net.minecraft.entity.EntityType; import net.minecraft.entity.effect.StatusEffect; import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NbtElement; import net.minecraft.particle.ParticleEffect; import net.minecraft.particle.ParticleType; import net.minecraft.text.Text; @@ -54,23 +57,23 @@ private static void onResourcePacksReloaded(ResourcePacksReloadedEvent event) { } public static String get(StatusEffect effect) { - return statusEffectNames.computeIfAbsent(effect, effect1 -> StringHelper.stripTextFormat(effect1.getName().getString())); + return statusEffectNames.computeIfAbsent(effect, effect1 -> StringHelper.stripTextFormat(I18n.translate(effect1.getTranslationKey()))); } public static String get(Item item) { - return itemNames.computeIfAbsent(item, item1 -> StringHelper.stripTextFormat(item1.getName().getString())); + return itemNames.computeIfAbsent(item, item1 -> StringHelper.stripTextFormat(I18n.translate(item1.getTranslationKey()))); } public static String get(Block block) { - return blockNames.computeIfAbsent(block, block1 -> StringHelper.stripTextFormat(block1.getName().getString())); + return blockNames.computeIfAbsent(block, block1 -> StringHelper.stripTextFormat(I18n.translate(block1.getTranslationKey()))); } public static String get(Enchantment enchantment) { - return enchantmentNames.computeIfAbsent(enchantment, enchantment1 -> StringHelper.stripTextFormat(Text.translatable(enchantment1.getTranslationKey()).getString())); + return enchantmentNames.computeIfAbsent(enchantment, enchantment1 -> StringHelper.stripTextFormat(I18n.translate(enchantment1.getTranslationKey()))); } public static String get(EntityType entityType) { - return entityTypeNames.computeIfAbsent(entityType, entityType1 -> StringHelper.stripTextFormat(entityType1.getName().getString())); + return entityTypeNames.computeIfAbsent(entityType, entityType1 -> StringHelper.stripTextFormat(I18n.translate(entityType1.getTranslationKey()))); } public static String get(ParticleType type) { @@ -89,4 +92,8 @@ public static String getSoundName(Identifier id) { return StringHelper.stripTextFormat(text.getString()); }); } + + public static String get(ItemStack stack) { + return stack.hasNbt() && stack.getNbt().contains("display", NbtElement.COMPOUND_TYPE) ? stack.getName().getString() : I18n.translate(stack.getTranslationKey()); + } } From 7b677fc2cea8f59ffd88739ffd5f0d978e527a1e Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Fri, 9 Feb 2024 18:37:04 +0000 Subject: [PATCH 195/357] anti hunger ensure correct packet is skipped --- .../meteorclient/systems/modules/player/AntiHunger.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AntiHunger.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AntiHunger.java index d54354cab0..2238c739cd 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AntiHunger.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AntiHunger.java @@ -47,7 +47,7 @@ public void onActivate() { @EventHandler private void onSendPacket(PacketEvent.Send event) { - if (ignorePacket) { + if (ignorePacket && event.packet instanceof PlayerMoveC2SPacket) { ignorePacket = false; return; } From 3776a5f7d52516d506faa41f3867fcffcd6014ef Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Thu, 8 Feb 2024 01:52:12 -0500 Subject: [PATCH 196/357] configurable brute force --- .../meteorclient/systems/config/Config.java | 17 ++++++++ .../effects/StatusEffectBruteForce.java | 42 +++++++++++-------- 2 files changed, 42 insertions(+), 17 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/config/Config.java b/src/main/java/meteordevelopment/meteorclient/systems/config/Config.java index 92239d2f5e..acd6ac65b6 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/config/Config.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/config/Config.java @@ -142,6 +142,23 @@ public class Config extends System { .build() ); + public final Setting heuristicCombatUtils = sgMisc.add(new BoolSetting.Builder() + .name("heuristic-damage-utils") + .description("Spends extra computation time in order to make combat-related calculations more accurate at the expense of framerate.") + .defaultValue(true) + .build() + ); + + public final Setting heuristicDepth = sgMisc.add(new IntSetting.Builder() + .name("heuristic-depth") + .description("The amount of extra computation time to give, in an exponential scale.") + .defaultValue(4) + .min(2) + .sliderRange(2, 5) + .visible(heuristicCombatUtils::get) + .build() + ); + public List dontShowAgainPrompts = new ArrayList<>(); public Config() { diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/effects/StatusEffectBruteForce.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/effects/StatusEffectBruteForce.java index 5fc8ab19a6..36815d68b6 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/entity/effects/StatusEffectBruteForce.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/entity/effects/StatusEffectBruteForce.java @@ -12,6 +12,7 @@ import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.game.GameLeftEvent; import meteordevelopment.meteorclient.mixin.LivingEntityAccessor; +import meteordevelopment.meteorclient.systems.config.Config; import meteordevelopment.meteorclient.utils.PreInit; import meteordevelopment.meteorclient.utils.entity.StatusEffectHelper; import meteordevelopment.orbit.EventHandler; @@ -35,7 +36,6 @@ public class StatusEffectBruteForce { private static final TrackedData POTION_SWIRLS_COLOR = LivingEntityAccessor.meteor$getPotionSwirlsColor(); private static final TrackedData POTION_SWRISL_AMBIENT = LivingEntityAccessor.meteor$getPotionSwirlsAmbient(); private static final int EMPTY_COLOR = 3694022; - private static final int MAX_DEPTH = 4; public static final Set ALL_ENTRIES = new ReferenceOpenHashSet<>(); public static final Set BEACON_ENTRIES = new ReferenceOpenHashSet<>(); private static final Map PLAYER_EFFECT_MAP = new Object2ObjectOpenHashMap<>(); @@ -174,28 +174,36 @@ private static void update(int particleColor, LivingEntity entity, EntityEffectC // Map#computeIfAbsent(Object, Function) cannot cache null return values, so we use a separate cache for those if (NULL_COLORS.contains(cacheKey)) return; - @Nullable Map match = EFFECT_CACHE_MAP.computeIfAbsent(cacheKey, key -> { - for (int depth = 2; depth <= MAX_DEPTH; depth++) { - for (var combination : Sets.combinations(possibleEntries, depth)) { - int color = blend(initialColor, combination); - if (color == particleColor) { - // If the amplifiers of all applied effects match, then it cannot be inferred and should be assumed to be 1 - boolean assumeLowestAmplifier = combination.stream().mapToInt(o -> o.amplifier).reduce((i1, i2) -> i1 == i2 ? i1 : -1).orElse(-1) != -1; + @Nullable Map match = EFFECT_CACHE_MAP.get(cacheKey); + if (match == null && Config.get().heuristicCombatUtils.get()) { + match = bruteForce(possibleEntries, initialColor, particleColor); + if (match == null) NULL_COLORS.add(cacheKey); + } + + if (match != null) container.statusEffects.putAll(match); + } - Map map = new Reference2ObjectOpenHashMap<>(); + @Nullable + private static Map bruteForce(Set entries, MutableParticleColor initialColor, int particleColor) { + int maxDepth = Config.get().heuristicDepth.get(); + for (int depth = 2; depth <= maxDepth; depth++) { + for (var combination : Sets.combinations(entries, depth)) { + int color = blend(initialColor, combination); + if (color == particleColor) { + // If the amplifiers of all applied effects match, then it cannot be inferred and should be assumed to be 1 + boolean assumeLowestAmplifier = combination.stream().mapToInt(o -> o.amplifier).reduce((i1, i2) -> i1 == i2 ? i1 : -1).orElse(-1) != -1; - for (var entry : combination) { - map.put(entry.effect, new StatusEffectInstance(entry.effect, 0, assumeLowestAmplifier ? 0 : entry.amplifier - 1)); - } + Map map = new Reference2ObjectOpenHashMap<>(); - return map; + for (var entry : combination) { + map.put(entry.effect, new StatusEffectInstance(entry.effect, 0, assumeLowestAmplifier ? 0 : entry.amplifier - 1)); } + + return map; } } - return null; - }); - if (match != null) container.statusEffects.putAll(match); - else NULL_COLORS.add(cacheKey); + } + return null; } @EventHandler From 3470964623e4f224eb6d0bb6e70f34ad6f92b6c7 Mon Sep 17 00:00:00 2001 From: Wide-Cat <74723656+Wide-Cat@users.noreply.github.com> Date: Fri, 9 Feb 2024 18:24:55 +0000 Subject: [PATCH 197/357] fix typo --- .../utils/entity/effects/StatusEffectBruteForce.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/effects/StatusEffectBruteForce.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/effects/StatusEffectBruteForce.java index 36815d68b6..52e5856ce5 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/entity/effects/StatusEffectBruteForce.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/entity/effects/StatusEffectBruteForce.java @@ -34,7 +34,7 @@ */ public class StatusEffectBruteForce { private static final TrackedData POTION_SWIRLS_COLOR = LivingEntityAccessor.meteor$getPotionSwirlsColor(); - private static final TrackedData POTION_SWRISL_AMBIENT = LivingEntityAccessor.meteor$getPotionSwirlsAmbient(); + private static final TrackedData POTION_SWIRLS_AMBIENT = LivingEntityAccessor.meteor$getPotionSwirlsAmbient(); private static final int EMPTY_COLOR = 3694022; public static final Set ALL_ENTRIES = new ReferenceOpenHashSet<>(); public static final Set BEACON_ENTRIES = new ReferenceOpenHashSet<>(); @@ -130,7 +130,7 @@ private static void update(int particleColor, LivingEntity entity, EntityEffectC Set possibleEntries; EffectAttributeModifier[] possibleModifiers; - if (entity.getDataTracker().get(POTION_SWRISL_AMBIENT)) { // entity is only affected by effects from beacons + if (entity.getDataTracker().get(POTION_SWIRLS_AMBIENT)) { // entity is only affected by effects from beacons possibleEntries = BEACON_ENTRIES; possibleModifiers = EffectAttributeModifier.BEACON; } else { From 6ee3909667928159f8e5a7fc8ff940240ce8e281 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Sat, 10 Feb 2024 17:25:50 +0000 Subject: [PATCH 198/357] Clean up plugins scanning --- .../commands/commands/ServerCommand.java | 224 ++++++++++-------- .../ClientPlayNetworkHandlerAccessor.java | 8 + .../mixin/ClientPlayNetworkHandlerMixin.java | 1 - .../resources/meteor-client.accesswidener | 8 +- src/main/resources/meteor-client.mixins.json | 1 + 5 files changed, 135 insertions(+), 107 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java index d4e5b5c056..e42d3b8156 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java @@ -13,13 +13,21 @@ 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.ConnectScreenAccessor; import meteordevelopment.meteorclient.utils.world.TickRate; import meteordevelopment.orbit.EventHandler; +import net.minecraft.client.gui.screen.multiplayer.ConnectScreen; +import net.minecraft.client.network.ClientPlayNetworkHandler; 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.network.ClientConnection; 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.registry.RegistryWrapper; import net.minecraft.server.integrated.IntegratedServer; import net.minecraft.text.ClickEvent; import net.minecraft.text.HoverEvent; @@ -30,21 +38,31 @@ import java.net.InetAddress; import java.net.UnknownHostException; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Random; import static com.mojang.brigadier.Command.SINGLE_SUCCESS; import static meteordevelopment.meteorclient.MeteorClient.mc; public class ServerCommand extends Command { private static final List ANTICHEAT_LIST = Arrays.asList("nocheatplus", "negativity", "warden", "horizon", "illegalstack", "coreprotect", "exploitsx", "vulcan", "abc", "spartan", "kauri", "anticheatreloaded", "witherac", "godseye", "matrix", "wraith", "antixrayheuristics", "grimac"); - private static final String completionStarts = "/:abcdefghijklmnopqrstuvwxyz0123456789-"; + private static final String[] VERSION_ALIASES = {"version", "ver", "about", "bukkit:version", "bukkit:ver", "bukkit:about"}; // aliases for bukkit:version + private String alias; private int ticks = 0; - private boolean bukkitMode = false; + private boolean tick = false; private final List plugins = new ArrayList<>(); + private final List commandTreePlugins = new ArrayList<>(); + private static final Random RANDOM = new Random(); + + private ClientConnection connection; public ServerCommand() { super("server", "Prints server information"); + + MeteorClient.EVENT_BUS.subscribe(this); } @Override @@ -59,16 +77,16 @@ public void build(LiteralArgumentBuilder builder) { return SINGLE_SUCCESS; })); - builder.then(literal("plugins") - .then(literal("BukkitVer").executes(ctx -> { - getPlugins(true); - return SINGLE_SUCCESS; - })) - .then(literal("MassScan").executes(ctx -> { - getPlugins(false); - return SINGLE_SUCCESS; - })) - ); + builder.then(literal("plugins").executes(ctx -> { + plugins.addAll(commandTreePlugins); + + if (alias != null) { + mc.getNetworkHandler().sendPacket(new RequestCommandCompletionsC2SPacket(RANDOM.nextInt(200), alias + " ")); + tick = true; + } else printPlugins(); + + return SINGLE_SUCCESS; + })); builder.then(literal("tps").executes(ctx -> { float tps = TickRate.INSTANCE.getTickRate(); @@ -81,50 +99,6 @@ public void build(LiteralArgumentBuilder builder) { })); } - private void getPlugins(boolean bukkit) { - bukkitMode = bukkit; - ticks = 0; - plugins.clear(); - Random random = new Random(); - MeteorClient.EVENT_BUS.subscribe(this); - - if (bukkit) { - if (mc.isIntegratedServerRunning()) { // don't bother if we're in singleplayer - printPlugins(); - return; - } - mc.player.networkHandler.sendPacket(new RequestCommandCompletionsC2SPacket(random.nextInt(200), "bukkit:ver ")); - } else { - info("Please wait around 5 seconds..."); - (new Thread(() -> completionStarts.chars().forEach(i -> { - mc.player.networkHandler.sendPacket(new RequestCommandCompletionsC2SPacket(random.nextInt(200), Character.toString(i))); - try { - Thread.sleep(100); - } catch (InterruptedException e) { - e.printStackTrace(); - } - }))).start(); - } - } - - private void printPlugins() { - Collections.sort(plugins); - - for (int i = 0; i < plugins.size(); i++) { - plugins.set(i, formatName(plugins.get(i))); - } - - if (!plugins.isEmpty()) { - info("Plugins (%d): %s ", plugins.size(), Strings.join(plugins.toArray(new String[0]), ", ")); - } else { - error("No plugins found."); - } - - ticks = 0; - plugins.clear(); - MeteorClient.EVENT_BUS.unsubscribe(this); - } - private void basicInfo() { if (mc.isIntegratedServerRunning()) { IntegratedServer server = mc.getServer(); @@ -209,62 +183,122 @@ private void basicInfo() { info("Permission level: %s", formatPerms()); } + public String formatPerms() { + int p = 5; + while (!mc.player.hasPermissionLevel(p) && p > 0) p--; + + return switch (p) { + case 0 -> "0 (No Perms)"; + case 1 -> "1 (No Perms)"; + case 2 -> "2 (Player Command Access)"; + case 3 -> "3 (Server Command Access)"; + case 4 -> "4 (Operator)"; + default -> p + " (Unknown)"; + }; + } + + + // plugin scanning + + private void printPlugins() { + plugins.sort(String.CASE_INSENSITIVE_ORDER); + plugins.replaceAll(this::formatName); + + if (!plugins.isEmpty()) { + info("Plugins (%d): %s ", plugins.size(), Strings.join(plugins.toArray(new String[0]), ", ")); + } else { + error("No plugins found."); + } + + tick = false; + ticks = 0; + plugins.clear(); + } + @EventHandler private void onTick(TickEvent.Post event) { + if (!tick) return; ticks++; - if (bukkitMode) { - if (ticks >= 200) { - error("Plugins check timed out. Either the packet has been dropped, or you dont have access to the bukkit:ver command."); - MeteorClient.EVENT_BUS.unsubscribe(this); - ticks = 0; - } - } - else { - if (ticks >= 100) { - printPlugins(); - } - } + if (ticks >= 100) printPlugins(); + } + + @EventHandler + private void onSendPacket(PacketEvent.Send event) { + if (tick && event.packet instanceof RequestCommandCompletionsC2SPacket) event.cancel(); } @EventHandler 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) getNetworkHandler(); + 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((RegistryWrapper.WrapperLookup) handler.getCombinedDynamicRegistries(), handler.getEnabledFeatures())).getChildren().forEach(node -> { + String[] split = node.getName().split(":"); + if (split.length > 1) { + if (!commandTreePlugins.contains(split[0])) commandTreePlugins.add(split[0]); + } + + // checking if any of the bukkit:version commands are available, which we can also grab plugins from + if (alias == null) { + for (String a : VERSION_ALIASES) { + if (node.getName().equals(a)) alias = a; + } + } + }); + + } + + if (!tick) return; + try { if (event.packet instanceof CommandSuggestionsS2CPacket packet) { - Suggestions matches = packet.getSuggestions(); if (matches == null) { - error("Invalid Packet."); + error("An error occurred while trying to find plugins."); return; } for (Suggestion suggestion : matches.getList()) { - if (bukkitMode) { - String pluginName = suggestion.getText(); - if (!plugins.contains(pluginName)) { - plugins.add(pluginName); - } - } - else { - String[] command = suggestion.getText().split(":"); - if (command.length > 1) { - String pluginName = command[0].replace("/", ""); - - if (!plugins.contains(pluginName)) { - plugins.add(pluginName); - } - } - } + String pluginName = suggestion.getText(); + if (!plugins.contains(pluginName.toLowerCase())) plugins.add(pluginName); } - if (bukkitMode) printPlugins(); + printPlugins(); } } catch (Exception e) { error("An error occurred while trying to find plugins."); } } + private ClientPlayNetworkHandler getNetworkHandler() { + ClientPlayNetworkHandler handler = mc.getNetworkHandler(); + + // mc.getNetworkHandler is null early in the login sequence + if (handler == null) { + if (connection != null && connection.getPacketListener() instanceof ClientPlayNetworkHandler listener) handler = listener; + + else if (mc.currentScreen instanceof ConnectScreen screen) { + ConnectScreenAccessor screenAccessor = (ConnectScreenAccessor) screen; + + if (screenAccessor.getConnection().getPacketListener() instanceof ClientPlayNetworkHandler listener) { + connection = screenAccessor.getConnection(); + handler = listener; + } + } + } + + return handler; + } + private String formatName(String name) { if (ANTICHEAT_LIST.contains(name.toLowerCase())) { return String.format("%s%s(default)", Formatting.RED, name); @@ -275,18 +309,4 @@ else if (StringUtils.containsIgnoreCase(name, "exploit") || StringUtils.contains return String.format("(highlight)%s(default)", name); } - - public String formatPerms() { - int p = 5; - while (!mc.player.hasPermissionLevel(p) && p > 0) p--; - - return switch (p) { - case 0 -> "0 (No Perms)"; - case 1 -> "1 (No Perms)"; - case 2 -> "2 (Player Command Access)"; - case 3 -> "3 (Server Command Access)"; - case 4 -> "4 (Operator)"; - default -> p + " (Unknown)"; - }; - } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerAccessor.java index f4c3d6b099..ab73ae49df 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerAccessor.java @@ -8,6 +8,8 @@ import net.minecraft.client.network.ClientPlayNetworkHandler; import net.minecraft.network.message.LastSeenMessagesCollector; import net.minecraft.network.message.MessageChain; +import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.resource.featuretoggle.FeatureSet; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; @@ -21,4 +23,10 @@ public interface ClientPlayNetworkHandlerAccessor { @Accessor("lastSeenMessagesCollector") LastSeenMessagesCollector getLastSeenMessagesCollector(); + + @Accessor("combinedDynamicRegistries") + DynamicRegistryManager.Immutable getCombinedDynamicRegistries(); + + @Accessor("enabledFeatures") + FeatureSet getEnabledFeatures(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerMixin.java index 2e51e27d72..f15d1c2750 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerMixin.java @@ -5,7 +5,6 @@ package meteordevelopment.meteorclient.mixin; -import baritone.api.BaritoneAPI; import com.mojang.brigadier.exceptions.CommandSyntaxException; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.commands.Commands; diff --git a/src/main/resources/meteor-client.accesswidener b/src/main/resources/meteor-client.accesswidener index 30a856f583..121a2c6331 100644 --- a/src/main/resources/meteor-client.accesswidener +++ b/src/main/resources/meteor-client.accesswidener @@ -69,9 +69,9 @@ accessible class net/minecraft/client/gui/screen/ingame/BeaconScreen$EffectB accessible class net/minecraft/client/resource/ResourceReloadLogger$ReloadState accessible field net/minecraft/block/AbstractBlock collidable Z -accessible field net/minecraft/util/math/Direction HORIZONTAL [Lnet/minecraft/util/math/Direction; +accessible field net/minecraft/util/math/Direction HORIZONTAL [Lnet/minecraft/util/math/Direction; -accessible field net/minecraft/item/ItemGroups INVENTORY Lnet/minecraft/registry/RegistryKey; +accessible field net/minecraft/item/ItemGroups INVENTORY Lnet/minecraft/registry/RegistryKey; -accessible field net/minecraft/client/render/item/ItemRenderer TRIDENT Lnet/minecraft/client/util/ModelIdentifier; -accessible field net/minecraft/client/render/item/ItemRenderer SPYGLASS Lnet/minecraft/client/util/ModelIdentifier; +accessible field net/minecraft/client/render/item/ItemRenderer TRIDENT Lnet/minecraft/client/util/ModelIdentifier; +accessible field net/minecraft/client/render/item/ItemRenderer SPYGLASS Lnet/minecraft/client/util/ModelIdentifier; diff --git a/src/main/resources/meteor-client.mixins.json b/src/main/resources/meteor-client.mixins.json index 9b7cf81096..d788e4e032 100644 --- a/src/main/resources/meteor-client.mixins.json +++ b/src/main/resources/meteor-client.mixins.json @@ -63,6 +63,7 @@ "CloseHandledScreenC2SPacketAccessor", "CobwebBlockMixin", "CompassAnglePredicateProviderMixin", + "ConnectScreenAccessor", "ConnectScreenMixin", "CrashReportMixin", "CreativeInventoryScreenAccessor", From 9859fcd8644beefa50a20fbb15dce1c66564c979 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Sat, 10 Feb 2024 17:30:05 +0000 Subject: [PATCH 199/357] oops --- .../mixin/ConnectScreenAccessor.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/ConnectScreenAccessor.java diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ConnectScreenAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/ConnectScreenAccessor.java new file mode 100644 index 0000000000..831fb3335f --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ConnectScreenAccessor.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.screen.multiplayer.ConnectScreen; +import net.minecraft.network.ClientConnection; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(ConnectScreen.class) +public interface ConnectScreenAccessor { + @Accessor("connection") + ClientConnection getConnection(); +} From 62cdea7ce49bbeb52cfc515e256677fc9fc50e9f Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Sun, 11 Feb 2024 06:05:57 -0500 Subject: [PATCH 200/357] sanitize notebot path Co-Authored-By: Damian <43420467+DAMcraft@users.noreply.github.com> --- .../commands/commands/NotebotCommand.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/NotebotCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/NotebotCommand.java index 4f88fc3183..3f226bb9ec 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/NotebotCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/NotebotCommand.java @@ -7,6 +7,7 @@ import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.exceptions.DynamicCommandExceptionType; import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.commands.Command; @@ -36,6 +37,7 @@ public class NotebotCommand extends Command { private final static SimpleCommandExceptionType INVALID_SONG = new SimpleCommandExceptionType(Text.literal("Invalid song.")); + private final static DynamicCommandExceptionType INVALID_PATH = new DynamicCommandExceptionType(object -> Text.literal("'%s' is not a valid path.".formatted(object))); int ticks = -1; private final Map> song = new HashMap<>(); // tick -> notes @@ -123,10 +125,14 @@ public void build(LiteralArgumentBuilder builder) { builder.then(literal("record").then(literal("save").then(argument("name", StringArgumentType.greedyString()).executes(ctx -> { String name = ctx.getArgument("name", String.class); - if (name == null || name.equals("")) { - throw INVALID_SONG.create(); + if (name == null || name.isEmpty()) { + throw INVALID_PATH.create(name); + } + Path notebotFolder = MeteorClient.FOLDER.toPath().resolve("notebot"); + Path path = notebotFolder.resolve(String.format("%s.txt", name)).normalize(); + if (!path.startsWith(notebotFolder)) { + throw INVALID_PATH.create(path); } - Path path = MeteorClient.FOLDER.toPath().resolve(String.format("notebot/%s.txt", name)); saveRecording(path); return SINGLE_SUCCESS; })))); From 7b2cdac84e9de6be17df47937acc794b5cb364b9 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Sun, 11 Feb 2024 06:06:23 -0500 Subject: [PATCH 201/357] prevent unexpected swarm inputs Co-Authored-By: Damian <43420467+DAMcraft@users.noreply.github.com> --- .../meteorclient/systems/modules/misc/swarm/SwarmWorker.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmWorker.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmWorker.java index 090a089359..5f4f419217 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmWorker.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmWorker.java @@ -41,7 +41,7 @@ public void run() { while (!isInterrupted()) { String read = in.readUTF(); - if (!read.equals("")) { + if (read.startsWith("swarm")) { ChatUtils.infoPrefix("Swarm", "Received command: (highlight)%s", read); try { From ae0b8aa9db981742b4af7e913fbf9c47c383ef68 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Sun, 11 Feb 2024 06:10:16 -0500 Subject: [PATCH 202/357] swarm join feedback Co-Authored-By: Damian <43420467+DAMcraft@users.noreply.github.com> --- .../meteorclient/commands/commands/SwarmCommand.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java index 317550eabd..5b116c440c 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java @@ -67,6 +67,8 @@ public void build(LiteralArgumentBuilder builder) { swarm.mode.set(Swarm.Mode.Worker); swarm.worker = new SwarmWorker(StringArgumentType.getString(context, "ip"), IntegerArgumentType.getInteger(context, "port")); + info("Connected to (highlight)%s.", swarm.worker.getConnection()); + return SINGLE_SUCCESS; }) ) From fca65be520aad29fc9c5a43408f0b32634045d7c Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Sun, 11 Feb 2024 06:19:25 -0500 Subject: [PATCH 203/357] prevent running meteor commands from clickevent Co-Authored-By: Damian <43420467+DAMcraft@users.noreply.github.com> --- .../commands/commands/NbtCommand.java | 3 ++- .../meteorclient/mixin/ScreenMixin.java | 3 ++- .../systems/modules/misc/BetterChat.java | 3 ++- .../utils/misc/text/MeteorClickEvent.java | 20 +++++++++++++++++++ .../meteorclient/utils/player/ChatUtils.java | 3 ++- 5 files changed, 28 insertions(+), 4 deletions(-) create mode 100644 src/main/java/meteordevelopment/meteorclient/utils/misc/text/MeteorClickEvent.java diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/NbtCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/NbtCommand.java index 49ee8d36a1..2b8a8935de 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/NbtCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/NbtCommand.java @@ -11,6 +11,7 @@ import meteordevelopment.meteorclient.commands.Command; import meteordevelopment.meteorclient.commands.arguments.CompoundNbtTagArgumentType; import meteordevelopment.meteorclient.systems.config.Config; +import meteordevelopment.meteorclient.utils.misc.text.MeteorClickEvent; import net.minecraft.command.CommandSource; import net.minecraft.command.argument.NbtPathArgumentType; import net.minecraft.item.ItemStack; @@ -84,7 +85,7 @@ public void build(LiteralArgumentBuilder builder) { MutableText copyButton = Text.literal("NBT"); copyButton.setStyle(copyButton.getStyle() .withFormatting(Formatting.UNDERLINE) - .withClickEvent(new ClickEvent( + .withClickEvent(new MeteorClickEvent( ClickEvent.Action.RUN_COMMAND, this.toString("copy") )) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ScreenMixin.java index 3fb6f8ecc2..13767eb998 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ScreenMixin.java @@ -12,6 +12,7 @@ import meteordevelopment.meteorclient.systems.modules.movement.GUIMove; import meteordevelopment.meteorclient.systems.modules.render.NoRender; import meteordevelopment.meteorclient.utils.Utils; +import meteordevelopment.meteorclient.utils.misc.text.MeteorClickEvent; import net.minecraft.client.gui.screen.ChatScreen; import net.minecraft.client.gui.screen.Screen; import net.minecraft.text.Style; @@ -35,7 +36,7 @@ private void onRenderBackground(CallbackInfo info) { @Inject(method = "handleTextClick", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;error(Ljava/lang/String;Ljava/lang/Object;)V", ordinal = 1, remap = false), cancellable = true) private void onRunCommand(Style style, CallbackInfoReturnable cir) { - if (style.getClickEvent().getValue().startsWith(Config.get().prefix.get())) { + if (style.getClickEvent() instanceof MeteorClickEvent clickEvent && clickEvent.getValue().startsWith(Config.get().prefix.get())) { try { Commands.dispatch(style.getClickEvent().getValue().substring(Config.get().prefix.get().length())); cir.setReturnValue(true); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java index 14c6889448..8fe57fc9dc 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java @@ -22,6 +22,7 @@ import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.misc.MeteorIdentifier; +import meteordevelopment.meteorclient.utils.misc.text.MeteorClickEvent; import meteordevelopment.meteorclient.utils.player.ChatUtils; import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.orbit.EventHandler; @@ -518,7 +519,7 @@ private MutableText getSendButton(String message) { sendButton.setStyle(sendButton.getStyle() .withFormatting(Formatting.DARK_RED) - .withClickEvent(new ClickEvent( + .withClickEvent(new MeteorClickEvent( ClickEvent.Action.RUN_COMMAND, Commands.get("say").toString(message) )) diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MeteorClickEvent.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MeteorClickEvent.java new file mode 100644 index 0000000000..acc9e6ed9f --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MeteorClickEvent.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.utils.misc.text; + +import net.minecraft.text.ClickEvent; +import net.minecraft.text.Style; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +/** + * This class does nothing except ensure that {@link ClickEvent}'s containing Meteor Client commands can only be executed if they come from the client. + * @see meteordevelopment.meteorclient.mixin.ScreenMixin#onRunCommand(Style, CallbackInfoReturnable) + */ +public class MeteorClickEvent extends ClickEvent { + public MeteorClickEvent(Action action, String value) { + super(action, value); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/utils/player/ChatUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/player/ChatUtils.java index d4eace822e..ba05ab99f3 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/player/ChatUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/player/ChatUtils.java @@ -11,6 +11,7 @@ import meteordevelopment.meteorclient.pathing.BaritoneUtils; import meteordevelopment.meteorclient.systems.config.Config; import meteordevelopment.meteorclient.utils.PostInit; +import meteordevelopment.meteorclient.utils.misc.text.MeteorClickEvent; import net.minecraft.text.*; import net.minecraft.util.Formatting; import net.minecraft.util.Pair; @@ -248,7 +249,7 @@ public static MutableText formatCoords(Vec3d pos) { )); if (BaritoneUtils.IS_AVAILABLE) { - style = style.withClickEvent(new ClickEvent( + style = style.withClickEvent(new MeteorClickEvent( ClickEvent.Action.RUN_COMMAND, String.format("%sgoto %d %d %d", BaritoneUtils.getPrefix(), (int) pos.x, (int) pos.y, (int) pos.z) )); From 867cc171698cf116184e264812160ad3e67a3046 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Sun, 11 Feb 2024 06:31:03 -0500 Subject: [PATCH 204/357] swarm join confirmation Co-Authored-By: Damian <43420467+DAMcraft@users.noreply.github.com> --- .../commands/commands/SwarmCommand.java | 49 ++++++++++++++++--- 1 file changed, 42 insertions(+), 7 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java index 5b116c440c..748fb2d0a5 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java @@ -10,6 +10,8 @@ import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; +import it.unimi.dsi.fastutil.objects.ObjectIntImmutablePair; +import it.unimi.dsi.fastutil.objects.ObjectIntPair; import meteordevelopment.meteorclient.commands.Command; import meteordevelopment.meteorclient.commands.arguments.ModuleArgumentType; import meteordevelopment.meteorclient.commands.arguments.PlayerArgumentType; @@ -20,13 +22,18 @@ import meteordevelopment.meteorclient.systems.modules.misc.swarm.SwarmConnection; import meteordevelopment.meteorclient.systems.modules.misc.swarm.SwarmWorker; 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.ClickEvent; +import net.minecraft.text.Style; import net.minecraft.text.Text; +import net.minecraft.util.Formatting; import net.minecraft.util.math.BlockPos; +import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.Random; @@ -37,6 +44,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 @Nullable ObjectIntPair pendingConnection; public SwarmCommand() { super("swarm", "Sends commands to connected swarm workers."); @@ -60,19 +68,46 @@ public void build(LiteralArgumentBuilder builder) { .then(argument("ip", StringArgumentType.string()) .then(argument("port", IntegerArgumentType.integer(0, 65535)) .executes(context -> { - Swarm swarm = Modules.get().get(Swarm.class); - if (!swarm.isActive()) swarm.toggle(); + String ip = StringArgumentType.getString(context, "ip"); + int port = IntegerArgumentType.getInteger(context, "port"); - swarm.close(); - swarm.mode.set(Swarm.Mode.Worker); - swarm.worker = new SwarmWorker(StringArgumentType.getString(context, "ip"), IntegerArgumentType.getInteger(context, "port")); + pendingConnection = new ObjectIntImmutablePair<>(ip, port); - info("Connected to (highlight)%s.", swarm.worker.getConnection()); + 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(ClickEvent.Action.RUN_COMMAND, ".swarm join confirm")) + )); - return SINGLE_SUCCESS; + 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); + if (!swarm.isActive()) swarm.toggle(); + + swarm.close(); + swarm.mode.set(Swarm.Mode.Worker); + swarm.worker = new SwarmWorker(pendingConnection.left(), pendingConnection.rightInt()); + + pendingConnection = null; + + 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; + })) ); builder.then(literal("connections").executes(context -> { From fb65624a1f6af6885956dcf37c2150475332df4f Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Mon, 12 Feb 2024 21:03:32 +0000 Subject: [PATCH 205/357] Fix getting the network handler --- .../commands/commands/ServerCommand.java | 28 +------------------ .../events/packets/PacketEvent.java | 5 +++- .../mixin/ClientConnectionMixin.java | 4 +-- .../mixin/ConnectScreenAccessor.java | 17 ----------- src/main/resources/meteor-client.mixins.json | 1 - 5 files changed, 7 insertions(+), 48 deletions(-) delete mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/ConnectScreenAccessor.java diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java index e42d3b8156..a43077b949 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java @@ -14,16 +14,12 @@ import meteordevelopment.meteorclient.events.packets.PacketEvent; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.mixin.ClientPlayNetworkHandlerAccessor; -import meteordevelopment.meteorclient.mixin.ConnectScreenAccessor; import meteordevelopment.meteorclient.utils.world.TickRate; import meteordevelopment.orbit.EventHandler; -import net.minecraft.client.gui.screen.multiplayer.ConnectScreen; -import net.minecraft.client.network.ClientPlayNetworkHandler; 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.network.ClientConnection; import net.minecraft.network.packet.c2s.play.RequestCommandCompletionsC2SPacket; import net.minecraft.network.packet.s2c.play.CommandSuggestionsS2CPacket; import net.minecraft.network.packet.s2c.play.CommandTreeS2CPacket; @@ -56,8 +52,6 @@ public class ServerCommand extends Command { private final List commandTreePlugins = new ArrayList<>(); private static final Random RANDOM = new Random(); - private ClientConnection connection; - public ServerCommand() { super("server", "Prints server information"); @@ -234,7 +228,7 @@ private void onReadPacket(PacketEvent.Receive event) { // 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) getNetworkHandler(); + ClientPlayNetworkHandlerAccessor handler = (ClientPlayNetworkHandlerAccessor) event.packetListener; commandTreePlugins.clear(); alias = null; @@ -279,26 +273,6 @@ private void onReadPacket(PacketEvent.Receive event) { } } - private ClientPlayNetworkHandler getNetworkHandler() { - ClientPlayNetworkHandler handler = mc.getNetworkHandler(); - - // mc.getNetworkHandler is null early in the login sequence - if (handler == null) { - if (connection != null && connection.getPacketListener() instanceof ClientPlayNetworkHandler listener) handler = listener; - - else if (mc.currentScreen instanceof ConnectScreen screen) { - ConnectScreenAccessor screenAccessor = (ConnectScreenAccessor) screen; - - if (screenAccessor.getConnection().getPacketListener() instanceof ClientPlayNetworkHandler listener) { - connection = screenAccessor.getConnection(); - handler = listener; - } - } - } - - return handler; - } - private String formatName(String name) { if (ANTICHEAT_LIST.contains(name.toLowerCase())) { return String.format("%s%s(default)", Formatting.RED, name); diff --git a/src/main/java/meteordevelopment/meteorclient/events/packets/PacketEvent.java b/src/main/java/meteordevelopment/meteorclient/events/packets/PacketEvent.java index 8b121b46dd..dfc2bb93eb 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/packets/PacketEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/packets/PacketEvent.java @@ -6,6 +6,7 @@ package meteordevelopment.meteorclient.events.packets; import meteordevelopment.meteorclient.events.Cancellable; +import net.minecraft.network.listener.PacketListener; import net.minecraft.network.packet.Packet; public class PacketEvent { @@ -13,10 +14,12 @@ public static class Receive extends Cancellable { private static final Receive INSTANCE = new Receive(); public Packet packet; + public PacketListener packetListener; - public static Receive get(Packet packet) { + public static Receive get(Packet packet, PacketListener listener) { INSTANCE.setCancelled(false); INSTANCE.packet = packet; + INSTANCE.packetListener = listener; return INSTANCE; } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java index ddbf0dc837..95fb825805 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java @@ -44,9 +44,9 @@ public class ClientConnectionMixin { private static void onHandlePacket(Packet packet, PacketListener listener, CallbackInfo info) { if (packet instanceof BundleS2CPacket bundle) { for (Iterator> it = bundle.getPackets().iterator(); it.hasNext(); ) { - if (MeteorClient.EVENT_BUS.post(PacketEvent.Receive.get(it.next())).isCancelled()) it.remove(); + if (MeteorClient.EVENT_BUS.post(PacketEvent.Receive.get(it.next(), listener)).isCancelled()) it.remove(); } - } else if (MeteorClient.EVENT_BUS.post(PacketEvent.Receive.get(packet)).isCancelled()) info.cancel(); + } else if (MeteorClient.EVENT_BUS.post(PacketEvent.Receive.get(packet, listener)).isCancelled()) info.cancel(); } @Inject(method = "disconnect", at = @At("HEAD")) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ConnectScreenAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/ConnectScreenAccessor.java deleted file mode 100644 index 831fb3335f..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ConnectScreenAccessor.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.multiplayer.ConnectScreen; -import net.minecraft.network.ClientConnection; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(ConnectScreen.class) -public interface ConnectScreenAccessor { - @Accessor("connection") - ClientConnection getConnection(); -} diff --git a/src/main/resources/meteor-client.mixins.json b/src/main/resources/meteor-client.mixins.json index d788e4e032..9b7cf81096 100644 --- a/src/main/resources/meteor-client.mixins.json +++ b/src/main/resources/meteor-client.mixins.json @@ -63,7 +63,6 @@ "CloseHandledScreenC2SPacketAccessor", "CobwebBlockMixin", "CompassAnglePredicateProviderMixin", - "ConnectScreenAccessor", "ConnectScreenMixin", "CrashReportMixin", "CreativeInventoryScreenAccessor", From 3d7fd1671f1f8a82347bdc126bcdb78ef42107e0 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Thu, 15 Feb 2024 19:36:36 +0000 Subject: [PATCH 206/357] anti hunger ensure correct packet is skipped p2 --- .../meteorclient/systems/modules/player/AntiHunger.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AntiHunger.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AntiHunger.java index 2238c739cd..0286b75152 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AntiHunger.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AntiHunger.java @@ -5,8 +5,8 @@ package meteordevelopment.meteorclient.systems.modules.player; +import meteordevelopment.meteorclient.events.entity.player.SendMovementPacketsEvent; import meteordevelopment.meteorclient.events.packets.PacketEvent; -import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.mixin.PlayerMoveC2SPacketAccessor; import meteordevelopment.meteorclient.settings.BoolSetting; import meteordevelopment.meteorclient.settings.Setting; @@ -64,7 +64,7 @@ private void onSendPacket(PacketEvent.Send event) { } @EventHandler - private void onTick(TickEvent.Pre event) { + private void onTick(SendMovementPacketsEvent.Pre event) { if (mc.player.isOnGround() && !lastOnGround && onGround.get()) { ignorePacket = true; // prevents you from not taking fall damage } From 55ce789339dbbdc06d460cf5d790417734eb5779 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Mon, 19 Feb 2024 12:00:05 +0000 Subject: [PATCH 207/357] Add grim bypass to speedmine --- .../systems/modules/player/SpeedMine.java | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/SpeedMine.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/SpeedMine.java index fe5ae7271f..3a24cb5b8d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/SpeedMine.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/SpeedMine.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.systems.modules.player; +import meteordevelopment.meteorclient.events.packets.PacketEvent; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.mixin.ClientPlayerInteractionManagerAccessor; import meteordevelopment.meteorclient.settings.*; @@ -14,6 +15,7 @@ import meteordevelopment.orbit.EventHandler; import net.minecraft.block.Block; import net.minecraft.entity.effect.StatusEffectInstance; +import net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket; import net.minecraft.util.math.BlockPos; import java.util.List; @@ -25,7 +27,7 @@ public class SpeedMine extends Module { public final Setting mode = sgGeneral.add(new EnumSetting.Builder() .name("mode") - .defaultValue(Mode.Normal) + .defaultValue(Mode.Damage) .onChanged(mode -> removeHaste()) .build() ); @@ -73,6 +75,14 @@ public class SpeedMine extends Module { .build() ); + private final Setting grimBypass = sgGeneral.add(new BoolSetting.Builder() + .name("grim-bypass") + .description("Bypasses Grim's fastbreak check, working as of 2.3.58") + .defaultValue(false) + .visible(() -> mode.get() == Mode.Damage) + .build() + ); + public SpeedMine() { super(Categories.Player, "speed-mine", "Allows you to quickly mine blocks."); } @@ -104,6 +114,15 @@ else if (mode.get() == Mode.Damage) { } } + @EventHandler + private void onPacket(PacketEvent.Send event) { + if (!(mode.get() == Mode.Damage) || !grimBypass.get()) return; + + if (event.packet instanceof PlayerActionC2SPacket packet && packet.getAction() == PlayerActionC2SPacket.Action.STOP_DESTROY_BLOCK) { + mc.getNetworkHandler().sendPacket(new PlayerActionC2SPacket(PlayerActionC2SPacket.Action.ABORT_DESTROY_BLOCK, packet.getPos().up(), packet.getDirection())); + } + } + private void removeHaste() { if (!Utils.canUpdate()) return; From d1a16f2dcfb6c817c064d2d3cd61b71855ecdacc Mon Sep 17 00:00:00 2001 From: 3arthqu4ke <56741599+3arthqu4ke@users.noreply.github.com> Date: Sun, 18 Feb 2024 17:31:23 +0100 Subject: [PATCH 208/357] Fixed potential crash due to Enums implementing interfaces/abstract methods --- src/main/java/meteordevelopment/meteorclient/gui/GuiTheme.java | 2 +- .../meteordevelopment/meteorclient/settings/EnumSetting.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/gui/GuiTheme.java b/src/main/java/meteordevelopment/meteorclient/gui/GuiTheme.java index 90b7958459..8f96e5fbfc 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/GuiTheme.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/GuiTheme.java @@ -115,7 +115,7 @@ public WTextBox textBox(String text) { public abstract WDropdown dropdown(T[] values, T value); public > WDropdown dropdown(T value) { - Class klass = value.getClass(); + Class klass = value.getDeclaringClass(); T[] values = (T[]) klass.getEnumConstants(); return dropdown(values, value); } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/EnumSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/EnumSetting.java index 9813d056ef..28a400061b 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/EnumSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/EnumSetting.java @@ -19,7 +19,7 @@ public class EnumSetting> extends Setting { public EnumSetting(String name, String description, T defaultValue, Consumer onChanged, Consumer> onModuleActivated, IVisible visible) { super(name, description, defaultValue, onChanged, onModuleActivated, visible); - values = (T[]) defaultValue.getClass().getEnumConstants(); + values = (T[]) defaultValue.getDeclaringClass().getEnumConstants(); suggestions = new ArrayList<>(values.length); for (T value : values) suggestions.add(value.toString()); } From 3d26b5bd2d364ebc71aaab64c605e4ccfde6a905 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Tue, 20 Feb 2024 20:22:10 +0000 Subject: [PATCH 209/357] Fix a crash with baritone and rusherhack --- .../meteordevelopment/meteorclient/mixin/ChatHudMixin.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java index 77f38556ca..ac7b0b1bb7 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java @@ -74,6 +74,8 @@ private void onAddMessageAfterNewChatHudLine(Text message, MessageSignatureData @ModifyExpressionValue(method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;ILnet/minecraft/client/gui/hud/MessageIndicator;Z)V", 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, @Local(ordinal = 2) int j) { IMessageHandler handler = (IMessageHandler) client.getMessageHandler(); + if (handler == null) return line; + IChatHudLineVisible meteorLine = (IChatHudLineVisible) (Object) line; meteorLine.meteor$setSender(handler.meteor$getSender()); @@ -85,6 +87,8 @@ private ChatHudLine.Visible onAddMessage_modifyChatHudLineVisible(ChatHudLine.Vi @ModifyExpressionValue(method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;ILnet/minecraft/client/gui/hud/MessageIndicator;Z)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; } From 277e92f344eeab24defdd9246152a04186fdde3b Mon Sep 17 00:00:00 2001 From: tympanicblock61 <99092380+tympanicblock61@users.noreply.github.com> Date: Tue, 20 Feb 2024 22:08:42 -0500 Subject: [PATCH 210/357] move BetterTab.java to render --- .../systems/modules/{misc => render}/BetterTab.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/main/java/meteordevelopment/meteorclient/systems/modules/{misc => render}/BetterTab.java (98%) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterTab.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTab.java similarity index 98% rename from src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterTab.java rename to src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTab.java index 5bdd2c8fdb..c48e8da88e 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterTab.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTab.java @@ -80,7 +80,7 @@ public class BetterTab extends Module { public BetterTab() { - super(Categories.Misc, "better-tab", "Various improvements to the tab list."); + super(Categories.Render, "better-tab", "Various improvements to the tab list."); } public Text getPlayerName(PlayerListEntry playerListEntry) { From b8c4e4f767b136cb5c9f90ae4f2c1c833e5766b4 Mon Sep 17 00:00:00 2001 From: tympanicblock61 <99092380+tympanicblock61@users.noreply.github.com> Date: Tue, 20 Feb 2024 22:12:03 -0500 Subject: [PATCH 211/357] Update Modules.java --- .../meteordevelopment/meteorclient/systems/modules/Modules.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java index c9b07c574d..7b90565aad 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java @@ -514,6 +514,7 @@ private void initRender() { add(new Blur()); add(new PopChams()); add(new TunnelESP()); + add(new BetterTab()); } private void initWorld() { @@ -556,7 +557,6 @@ private void initMisc() { add(new AutoRespawn()); add(new BetterBeacons()); add(new BetterChat()); - add(new BetterTab()); add(new BookBot()); add(new DiscordPresence()); add(new MessageAura()); From 1df040e88c1fb5216519decfbdffcc93754ea8de Mon Sep 17 00:00:00 2001 From: Roman Danilov Date: Wed, 21 Feb 2024 12:51:26 +0300 Subject: [PATCH 212/357] Fix Speed and LongJump override timer Fix Speed and LongJump override timer for other Timer modules (in addons) --- .../meteorclient/systems/modules/movement/LongJump.java | 4 +++- .../meteorclient/systems/modules/movement/speed/Speed.java | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/LongJump.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/LongJump.java index 941e74e2eb..bbb0fbe7e1 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/LongJump.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/LongJump.java @@ -144,7 +144,9 @@ private void onPacketReceive(PacketEvent.Receive event) { @EventHandler private void onPlayerMove(PlayerMoveEvent event) { - Modules.get().get(Timer.class).setOverride(PlayerUtils.isMoving() ? timer.get() : Timer.OFF); + if (timer.get() != Timer.OFF) { + Modules.get().get(Timer.class).setOverride(PlayerUtils.isMoving() ? timer.get() : Timer.OFF); + } switch (jumpMode.get()) { case Vanilla -> { if (PlayerUtils.isMoving() && mc.options.jumpKey.isPressed()) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/speed/Speed.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/speed/Speed.java index 208bfff0ec..e95b3341d4 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/speed/Speed.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/speed/Speed.java @@ -118,7 +118,9 @@ private void onPlayerMove(PlayerMoveEvent event) { if (vanillaOnGround.get() && !mc.player.isOnGround() && speedMode.get() == SpeedModes.Vanilla) return; if (!inLiquids.get() && (mc.player.isTouchingWater() || mc.player.isInLava())) return; - Modules.get().get(Timer.class).setOverride(PlayerUtils.isMoving() ? timer.get() : Timer.OFF); + if (timer.get() != Timer.OFF) { + Modules.get().get(Timer.class).setOverride(PlayerUtils.isMoving() ? timer.get() : Timer.OFF); + } currentMode.onMove(event); } From 583eb40eb02c62f3ef4cdb749a222b90214e95f7 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Fri, 23 Feb 2024 13:29:29 +0000 Subject: [PATCH 213/357] speedmine bypass link original issue [skip ci] --- .../meteorclient/systems/modules/player/SpeedMine.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/SpeedMine.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/SpeedMine.java index 3a24cb5b8d..8dbc548d28 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/SpeedMine.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/SpeedMine.java @@ -118,6 +118,7 @@ else if (mode.get() == Mode.Damage) { private void onPacket(PacketEvent.Send event) { if (!(mode.get() == Mode.Damage) || !grimBypass.get()) return; + // https://github.com/GrimAnticheat/Grim/issues/1296 if (event.packet instanceof PlayerActionC2SPacket packet && packet.getAction() == PlayerActionC2SPacket.Action.STOP_DESTROY_BLOCK) { mc.getNetworkHandler().sendPacket(new PlayerActionC2SPacket(PlayerActionC2SPacket.Action.ABORT_DESTROY_BLOCK, packet.getPos().up(), packet.getDirection())); } From 9abda87f187f9ca6a85f0e5245f3f409bb2c55a0 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Fri, 23 Feb 2024 23:01:15 +0000 Subject: [PATCH 214/357] security fix for detecting meteor via translatable text in signs --- .../mixin/AbstractSignEditScreenMixin.java | 47 +++++++++++++++++++ src/main/resources/meteor-client.mixins.json | 1 + 2 files changed, 48 insertions(+) create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/AbstractSignEditScreenMixin.java diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/AbstractSignEditScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractSignEditScreenMixin.java new file mode 100644 index 0000000000..1c4fbbed07 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractSignEditScreenMixin.java @@ -0,0 +1,47 @@ +/* + * 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 net.minecraft.client.gui.screen.ingame.AbstractSignEditScreen; +import net.minecraft.text.*; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; + +import java.util.stream.Stream; + +@Mixin(AbstractSignEditScreen.class) +public class AbstractSignEditScreenMixin { + @ModifyExpressionValue(method = "(Lnet/minecraft/block/entity/SignBlockEntity;ZZLnet/minecraft/text/Text;)V", at = @At(value = "INVOKE", target = "Ljava/util/stream/IntStream;mapToObj(Ljava/util/function/IntFunction;)Ljava/util/stream/Stream;")) + private Stream modifyTranslatableText(Stream original) { + return original.map(this::modifyText); + } + + // based on https://github.com/JustAlittleWolf/ModDetectionPreventer + @Unique + private Text modifyText(Text message) { + MutableText modified = MutableText.of(message.getContent()); + + if (message.getContent() instanceof KeybindTextContent content) { + String key = content.getKey(); + + if (key.contains("meteor-client")) modified = MutableText.of(new PlainTextContent.Literal(key)); + } + if (message.getContent() instanceof TranslatableTextContent content) { + String key = content.getKey(); + + if (key.contains("meteor-client")) modified = MutableText.of(new PlainTextContent.Literal(key)); + } + + modified.setStyle(message.getStyle()); + for (Text sibling : message.getSiblings()) { + modified.append(modifyText(sibling)); + } + + return modified; + } +} diff --git a/src/main/resources/meteor-client.mixins.json b/src/main/resources/meteor-client.mixins.json index 9b7cf81096..80289c22b5 100644 --- a/src/main/resources/meteor-client.mixins.json +++ b/src/main/resources/meteor-client.mixins.json @@ -11,6 +11,7 @@ "AbstractFurnaceScreenHandlerMixin", "AbstractFurnaceScreenMixin", "AbstractSignEditScreenAccessor", + "AbstractSignEditScreenMixin", "ArmorFeatureRendererMixin", "AttributeContainerMixin", "BackgroundRendererMixin", From a8d75dc450e52250960a4aa9a8eb33f949ec4a6b Mon Sep 17 00:00:00 2001 From: hellidox <97000871+hellidox@users.noreply.github.com> Date: Sat, 10 Feb 2024 20:51:26 -0600 Subject: [PATCH 215/357] Update OffhandCrash.java --- .../meteorclient/systems/modules/player/OffhandCrash.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/OffhandCrash.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/OffhandCrash.java index 47451c973e..6e20814b4d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/OffhandCrash.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/OffhandCrash.java @@ -33,7 +33,7 @@ public class OffhandCrash extends Module { private final Setting speed = sgGeneral.add(new IntSetting.Builder() .name("speed") - .description("The amount of swaps measured in ticks.") + .description("The amount of swaps per tick.") .defaultValue(2000) .min(1) .sliderRange(1, 10000) From fc1c83a3716e32d6303212fc7cf8448f754487dd Mon Sep 17 00:00:00 2001 From: crazycat256 <63475640+crazycat256@users.noreply.github.com> Date: Mon, 26 Feb 2024 13:34:13 +0100 Subject: [PATCH 216/357] Fix BreakDelay no-insta-break (#4415) --- .../ClientPlayerInteractionManagerMixin.java | 2 +- .../systems/modules/player/BreakDelay.java | 28 ++++++++++++++++--- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerInteractionManagerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerInteractionManagerMixin.java index 582f8d62a2..7bbdcb9886 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerInteractionManagerMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerInteractionManagerMixin.java @@ -167,7 +167,7 @@ private void creativeBreakDelayChange2(ClientPlayerInteractionManager interactio @Redirect(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 deltaChange(BlockState blockState, PlayerEntity player, BlockView world, BlockPos pos) { float delta = blockState.calcBlockBreakingDelta(player, world, pos); - if (Modules.get().get(BreakDelay.class).noInstaBreak.get() && delta >= 1) { + if (Modules.get().get(BreakDelay.class).preventInstaBreak() && delta >= 1) { BlockBreakingCooldownEvent event = MeteorClient.EVENT_BUS.post(BlockBreakingCooldownEvent.get(blockBreakingCooldown)); blockBreakingCooldown = event.cooldown; return 0; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/BreakDelay.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/BreakDelay.java index 8c03db2ad6..a77923d0f4 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/BreakDelay.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/BreakDelay.java @@ -6,12 +6,14 @@ package meteordevelopment.meteorclient.systems.modules.player; import meteordevelopment.meteorclient.events.entity.player.BlockBreakingCooldownEvent; +import meteordevelopment.meteorclient.events.meteor.MouseButtonEvent; import meteordevelopment.meteorclient.settings.BoolSetting; import meteordevelopment.meteorclient.settings.IntSetting; import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.settings.SettingGroup; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; +import meteordevelopment.meteorclient.utils.misc.input.KeyAction; import meteordevelopment.orbit.EventHandler; public class BreakDelay extends Module { @@ -26,19 +28,37 @@ public class BreakDelay extends Module { .build() ); - public final Setting noInstaBreak = sgGeneral.add(new BoolSetting.Builder() + private final Setting noInstaBreak = sgGeneral.add(new BoolSetting.Builder() .name("no-insta-break") - .description("Prevent you from breaking blocks instantly.") + .description("Prevents you from misbreaking blocks if you can instantly break them.") .defaultValue(false) .build() ); + private boolean breakBlockCooldown = false; + public BreakDelay() { super(Categories.Player, "break-delay", "Changes the delay between breaking blocks."); } - @EventHandler() + @EventHandler private void onBlockBreakingCooldown(BlockBreakingCooldownEvent event) { - event.cooldown = cooldown.get(); + if (breakBlockCooldown) { + event.cooldown = 5; + breakBlockCooldown = false; + } else { + event.cooldown = cooldown.get(); + } + } + + @EventHandler + private void onClick(MouseButtonEvent event) { + if (event.action == KeyAction.Press && noInstaBreak.get()) { + breakBlockCooldown = true; + } + } + + public boolean preventInstaBreak() { + return isActive() && noInstaBreak.get(); } } From 1f98e9594686dcff78044a96d1e81c294894ae15 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Fri, 1 Mar 2024 15:53:00 -0500 Subject: [PATCH 217/357] Velocity prevent fishing rod pull (#4439) --- .../mixin/FishingBobberEntityMixin.java | 28 +++++++++++++++++++ .../systems/modules/movement/Velocity.java | 7 +++++ src/main/resources/meteor-client.mixins.json | 1 + 3 files changed, 36 insertions(+) create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/FishingBobberEntityMixin.java diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/FishingBobberEntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/FishingBobberEntityMixin.java new file mode 100644 index 0000000000..01cc2d60e3 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/FishingBobberEntityMixin.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.llamalad7.mixinextras.injector.wrapoperation.Operation; +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 org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import static meteordevelopment.meteorclient.MeteorClient.mc; + +@Mixin(FishingBobberEntity.class) +public 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.getWorld().isClient || 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/systems/modules/movement/Velocity.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Velocity.java index 54ae485eac..1687e6ca20 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Velocity.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Velocity.java @@ -126,6 +126,13 @@ public class Velocity extends Module { .build() ); + public final Setting fishing = sgGeneral.add(new BoolSetting.Builder() + .name("fishing") + .description("Prevents you from being pulled by fishing rods.") + .defaultValue(false) + .build() + ); + public Velocity() { super(Categories.Movement, "velocity", "Prevents you from being moved by external forces."); } diff --git a/src/main/resources/meteor-client.mixins.json b/src/main/resources/meteor-client.mixins.json index 80289c22b5..7f3143c3e5 100644 --- a/src/main/resources/meteor-client.mixins.json +++ b/src/main/resources/meteor-client.mixins.json @@ -90,6 +90,7 @@ "FireworkRocketEntityMixin", "FireworksSparkParticleMixin", "FireworksSparkParticleSubMixin", + "FishingBobberEntityMixin", "FluidRendererMixin", "FoliageColorsMixin", "GameOptionsMixin", From 484b2cf4eec460fd13d1eaee8555f24a05002bdc Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Mon, 4 Mar 2024 00:34:25 -0500 Subject: [PATCH 218/357] fix potential `ChunkDataEvent` race condition --- .../events/world/ChunkDataEvent.java | 21 +++++-------------- .../mixin/ClientPlayNetworkHandlerMixin.java | 2 +- .../modules/render/blockesp/BlockESP.java | 8 +++---- .../systems/modules/world/StashFinder.java | 10 ++++----- 4 files changed, 13 insertions(+), 28 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/events/world/ChunkDataEvent.java b/src/main/java/meteordevelopment/meteorclient/events/world/ChunkDataEvent.java index 340f2583cc..438c8f1f57 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/world/ChunkDataEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/world/ChunkDataEvent.java @@ -5,21 +5,10 @@ package meteordevelopment.meteorclient.events.world; -import meteordevelopment.meteorclient.utils.misc.Pool; import net.minecraft.world.chunk.WorldChunk; -public class ChunkDataEvent { - private static final Pool INSTANCE = new Pool<>(ChunkDataEvent::new); - - public WorldChunk chunk; - - public static ChunkDataEvent get(WorldChunk chunk) { - ChunkDataEvent event = INSTANCE.get(); - event.chunk = chunk; - return event; - } - - public static void returnChunkDataEvent(ChunkDataEvent event) { - INSTANCE.free(event); - } -} +/** + * @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 + */ +public record ChunkDataEvent(WorldChunk chunk) {} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerMixin.java index f15d1c2750..cf9b5d7bb2 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerMixin.java @@ -96,7 +96,7 @@ private void onPlaySound(PlaySoundS2CPacket packet, CallbackInfo info) { @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(ChunkDataEvent.get(chunk)); + MeteorClient.EVENT_BUS.post(new ChunkDataEvent(chunk)); } @Inject(method = "onScreenHandlerSlotUpdate", at = @At("TAIL")) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/blockesp/BlockESP.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/blockesp/BlockESP.java index 2f9a9063bc..39b6096f4a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/blockesp/BlockESP.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/blockesp/BlockESP.java @@ -96,7 +96,7 @@ public void onActivate() { } for (Chunk chunk : Utils.chunks()) { - searchChunk(chunk, null); + searchChunk(chunk); } lastDimension = PlayerUtils.getDimension(); @@ -153,10 +153,10 @@ public void removeGroup(ESPGroup group) { @EventHandler private void onChunkData(ChunkDataEvent event) { - searchChunk(event.chunk, event); + searchChunk(event.chunk()); } - private void searchChunk(Chunk chunk, ChunkDataEvent event) { + private void searchChunk(Chunk chunk) { MeteorExecutor.execute(() -> { if (!isActive()) return; ESPChunk schunk = ESPChunk.searchChunk(chunk, blocks.get()); @@ -173,8 +173,6 @@ private void searchChunk(Chunk chunk, ChunkDataEvent event) { updateChunk(chunk.getPos().x, chunk.getPos().z + 1); } } - - if (event != null) ChunkDataEvent.returnChunkDataEvent(event); }); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/StashFinder.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/StashFinder.java index 3cfc6b6d86..92b79a7c65 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/StashFinder.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/StashFinder.java @@ -94,13 +94,13 @@ public void onActivate() { @EventHandler private void onChunkData(ChunkDataEvent event) { // Check the distance. - double chunkXAbs = Math.abs(event.chunk.getPos().x * 16); - double chunkZAbs = Math.abs(event.chunk.getPos().z * 16); + double chunkXAbs = Math.abs(event.chunk().getPos().x * 16); + double chunkZAbs = Math.abs(event.chunk().getPos().z * 16); if (Math.sqrt(chunkXAbs * chunkXAbs + chunkZAbs * chunkZAbs) < minimumDistance.get()) return; - Chunk chunk = new Chunk(event.chunk.getPos()); + Chunk chunk = new Chunk(event.chunk().getPos()); - for (BlockEntity blockEntity : event.chunk.getBlockEntities().values()) { + for (BlockEntity blockEntity : event.chunk().getBlockEntities().values()) { if (!storageBlocks.get().contains(blockEntity.getType())) continue; if (blockEntity instanceof ChestBlockEntity) chunk.chests++; @@ -133,8 +133,6 @@ private void onChunkData(ChunkDataEvent event) { } } } - - ChunkDataEvent.returnChunkDataEvent(event); } @Override From 0a88a784d1865f0d56c12e277131da1eade24489 Mon Sep 17 00:00:00 2001 From: Vaker Date: Fri, 1 Mar 2024 03:04:05 +0300 Subject: [PATCH 219/357] Fix BetterChat getSender fallback when Timestamps are active --- .../meteorclient/systems/modules/misc/BetterChat.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java index 8fe57fc9dc..5c9944b0aa 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java @@ -220,6 +220,7 @@ public class BetterChat extends Module { private static final Pattern antiSpamRegex = Pattern.compile(" \\(([0-9]+)\\)$"); private static final Pattern timestampRegex = Pattern.compile("^(<[0-9]{2}:[0-9]{2}>\\s)"); + private static final Pattern usernameRegex = Pattern.compile("^(?:<[0-9]{2}:[0-9]{2}>\\s)?<(.*?)>.*"); private final Char2CharMap SMALL_CAPS = new Char2CharOpenHashMap(); private final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm"); @@ -426,11 +427,10 @@ private GameProfile getSender(IChatHudLine line, String text) { // If the packet did not contain a sender field then try to get the sender from the message if (sender == null) { - int openingI = text.indexOf('<'); - int closingI = text.indexOf('>'); + Matcher usernameMatcher = usernameRegex.matcher(text); - if (openingI != -1 && closingI != -1 && closingI > openingI) { - String username = text.substring(openingI + 1, closingI); + if (usernameMatcher.matches()) { + String username = usernameMatcher.group(1); PlayerListEntry entry = mc.getNetworkHandler().getPlayerListEntry(username); if (entry != null) sender = entry.getProfile(); From 1a2b5d69a739c6b9be98b234a6e7e8a564e44fe0 Mon Sep 17 00:00:00 2001 From: mist64 <91566571+misten1@users.noreply.github.com> Date: Sun, 10 Mar 2024 17:29:43 +0000 Subject: [PATCH 220/357] Save EasyMC/Altening tokens (#4428) --- .../screens/accounts/AccountInfoScreen.java | 39 +++++++++++++++++++ .../meteorclient/gui/widgets/WAccount.java | 9 ++++- .../systems/accounts/Account.java | 1 - .../systems/accounts/TokenAccount.java | 10 +++++ .../systems/accounts/types/EasyMCAccount.java | 34 +++++++++++++++- .../accounts/types/TheAlteningAccount.java | 35 ++++++++++++++++- 6 files changed, 124 insertions(+), 4 deletions(-) create mode 100644 src/main/java/meteordevelopment/meteorclient/gui/screens/accounts/AccountInfoScreen.java create mode 100644 src/main/java/meteordevelopment/meteorclient/systems/accounts/TokenAccount.java diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/accounts/AccountInfoScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/accounts/AccountInfoScreen.java new file mode 100644 index 0000000000..e81bb64dc1 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/accounts/AccountInfoScreen.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.gui.screens.accounts; + +import meteordevelopment.meteorclient.gui.GuiTheme; +import meteordevelopment.meteorclient.gui.WindowScreen; +import meteordevelopment.meteorclient.gui.widgets.containers.WHorizontalList; +import meteordevelopment.meteorclient.gui.widgets.pressable.WButton; +import meteordevelopment.meteorclient.systems.accounts.Account; +import meteordevelopment.meteorclient.systems.accounts.AccountType; +import meteordevelopment.meteorclient.systems.accounts.TokenAccount; +import meteordevelopment.meteorclient.utils.render.color.Color; + +import static meteordevelopment.meteorclient.MeteorClient.mc; + +public class AccountInfoScreen extends WindowScreen { + private Account account; + + public AccountInfoScreen(GuiTheme theme, Account account) { + super(theme, account.getUsername() + " details"); + this.account = account; + } + + @Override + public void initWidgets() { + TokenAccount e = (TokenAccount) account; + WHorizontalList l = add(theme.horizontalList()).expandX().widget(); + + WButton copy = theme.button("Copy"); + copy.action = () -> mc.keyboard.setClipboard(e.getToken()); + + l.add(theme.label((account.getType() == AccountType.EasyMC ? "EasyMC" : "TheAltening") + " token")); + l.add(theme.label(e.getToken()).color(Color.GRAY)).pad(5); + l.add(copy); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WAccount.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WAccount.java index 8262cc1c4e..1c4d3ef640 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WAccount.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WAccount.java @@ -6,11 +6,13 @@ package meteordevelopment.meteorclient.gui.widgets; import meteordevelopment.meteorclient.gui.WidgetScreen; +import meteordevelopment.meteorclient.gui.screens.accounts.AccountInfoScreen; import meteordevelopment.meteorclient.gui.widgets.containers.WHorizontalList; import meteordevelopment.meteorclient.gui.widgets.pressable.WButton; import meteordevelopment.meteorclient.gui.widgets.pressable.WMinus; import meteordevelopment.meteorclient.systems.accounts.Account; import meteordevelopment.meteorclient.systems.accounts.Accounts; +import meteordevelopment.meteorclient.systems.accounts.TokenAccount; import meteordevelopment.meteorclient.utils.network.MeteorExecutor; import meteordevelopment.meteorclient.utils.render.color.Color; @@ -18,7 +20,6 @@ public abstract class WAccount extends WHorizontalList { public Runnable refreshScreenAction; - private final WidgetScreen screen; private final Account account; @@ -43,6 +44,12 @@ public void init() { WLabel label = add(theme.label("(" + account.getType() + ")")).expandCellX().right().widget(); label.color = accountTypeColor(); + // Info + if (account instanceof TokenAccount) { + WButton info = add(theme.button("Info")).widget(); + info.action = () -> mc.setScreen(new AccountInfoScreen(theme, account)); + } + // Login WButton login = add(theme.button("Login")).widget(); login.action = () -> { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/accounts/Account.java b/src/main/java/meteordevelopment/meteorclient/systems/accounts/Account.java index 70ca1ac710..3e1b5859f4 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/accounts/Account.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/accounts/Account.java @@ -5,7 +5,6 @@ package meteordevelopment.meteorclient.systems.accounts; -import com.mojang.authlib.exceptions.AuthenticationException; import com.mojang.authlib.minecraft.MinecraftSessionService; import com.mojang.authlib.minecraft.UserApiService; import com.mojang.authlib.yggdrasil.ServicesKeyType; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/accounts/TokenAccount.java b/src/main/java/meteordevelopment/meteorclient/systems/accounts/TokenAccount.java new file mode 100644 index 0000000000..0a314485e6 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/systems/accounts/TokenAccount.java @@ -0,0 +1,10 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.systems.accounts; + +public interface TokenAccount { + String getToken(); +} diff --git a/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/EasyMCAccount.java b/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/EasyMCAccount.java index 52b1aeeef7..26f3e6e143 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/EasyMCAccount.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/EasyMCAccount.java @@ -12,20 +12,29 @@ import meteordevelopment.meteorclient.mixin.YggdrasilMinecraftSessionServiceAccessor; 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 meteordevelopment.meteorclient.utils.network.Http; import net.minecraft.client.session.Session; +import net.minecraft.nbt.NbtCompound; import java.util.Optional; import static meteordevelopment.meteorclient.MeteorClient.mc; -public class EasyMCAccount extends Account { +public class EasyMCAccount extends Account implements TokenAccount { private static final Environment ENVIRONMENT = new Environment("https://sessionserver.easymc.io", "https://authserver.mojang.com", "EasyMC"); private static final YggdrasilAuthenticationService SERVICE = new YggdrasilAuthenticationService(((MinecraftClientAccessor) mc).getProxy(), ENVIRONMENT); + private String token; public EasyMCAccount(String token) { super(AccountType.EasyMC, token); + this.token = token; + } + + public String getToken() { + return token; } @Override @@ -64,4 +73,27 @@ private static class AuthResponse { public String session; public String message; } + + @Override + public NbtCompound toTag() { + NbtCompound tag = new NbtCompound(); + + tag.putString("type", type.name()); + tag.putString("name", name); + tag.putString("token", token); + tag.put("cache", cache.toTag()); + + return tag; + } + + @Override + public EasyMCAccount fromTag(NbtCompound tag) { + if (!tag.contains("name") || !tag.contains("cache") || !tag.contains("token")) throw new NbtException(); + + name = tag.getString("name"); + token = tag.getString("token"); + cache.fromTag(tag.getCompound("cache")); + + return this; + } } 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 57f2df4bc2..51f63bba3c 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/TheAlteningAccount.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/TheAlteningAccount.java @@ -14,18 +14,23 @@ import meteordevelopment.meteorclient.mixin.YggdrasilMinecraftSessionServiceAccessor; 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 java.util.Optional; import static meteordevelopment.meteorclient.MeteorClient.mc; -public class TheAlteningAccount extends Account { +public class TheAlteningAccount extends Account implements TokenAccount { private static final Environment ENVIRONMENT = new Environment("http://sessionserver.thealtening.com", "http://authserver.thealtening.com", "The Altening"); private static final YggdrasilAuthenticationService SERVICE = new YggdrasilAuthenticationService(((MinecraftClientAccessor) mc).getProxy(), ENVIRONMENT); + private String token; public TheAlteningAccount(String token) { super(AccountType.TheAltening, token); + this.token = token; } @Override @@ -75,4 +80,32 @@ private WaybackAuthLib getAuth() { return auth; } + + @Override + public String getToken() { + return token; + } + + @Override + public NbtCompound toTag() { + NbtCompound tag = new NbtCompound(); + + tag.putString("type", type.name()); + tag.putString("name", name); + tag.putString("token", token); + tag.put("cache", cache.toTag()); + + return tag; + } + + @Override + public TheAlteningAccount fromTag(NbtCompound tag) { + if (!tag.contains("name") || !tag.contains("cache") || !tag.contains("token")) throw new NbtException(); + + name = tag.getString("name"); + token = tag.getString("token"); + cache.fromTag(tag.getCompound("cache")); + + return this; + } } From 35b82361cdb4a41e2195dee485c146d0fa4df428 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Mon, 11 Mar 2024 21:44:57 +0000 Subject: [PATCH 221/357] fix a broad chat mod incompatibility --- .../meteordevelopment/meteorclient/mixin/ChatHudMixin.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java index ac7b0b1bb7..b74600affb 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java @@ -31,7 +31,9 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.*; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Slice; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.LocalCapture; @@ -121,7 +123,7 @@ private void onAddMessage(Text message, @Nullable MessageSignatureData signature } //modify max lengths for messages and visible messages - @ModifyConstant(method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;ILnet/minecraft/client/gui/hud/MessageIndicator;Z)V", constant = @Constant(intValue = 100)) + @ModifyExpressionValue(method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;ILnet/minecraft/client/gui/hud/MessageIndicator;Z)V", at = @At(value = "CONSTANT", args = "intValue=100")) private int maxLength(int size) { if (Modules.get() == null || !getBetterChat().isLongerChat()) return size; From 0e0e5d33507fd4e1a6263a4a4f75fc36c2299868 Mon Sep 17 00:00:00 2001 From: maxsupermanhd Date: Wed, 13 Mar 2024 15:55:15 +0300 Subject: [PATCH 222/357] Add starscript function meteor.get_module_setting(module, setting) for advanced macro use --- .../utils/misc/MeteorStarscript.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorStarscript.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorStarscript.java index eba2bba254..90a3cfb507 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorStarscript.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorStarscript.java @@ -60,6 +60,7 @@ import java.time.format.DateTimeFormatter; import java.time.format.FormatStyle; import java.util.Arrays; +import java.util.List; import java.util.Optional; import java.util.stream.Collectors; @@ -90,6 +91,7 @@ public static void init() { .set("active_modules", () -> Value.number(Modules.get().getActive().size())) .set("is_module_active", MeteorStarscript::isModuleActive) .set("get_module_info", MeteorStarscript::getModuleInfo) + .set("get_module_setting", MeteorStarscript::getModuleSetting) .set("prefix", MeteorStarscript::getMeteorPrefix) ); @@ -348,6 +350,33 @@ private static Value getModuleInfo(Starscript ss, int argCount) { return Value.string(""); } + private static Value getModuleSetting(Starscript ss, int argCount) { + if (argCount != 2) ss.error("meteor.get_module_setting() requires 2 arguments, got %d.", argCount); + + var settingName = ss.popString("Second argument to meteor.get_module_setting() needs to be a string."); + var moduleName = ss.popString("First argument to meteor.get_module_setting() needs to be a string."); + Module module = Modules.get().get(moduleName); + if (module == null) { + ss.error("Unable to get module %s for meteor.get_module_setting()", moduleName); + } + var setting = module.settings.get(settingName); + if (setting == null) { + ss.error("Unable to get setting %s for module %s for meteor.get_module_setting()", settingName, moduleName); + } + var value = setting.get(); + if (value instanceof Double) { + return Value.number((Double) value); + } else if (value instanceof Integer) { + return Value.number((Integer) value); + } else if (value instanceof Boolean) { + return Value.bool((Boolean) value); + } else if (value instanceof List) { + return Value.number(((List) value).size()); + } else { + return Value.string(value.toString()); + } + } + private static Value isModuleActive(Starscript ss, int argCount) { if (argCount != 1) ss.error("meteor.is_module_active() requires 1 argument, got %d.", argCount); From 3145c37fa1473fa5877a665057dc6d99eee0395c Mon Sep 17 00:00:00 2001 From: Tas <103238549+0xTas@users.noreply.github.com> Date: Thu, 14 Mar 2024 13:17:22 -0700 Subject: [PATCH 223/357] Fix compatibility with Future Client (#4454) --- .../mixin/PlayerListHudMixin.java | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerListHudMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerListHudMixin.java index ecb00bd57d..18939ffb01 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerListHudMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerListHudMixin.java @@ -5,6 +5,8 @@ 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.misc.BetterTab; import net.minecraft.client.MinecraftClient; @@ -15,12 +17,18 @@ 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 class PlayerListHudMixin { +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); @@ -42,10 +50,20 @@ private int modifyWidth(int width) { return module.isActive() && module.accurateLatency.get() ? width + 30 : width; } - @ModifyConstant(constant = @Constant(intValue = 20), method = "render") - private int modifyHeight(int height) { + @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); - return module.isActive() ? module.tabHeight.get() : height; + 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) From 30437a09b9a0f89f6fc5421d4faa3b6db778dc02 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Sat, 16 Mar 2024 20:42:48 +0000 Subject: [PATCH 224/357] Fixes and improvements to highway builder and block utils --- .../systems/modules/world/HighwayBuilder.java | 50 +++++++++++-------- .../meteorclient/utils/misc/MBlockPos.java | 4 +- .../meteorclient/utils/world/BlockUtils.java | 16 ++++-- 3 files changed, 44 insertions(+), 26 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java index 8908aac703..2f09524c0a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java @@ -46,6 +46,7 @@ import net.minecraft.util.math.Box; import net.minecraft.util.math.Direction; import net.minecraft.util.math.Vec3d; +import net.minecraft.world.EmptyBlockView; import org.jetbrains.annotations.NotNull; import java.util.Iterator; @@ -64,7 +65,7 @@ public enum Rotation { Place(false, true), Both(true, true); - public boolean mine, place; + public final boolean mine, place; Rotation(boolean mine, boolean place) { this.mine = mine; @@ -131,7 +132,7 @@ public enum Rotation { .name("blocks-to-place") .description("Blocks it is allowed to place.") .defaultValue(Blocks.OBSIDIAN) - .filter(block -> Block.isShapeFullCube(block.getDefaultState().getCollisionShape(mc.world, ZERO))) + .filter(block -> Block.isShapeFullCube(block.getDefaultState().getCollisionShape(EmptyBlockView.INSTANCE, ZERO))) .build() ); @@ -343,7 +344,7 @@ private void render(Render3DEvent event, MBPIterator it, Predicate pr it.restore(); } - event.renderer.box(posRender2.getMcPos(), sideColor, lineColor, shapeMode, excludeDir); + event.renderer.box(posRender2.getBlockPos(), sideColor, lineColor, shapeMode, excludeDir); } } } @@ -374,11 +375,11 @@ private int getWidthRight() { private boolean canMine(MBlockPos pos, boolean ignoreBlocksToPlace) { BlockState state = pos.getState(); - return BlockUtils.canBreak(pos.getMcPos(), state) && (ignoreBlocksToPlace || !blocksToPlace.get().contains(state.getBlock())); + return BlockUtils.canBreak(pos.getBlockPos(), state) && (ignoreBlocksToPlace || !blocksToPlace.get().contains(state.getBlock())); } private boolean canPlace(MBlockPos pos, boolean liquids) { - return liquids ? !pos.getState().getFluidState().isEmpty() : pos.getState().isAir(); + return liquids ? !pos.getState().getFluidState().isEmpty() : BlockUtils.canPlace(pos.getBlockPos()); } private void disconnect(String message, Object... args) { @@ -442,17 +443,27 @@ protected void tick(HighwayBuilder b) { }, Forward { + @Override + protected void start(HighwayBuilder b) { + b.mc.player.setYaw(b.dir.yaw); + checkTasks(b); + } + @Override protected void tick(HighwayBuilder b) { b.mc.player.setYaw(b.dir.yaw); + checkTasks(b); + if (b.state == Forward) b.input.pressingForward = true; // Move + } + + private void checkTasks(HighwayBuilder b) { if (needsToPlace(b, b.blockPosProvider.getLiquids(), true)) b.setState(FillLiquids); // Fill Liquids else if (needsToMine(b, b.blockPosProvider.getFront(), true)) b.setState(MineFront); // Mine Front else if (b.floor.get() == Floor.Replace && needsToMine(b, b.blockPosProvider.getFloor(), false)) b.setState(MineFloor); // Mine Floor else if (b.railings.get() && needsToMine(b, b.blockPosProvider.getRailings(true), false)) b.setState(MineRailings); // Mine Railings else if (b.railings.get() && needsToPlace(b, b.blockPosProvider.getRailings(false), false)) b.setState(PlaceRailings); // Place Railings else if (needsToPlace(b, b.blockPosProvider.getFloor(), false)) b.setState(PlaceFloor); // Place Floor - else b.input.pressingForward = true; // Move } private boolean needsToMine(HighwayBuilder b, MBPIterator it, boolean ignoreBlocksToPlace) { @@ -683,18 +694,19 @@ protected void tick(HighwayBuilder b) { } // Check block state - BlockState blockState = b.mc.world.getBlockState(pos.getMcPos()); + BlockState blockState = b.mc.world.getBlockState(pos.getBlockPos()); if (blockState.getBlock() == Blocks.ENDER_CHEST) { // Mine ender chest - int slot = findAndMoveBestToolToHotbar(b, blockState, true, false); + int slot = findAndMoveBestToolToHotbar(b, blockState, true); if (slot == -1) { - b.error("Cannot find pickaxe with silk touch to mine ender chests."); + b.error("Cannot find pickaxe without silk touch to mine ender chests."); return; } InvUtils.swap(slot, false); - BlockUtils.breakBlock(pos.getMcPos(), true); + if (b.rotation.get().mine) Rotations.rotate(Rotations.getYaw(pos.getBlockPos()), Rotations.getPitch(pos.getBlockPos()), () -> BlockUtils.breakBlock(pos.getBlockPos(), true)); + else BlockUtils.breakBlock(pos.getBlockPos(), true); } else { // Place ender chest @@ -710,7 +722,7 @@ protected void tick(HighwayBuilder b) { first = false; } - BlockUtils.place(pos.getMcPos(), Hand.MAIN_HAND, slot, true, 0, true, true, false); + BlockUtils.place(pos.getBlockPos(), Hand.MAIN_HAND, slot, b.rotation.get().place, 0, true, true, false); } } }; @@ -726,14 +738,14 @@ protected void mine(HighwayBuilder b, MBPIterator it, boolean ignoreBlocksToPlac BlockState state = pos.getState(); if (state.isAir() || (!ignoreBlocksToPlace && b.blocksToPlace.get().contains(state.getBlock()))) continue; - int slot = findAndMoveBestToolToHotbar(b, state, false, true); + int slot = findAndMoveBestToolToHotbar(b, state, false); if (slot == -1) return; InvUtils.swap(slot, false); - BlockPos mcPos = pos.getMcPos(); + BlockPos mcPos = pos.getBlockPos(); if (BlockUtils.canBreak(mcPos)) { - if (b.rotation.get().mine) Rotations.rotate(Rotations.getYaw(mcPos), Rotations.getPitch(mcPos), () -> BlockUtils.breakBlock(pos.getMcPos(), true)); + if (b.rotation.get().mine) Rotations.rotate(Rotations.getYaw(mcPos), Rotations.getPitch(mcPos), () -> BlockUtils.breakBlock(pos.getBlockPos(), true)); else BlockUtils.breakBlock(mcPos, true); breaking = true; @@ -760,7 +772,7 @@ protected void place(HighwayBuilder b, MBPIterator it, int slot, State nextState boolean placed = false; for (MBlockPos pos : it) { - if (BlockUtils.place(pos.getMcPos(), Hand.MAIN_HAND, slot, b.rotation.get().place, 0, true, true, true)) { + if (BlockUtils.place(pos.getBlockPos(), Hand.MAIN_HAND, slot, b.rotation.get().place, 0, true, true, true)) { placed = true; b.blocksPlaced++; break; @@ -855,7 +867,7 @@ protected int findAndMoveToHotbar(HighwayBuilder b, Predicate predica return hotbarSlot; } - protected int findAndMoveBestToolToHotbar(HighwayBuilder b, BlockState blockState, boolean noSilkTouch, boolean error) { + protected int findAndMoveBestToolToHotbar(HighwayBuilder b, BlockState blockState, boolean noSilkTouch) { // Check for creative if (b.mc.player.isCreative()) return b.mc.player.getInventory().selectedSlot; @@ -875,11 +887,7 @@ protected int findAndMoveBestToolToHotbar(HighwayBuilder b, BlockState blockStat } } - // Stop if not found - if (bestSlot == -1) { - if (error) b.error("Failed to find suitable tool for mining."); - return -1; - } + if (bestSlot == -1) return b.mc.player.getInventory().selectedSlot; // Check if the tool is already in hotbar if (bestSlot < 9) return bestSlot; diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/MBlockPos.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/MBlockPos.java index 6ac88ebaa9..2e55dab575 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/MBlockPos.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/MBlockPos.java @@ -51,12 +51,12 @@ public MBlockPos add(int x, int y, int z) { return this; } - public BlockPos getMcPos() { + public BlockPos getBlockPos() { return POS.set(x, y, z); } public BlockState getState() { - return mc.world.getBlockState(getMcPos()); + return mc.world.getBlockState(getBlockPos()); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java index 4149068d9b..fd9165f2f4 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java @@ -11,6 +11,7 @@ import meteordevelopment.meteorclient.utils.player.FindItemResult; import meteordevelopment.meteorclient.utils.player.InvUtils; import meteordevelopment.meteorclient.utils.player.Rotations; +import meteordevelopment.meteorclient.utils.player.SlotUtils; import meteordevelopment.orbit.EventHandler; import meteordevelopment.orbit.EventPriority; import net.minecraft.block.*; @@ -20,6 +21,7 @@ import net.minecraft.enchantment.Enchantments; import net.minecraft.entity.effect.StatusEffectUtil; import net.minecraft.entity.effect.StatusEffects; +import net.minecraft.item.BlockItem; import net.minecraft.item.ItemStack; import net.minecraft.network.packet.c2s.play.HandSwingC2SPacket; import net.minecraft.registry.tag.FluidTags; @@ -77,7 +79,11 @@ public static boolean place(BlockPos blockPos, FindItemResult findItemResult, bo public static boolean place(BlockPos blockPos, Hand hand, int slot, boolean rotate, int rotationPriority, boolean swingHand, boolean checkEntities, boolean swapBack) { if (slot < 0 || slot > 8) return false; - if (!canPlace(blockPos, checkEntities)) return false; + + Block toPlace = Blocks.OBSIDIAN; + ItemStack i = hand == Hand.MAIN_HAND ? mc.player.getInventory().getStack(slot) : mc.player.getInventory().getStack(SlotUtils.OFFHAND); + if (i.getItem() instanceof BlockItem blockItem) toPlace = blockItem.getBlock(); + if (!canPlaceBlock(blockPos, checkEntities, toPlace)) return false; Vec3d hitPos = Vec3d.ofCenter(blockPos); @@ -128,7 +134,7 @@ public static void interact(BlockHitResult blockHitResult, Hand hand, boolean sw mc.player.input.sneaking = wasSneaking; } - public static boolean canPlace(BlockPos blockPos, boolean checkEntities) { + public static boolean canPlaceBlock(BlockPos blockPos, boolean checkEntities, Block block) { if (blockPos == null) return false; // Check y level @@ -138,7 +144,11 @@ public static boolean canPlace(BlockPos blockPos, boolean checkEntities) { if (!mc.world.getBlockState(blockPos).isReplaceable()) return false; // Check if intersects entities - return !checkEntities || mc.world.canPlace(Blocks.OBSIDIAN.getDefaultState(), blockPos, ShapeContext.absent()); + return !checkEntities || mc.world.canPlace(block.getDefaultState(), blockPos, ShapeContext.absent()); + } + + public static boolean canPlace(BlockPos blockPos, boolean checkEntities) { + return canPlaceBlock(blockPos, checkEntities, Blocks.OBSIDIAN); } public static boolean canPlace(BlockPos blockPos) { From f19fe10cdc52c3974bd2a7c989dc9cab730bc7bb Mon Sep 17 00:00:00 2001 From: L4J <80828850+Logging4J@users.noreply.github.com> Date: Mon, 12 Feb 2024 22:06:48 +0000 Subject: [PATCH 225/357] Fix Auto Tool For Leaf Blocks Fixes Auto Tool not switching to shears when when breaking leaf blocks --- .../meteorclient/systems/modules/player/AutoTool.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java index f72e2fa1d0..0bca304ba7 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java @@ -189,7 +189,7 @@ private boolean shouldStopUsing(ItemStack itemStack) { public static double getScore(ItemStack itemStack, BlockState state, boolean silkTouchEnderChest, boolean fortuneOre, EnchantPreference enchantPreference, Predicate good) { if (!good.test(itemStack) || !isTool(itemStack)) return -1; - if (!itemStack.isSuitableFor(state) && !(itemStack.getItem() instanceof SwordItem && (state.getBlock() instanceof BambooBlock || state.getBlock() instanceof BambooShootBlock))) return -1; + if (!itemStack.isSuitableFor(state) && !(itemStack.getItem() instanceof SwordItem && (state.getBlock() instanceof BambooBlock || state.getBlock() instanceof BambooShootBlock)) && !(itemStack.getItem() instanceof ShearsItem && (state.getBlock() instanceof LeavesBlock))) return -1; if (silkTouchEnderChest && state.getBlock() == Blocks.ENDER_CHEST From aaa2e1f08fa385c1320716145a42bc79a104a016 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Mon, 18 Mar 2024 17:58:08 +0000 Subject: [PATCH 226/357] lol? --- .../meteorclient/systems/modules/render/BetterTab.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTab.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTab.java index c48e8da88e..e0aa93a3d8 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTab.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTab.java @@ -3,7 +3,7 @@ * Copyright (c) Meteor Development. */ -package meteordevelopment.meteorclient.systems.modules.misc; +package meteordevelopment.meteorclient.systems.modules.render; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.config.Config; From 21add2d033609d4d4c9296d1861ac06d26f53de3 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Mon, 18 Mar 2024 17:59:44 +0000 Subject: [PATCH 227/357] Add back InstaMine --- .../meteorclient/systems/modules/Modules.java | 4 +- .../systems/modules/player/InstaMine.java | 132 ++++++++++++++++++ 2 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 src/main/java/meteordevelopment/meteorclient/systems/modules/player/InstaMine.java diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java index 7b90565aad..4bbc322a22 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java @@ -52,6 +52,7 @@ import net.minecraft.registry.tag.TagKey; import net.minecraft.util.Identifier; import net.minecraft.util.math.random.Random; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.lwjgl.glfw.GLFW; @@ -424,6 +425,7 @@ private void initPlayer() { add(new FakePlayer()); add(new FastUse()); add(new GhostHand()); + add(new InstaMine()); add(new LiquidInteract()); add(new MiddleClickExtra()); add(new BreakDelay()); @@ -631,7 +633,7 @@ public Module get(int index) { } @Override - public Iterator iterator() { + public @NotNull Iterator iterator() { return new ModuleIterator(); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/InstaMine.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/InstaMine.java new file mode 100644 index 0000000000..44de277791 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/InstaMine.java @@ -0,0 +1,132 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.systems.modules.player; + +import meteordevelopment.meteorclient.events.entity.player.StartBreakingBlockEvent; +import meteordevelopment.meteorclient.events.render.Render3DEvent; +import meteordevelopment.meteorclient.events.world.TickEvent; +import meteordevelopment.meteorclient.renderer.ShapeMode; +import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.systems.modules.Categories; +import meteordevelopment.meteorclient.systems.modules.Module; +import meteordevelopment.meteorclient.utils.player.Rotations; +import meteordevelopment.meteorclient.utils.render.color.SettingColor; +import meteordevelopment.meteorclient.utils.world.BlockUtils; +import meteordevelopment.orbit.EventHandler; +import net.minecraft.item.PickaxeItem; +import net.minecraft.network.packet.c2s.play.HandSwingC2SPacket; +import net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; + +public class InstaMine extends Module { + private final SettingGroup sgGeneral = settings.getDefaultGroup(); + private final SettingGroup sgRender = settings.createGroup("Render"); + + private final Setting tickDelay = sgGeneral.add(new IntSetting.Builder() + .name("delay") + .description("The delay between break attempts.") + .defaultValue(0) + .min(0) + .sliderMax(20) + .build() + ); + + private final Setting pick = sgGeneral.add(new BoolSetting.Builder() + .name("only-pick") + .description("Only tries to mine the block if you are holding a pickaxe.") + .defaultValue(true) + .build() + ); + + private final Setting rotate = sgGeneral.add(new BoolSetting.Builder() + .name("rotate") + .description("Faces the block being mined server side.") + .defaultValue(true) + .build() + ); + + // Render + + private final Setting render = sgRender.add(new BoolSetting.Builder() + .name("render") + .description("Renders an overlay on the block being broken.") + .defaultValue(true) + .build() + ); + + private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() + .name("shape-mode") + .description("How the shapes are rendered.") + .defaultValue(ShapeMode.Both) + .build() + ); + + private final Setting sideColor = sgRender.add(new ColorSetting.Builder() + .name("side-color") + .description("The color of the sides of the blocks being rendered.") + .defaultValue(new SettingColor(204, 0, 0, 10)) + .build() + ); + + private final Setting lineColor = sgRender.add(new ColorSetting.Builder() + .name("line-color") + .description("The color of the lines of the blocks being rendered.") + .defaultValue(new SettingColor(204, 0, 0, 255)) + .build() + ); + + private final BlockPos.Mutable blockPos = new BlockPos.Mutable(0, Integer.MIN_VALUE, 0); + private int ticks; + private Direction direction; + + public InstaMine() { + super(Categories.Player, "insta-mine", "Instantly re-breaks blocks in the same position."); + } + + @Override + public void onActivate() { + ticks = 0; + blockPos.set(0, -1, 0); + } + + @EventHandler + private void onStartBreakingBlock(StartBreakingBlockEvent event) { + direction = event.direction; + blockPos.set(event.blockPos); + } + + @EventHandler + private void onTick(TickEvent.Pre event) { + if (ticks >= tickDelay.get()) { + ticks = 0; + + if (shouldMine()) { + if (rotate.get()) + Rotations.rotate(Rotations.getYaw(blockPos), Rotations.getPitch(blockPos), () -> mc.getNetworkHandler().sendPacket(new PlayerActionC2SPacket(PlayerActionC2SPacket.Action.STOP_DESTROY_BLOCK, blockPos, direction))); + else mc.getNetworkHandler().sendPacket(new PlayerActionC2SPacket(PlayerActionC2SPacket.Action.STOP_DESTROY_BLOCK, blockPos, direction)); + + mc.getNetworkHandler().sendPacket(new HandSwingC2SPacket(Hand.MAIN_HAND)); + } + } else { + ticks++; + } + } + + private boolean shouldMine() { + if (mc.world.isOutOfHeightLimit(blockPos) || !BlockUtils.canBreak(blockPos)) return false; + + return !pick.get() || mc.player.getMainHandStack().getItem() instanceof PickaxeItem; + } + + @EventHandler + private void onRender(Render3DEvent event) { + if (!render.get() || !shouldMine()) return; + + event.renderer.box(blockPos, sideColor.get(), lineColor.get(), shapeMode.get(), 0); + } +} From d240336fb85f918c0b301fb4e8159d17d44dcc07 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Mon, 18 Mar 2024 18:04:05 +0000 Subject: [PATCH 228/357] oopsie --- .../meteorclient/mixin/PlayerListHudMixin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerListHudMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerListHudMixin.java index 18939ffb01..affa543550 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerListHudMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerListHudMixin.java @@ -8,7 +8,7 @@ import com.llamalad7.mixinextras.sugar.Local; import com.llamalad7.mixinextras.sugar.ref.LocalIntRef; import meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.systems.modules.misc.BetterTab; +import meteordevelopment.meteorclient.systems.modules.render.BetterTab; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; From 960d86bdb382380023f00bca877903a541cd923f Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Tue, 19 Mar 2024 17:17:26 +0000 Subject: [PATCH 229/357] Make instamine work properly with BlockUtils::breakBlock --- .../systems/modules/movement/Scaffold.java | 8 +++----- .../systems/modules/player/InstaMine.java | 13 ++++++++----- .../meteorclient/utils/world/BlockUtils.java | 11 ++++++++++- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Scaffold.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Scaffold.java index ed77f35ab9..4859cc63eb 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Scaffold.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Scaffold.java @@ -133,7 +133,7 @@ public class Scaffold extends Module { .defaultValue(0) .min(0) .max(6) - .visible(() -> airPlace.get()) + .visible(airPlace::get) .build() ); @@ -142,7 +142,7 @@ public class Scaffold extends Module { .description("How many blocks to place in one tick.") .defaultValue(3) .min(1) - .visible(() -> airPlace.get()) + .visible(airPlace::get) .build() ); @@ -229,9 +229,7 @@ private void onTick(TickEvent.Pre event) { } } } - if (blockPosArray.size() == 0) { - return; - } + if (blockPosArray.isEmpty()) return; blockPosArray.sort(Comparator.comparingDouble((blockPos) -> blockPos.getSquaredDistance(targetBlock))); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/InstaMine.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/InstaMine.java index 44de277791..71efa7ea0f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/InstaMine.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/InstaMine.java @@ -80,7 +80,7 @@ public class InstaMine extends Module { .build() ); - private final BlockPos.Mutable blockPos = new BlockPos.Mutable(0, Integer.MIN_VALUE, 0); + public final BlockPos.Mutable blockPos = new BlockPos.Mutable(0, Integer.MIN_VALUE, 0); private int ticks; private Direction direction; @@ -106,9 +106,8 @@ private void onTick(TickEvent.Pre event) { ticks = 0; if (shouldMine()) { - if (rotate.get()) - Rotations.rotate(Rotations.getYaw(blockPos), Rotations.getPitch(blockPos), () -> mc.getNetworkHandler().sendPacket(new PlayerActionC2SPacket(PlayerActionC2SPacket.Action.STOP_DESTROY_BLOCK, blockPos, direction))); - else mc.getNetworkHandler().sendPacket(new PlayerActionC2SPacket(PlayerActionC2SPacket.Action.STOP_DESTROY_BLOCK, blockPos, direction)); + if (rotate.get()) Rotations.rotate(Rotations.getYaw(blockPos), Rotations.getPitch(blockPos), this::sendPacket); + else sendPacket(); mc.getNetworkHandler().sendPacket(new HandSwingC2SPacket(Hand.MAIN_HAND)); } @@ -117,7 +116,11 @@ private void onTick(TickEvent.Pre event) { } } - private boolean shouldMine() { + public void sendPacket() { + mc.getNetworkHandler().sendPacket(new PlayerActionC2SPacket(PlayerActionC2SPacket.Action.STOP_DESTROY_BLOCK, blockPos, direction)); + } + + public boolean shouldMine() { if (mc.world.isOutOfHeightLimit(blockPos) || !BlockUtils.canBreak(blockPos)) return false; return !pick.get() || mc.player.getMainHandStack().getItem() instanceof PickaxeItem; diff --git a/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java index fd9165f2f4..1ee7a88b9d 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java @@ -7,6 +7,8 @@ import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.world.TickEvent; +import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.player.InstaMine; import meteordevelopment.meteorclient.utils.PreInit; import meteordevelopment.meteorclient.utils.player.FindItemResult; import meteordevelopment.meteorclient.utils.player.InvUtils; @@ -37,6 +39,7 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; +@SuppressWarnings("ConstantConditions") public class BlockUtils { public static boolean breaking; private static boolean breakingThisTick; @@ -220,9 +223,15 @@ private static void onTickPost(TickEvent.Post event) { public static boolean breakBlock(BlockPos blockPos, boolean swing) { if (!canBreak(blockPos, mc.world.getBlockState(blockPos))) return false; - // Creating new instance of block pos because minecraft assigns the parameter to a field and we don't want it to change when it has been stored in a field somewhere + // Creating new instance of block pos because minecraft assigns the parameter to a field, and we don't want it to change when it has been stored in a field somewhere BlockPos pos = blockPos instanceof BlockPos.Mutable ? new BlockPos(blockPos) : blockPos; + InstaMine im = Modules.get().get(InstaMine.class); + if (im.isActive() && im.blockPos.equals(pos) && im.shouldMine()) { + im.sendPacket(); + return true; + } + if (mc.interactionManager.isBreakingBlock()) mc.interactionManager.updateBlockBreakingProgress(pos, getDirection(blockPos)); else mc.interactionManager.attackBlock(pos, getDirection(blockPos)); From 8a868a19b457c3da45c3287c6149bee046c728d0 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Tue, 19 Mar 2024 19:02:55 +0000 Subject: [PATCH 230/357] VeinMiner sane default setting --- .../meteorclient/systems/modules/world/VeinMiner.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/VeinMiner.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/VeinMiner.java index ca985ce861..53937e680d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/VeinMiner.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/VeinMiner.java @@ -62,7 +62,7 @@ public class VeinMiner extends Module { private final Setting mode = sgGeneral.add(new EnumSetting.Builder() .name("mode") .description("Selection mode.") - .defaultValue(ListMode.Whitelist) + .defaultValue(ListMode.Blacklist) .build() ); From 6ee9ea55f8e8ef412243cdab63494b6dc15d0aa1 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Wed, 20 Mar 2024 09:40:09 -0400 Subject: [PATCH 231/357] Optimize status effect map setting (#4392) --- ...StatusEffectAmplifierMapSettingScreen.java | 6 ++-- .../StatusEffectAmplifierMapSetting.java | 34 ++++++++++++------- .../systems/modules/player/PotionSpoof.java | 20 +++++------ .../meteorclient/utils/Utils.java | 12 +++---- 4 files changed, 39 insertions(+), 33 deletions(-) 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 f4b4c073c8..09849ffd5b 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/StatusEffectAmplifierMapSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/StatusEffectAmplifierMapSettingScreen.java @@ -5,7 +5,7 @@ package meteordevelopment.meteorclient.gui.screens.settings; -import it.unimi.dsi.fastutil.objects.Object2IntMap; +import it.unimi.dsi.fastutil.objects.Reference2IntMap; import meteordevelopment.meteorclient.gui.GuiTheme; import meteordevelopment.meteorclient.gui.WindowScreen; import meteordevelopment.meteorclient.gui.widgets.containers.WTable; @@ -23,13 +23,13 @@ import java.util.List; 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; diff --git a/src/main/java/meteordevelopment/meteorclient/settings/StatusEffectAmplifierMapSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/StatusEffectAmplifierMapSetting.java index a4047536a2..cd2f90c5fe 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/StatusEffectAmplifierMapSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/StatusEffectAmplifierMapSetting.java @@ -5,9 +5,9 @@ package meteordevelopment.meteorclient.settings; -import it.unimi.dsi.fastutil.objects.Object2IntArrayMap; -import it.unimi.dsi.fastutil.objects.Object2IntMap; -import meteordevelopment.meteorclient.utils.Utils; +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; @@ -15,20 +15,22 @@ import java.util.function.Consumer; -public class StatusEffectAmplifierMapSetting extends Setting> { - public StatusEffectAmplifierMapSetting(String name, String description, Object2IntMap defaultValue, Consumer> onChanged, Consumer>> onModuleActivated, IVisible visible) { +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) { super(name, description, defaultValue, onChanged, onModuleActivated, visible); } @Override public void resetImpl() { - value = new Object2IntArrayMap<>(defaultValue); + value = new Reference2IntOpenHashMap<>(defaultValue); } @Override - protected Object2IntMap parseImpl(String str) { + protected Reference2IntMap parseImpl(String str) { String[] values = str.split(","); - Object2IntMap effects = Utils.createStatusEffectMap(); + Reference2IntMap effects = new Reference2IntOpenHashMap<>(EMPTY_STATUS_EFFECT_MAP); try { for (String value : values) { @@ -45,7 +47,7 @@ protected Object2IntMap parseImpl(String str) { } @Override - protected boolean isValueValid(Object2IntMap value) { + protected boolean isValueValid(Reference2IntMap value) { return true; } @@ -61,8 +63,16 @@ public NbtCompound save(NbtCompound tag) { return tag; } + private static Reference2IntMap createStatusEffectMap() { + Reference2IntMap map = new Reference2IntArrayMap<>(Registries.STATUS_EFFECT.getIds().size()); + + Registries.STATUS_EFFECT.forEach(potion -> map.put(potion, 0)); + + return map; + } + @Override - public Object2IntMap load(NbtCompound tag) { + public Reference2IntMap load(NbtCompound tag) { get().clear(); NbtCompound valueTag = tag.getCompound("value"); @@ -74,9 +84,9 @@ public Object2IntMap load(NbtCompound tag) { return get(); } - public static class Builder extends SettingBuilder, StatusEffectAmplifierMapSetting> { + public static class Builder extends SettingBuilder, StatusEffectAmplifierMapSetting> { public Builder() { - super(new Object2IntArrayMap<>(0)); + super(new Reference2IntOpenHashMap<>(0)); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/PotionSpoof.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/PotionSpoof.java index 24af8ac2b4..dc0669ac88 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/PotionSpoof.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/PotionSpoof.java @@ -5,7 +5,7 @@ package meteordevelopment.meteorclient.systems.modules.player; -import it.unimi.dsi.fastutil.objects.Object2IntMap; +import it.unimi.dsi.fastutil.objects.Reference2IntMap; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.mixin.StatusEffectInstanceAccessor; import meteordevelopment.meteorclient.settings.*; @@ -23,7 +23,7 @@ public class PotionSpoof extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final Setting> spoofPotions = sgGeneral.add(new StatusEffectAmplifierMapSetting.Builder() + private final Setting> spoofPotions = sgGeneral.add(new StatusEffectAmplifierMapSetting.Builder() .name("spoofed-potions") .description("Potions to add.") .defaultValue(Utils.createStatusEffectMap()) @@ -64,24 +64,24 @@ public PotionSpoof() { public void onDeactivate() { if (!clearEffects.get() || !Utils.canUpdate()) return; - for (StatusEffect effect : spoofPotions.get().keySet()) { - if (spoofPotions.get().getInt(effect) <= 0) continue; - if (mc.player.hasStatusEffect(effect)) mc.player.removeStatusEffect(effect); + for (Reference2IntMap.Entry entry : spoofPotions.get().reference2IntEntrySet()) { + if (entry.getIntValue() <= 0) continue; + if (mc.player.hasStatusEffect(entry.getKey())) mc.player.removeStatusEffect(entry.getKey()); } } @EventHandler private void onTick(TickEvent.Post event) { - for (StatusEffect statusEffect : spoofPotions.get().keySet()) { - int level = spoofPotions.get().getInt(statusEffect); + for (Reference2IntMap.Entry entry : spoofPotions.get().reference2IntEntrySet()) { + int level = entry.getIntValue(); if (level <= 0) continue; - if (mc.player.hasStatusEffect(statusEffect)) { - StatusEffectInstance instance = mc.player.getStatusEffect(statusEffect); + if (mc.player.hasStatusEffect(entry.getKey())) { + StatusEffectInstance instance = mc.player.getStatusEffect(entry.getKey()); ((StatusEffectInstanceAccessor) instance).setAmplifier(level - 1); if (instance.getDuration() < 20) ((StatusEffectInstanceAccessor) instance).setDuration(20); } else { - mc.player.addStatusEffect(new StatusEffectInstance(statusEffect, 20, level - 1)); + mc.player.addStatusEffect(new StatusEffectInstance(entry.getKey(), 20, level - 1)); } } } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/Utils.java b/src/main/java/meteordevelopment/meteorclient/utils/Utils.java index 35e9dbb004..6c137e9eee 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/Utils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/Utils.java @@ -7,13 +7,13 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.VertexSorter; -import it.unimi.dsi.fastutil.objects.Object2IntArrayMap; -import it.unimi.dsi.fastutil.objects.Object2IntMap; +import it.unimi.dsi.fastutil.objects.*; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.gui.tabs.TabScreen; import meteordevelopment.meteorclient.mixin.*; import meteordevelopment.meteorclient.mixininterface.IMinecraftClient; +import meteordevelopment.meteorclient.settings.StatusEffectAmplifierMapSetting; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.BetterTooltips; import meteordevelopment.meteorclient.systems.modules.world.Timer; @@ -242,12 +242,8 @@ public static boolean hasItems(ItemStack itemStack) { return compoundTag != null && compoundTag.contains("Items", 9); } - public static Object2IntMap createStatusEffectMap() { - Object2IntMap map = new Object2IntArrayMap<>(Registries.STATUS_EFFECT.getIds().size()); - - Registries.STATUS_EFFECT.forEach(potion -> map.put(potion, 0)); - - return map; + public static Reference2IntMap createStatusEffectMap() { + return new Reference2IntArrayMap<>(StatusEffectAmplifierMapSetting.EMPTY_STATUS_EFFECT_MAP); } public static String getEnchantSimpleName(Enchantment enchantment, int length) { From 054f329ca501af651013ae4dd583f161c8040b49 Mon Sep 17 00:00:00 2001 From: crazycat256 <63475640+crazycat256@users.noreply.github.com> Date: Thu, 11 Jan 2024 12:14:13 +0100 Subject: [PATCH 232/357] Add no-sneak setting to Flight --- .../mixin/ClientPlayerEntityMixin.java | 6 ++--- .../systems/modules/movement/Flight.java | 22 ++++++++++++++++--- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityMixin.java index c971bd64c4..cedf6b361c 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityMixin.java @@ -12,10 +12,7 @@ import meteordevelopment.meteorclient.events.entity.DropItemsEvent; import meteordevelopment.meteorclient.events.entity.player.SendMovementPacketsEvent; import meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.systems.modules.movement.NoSlow; -import meteordevelopment.meteorclient.systems.modules.movement.Scaffold; -import meteordevelopment.meteorclient.systems.modules.movement.Sneak; -import meteordevelopment.meteorclient.systems.modules.movement.Velocity; +import meteordevelopment.meteorclient.systems.modules.movement.*; import meteordevelopment.meteorclient.systems.modules.player.Portals; import meteordevelopment.meteorclient.utils.Utils; import net.minecraft.client.MinecraftClient; @@ -55,6 +52,7 @@ private boolean redirectUsingItem(boolean 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) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Flight.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Flight.java index bd0d1b6599..3706dcddcd 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Flight.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Flight.java @@ -50,6 +50,14 @@ public class Flight extends Module { .build() ); + private final Setting noSneak = sgGeneral.add(new BoolSetting.Builder() + .name("no-sneak") + .description("Prevents you from sneaking while flying.") + .defaultValue(false) + .visible(() -> mode.get() == Mode.Velocity) + .build() + ); + private final Setting antiKickMode = sgAntiKick.add(new EnumSetting.Builder() .name("mode") .description("The mode for anti kick.") @@ -148,11 +156,15 @@ private void onPostTick(TickEvent.Post event) { case Velocity -> { mc.player.getAbilities().flying = false; mc.player.setVelocity(0, 0, 0); - Vec3d initialVelocity = mc.player.getVelocity(); + Vec3d playerVelocity = mc.player.getVelocity(); if (mc.options.jumpKey.isPressed()) - mc.player.setVelocity(initialVelocity.add(0, speed.get() * (verticalSpeedMatch.get() ? 10f : 5f), 0)); + playerVelocity = playerVelocity.add(0, speed.get() * (verticalSpeedMatch.get() ? 10f : 5f), 0); if (mc.options.sneakKey.isPressed()) - mc.player.setVelocity(initialVelocity.subtract(0, speed.get() * (verticalSpeedMatch.get() ? 10f : 5f), 0)); + playerVelocity = playerVelocity.subtract(0, speed.get() * (verticalSpeedMatch.get() ? 10f : 5f), 0); + mc.player.setVelocity(playerVelocity); + if (noSneak.get()) { + mc.player.setOnGround(false); + } } case Abilities -> { if (mc.player.isSpectator()) return; @@ -238,6 +250,10 @@ public float getOffGroundSpeed() { return speed.get().floatValue() * (mc.player.isSprinting() ? 15f : 10f); } + public boolean noSneak() { + return isActive() && mode.get() == Mode.Velocity && noSneak.get(); + } + public enum Mode { Abilities, Velocity From 7e9068676501cf4bade0bf72c41dd7c5ba64737e Mon Sep 17 00:00:00 2001 From: 0x06 <56885523+0x000006@users.noreply.github.com> Date: Mon, 25 Mar 2024 20:21:59 +0100 Subject: [PATCH 233/357] Use tickDelta in RenderBlock for smoother rendering (#4474) --- .../meteorclient/utils/render/RenderUtils.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/RenderUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/render/RenderUtils.java index 99dfc3c3a5..b46a8975c5 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/RenderUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/RenderUtils.java @@ -164,12 +164,13 @@ public void render(Render3DEvent event) { double x1 = pos.getX(), y1 = pos.getY(), z1 = pos.getZ(), x2 = pos.getX() + 1, y2 = pos.getY() + 1, z2 = pos.getZ() + 1; + double d = (double) (ticks - event.tickDelta) / duration; + if (fade) { - sideColor.a *= (double) ticks / duration; - lineColor.a *= (double) ticks / duration; + sideColor.a = (int) (sideColor.a * d); + lineColor.a = (int) (lineColor.a * d); } if (shrink) { - double d = (double) ticks / duration; x1 += d; y1 += d; z1 += d; x2 -= d; y2 -= d; z2 -= d; } From efbd39af2605ad51be858c95832ca7d39b1b6918 Mon Sep 17 00:00:00 2001 From: crazycat256 <63475640+crazycat256@users.noreply.github.com> Date: Wed, 10 Jan 2024 16:06:30 +0100 Subject: [PATCH 234/357] Jesus improvements --- .../systems/modules/movement/Jesus.java | 48 +++++++++++++++++-- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Jesus.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Jesus.java index ff0ab134df..afe5691e97 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Jesus.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Jesus.java @@ -28,6 +28,7 @@ import net.minecraft.network.packet.Packet; import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket; import net.minecraft.registry.tag.FluidTags; +import net.minecraft.state.property.Properties; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Box; import net.minecraft.util.math.MathHelper; @@ -188,8 +189,15 @@ private void onTick(TickEvent.Post event) { } if (mc.player.isTouchingWater() && !waterShouldBeSolid()) return; + if (mc.player.isInSwimmingPose()) return; if (mc.player.isInLava() && !lavaShouldBeSolid()) return; + // Move up in bubble columns + if (isTouchingBubbleColumn()) { + if (mc.options.jumpKey.isPressed() && mc.player.getVelocity().getY() < 0.11) ((IVec3d) mc.player.getVelocity()).setY(0.11); + return; + } + // Move up if (mc.player.isTouchingWater() || mc.player.isInLava()) { ((IVec3d) mc.player.getVelocity()).setY(0.11); @@ -197,15 +205,24 @@ private void onTick(TickEvent.Post event) { return; } + BlockState blockBelowState = mc.world.getBlockState(mc.player.getBlockPos().down()); + boolean waterLogger = false; + try { + waterLogger = blockBelowState.get(Properties.WATERLOGGED); + } catch (Exception ignored) {} + + // Simulate jumping out of water if (tickTimer == 0) ((IVec3d) mc.player.getVelocity()).setY(0.30); - else if (tickTimer == 1) ((IVec3d) mc.player.getVelocity()).setY(0); + else if (tickTimer == 1 && (blockBelowState == Blocks.WATER.getDefaultState() || blockBelowState == Blocks.LAVA.getDefaultState() || waterLogger)) + ((IVec3d) mc.player.getVelocity()).setY(0); tickTimer++; } @EventHandler private void onCanWalkOnFluid(CanWalkOnFluidEvent event) { + if (mc.player != null && mc.player.isInSwimmingPose()) return; if ((event.fluidState.getFluid() == Fluids.WATER || event.fluidState.getFluid() == Fluids.FLOWING_WATER) && waterShouldBeSolid()) { event.walkOnFluid = true; } @@ -218,9 +235,9 @@ else if ((event.fluidState.getFluid() == Fluids.LAVA || event.fluidState.getFlui private void onFluidCollisionShape(CollisionShapeEvent event) { if (event.state.getFluidState().isEmpty()) return; - if ((event.state.getBlock() == Blocks.WATER | event.state.getFluidState().getFluid() == Fluids.WATER) && !mc.player.isTouchingWater() && waterShouldBeSolid()) { + if ((event.state.getBlock() == Blocks.WATER | event.state.getFluidState().getFluid() == Fluids.WATER) && !mc.player.isTouchingWater() && waterShouldBeSolid() && event.pos.getY() <= mc.player.getY() - 1) { event.shape = VoxelShapes.fullCube(); - } else if (event.state.getBlock() == Blocks.LAVA && !mc.player.isInLava() && lavaShouldBeSolid()) { + } else if (event.state.getBlock() == Blocks.LAVA && !mc.player.isInLava() && lavaShouldBeSolid() && (!lavaIsSafe() || event.pos.getY() <= mc.player.getY() - 1)) { event.shape = VoxelShapes.fullCube(); } } @@ -326,6 +343,31 @@ private boolean isOverLiquid() { return foundLiquid && !foundSolid; } + + private boolean isTouchingBubbleColumn() { + // Get the bounding box of the player, it's necessary to slightly to avoid false positives + Box box = mc.player.getBoundingBox().contract(0.001); + + double xStep = (box.maxX - box.minX) / 2; + double yStep = (box.maxY - box.minY) / 2; + double zStep = (box.maxZ - box.minZ) / 2; + + // Scans all corners and in mid-edges positions and checks whether the block is a bubble column or not + for (int x = 0; x < 3; x++) { + for (int y = 0; y < 3; y++) { + for (int z = 0; z < 3; z++) { + BlockPos blockPos = new BlockPos((int) Math.floor(box.minX + xStep * x), (int) Math.floor(box.minY + yStep * y), (int) Math.floor(box.minZ + zStep * z)); + BlockState blockState = mc.world.getBlockState(blockPos); + if (blockState.getBlock() == Blocks.BUBBLE_COLUMN) { + return true; + } + } + } + } + + return false; + } + public enum Mode { Solid, Bob, From 6fdfaa1cfc0be4880380ca6b34eee7e0afcdb4da Mon Sep 17 00:00:00 2001 From: crazycat256 <63475640+crazycat256@users.noreply.github.com> Date: Thu, 11 Jan 2024 22:01:25 +0100 Subject: [PATCH 235/357] Removed isTouchingBubbleColumn --- .../meteorclient/mixin/EntityMixin.java | 21 +++++++++--- .../systems/modules/movement/Jesus.java | 32 ++++--------------- 2 files changed, 23 insertions(+), 30 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/EntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/EntityMixin.java index 74e4af8f4f..e62c6f6395 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/EntityMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/EntityMixin.java @@ -13,10 +13,7 @@ import meteordevelopment.meteorclient.events.entity.player.PlayerMoveEvent; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.combat.Hitboxes; -import meteordevelopment.meteorclient.systems.modules.movement.Flight; -import meteordevelopment.meteorclient.systems.modules.movement.NoFall; -import meteordevelopment.meteorclient.systems.modules.movement.NoSlow; -import meteordevelopment.meteorclient.systems.modules.movement.Velocity; +import meteordevelopment.meteorclient.systems.modules.movement.*; import meteordevelopment.meteorclient.systems.modules.movement.elytrafly.ElytraFly; import meteordevelopment.meteorclient.systems.modules.render.ESP; import meteordevelopment.meteorclient.systems.modules.render.NoRender; @@ -69,6 +66,22 @@ private void isInLava(CallbackInfoReturnable info) { if ((Object) this == mc.player && Modules.get().get(NoSlow.class).fluidDrag()) info.setReturnValue(false); } + @Inject(method = "onBubbleColumnSurfaceCollision", at = @At("HEAD")) + private void onBubbleColumnSurfaceCollision(CallbackInfo info) { + Jesus jesus = Modules.get().get(Jesus.class); + if ((Object) this == mc.player && jesus.isActive()) { + jesus.isInBubbleColumn = true; + } + } + + @Inject(method = "onBubbleColumnCollision", at = @At("HEAD")) + private void onBubbleColumnCollision(CallbackInfo info) { + Jesus jesus = Modules.get().get(Jesus.class); + if ((Object) this == mc.player && jesus.isActive()) { + jesus.isInBubbleColumn = true; + } + } + @ModifyExpressionValue(method = "updateSwimming", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;isSubmergedInWater()Z")) private boolean isSubmergedInWater(boolean submerged) { if ((Object) this == mc.player && Modules.get().get(NoSlow.class).fluidDrag()) return false; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Jesus.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Jesus.java index afe5691e97..a3d6a73ba2 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Jesus.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Jesus.java @@ -150,6 +150,8 @@ public class Jesus extends Module { private boolean prePathManagerWalkOnWater; private boolean prePathManagerWalkOnLava; + public boolean isInBubbleColumn = false; + public Jesus() { super(Categories.Movement, "jesus", "Walk on liquids and powder snow like Jesus."); } @@ -171,6 +173,9 @@ public void onDeactivate() { @EventHandler private void onTick(TickEvent.Post event) { + boolean bubbleColumn = isInBubbleColumn; + isInBubbleColumn = false; + if ((waterMode.get() == Mode.Bob && mc.player.isTouchingWater()) || (lavaMode.get() == Mode.Bob && mc.player.isInLava())) { double fluidHeight; if (mc.player.isInLava()) fluidHeight = mc.player.getFluidHeight(FluidTags.LAVA); @@ -193,7 +198,7 @@ private void onTick(TickEvent.Post event) { if (mc.player.isInLava() && !lavaShouldBeSolid()) return; // Move up in bubble columns - if (isTouchingBubbleColumn()) { + if (bubbleColumn) { if (mc.options.jumpKey.isPressed() && mc.player.getVelocity().getY() < 0.11) ((IVec3d) mc.player.getVelocity()).setY(0.11); return; } @@ -343,31 +348,6 @@ private boolean isOverLiquid() { return foundLiquid && !foundSolid; } - - private boolean isTouchingBubbleColumn() { - // Get the bounding box of the player, it's necessary to slightly to avoid false positives - Box box = mc.player.getBoundingBox().contract(0.001); - - double xStep = (box.maxX - box.minX) / 2; - double yStep = (box.maxY - box.minY) / 2; - double zStep = (box.maxZ - box.minZ) / 2; - - // Scans all corners and in mid-edges positions and checks whether the block is a bubble column or not - for (int x = 0; x < 3; x++) { - for (int y = 0; y < 3; y++) { - for (int z = 0; z < 3; z++) { - BlockPos blockPos = new BlockPos((int) Math.floor(box.minX + xStep * x), (int) Math.floor(box.minY + yStep * y), (int) Math.floor(box.minZ + zStep * z)); - BlockState blockState = mc.world.getBlockState(blockPos); - if (blockState.getBlock() == Blocks.BUBBLE_COLUMN) { - return true; - } - } - } - } - - return false; - } - public enum Mode { Solid, Bob, From 5da17d8c2b76749bae89f5927f6959dfe9b09834 Mon Sep 17 00:00:00 2001 From: L4J <80828850+Logging4J@users.noreply.github.com> Date: Mon, 25 Mar 2024 18:51:39 -0400 Subject: [PATCH 236/357] Fix AutoTool for Wool Blocks (#4473) --- .../meteorclient/systems/modules/player/AutoTool.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java index 0bca304ba7..2dbaf5d492 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java @@ -22,6 +22,7 @@ import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.enchantment.Enchantments; import net.minecraft.item.*; +import net.minecraft.registry.tag.BlockTags; import java.util.List; import java.util.function.Predicate; @@ -189,7 +190,7 @@ private boolean shouldStopUsing(ItemStack itemStack) { public static double getScore(ItemStack itemStack, BlockState state, boolean silkTouchEnderChest, boolean fortuneOre, EnchantPreference enchantPreference, Predicate good) { if (!good.test(itemStack) || !isTool(itemStack)) return -1; - if (!itemStack.isSuitableFor(state) && !(itemStack.getItem() instanceof SwordItem && (state.getBlock() instanceof BambooBlock || state.getBlock() instanceof BambooShootBlock)) && !(itemStack.getItem() instanceof ShearsItem && (state.getBlock() instanceof LeavesBlock))) return -1; + if (!itemStack.isSuitableFor(state) && !(itemStack.getItem() instanceof SwordItem && (state.getBlock() instanceof BambooBlock || state.getBlock() instanceof BambooShootBlock)) && !(itemStack.getItem() instanceof ShearsItem && state.getBlock() instanceof LeavesBlock || state.isIn(BlockTags.WOOL))) return -1; if (silkTouchEnderChest && state.getBlock() == Blocks.ENDER_CHEST @@ -227,6 +228,7 @@ public static boolean isTool(ItemStack itemStack) { return isTool(itemStack.getItem()); } + private static boolean isFortunable(Block block) { if (block == Blocks.ANCIENT_DEBRIS) return false; return Xray.ORES.contains(block) || block instanceof CropBlock; From 451b2fcafa0956f57f8c1fd77800d9b1a47bfa7e Mon Sep 17 00:00:00 2001 From: maxsupermanhd Date: Fri, 29 Mar 2024 14:05:17 +0300 Subject: [PATCH 237/357] Fix BlockUtils+InstaMine regression --- .../meteordevelopment/meteorclient/utils/world/BlockUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java index 1ee7a88b9d..d0c10efdc2 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java @@ -227,7 +227,7 @@ public static boolean breakBlock(BlockPos blockPos, boolean swing) { BlockPos pos = blockPos instanceof BlockPos.Mutable ? new BlockPos(blockPos) : blockPos; InstaMine im = Modules.get().get(InstaMine.class); - if (im.isActive() && im.blockPos.equals(pos) && im.shouldMine()) { + if (im != null && im.isActive() && im.blockPos.equals(pos) && im.shouldMine()) { im.sendPacket(); return true; } From f0f58976dced64bdd4e45bb1c5af45effcb58b2a Mon Sep 17 00:00:00 2001 From: Wide-Cat <74723656+Wide-Cat@users.noreply.github.com> Date: Fri, 29 Mar 2024 23:09:21 +0000 Subject: [PATCH 238/357] Large highway builder changes and improvements (#4468) --- .../systems/modules/world/HighwayBuilder.java | 328 ++++++++++++++---- .../meteorclient/utils/misc/MBlockPos.java | 5 + 2 files changed, 262 insertions(+), 71 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java index 2f09524c0a..4918be2c91 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java @@ -15,6 +15,7 @@ import meteordevelopment.meteorclient.systems.modules.player.AutoEat; import meteordevelopment.meteorclient.systems.modules.player.AutoGap; import meteordevelopment.meteorclient.systems.modules.player.AutoTool; +import meteordevelopment.meteorclient.systems.modules.player.InstaMine; import meteordevelopment.meteorclient.utils.misc.HorizontalDirection; import meteordevelopment.meteorclient.utils.misc.MBlockPos; import meteordevelopment.meteorclient.utils.player.CustomPlayerInput; @@ -25,6 +26,7 @@ import meteordevelopment.meteorclient.utils.render.color.SettingColor; import meteordevelopment.meteorclient.utils.world.BlockUtils; import meteordevelopment.meteorclient.utils.world.Dir; +import meteordevelopment.meteorclient.utils.world.TickRate; import meteordevelopment.orbit.EventHandler; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -34,10 +36,8 @@ import net.minecraft.enchantment.Enchantments; import net.minecraft.entity.Entity; import net.minecraft.entity.ItemEntity; -import net.minecraft.item.BlockItem; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; +import net.minecraft.item.*; +import net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -53,6 +53,7 @@ import java.util.List; import java.util.function.Predicate; +@SuppressWarnings("ConstantConditions") public class HighwayBuilder extends Module { public enum Floor { Replace, @@ -76,8 +77,11 @@ public enum Rotation { private static final BlockPos ZERO = new BlockPos(0, 0, 0); private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgRenderMine = settings.createGroup("Render Mine"); - private final SettingGroup sgRenderPlace = settings.createGroup("Render Place"); + private final SettingGroup sgDigging = settings.createGroup("Digging"); + private final SettingGroup sgPaving = settings.createGroup("Paving"); + private final SettingGroup sgInventory = settings.createGroup("Inventory"); + private final SettingGroup sgRenderDigging = settings.createGroup("Render Digging"); + private final SettingGroup sgRenderPaving = settings.createGroup("Render Paving"); // General @@ -128,7 +132,59 @@ public enum Rotation { .build() ); - private final Setting> blocksToPlace = sgGeneral.add(new BlockListSetting.Builder() + private final Setting disconnectOnToggle = sgGeneral.add(new BoolSetting.Builder() + .name("disconnect-on-toggle") + .description("Automatically disconnects when the module is turned off, for example for not having enough blocks.") + .defaultValue(false) + .build() + ); + + private final Setting pauseOnLag = sgGeneral.add(new BoolSetting.Builder() + .name("pause-on-lag") + .description("Pauses the current process while the server stops responding.") + .defaultValue(true) + .build() + ); + + // Digging + + private final Setting dontBreakTools = sgDigging.add(new BoolSetting.Builder() + .name("dont-break-tools") + .description("Don't break tools.") + .defaultValue(false) + .build() + ); + + private final Setting savePickaxes = sgDigging.add(new IntSetting.Builder() + .name("save-pickaxes") + .description("How many pickaxes to ensure are saved.") + .defaultValue(0) + .range(0, 36) + .sliderRange(0, 36) + .visible(() -> !dontBreakTools.get()) + .build() + ); + + private final Setting breakDelay = sgDigging.add(new IntSetting.Builder() + .name("break-delay") + .description("The delay between breaking blocks.") + .defaultValue(0) + .min(0) + .build() + ); + + private final Setting blocksPerTick = sgDigging.add(new IntSetting.Builder() + .name("blocks-per-tick") + .description("The maximum amount of blocks that can be mined in a tick. Only applies to blocks instantly breakable.") + .defaultValue(1) + .range(1, 100) + .sliderRange(1, 25) + .build() + ); + + // Paving + + private final Setting> blocksToPlace = sgPaving.add(new BlockListSetting.Builder() .name("blocks-to-place") .description("Blocks it is allowed to place.") .defaultValue(Blocks.OBSIDIAN) @@ -136,88 +192,119 @@ public enum Rotation { .build() ); - private final Setting> trashItems = sgGeneral.add(new ItemListSetting.Builder() - .name("trash-items") - .description("Items that are considered trash and can be thrown out.") - .defaultValue(Items.NETHERRACK, Items.QUARTZ, Items.GOLD_NUGGET, Items.GLOWSTONE_DUST, Items.BLACKSTONE, Items.BASALT) + private final Setting placeDelay = sgPaving.add(new IntSetting.Builder() + .name("place-delay") + .description("The delay between placing blocks.") + .defaultValue(0) + .min(0) .build() ); - private final Setting dontBreakTools = sgGeneral.add(new BoolSetting.Builder() - .name("dont-break-tools") - .description("Don't break tools.") - .defaultValue(false) + private final Setting placementsPerTick = sgPaving.add(new IntSetting.Builder() + .name("placements-per-tick") + .description("The maximum amount of blocks that can be placed in a tick.") + .defaultValue(1) + .min(1) .build() ); - private final Setting mineEnderChests = sgGeneral.add(new BoolSetting.Builder() + // Inventory + + private final Setting> trashItems = sgInventory.add(new ItemListSetting.Builder() + .name("trash-items") + .description("Items that are considered trash and can be thrown out.") + .defaultValue(Items.NETHERRACK, Items.QUARTZ, Items.GOLD_NUGGET, Items.GOLDEN_SWORD, Items.GLOWSTONE_DUST, Items.GLOWSTONE, Items.BLACKSTONE, Items.BASALT, Items.GHAST_TEAR, Items.SOUL_SAND, Items.SOUL_SOIL) + .build() + ); + + private final Setting mineEnderChests = sgInventory.add(new BoolSetting.Builder() .name("mine-ender-chests") .description("Mines ender chests for obsidian.") .defaultValue(true) .build() ); - private final Setting disconnectOnToggle = sgGeneral.add(new BoolSetting.Builder() - .name("disconnect-on-toggle") - .description("Automatically disconnects when the module is turned off, for example for not having enough blocks.") + private final Setting saveEchests = sgInventory.add(new IntSetting.Builder() + .name("save-ender-chests") + .description("How many ender chests to ensure are saved.") + .defaultValue(1) + .range(0, 64) + .sliderRange(0, 64) + .visible(mineEnderChests::get) + .build() + ); + + private final Setting instamineEchests = sgInventory.add(new BoolSetting.Builder() + .name("instamine-echests") + .description("Whether or not to use the instamine exploit to break echests.") .defaultValue(false) + .visible(mineEnderChests::get) + .build() + ); + + private final Setting instamineDelay = sgInventory.add(new IntSetting.Builder() + .name("instamine-delay") + .description("Delay between instamine attempts.") + .defaultValue(0) + .sliderMax(20) + .visible(() -> mineEnderChests.get() && instamineEchests.get()) .build() ); - // Render Mine + // Render Digging - private final Setting renderMine = sgRenderMine.add(new BoolSetting.Builder() + private final Setting renderMine = sgRenderDigging.add(new BoolSetting.Builder() .name("render-blocks-to-mine") .description("Render blocks to be mined.") .defaultValue(true) .build() ); - private final Setting renderMineShape = sgRenderMine.add(new EnumSetting.Builder() + private final Setting renderMineShape = sgRenderDigging.add(new EnumSetting.Builder() .name("blocks-to-mine-shape-mode") .description("How the blocks to be mined are rendered.") .defaultValue(ShapeMode.Both) .build() ); - private final Setting renderMineSideColor = sgRenderMine.add(new ColorSetting.Builder() + private final Setting renderMineSideColor = sgRenderDigging.add(new ColorSetting.Builder() .name("blocks-to-mine-side-color") .description("Color of blocks to be mined.") .defaultValue(new SettingColor(225, 25, 25, 25)) .build() ); - private final Setting renderMineLineColor = sgRenderMine.add(new ColorSetting.Builder() + private final Setting renderMineLineColor = sgRenderDigging.add(new ColorSetting.Builder() .name("blocks-to-mine-line-color") .description("Color of blocks to be mined.") .defaultValue(new SettingColor(225, 25, 25)) .build() ); - // Render Place + // Render Paving - private final Setting renderPlace = sgRenderPlace.add(new BoolSetting.Builder() + private final Setting renderPlace = sgRenderPaving.add(new BoolSetting.Builder() .name("render-blocks-to-place") .description("Render blocks to be placed.") .defaultValue(true) .build() ); - private final Setting renderPlaceShape = sgRenderPlace.add(new EnumSetting.Builder() + private final Setting renderPlaceShape = sgRenderPaving.add(new EnumSetting.Builder() .name("blocks-to-place-shape-mode") .description("How the blocks to be placed are rendered.") .defaultValue(ShapeMode.Both) .build() ); - private final Setting renderPlaceSideColor = sgRenderPlace.add(new ColorSetting.Builder() + private final Setting renderPlaceSideColor = sgRenderPaving.add(new ColorSetting.Builder() .name("blocks-to-place-side-color") .description("Color of blocks to be placed.") .defaultValue(new SettingColor(25, 25, 225, 25)) .build() ); - private final Setting renderPlaceLineColor = sgRenderPlace.add(new ColorSetting.Builder() + private final Setting renderPlaceLineColor = sgRenderPaving.add(new ColorSetting.Builder() .name("blocks-to-place-line-color") .description("Color of blocks to be placed.") .defaultValue(new SettingColor(25, 25, 225)) @@ -236,6 +323,7 @@ public enum Rotation { public int blocksBroken, blocksPlaced; private final MBlockPos lastBreakingPos = new MBlockPos(); private boolean displayInfo; + private int placeTimer, breakTimer, count; private final MBlockPos posRender2 = new MBlockPos(); private final MBlockPos posRender3 = new MBlockPos(); @@ -244,6 +332,14 @@ public HighwayBuilder() { super(Categories.World, "highway-builder", "Automatically builds highways."); } + /*todo + - separate digging and paving more effectively + - better inventory management + - getting echests and picks from shulker boxes - refactor echest blockade to be more general purpose? + - access to your ec + - separate walking forwards from the current state to speed up actions + */ + @Override public void onActivate() { dir = HorizontalDirection.get(mc.player.getYaw()); @@ -261,6 +357,15 @@ public void onActivate() { blocksBroken = blocksPlaced = 0; lastBreakingPos.set(0, 0, 0); displayInfo = true; + + placeTimer = 0; + breakTimer = 0; + count = 0; + + if (blocksPerTick.get() > 1 && rotation.get().mine) warning("With rotations enabled, you can break at most 1 block per tick."); + if (placementsPerTick.get() > 1 && rotation.get().place) warning("With rotations enabled, you can place at most 1 block per tick."); + + if (Modules.get().get(InstaMine.class).isActive()) warning("It's recommended to disable the InstaMine module and instead use 'instamine-echests' to avoid errors."); } @Override @@ -303,7 +408,14 @@ private void onTick(TickEvent.Pre event) { if (Modules.get().get(AutoEat.class).eating) return; if (Modules.get().get(AutoGap.class).isEating()) return; + if (pauseOnLag.get() && TickRate.INSTANCE.getTimeSinceLastTick() >= 2.0f) return; + + count = 0; + state.tick(this); + + if (breakTimer > 0) breakTimer--; + if (placeTimer > 0) placeTimer--; } @EventHandler @@ -409,6 +521,8 @@ protected void tick(HighwayBuilder b) { boolean isZ = Math.abs(z) <= 0.1; if (isX && isZ) { + b.input.stop(); + b.mc.player.setVelocity(0, 0, 0); b.mc.player.setPosition((int) b.mc.player.getX() + (b.mc.player.getX() < 0 ? -0.5 : 0.5), b.mc.player.getY(), (int) b.mc.player.getZ() + (b.mc.player.getZ() < 0 ? -0.5 : 0.5)); b.setState(b.lastState); } @@ -446,14 +560,14 @@ protected void tick(HighwayBuilder b) { @Override protected void start(HighwayBuilder b) { b.mc.player.setYaw(b.dir.yaw); + checkTasks(b); } @Override protected void tick(HighwayBuilder b) { - b.mc.player.setYaw(b.dir.yaw); - checkTasks(b); + if (b.state == Forward) b.input.pressingForward = true; // Move } @@ -496,31 +610,31 @@ protected void tick(HighwayBuilder b) { MineFront { @Override protected void tick(HighwayBuilder b) { - mine(b, b.blockPosProvider.getFront(), true); + mine(b, b.blockPosProvider.getFront(), true, MineFloor, this); } }, MineFloor { @Override - protected void tick(HighwayBuilder b) { - mine(b, b.blockPosProvider.getFloor(), false); + protected void start(HighwayBuilder b) { + mine(b, b.blockPosProvider.getFloor(), false, MineRailings, this); } - }, - PlaceFloor { @Override protected void tick(HighwayBuilder b) { - int slot = findBlocksToPlace(b); - if (slot == -1) return; - - place(b, b.blockPosProvider.getFloor(), slot, Forward); + mine(b, b.blockPosProvider.getFloor(), false, MineRailings, this); } }, MineRailings { + @Override + protected void start(HighwayBuilder b) { + mine(b, b.blockPosProvider.getRailings(true), false, PlaceRailings, this); + } + @Override protected void tick(HighwayBuilder b) { - mine(b, b.blockPosProvider.getRailings(true), false); + mine(b, b.blockPosProvider.getRailings(true), false, PlaceRailings, this); } }, @@ -534,6 +648,24 @@ protected void tick(HighwayBuilder b) { } }, + PlaceFloor { + @Override + protected void start(HighwayBuilder b) { + int slot = findBlocksToPlace(b); + if (slot == -1) return; + + place(b, b.blockPosProvider.getFloor(), slot, Forward); + } + + @Override + protected void tick(HighwayBuilder b) { + int slot = findBlocksToPlace(b); + if (slot == -1) return; + + place(b, b.blockPosProvider.getFloor(), slot, Forward); + } + }, + ThrowOutTrash { private int skipSlot; private boolean timerEnabled, firstTick; @@ -576,6 +708,11 @@ protected void tick(HighwayBuilder b) { return; } + if (!b.mc.player.currentScreenHandler.getCursorStack().isEmpty()) { + InvUtils.dropHand(); + return; + } + for (int i = 0; i < b.mc.player.getInventory().main.size(); i++) { if (i == skipSlot) continue; @@ -611,13 +748,10 @@ protected void tick(HighwayBuilder b) { MineEnderChests { private static final MBlockPos pos = new MBlockPos(); - private int minimumObsidian; - private boolean first; - private int moveTimer; - + private boolean first, primed; private boolean stopTimerEnabled; - private int stopTimer; + private int stopTimer, moveTimer, instamineTimer; @Override protected void start(HighwayBuilder b) { @@ -650,6 +784,7 @@ else if (b.lastState == ThrowOutTrash) { moveTimer = 0; stopTimerEnabled = false; + primed = false; } @Override @@ -693,10 +828,18 @@ protected void tick(HighwayBuilder b) { return; } + BlockPos bp = pos.getBlockPos(); + // Check block state - BlockState blockState = b.mc.world.getBlockState(pos.getBlockPos()); + BlockState blockState = b.mc.world.getBlockState(bp); if (blockState.getBlock() == Blocks.ENDER_CHEST) { + if (first) { + moveTimer = 8; + first = false; + return; + } + // Mine ender chest int slot = findAndMoveBestToolToHotbar(b, blockState, true); if (slot == -1) { @@ -705,24 +848,36 @@ protected void tick(HighwayBuilder b) { } InvUtils.swap(slot, false); - if (b.rotation.get().mine) Rotations.rotate(Rotations.getYaw(pos.getBlockPos()), Rotations.getPitch(pos.getBlockPos()), () -> BlockUtils.breakBlock(pos.getBlockPos(), true)); - else BlockUtils.breakBlock(pos.getBlockPos(), true); + + if (b.instamineEchests.get() && primed) { + if (instamineTimer > 0) { + instamineTimer--; + return; + } + + PlayerActionC2SPacket p = new PlayerActionC2SPacket(PlayerActionC2SPacket.Action.STOP_DESTROY_BLOCK, bp, BlockUtils.getDirection(bp)); + instamineTimer = b.instamineDelay.get(); + + if (b.rotation.get().mine) Rotations.rotate(Rotations.getYaw(bp), Rotations.getPitch(bp), () -> b.mc.getNetworkHandler().sendPacket(p)); + else b.mc.getNetworkHandler().sendPacket(p); + } + else { + if (b.rotation.get().mine) Rotations.rotate(Rotations.getYaw(bp), Rotations.getPitch(bp), () -> BlockUtils.breakBlock(bp, true)); + else BlockUtils.breakBlock(bp, true); + } } else { // Place ender chest int slot = findAndMoveToHotbar(b, itemStack -> itemStack.getItem() == Items.ENDER_CHEST, false); - if (slot == -1) { + if (slot == -1 || countItem(b, stack -> stack.getItem().equals(Items.ENDER_CHEST)) <= b.saveEchests.get()) { stopTimerEnabled = true; stopTimer = 4; return; } - if (first) { - moveTimer = 8; - first = false; - } + if (!first) primed = true; - BlockUtils.place(pos.getBlockPos(), Hand.MAIN_HAND, slot, b.rotation.get().place, 0, true, true, false); + BlockUtils.place(bp, Hand.MAIN_HAND, slot, b.rotation.get().place, 0, true, true, false); } } }; @@ -733,8 +888,12 @@ protected void start(HighwayBuilder b) {} protected void mine(HighwayBuilder b, MBPIterator it, boolean ignoreBlocksToPlace, State nextState, State lastState) { boolean breaking = false; + boolean finishedBreaking = false; // if you can multi break this lets you mine blocks between tasks in a single tick for (MBlockPos pos : it) { + if (b.count >= b.blocksPerTick.get()) return; + if (b.breakTimer > 0) return; + BlockState state = pos.getState(); if (state.isAir() || (!ignoreBlocksToPlace && b.blocksToPlace.get().contains(state.getBlock()))) continue; @@ -745,41 +904,53 @@ protected void mine(HighwayBuilder b, MBPIterator it, boolean ignoreBlocksToPlac BlockPos mcPos = pos.getBlockPos(); if (BlockUtils.canBreak(mcPos)) { - if (b.rotation.get().mine) Rotations.rotate(Rotations.getYaw(mcPos), Rotations.getPitch(mcPos), () -> BlockUtils.breakBlock(pos.getBlockPos(), true)); + if (b.rotation.get().mine) Rotations.rotate(Rotations.getYaw(mcPos), Rotations.getPitch(mcPos), () -> BlockUtils.breakBlock(mcPos, true)); else BlockUtils.breakBlock(mcPos, true); - breaking = true; + b.breakTimer = b.breakDelay.get(); + if (!b.lastBreakingPos.equals(pos)) { b.lastBreakingPos.set(pos); b.blocksBroken++; } - break; + b.count++; + + // can only multi break if we aren't rotating and the block can be instamined + if (b.blocksPerTick.get() == 1 || !BlockUtils.canInstaBreak(mcPos) || b.rotation.get().mine) break; } + + if (!it.hasNext() && BlockUtils.canInstaBreak(mcPos)) finishedBreaking = true; } - if (!breaking) { + if (finishedBreaking || !breaking) { b.setState(nextState); b.lastState = lastState; } } - protected void mine(HighwayBuilder b, MBPIterator it, boolean ignoreBlocksToPlace) { - mine(b, it, ignoreBlocksToPlace, Forward, b.state); - } protected void place(HighwayBuilder b, MBPIterator it, int slot, State nextState) { boolean placed = false; + boolean finishedPlacing = false; for (MBlockPos pos : it) { + if (b.count >= b.placementsPerTick.get()) return; + if (b.placeTimer > 0) return; + if (BlockUtils.place(pos.getBlockPos(), Hand.MAIN_HAND, slot, b.rotation.get().place, 0, true, true, true)) { placed = true; b.blocksPlaced++; - break; + b.placeTimer = b.placeDelay.get(); + + b.count++; + if (b.placementsPerTick.get() == 1) break; } + + if (!it.hasNext()) finishedPlacing = true; } - if (!placed) b.setState(nextState); + if (finishedPlacing || !placed) b.setState(nextState); } private int findSlot(HighwayBuilder b, Predicate predicate, boolean hotbar) { @@ -839,6 +1010,16 @@ private boolean hasItem(HighwayBuilder b, Item item) { return false; } + protected int countItem(HighwayBuilder b, Predicate predicate) { + int count = 0; + for (int i = 0; i < b.mc.player.getInventory().main.size(); i++) { + ItemStack stack = b.mc.player.getInventory().getStack(i); + if (predicate.test(stack)) count += stack.getCount(); + } + + return count; + } + protected int findAndMoveToHotbar(HighwayBuilder b, Predicate predicate, boolean required) { // Check hotbar int slot = findSlot(b, predicate, true); @@ -889,6 +1070,12 @@ protected int findAndMoveBestToolToHotbar(HighwayBuilder b, BlockState blockStat if (bestSlot == -1) return b.mc.player.getInventory().selectedSlot; + if (b.mc.player.getInventory().getStack(bestSlot).getItem() instanceof PickaxeItem ){ + int count = countItem(b, stack -> stack.getItem() instanceof PickaxeItem); + + if (count <= b.savePickaxes.get()) b.error("Found less than the selected amount of pickaxes required: " + count + "/" + (b.savePickaxes.get() + 1)); + } + // Check if the tool is already in hotbar if (bestSlot < 9) return bestSlot; @@ -907,13 +1094,10 @@ protected int findBlocksToPlace(HighwayBuilder b) { int slot = findAndMoveToHotbar(b, itemStack -> itemStack.getItem() instanceof BlockItem blockItem && b.blocksToPlace.get().contains(blockItem.getBlock()), false); if (slot == -1) { - if (!b.mineEnderChests.get()) { + if (!b.mineEnderChests.get() || !hasItem(b, Items.ENDER_CHEST) || countItem(b, stack -> stack.getItem().equals(Items.ENDER_CHEST)) <= b.saveEchests.get()) { b.error("Out of blocks to place."); } - else { - if (hasItem(b, Items.ENDER_CHEST)) b.setState(MineEnderChests); - else b.error("Out of blocks to place."); - } + else b.setState(MineEnderChests); return -1; } @@ -1179,12 +1363,13 @@ private MBlockPos get(int i) { default -> pos.offset(dir.opposite()); case 1 -> pos.offset(leftDir); case 2 -> pos.offset(rightDir); + case 3 -> pos.offset(dir, 2); }; } @Override public boolean hasNext() { - return i < 3 && y < 2; + return i < 4 && y < 2; } @Override @@ -1472,12 +1657,13 @@ private MBlockPos get(int i) { default -> pos.offset(dir2); case 1 -> pos.offset(dir2.rotateLeftSkipOne()); case 2 -> pos.offset(dir2.rotateLeftSkipOne().opposite()); + case 3 -> pos.offset(dir2.opposite(), 2); }; } @Override public boolean hasNext() { - return i < 3 && y < 2; + return i < 4 && y < 2; } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/MBlockPos.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/MBlockPos.java index 2e55dab575..5aafaa0aac 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/MBlockPos.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/MBlockPos.java @@ -78,4 +78,9 @@ public int hashCode() { result = 31 * result + z; return result; } + + @Override + public String toString() { + return this.x + ", " + this.y + ", " + this.z; + } } From e1213a732a4ca5980fa2d9328997709d04afbc6f Mon Sep 17 00:00:00 2001 From: i9p <55615254+i9p@users.noreply.github.com> Date: Wed, 3 Apr 2024 01:36:29 +1100 Subject: [PATCH 239/357] Nametags: Add options to show item durability. (#4498) --- .../systems/modules/render/Nametags.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java index 56ffb1e503..aa9c22d7ec 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java @@ -164,6 +164,14 @@ public class Nametags extends Module { .build() ); + private final Setting itemDurability = sgPlayers.add(new EnumSetting.Builder() + .name("durability") + .description("Displays item durability as either a total, percentage, or neither.") + .defaultValue(Durability.None) + .visible(displayItems::get) + .build() + ); + private final Setting displayEnchants = sgPlayers.add(new BoolSetting.Builder() .name("display-enchants") .description("Displays item enchantments on the items.") @@ -499,6 +507,20 @@ private void renderNametagPlayer(Render2DEvent event, PlayerEntity player, boole RenderUtils.drawItem(event.drawContext, stack, (int) x, (int) y, 2, true); + if (stack.isDamageable() && itemDurability.get() != Durability.None) { + text.begin(0.75, false, true); + + String damageText = switch (itemDurability.get()) { + case Percentage -> String.format("%.0f%%", ((stack.getMaxDamage() - stack.getDamage()) * 100f) / (float) stack.getMaxDamage()); + case Total -> Integer.toString(stack.getMaxDamage() - stack.getDamage()); + default -> "err"; + }; + Color damageColor = new Color(stack.getItemBarColor()); + + text.render(damageText, (int) x, (int) y, damageColor.a(255), true); + text.end(); + } + if (maxEnchantCount > 0 && displayEnchants.get()) { text.begin(0.5 * enchantTextScale.get(), false, true); @@ -661,6 +683,12 @@ public enum Position { OnTop } + public enum Durability { + None, + Total, + Percentage + } + public enum DistanceColorMode { Gradient, Flat; From f42a690ce50e3235d8becb1b9e0384194d6b33b3 Mon Sep 17 00:00:00 2001 From: FurnyGo <68079109+FurnyGo@users.noreply.github.com> Date: Sat, 30 Mar 2024 03:28:05 +0400 Subject: [PATCH 240/357] Increase text quality by x1.5 times --- .../renderer/text/CustomTextRenderer.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/text/CustomTextRenderer.java b/src/main/java/meteordevelopment/meteorclient/renderer/text/CustomTextRenderer.java index 447b17753d..878fbe80fb 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/text/CustomTextRenderer.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/text/CustomTextRenderer.java @@ -36,7 +36,7 @@ public CustomTextRenderer(FontFace fontFace) { fonts = new Font[5]; for (int i = 0; i < fonts.length; i++) { - fonts[i] = new Font(buffer, (int) Math.round(18 * ((i * 0.5) + 1))); + fonts[i] = new Font(buffer, (int) Math.round(27 * ((i * 0.5) + 1))); } } @@ -70,7 +70,7 @@ public void begin(double scale, boolean scaleOnly, boolean big) { this.building = true; this.scaleOnly = scaleOnly; - this.fontScale = font.getHeight() / 18.0; + this.fontScale = font.getHeight() / 27.0; this.scale = 1 + (scale - fontScale) / fontScale; } @@ -79,13 +79,13 @@ public double getWidth(String text, int length, boolean shadow) { if (text.isEmpty()) return 0; Font font = building ? this.font : fonts[0]; - return (font.getWidth(text, length) + (shadow ? 1 : 0)) * scale; + return (font.getWidth(text, length) + (shadow ? 1 : 0)) * scale / 1.5; } @Override public double getHeight(boolean shadow) { Font font = building ? this.font : fonts[0]; - return (font.getHeight() + 1 + (shadow ? 1 : 0)) * scale; + return (font.getHeight() + 1 + (shadow ? 1 : 0)) * scale / 1.5; } @Override @@ -98,13 +98,13 @@ public double render(String text, double x, double y, Color color, boolean shado int preShadowA = SHADOW_COLOR.a; SHADOW_COLOR.a = (int) (color.a / 255.0 * preShadowA); - width = font.render(mesh, text, x + fontScale * scale, y + fontScale * scale, SHADOW_COLOR, scale); - font.render(mesh, text, x, y, color, scale); + width = font.render(mesh, text, x + fontScale * scale / 1.5, y + fontScale * scale / 1.5, SHADOW_COLOR, scale / 1.5); + font.render(mesh, text, x, y, color, scale / 1.5); SHADOW_COLOR.a = preShadowA; } else { - width = font.render(mesh, text, x, y, color, scale); + width = font.render(mesh, text, x, y, color, scale / 1.5); } if (!wasBuilding) end(); From 487fa223c40a0eb4f7d2843af3074db6e210279c Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Wed, 3 Apr 2024 09:09:30 -0400 Subject: [PATCH 241/357] Fix and improve title screen credits, improve the HTTP API (#4501) --- .../meteorclient/addons/GithubRepo.java | 23 ++++++- .../gui/screens/CommitsScreen.java | 56 +++++++++++++---- .../meteorclient/mixin/MutableTextMixin.java | 24 +++++++ .../meteorclient/mixin/TextMixin.java | 16 +++++ .../meteorclient/mixininterface/IText.java | 10 +++ .../utils/network/FailedHttpResponse.java | 62 +++++++++++++++++++ .../meteorclient/utils/network/Http.java | 62 ++++++++++++++++--- .../utils/network/JsonBodyHandler.java | 48 ++++++++++++++ .../utils/player/TitleScreenCredits.java | 52 +++++++++++++--- src/main/resources/meteor-client.mixins.json | 2 + 10 files changed, 324 insertions(+), 31 deletions(-) create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/MutableTextMixin.java create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/TextMixin.java create mode 100644 src/main/java/meteordevelopment/meteorclient/mixininterface/IText.java create mode 100644 src/main/java/meteordevelopment/meteorclient/utils/network/FailedHttpResponse.java create mode 100644 src/main/java/meteordevelopment/meteorclient/utils/network/JsonBodyHandler.java diff --git a/src/main/java/meteordevelopment/meteorclient/addons/GithubRepo.java b/src/main/java/meteordevelopment/meteorclient/addons/GithubRepo.java index cce14d539b..0ee4158f9f 100644 --- a/src/main/java/meteordevelopment/meteorclient/addons/GithubRepo.java +++ b/src/main/java/meteordevelopment/meteorclient/addons/GithubRepo.java @@ -5,12 +5,31 @@ package meteordevelopment.meteorclient.addons; -public record GithubRepo(String owner, String name, String branch) { +import meteordevelopment.meteorclient.utils.network.Http; + +import javax.annotation.Nullable; + +public record GithubRepo(String owner, String name, String branch, @Nullable String accessToken) { + public GithubRepo(String owner, String name, @Nullable String accessToken) { + this(owner, name, "master", accessToken); + } + public GithubRepo(String owner, String name) { - this(owner, name, "master"); + this(owner, name, "master", null); } public String getOwnerName() { return owner + "/" + name; } + + public void authenticate(Http.Request request) { + if (this.accessToken != null && !this.accessToken.isBlank()) { + request.bearer(this.accessToken); + } else { + String personalAuthToken = System.getenv("meteor.github.authorization"); + if (personalAuthToken != null && !personalAuthToken.isBlank()) { + request.bearer(personalAuthToken); + } + } + } } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/CommitsScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/CommitsScreen.java index f12c7b2ad7..677a51acd2 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/CommitsScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/CommitsScreen.java @@ -15,12 +15,14 @@ import meteordevelopment.meteorclient.utils.network.MeteorExecutor; import net.minecraft.util.Util; +import java.net.http.HttpResponse; import java.time.format.DateTimeFormatter; import java.time.format.FormatStyle; public class CommitsScreen extends WindowScreen { private final MeteorAddon addon; private Commit[] commits; + private int statusCode; public CommitsScreen(GuiTheme theme, MeteorAddon addon) { super(theme, "Commits for " + addon.name); @@ -32,13 +34,17 @@ public CommitsScreen(GuiTheme theme, MeteorAddon addon) { MeteorExecutor.execute(() -> { GithubRepo repo = addon.getRepo(); - Response res = Http.get(String.format("https://api.github.com/repos/%s/compare/%s...%s", repo.getOwnerName(), addon.getCommit(), repo.branch())).sendJson(Response.class); - - if (res != null) { - commits = res.commits; - taskAfterRender = this::populateWidgets; + Http.Request request = Http.get(String.format("https://api.github.com/repos/%s/compare/%s...%s", repo.getOwnerName(), addon.getCommit(), repo.branch())); + repo.authenticate(request); + HttpResponse res = request.sendJsonReponse(Response.class); + + if (res.statusCode() == Http.SUCCESS) { + commits = res.body().commits; + taskAfterRender = this::populateCommits; + } else { + statusCode = res.statusCode(); + taskAfterRender = this::populateError; } - else locked = false; }); } @@ -47,13 +53,10 @@ public void initWidgets() { // Only initialize widgets after data arrives } - private void populateWidgets() { - // Top + private void populateHeader(String headerMessage) { WHorizontalList l = add(theme.horizontalList()).expandX().widget(); - String text = "There are %d new commits"; - if (commits.length == 1) text = "There is %d new commit"; - l.add(theme.label(String.format(text, commits.length))).expandX(); + l.add(theme.label(headerMessage)).expandX(); String website = addon.getWebsite(); if (website != null) l.add(theme.button("Website")).widget().action = () -> Util.getOperatingSystem().open(website); @@ -62,6 +65,37 @@ private void populateWidgets() { GithubRepo repo = addon.getRepo(); Util.getOperatingSystem().open(String.format("https://github.com/%s/tree/%s", repo.getOwnerName(), repo.branch())); }; + } + + private void populateError() { + String errorMessage = switch (statusCode) { + case Http.BAD_REQUEST -> "Connection dropped"; + case Http.UNAUTHORIZED -> "Unauthorized"; + case Http.FORBIDDEN -> "Rate-limited"; + case Http.NOT_FOUND -> "Invalid commit hash"; + default -> "Error Code: " + statusCode; + }; + + populateHeader("There was an error fetching commits: " + errorMessage); + + if (statusCode == Http.UNAUTHORIZED) { + add(theme.horizontalSeparator()).padVertical(theme.scale(8)).expandX(); + WHorizontalList l = add(theme.horizontalList()).expandX().widget(); + + 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"); + }; + } + + locked = false; + } + + private void populateCommits() { + // Top + String text = "There are %d new commits"; + if (commits.length == 1) text = "There is %d new commit"; + populateHeader(String.format(text, commits.length)); // Commits if (commits.length > 0) { diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MutableTextMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/MutableTextMixin.java new file mode 100644 index 0000000000..0c28c3023c --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/MutableTextMixin.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 meteordevelopment.meteorclient.mixininterface.IText; +import net.minecraft.text.MutableText; +import net.minecraft.util.Language; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(MutableText.class) +public class MutableTextMixin implements IText { + @Shadow + private @Nullable Language language; + + @Override + public void meteor$invalidateCache() { + this.language = null; + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/TextMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/TextMixin.java new file mode 100644 index 0000000000..26403c1ecb --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/TextMixin.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 meteordevelopment.meteorclient.mixininterface.IText; +import net.minecraft.text.Text; +import org.spongepowered.asm.mixin.Mixin; + +@Mixin(Text.class) +public interface TextMixin extends IText { + @Override + default void meteor$invalidateCache() {} +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixininterface/IText.java b/src/main/java/meteordevelopment/meteorclient/mixininterface/IText.java new file mode 100644 index 0000000000..dd867af2bd --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixininterface/IText.java @@ -0,0 +1,10 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixininterface; + +public interface IText { + void meteor$invalidateCache(); +} diff --git a/src/main/java/meteordevelopment/meteorclient/utils/network/FailedHttpResponse.java b/src/main/java/meteordevelopment/meteorclient/utils/network/FailedHttpResponse.java new file mode 100644 index 0000000000..3d6577741f --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/utils/network/FailedHttpResponse.java @@ -0,0 +1,62 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.utils.network; + +import javax.annotation.Nullable; +import javax.net.ssl.SSLSession; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpHeaders; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.util.Map; +import java.util.Optional; + +/** + * Failed {@link HttpResponse} object that is returned from {@link Http} {@code sendRequest} methods when + * {@link HttpClient#send(HttpRequest, BodyHandler)} throws an exception instead of returning an error response, such + * as when the connection is interrupted or an I/O error occurs. This object is used to prevent {@code sendRequest} + * methods from returning {@code null}. + * + * @author Crosby + */ +public record FailedHttpResponse(HttpRequest request) implements HttpResponse { + @Override + public int statusCode() { + return Http.BAD_REQUEST; + } + + @Override + public Optional> previousResponse() { + return Optional.empty(); + } + + @Override + public HttpHeaders headers() { + return HttpHeaders.of(Map.of(), (s1, s2) -> true); + } + + @Override + public T body() { + return null; + } + + @Override + public Optional sslSession() { + return Optional.empty(); + } + + @Override + public URI uri() { + return this.request.uri(); + } + + @Nullable + @Override + public HttpClient.Version version() { + return this.request.version().orElse(null); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/utils/network/Http.java b/src/main/java/meteordevelopment/meteorclient/utils/network/Http.java index 24fec46abe..23d061a3e7 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/network/Http.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/network/Http.java @@ -9,9 +9,9 @@ import com.google.gson.GsonBuilder; import meteordevelopment.meteorclient.utils.other.JsonDateDeserializer; +import javax.annotation.Nullable; import java.io.IOException; import java.io.InputStream; -import java.io.InputStreamReader; import java.lang.reflect.Type; import java.net.URI; import java.net.URISyntaxException; @@ -22,6 +22,12 @@ import java.util.stream.Stream; public class Http { + public static final int SUCCESS = 200; + public static final int BAD_REQUEST = 400; + public static final int UNAUTHORIZED = 401; + public static final int FORBIDDEN = 403; + public static final int NOT_FOUND = 404; + private static final HttpClient CLIENT = HttpClient.newHttpClient(); private static final Gson GSON = new GsonBuilder() @@ -34,18 +40,24 @@ private enum Method { } public static class Request { - private HttpRequest.Builder builder; + private final HttpRequest.Builder builder; private Method method; - public Request(Method method, String url) { + private Request(Method method, String url) { try { this.builder = HttpRequest.newBuilder().uri(new URI(url)).header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36"); this.method = method; } catch (URISyntaxException e) { - e.printStackTrace(); + throw new IllegalArgumentException(e); } } + public Request header(String name, String value) { + builder.header(name, value); + + return this; + } + public Request bearer(String token) { builder.header("Authorization", "Bearer " + token); @@ -84,38 +96,68 @@ public Request bodyJson(Object object) { return this; } - private T _send(String accept, HttpResponse.BodyHandler responseBodyHandler) { + private HttpResponse _sendResponse(String accept, HttpResponse.BodyHandler responseBodyHandler) { builder.header("Accept", accept); if (method != null) builder.method(method.name(), HttpRequest.BodyPublishers.noBody()); + HttpRequest request = builder.build(); + try { - var res = CLIENT.send(builder.build(), responseBodyHandler); - return res.statusCode() == 200 ? res.body() : null; + return CLIENT.send(request, responseBodyHandler); } catch (IOException | InterruptedException e) { e.printStackTrace(); - return null; + return new FailedHttpResponse<>(request); } } + @Nullable + private T _send(String accept, HttpResponse.BodyHandler responseBodyHandler) { + HttpResponse res = _sendResponse(accept, responseBodyHandler); + return res.statusCode() == 200 ? res.body() : null; + } + public void send() { _send("*/*", HttpResponse.BodyHandlers.discarding()); } + public HttpResponse sendResponse() { + return _sendResponse("*/*", HttpResponse.BodyHandlers.discarding()); + } + + @Nullable public InputStream sendInputStream() { return _send("*/*", HttpResponse.BodyHandlers.ofInputStream()); } + public HttpResponse sendInputStreamReponse() { + return _sendResponse("*/*", HttpResponse.BodyHandlers.ofInputStream()); + } + + @Nullable public String sendString() { return _send("*/*", HttpResponse.BodyHandlers.ofString()); } + public HttpResponse sendStringReponse() { + return _sendResponse("*/*", HttpResponse.BodyHandlers.ofString()); + } + + @Nullable public Stream sendLines() { return _send("*/*", HttpResponse.BodyHandlers.ofLines()); } + public HttpResponse> sendLinesResponse() { + return _sendResponse("*/*", HttpResponse.BodyHandlers.ofLines()); + } + + @Nullable public T sendJson(Type type) { - InputStream in = _send("application/json", HttpResponse.BodyHandlers.ofInputStream()); - return in == null ? null : GSON.fromJson(new InputStreamReader(in), type); + return _send("application/json", JsonBodyHandler.ofJson(GSON, type)); + } + + public HttpResponse sendJsonReponse(Type type) { + return _sendResponse("*/*", JsonBodyHandler.ofJson(GSON, type)); } } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/network/JsonBodyHandler.java b/src/main/java/meteordevelopment/meteorclient/utils/network/JsonBodyHandler.java new file mode 100644 index 0000000000..82a19411e0 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/utils/network/JsonBodyHandler.java @@ -0,0 +1,48 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.utils.network; + +import com.google.gson.Gson; + +import java.io.InputStream; +import java.io.InputStreamReader; +import java.lang.reflect.Type; +import java.net.http.HttpResponse; +import java.nio.ByteBuffer; +import java.util.List; +import java.util.concurrent.CompletionStage; +import java.util.concurrent.Flow; + +public record JsonBodyHandler(HttpResponse.BodySubscriber delegate, Gson gson, Type type) implements HttpResponse.BodySubscriber { + public static HttpResponse.BodyHandler ofJson(Gson gson, Type type) { + return responseInfo -> new JsonBodyHandler<>(HttpResponse.BodySubscribers.ofInputStream(), gson, type); + } + + @Override + public CompletionStage getBody() { + return this.delegate.getBody().thenApply(in -> in == null ? null : gson.fromJson(new InputStreamReader(in), type)); + } + + @Override + public void onSubscribe(Flow.Subscription subscription) { + this.delegate.onSubscribe(subscription); + } + + @Override + public void onNext(List item) { + this.delegate.onNext(item); + } + + @Override + public void onError(Throwable throwable) { + this.delegate.onError(throwable); + } + + @Override + public void onComplete() { + this.delegate.onComplete(); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/utils/player/TitleScreenCredits.java b/src/main/java/meteordevelopment/meteorclient/utils/player/TitleScreenCredits.java index e86b163bd0..cd3cc4c4b0 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/player/TitleScreenCredits.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/player/TitleScreenCredits.java @@ -11,13 +11,17 @@ import meteordevelopment.meteorclient.addons.MeteorAddon; import meteordevelopment.meteorclient.gui.GuiThemes; import meteordevelopment.meteorclient.gui.screens.CommitsScreen; +import meteordevelopment.meteorclient.mixininterface.IText; import meteordevelopment.meteorclient.utils.network.Http; import meteordevelopment.meteorclient.utils.network.MeteorExecutor; +import meteordevelopment.meteorclient.utils.render.MeteorToast; import net.minecraft.client.gui.DrawContext; +import net.minecraft.item.Items; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; +import java.net.http.HttpResponse; import java.util.ArrayList; import java.util.Comparator; import java.util.List; @@ -41,10 +45,35 @@ private static void init() { if (credit.addon.getRepo() == null || credit.addon.getCommit() == null) continue; GithubRepo repo = credit.addon.getRepo(); - Response res = Http.get("https://api.github.com/repos/%s/branches/%s".formatted(repo.getOwnerName(), repo.branch())).sendJson(Response.class); - - if (res != null && !credit.addon.getCommit().equals(res.commit.sha)) { - credit.text.append(Text.literal("*").formatted(Formatting.RED)); + Http.Request request = Http.get("https://api.github.com/repos/%s/branches/%s".formatted(repo.getOwnerName(), repo.branch())); + repo.authenticate(request); + HttpResponse res = request.sendJsonReponse(Response.class); + + switch (res.statusCode()) { + case Http.UNAUTHORIZED -> { + String message = "Invalid authentication token for repository '%s'".formatted(repo.getOwnerName()); + mc.getToastManager().add(new MeteorToast(Items.BARRIER, "GitHub: Unauthorized", message)); + MeteorClient.LOG.warn(message); + if (System.getenv("meteor.github.authorization") == null) { + MeteorClient.LOG.info("Consider setting an authorization " + + "token with the 'meteor.github.authorization' environment variable."); + MeteorClient.LOG.info("See: https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens"); + } + } + case Http.FORBIDDEN -> { + MeteorClient.LOG.warn("Could not fetch updates for addon '%s': Rate-limited by GitHub.".formatted(credit.addon.name)); + } + case Http.NOT_FOUND -> { + MeteorClient.LOG.warn("Could not fetch updates for addon '%s': GitHub repository '%s' not found.".formatted(credit.addon.name, repo.getOwnerName())); + } + case Http.SUCCESS -> { + if (!credit.addon.getCommit().equals(res.body().commit.sha)) { + synchronized (credit.text) { + credit.text.append(Text.literal("*").formatted(Formatting.RED)); + ((IText) credit.text).meteor$invalidateCache(); + } + } + } } } }); @@ -72,9 +101,11 @@ public static void render(DrawContext context) { int y = 3; for (Credit credit : credits) { - int x = mc.currentScreen.width - 3 - mc.textRenderer.getWidth(credit.text); + synchronized (credit.text) { + int x = mc.currentScreen.width - 3 - mc.textRenderer.getWidth(credit.text); - context.drawTextWithShadow(mc.textRenderer, credit.text, x, y, -1); + context.drawTextWithShadow(mc.textRenderer, credit.text, x, y, -1); + } y += mc.textRenderer.fontHeight + 2; } @@ -83,9 +114,14 @@ public static void render(DrawContext context) { public static boolean onClicked(double mouseX, double mouseY) { int y = 3; for (Credit credit : credits) { - int x = mc.currentScreen.width - 3 - mc.textRenderer.getWidth(credit.text); + int width; + synchronized (credit.text) { + width = mc.textRenderer.getWidth(credit.text); + } + + int x = mc.currentScreen.width - 3 - width; - if (mouseX >= x && mouseX <= x + mc.textRenderer.getWidth(credit.text) && mouseY >= y && mouseY <= y + mc.textRenderer.fontHeight + 2) { + if (mouseX >= x && mouseX <= x + width && mouseY >= y && mouseY <= y + mc.textRenderer.fontHeight + 2) { if (credit.addon.getRepo() != null && credit.addon.getCommit() != null) { mc.setScreen(new CommitsScreen(GuiThemes.get(), credit.addon)); return true; diff --git a/src/main/resources/meteor-client.mixins.json b/src/main/resources/meteor-client.mixins.json index 7f3143c3e5..adbbb7747b 100644 --- a/src/main/resources/meteor-client.mixins.json +++ b/src/main/resources/meteor-client.mixins.json @@ -126,6 +126,7 @@ "MobSpawnerBlockEntityRendererMixin", "MouseMixin", "MultiplayerScreenMixin", + "MutableTextMixin", "PacketByteBufMixin", "ParticleManagerMixin", "PlayerArmorSlotMixin", @@ -164,6 +165,7 @@ "StringHelperMixin", "SweetBerryBushBlockMixin", "TextHandlerAccessor", + "TextMixin", "TextRendererMixin", "TextVisitFactoryMixin", "TitleScreenMixin", From 0d060102024c0842af76a8369d9c93f2384d4730 Mon Sep 17 00:00:00 2001 From: Redhawk <77415970+Redhawk18@users.noreply.github.com> Date: Wed, 3 Apr 2024 15:29:24 -0400 Subject: [PATCH 242/357] CrystalAura can now target any living entity (#4499) --- .../systems/modules/combat/CrystalAura.java | 75 ++++++++++++------- .../utils/entity/EntityUtils.java | 2 +- 2 files changed, 51 insertions(+), 26 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/CrystalAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/CrystalAura.java index af9915d787..7ddc907718 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/CrystalAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/CrystalAura.java @@ -26,7 +26,10 @@ import meteordevelopment.meteorclient.utils.entity.EntityUtils; import meteordevelopment.meteorclient.utils.entity.Target; import meteordevelopment.meteorclient.utils.misc.Keybind; -import meteordevelopment.meteorclient.utils.player.*; +import meteordevelopment.meteorclient.utils.player.FindItemResult; +import meteordevelopment.meteorclient.utils.player.InvUtils; +import meteordevelopment.meteorclient.utils.player.PlayerUtils; +import meteordevelopment.meteorclient.utils.player.Rotations; import meteordevelopment.meteorclient.utils.render.NametagUtils; import meteordevelopment.meteorclient.utils.render.RenderUtils; import meteordevelopment.meteorclient.utils.render.color.Color; @@ -38,6 +41,8 @@ import meteordevelopment.orbit.EventPriority; import net.minecraft.block.Blocks; import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.LivingEntity; import net.minecraft.entity.decoration.EndCrystalEntity; import net.minecraft.entity.effect.StatusEffectInstance; import net.minecraft.entity.effect.StatusEffects; @@ -53,6 +58,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; @@ -138,6 +144,14 @@ public class CrystalAura extends Module { .build() ); + private final Setting>> entities = sgGeneral.add(new EntityTypeListSetting.Builder() + .name("entities") + .description("Entities to attack.") + .onlyAttackable() + .defaultValue(EntityType.PLAYER, EntityType.WARDEN, EntityType.WITHER) + .build() + ); + // Switch private final Setting autoSwitch = sgSwitch.add(new EnumSetting.Builder() @@ -541,7 +555,7 @@ public class CrystalAura extends Module { private Item mainItem, offItem; private int breakTimer, placeTimer, switchTimer, ticksPassed; - private final List targets = new ArrayList<>(); + private final List targets = new ArrayList<>(); private final Vec3d vec3d = new Vec3d(0, 0, 0); private final Vec3d playerEyePos = new Vec3d(0, 0, 0); @@ -565,7 +579,7 @@ public class CrystalAura extends Module { private double serverYaw; - private PlayerEntity bestTarget; + private LivingEntity bestTarget; private double bestTargetDamage; private int bestTargetTimer; @@ -1105,7 +1119,7 @@ private boolean shouldFacePlace() { if (forceFacePlace.get().isPressed()) return true; // Checks if the provided crystal position should face place to any target - for (PlayerEntity target : targets) { + for (LivingEntity target : targets) { if (EntityUtils.getTotalHealth(target) <= facePlaceHealth.get()) return true; for (ItemStack itemStack : target.getArmorItems()) { @@ -1144,11 +1158,11 @@ private boolean isOutOfRange(Vec3d vec3d, BlockPos blockPos, boolean place) { return !PlayerUtils.isWithin(vec3d, (place ? placeRange : breakRange).get()); } - private PlayerEntity getNearestTarget() { - PlayerEntity nearestTarget = null; + private LivingEntity getNearestTarget() { + LivingEntity nearestTarget = null; double nearestDistance = Double.MAX_VALUE; - for (PlayerEntity target : targets) { + for (LivingEntity target : targets) { double distance = PlayerUtils.squaredDistanceTo(target); if (distance < nearestDistance) { @@ -1164,11 +1178,11 @@ private float getDamageToTargets(Vec3d vec3d, BlockPos obsidianPos, boolean brea float damage = 0; if (fast) { - PlayerEntity target = getNearestTarget(); + LivingEntity target = getNearestTarget(); if (!(smartDelay.get() && breaking && target.hurtTime > 0)) damage = DamageUtils.crystalDamage(target, vec3d, predictMovement.get(), obsidianPos); } else { - for (PlayerEntity target : targets) { + for (LivingEntity target : targets) { if (smartDelay.get() && breaking && target.hurtTime > 0) continue; float dmg = DamageUtils.crystalDamage(target, vec3d, predictMovement.get(), obsidianPos); @@ -1189,29 +1203,40 @@ private float getDamageToTargets(Vec3d vec3d, BlockPos obsidianPos, boolean brea @Override public String getInfoString() { - return bestTarget != null && bestTargetTimer > 0 ? bestTarget.getGameProfile().getName() : null; + return bestTarget != null && bestTargetTimer > 0 ? EntityUtils.getName(bestTarget) : null; } private void findTargets() { targets.clear(); - // Players - for (PlayerEntity player : mc.world.getPlayers()) { - if (player.getAbilities().creativeMode || player == mc.player) continue; - if (!player.isAlive() || !Friends.get().shouldAttack(player)) continue; - if (player.squaredDistanceTo(mc.player) > Math.pow(targetRange.get(), 2)) continue; - - if (ignoreNakeds.get()) { - if (player.getOffHandStack().isEmpty() - && player.getMainHandStack().isEmpty() - && player.getInventory().armor.get(0).isEmpty() - && player.getInventory().armor.get(1).isEmpty() - && player.getInventory().armor.get(2).isEmpty() - && player.getInventory().armor.get(3).isEmpty() - ) continue; + // Living Entities + for (Entity entity : mc.world.getEntities()) { + // Ignore non-living + if (!(entity instanceof LivingEntity livingEntity)) continue; + + // Player + if (livingEntity instanceof PlayerEntity player) { + if (player.getAbilities().creativeMode || livingEntity == mc.player) continue; + if (!player.isAlive() || !Friends.get().shouldAttack(player)) continue; + + if (ignoreNakeds.get()) { + if (player.getOffHandStack().isEmpty() + && player.getMainHandStack().isEmpty() + && player.getInventory().armor.get(0).isEmpty() + && player.getInventory().armor.get(1).isEmpty() + && player.getInventory().armor.get(2).isEmpty() + && player.getInventory().armor.get(3).isEmpty() + ) continue; + } } - targets.add(player); + // Animals, water animals, monsters, bats, misc + if (!(entities.get().contains(livingEntity.getType()))) continue; + + // Close enough to damage + if (livingEntity.squaredDistanceTo(mc.player) > targetRange.get() * targetRange.get()) continue; + + targets.add(livingEntity); } } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityUtils.java index 3fa73c7704..0b5ee0bbf8 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityUtils.java @@ -52,7 +52,7 @@ public static boolean isRideable(EntityType type) { return type == EntityType.MINECART || type == EntityType.BOAT || type == EntityType.CAMEL || type == EntityType.DONKEY || type == EntityType.HORSE || type == EntityType.LLAMA || type == EntityType.MULE || type == EntityType.PIG || type == EntityType.SKELETON_HORSE || type == EntityType.STRIDER || type == EntityType.ZOMBIE_HORSE; } - public static float getTotalHealth(PlayerEntity target) { + public static float getTotalHealth(LivingEntity target) { return target.getHealth() + target.getAbsorptionAmount(); } From f4718dfc0f33b6d906e393b217c17bb55592fb85 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Fri, 5 Apr 2024 07:14:21 -0400 Subject: [PATCH 243/357] improve damage utils accuracy, performance, and api (#4496) --- .../utils/entity/DamageUtils.java | 159 +++++++++++------- .../utils/entity/SortPriority.java | 60 ++++++- .../utils/entity/TargetUtils.java | 48 +----- .../utils/player/PlayerUtils.java | 10 +- 4 files changed, 168 insertions(+), 109 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/DamageUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/DamageUtils.java index 55479ff535..4028523a6c 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/entity/DamageUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/entity/DamageUtils.java @@ -5,8 +5,8 @@ package meteordevelopment.meteorclient.utils.entity; -import meteordevelopment.meteorclient.mixininterface.IVec3d; import meteordevelopment.meteorclient.utils.entity.fakeplayer.FakePlayerEntity; +import meteordevelopment.meteorclient.utils.player.PlayerUtils; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.enchantment.EnchantmentHelper; @@ -27,44 +27,103 @@ import net.minecraft.world.explosion.Explosion; import org.jetbrains.annotations.Nullable; +import java.util.function.BiFunction; + import static meteordevelopment.meteorclient.MeteorClient.mc; +@SuppressWarnings("JavadocReference") public class DamageUtils { // Explosion damage - public static float explosionDamage(LivingEntity target, Vec3d origin, float power, boolean predictMovement, BlockPos override, BlockState overrideState) { - if (target == null) return 0f; - if (target instanceof PlayerEntity player && EntityUtils.getGameMode(player) == GameMode.CREATIVE && !(player instanceof FakePlayerEntity)) return 0f; + /** + * It is recommended to use this {@link RaycastFactory} unless you implement custom behaviour, as soon:tm: it will be the + * target of optimizations to make it more performant. + * @see BlockView#raycast(RaycastContext) + */ + public static final RaycastFactory HIT_FACTORY = (context, blockPos) -> { + BlockState blockState = mc.world.getBlockState(blockPos); + if (blockState.getBlock().getBlastResistance() < 600) return null; - Vec3d position = predictMovement ? target.getPos().add(target.getVelocity()) : target.getPos(); + return blockState.getCollisionShape(mc.world, blockPos).raycast(context.start(), context.end(), blockPos); + }; - double modDistance = position.distanceTo(origin); - if (modDistance > power) return 0f; + public static float crystalDamage(LivingEntity target, Vec3d targetPos, Box targetBox, Vec3d explosionPos, RaycastFactory raycastFactory) { + return explosionDamage(target, targetPos, targetBox, explosionPos, 12f, raycastFactory); + } - Box box = target.getBoundingBox(); - if (predictMovement) box = box.offset(target.getVelocity()); + public static float bedDamage(LivingEntity target, Vec3d targetPos, Box targetBox, Vec3d explosionPos, RaycastFactory raycastFactory) { + return explosionDamage(target, targetPos, targetBox, explosionPos, 10f, raycastFactory); + } - double exposure = getExposure(origin, box, override, overrideState); + public static float anchorDamage(LivingEntity target, Vec3d targetPos, Box targetBox, Vec3d explosionPos, RaycastFactory raycastFactory) { + return explosionDamage(target, targetPos, targetBox, explosionPos, 10f, raycastFactory); + } + + /** + * Low level control of parameters without having to reimplement everything, for addon authors who wish to use their + * own predictions or other systems. + * @see net.minecraft.world.explosion.ExplosionBehavior#calculateDamage(Explosion, Entity) + */ + public static float explosionDamage(LivingEntity target, Vec3d targetPos, Box targetBox, Vec3d explosionPos, float power, RaycastFactory raycastFactory) { + double modDistance = PlayerUtils.distance(targetPos.x, targetPos.y, targetPos.z, explosionPos.x, explosionPos.y, explosionPos.z); + if (modDistance > power) return 0f; + + double exposure = getExposure(explosionPos, targetBox, raycastFactory); double impact = (1 - (modDistance / power)) * exposure; float damage = (int) ((impact * impact + impact) / 2 * 7 * 12 + 1); return calculateReductions(damage, target, mc.world.getDamageSources().explosion(null)); } + /** Meteor Client implementations */ + public static float crystalDamage(LivingEntity target, Vec3d crystal, boolean predictMovement, BlockPos obsidianPos) { - return explosionDamage(target, crystal, 12f, predictMovement, obsidianPos, Blocks.OBSIDIAN.getDefaultState()); + return overridingExplosionDamage(target, crystal, 12f, predictMovement, obsidianPos, Blocks.OBSIDIAN.getDefaultState()); } public static float crystalDamage(LivingEntity target, Vec3d crystal) { - return explosionDamage(target, crystal, 12f, false, null, null); + return explosionDamage(target, crystal, 12f, false); } public static float bedDamage(LivingEntity target, Vec3d bed) { - return explosionDamage(target, bed, 10f, false, null, null); + return explosionDamage(target, bed, 10f, false); } public static float anchorDamage(LivingEntity target, Vec3d anchor) { - return explosionDamage(target, anchor, 10f, false, BlockPos.ofFloored(anchor), Blocks.AIR.getDefaultState()); + return overridingExplosionDamage(target, anchor, 10f, false, BlockPos.ofFloored(anchor), Blocks.AIR.getDefaultState()); + } + + private static float overridingExplosionDamage(LivingEntity target, Vec3d explosionPos, float power, boolean predictMovement, BlockPos overridePos, BlockState overrideState) { + return explosionDamage(target, explosionPos, power, predictMovement, getOverridingHitFactory(overridePos, overrideState)); + } + + private static float explosionDamage(LivingEntity target, Vec3d explosionPos, float power, boolean predictMovement) { + return explosionDamage(target, explosionPos, power, predictMovement, HIT_FACTORY); + } + + private static float explosionDamage(LivingEntity target, Vec3d explosionPos, float power, boolean predictMovement, RaycastFactory raycastFactory) { + if (target == null) return 0f; + if (target instanceof PlayerEntity player && EntityUtils.getGameMode(player) == GameMode.CREATIVE && !(player instanceof FakePlayerEntity)) return 0f; + + Vec3d position = predictMovement ? target.getPos().add(target.getVelocity()) : target.getPos(); + + Box box = target.getBoundingBox(); + if (predictMovement) box = box.offset(target.getVelocity()); + + return explosionDamage(target, position, box, explosionPos, power, raycastFactory); + } + + public static RaycastFactory getOverridingHitFactory(BlockPos overridePos, BlockState overrideState) { + return (context, blockPos) -> { + BlockState blockState; + if (blockPos.equals(overridePos)) blockState = overrideState; + else { + blockState = mc.world.getBlockState(blockPos); + if (blockState.getBlock().getBlastResistance() < 600) return null; + } + + return blockState.getCollisionShape(mc.world, blockPos).raycast(context.start(), context.end(), blockPos); + }; } // Sword damage @@ -108,7 +167,6 @@ public static float getAttackDamage(LivingEntity attacker, LivingEntity target) /** * @see LivingEntity#computeFallDamage(float, float) (float, float, DamageSource) */ - @SuppressWarnings("JavadocReference") public static float fallDamage(LivingEntity entity) { if (entity instanceof PlayerEntity player && player.getAbilities().flying) return 0f; if (StatusEffectHelper.hasStatusEffect(entity, StatusEffects.SLOW_FALLING) || StatusEffectHelper.hasStatusEffect(entity, StatusEffects.LEVITATION)) return 0f; @@ -134,12 +192,12 @@ private static float fallDamageReductions(LivingEntity entity, int surface) { // Utils - private static float calculateReductions(float damage, LivingEntity entity, DamageSource damageSource) { + /** + * @see LivingEntity#applyDamage(DamageSource, float) + */ + public static float calculateReductions(float damage, LivingEntity entity, DamageSource damageSource) { if (damageSource.isScaledWithDifficulty()) { switch (mc.world.getDifficulty()) { - case PEACEFUL -> { - return 0; - } case EASY -> damage = Math.min(damage / 2 + 1, damage); case HARD -> damage *= 1.5f; } @@ -164,7 +222,6 @@ private static float getArmor(LivingEntity entity) { /** * @see LivingEntity#modifyAppliedDamage(DamageSource, float) */ - @SuppressWarnings("JavadocReference") private static float protectionReduction(Entity player, float damage, DamageSource source) { int protLevel = EnchantmentHelper.getProtectionAmount(player.getArmorItems(), source); return DamageUtil.getInflictedDamage(damage, protLevel); @@ -173,7 +230,6 @@ private static float protectionReduction(Entity player, float damage, DamageSour /** * @see LivingEntity#modifyAppliedDamage(DamageSource, float) */ - @SuppressWarnings("JavadocReference") private static float resistanceReduction(LivingEntity player, float damage) { StatusEffectInstance resistance = StatusEffectHelper.getStatusEffect(player, StatusEffects.RESISTANCE); if (resistance != null) { @@ -187,19 +243,25 @@ private static float resistanceReduction(LivingEntity player, float damage) { /** * @see Explosion#getExposure(Vec3d, Entity) */ - private static float getExposure(Vec3d source, Box box, @Nullable BlockPos override, @Nullable BlockState overrideState) { - double xStep = 1 / ((box.maxX - box.minX) * 2 + 1); - double yStep = 1 / ((box.maxY - box.minY) * 2 + 1); + private static float getExposure(Vec3d source, Box box, RaycastFactory raycastFactory) { + double xDiff = box.maxX - box.minX; + double yDiff = box.maxY - box.minY; + double zDiff = box.maxZ - box.minZ; + + double xStep = 1 / (xDiff * 2 + 1); + double yStep = 1 / (yDiff * 2 + 1); + double zStep = 1 / (zDiff * 2 + 1); - if (xStep > 0 && yStep > 0) { + if (xStep > 0 && yStep > 0 && zStep > 0) { int misses = 0; int hits = 0; - xStep = xStep * (box.maxX - box.minX); - yStep = yStep * (box.maxY - box.minY); + double xOffset = (1 - Math.floor(1 / xStep) * xStep) * 0.5; + double zOffset = (1 - Math.floor(1 / zStep) * zStep) * 0.5; - double xOffset = (1 - Math.floor(1 / xStep) * xStep) / 2; - double zOffset = (1 - Math.floor(1 / yStep) * yStep) / 2; + xStep = xStep * xDiff; + yStep = yStep * yDiff; + zStep = zStep * zDiff; double startX = box.minX + xOffset; double startY = box.minY; @@ -208,14 +270,12 @@ private static float getExposure(Vec3d source, Box box, @Nullable BlockPos overr double endY = box.maxY; double endZ = box.maxZ + zOffset; - Vec3d position = new Vec3d(0, 0, 0); - for (double x = startX; x <= endX; x += xStep) { for (double y = startY; y <= endY; y += yStep) { - for (double z = startZ; z <= endZ; z += xStep) { - ((IVec3d) position).set(x, y, z); + for (double z = startZ; z <= endZ; z += zStep) { + Vec3d position = new Vec3d(x, y, z); - if ((override != null ? raycast(position, source, override, overrideState) : raycast(position, source)) == HitResult.Type.MISS) misses++; + if (raycast(new ExposureRaycastContext(position, source), raycastFactory) == null) misses++; hits++; } @@ -228,31 +288,14 @@ private static float getExposure(Vec3d source, Box box, @Nullable BlockPos overr return 0f; } - /** - * @see BlockView#raycast(RaycastContext) - */ - private static HitResult.Type raycast(Vec3d start, Vec3d end) { - return BlockView.raycast(start, end, null, (_null, blockPos) -> { - BlockState blockState = mc.world.getBlockState(blockPos); - if (blockState.getBlock().getBlastResistance() < 600) return null; - - BlockHitResult hitResult = blockState.getCollisionShape(mc.world, blockPos).raycast(start, end, blockPos); - return hitResult == null ? null : hitResult.getType(); - }, (_null) -> HitResult.Type.MISS); - } + /* Raycasts */ + private static BlockHitResult raycast(ExposureRaycastContext context, RaycastFactory raycastFactory) { + return BlockView.raycast(context.start, context.end, context, raycastFactory, ctx -> null); + } - private static HitResult.Type raycast(Vec3d start, Vec3d end, BlockPos override, BlockState overrideState) { - return BlockView.raycast(start, end, null, (_null, blockPos) -> { - BlockState blockState; - if (blockPos.equals(override)) blockState = overrideState; - else { - blockState = mc.world.getBlockState(blockPos); - if (blockState.getBlock().getBlastResistance() < 600) return null; - } + public record ExposureRaycastContext(Vec3d start, Vec3d end) {} - BlockHitResult hitResult = blockState.getCollisionShape(mc.world, blockPos).raycast(start, end, blockPos); - return hitResult == null ? null : hitResult.getType(); - }, (_null) -> HitResult.Type.MISS); - } + @FunctionalInterface + public interface RaycastFactory extends BiFunction {} } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/SortPriority.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/SortPriority.java index b33d58d52b..835cc78652 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/entity/SortPriority.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/entity/SortPriority.java @@ -5,10 +5,58 @@ package meteordevelopment.meteorclient.utils.entity; -public enum SortPriority { - LowestDistance, - HighestDistance, - LowestHealth, - HighestHealth, - ClosestAngle +import meteordevelopment.meteorclient.utils.player.PlayerUtils; +import meteordevelopment.meteorclient.utils.player.Rotations; +import net.minecraft.entity.Entity; +import net.minecraft.entity.LivingEntity; + +import java.util.Comparator; + +import static meteordevelopment.meteorclient.MeteorClient.mc; + +public enum SortPriority implements Comparator { + LowestDistance((e1, e2) -> Double.compare(PlayerUtils.squaredDistanceTo(e1), PlayerUtils.squaredDistanceTo(e2))), + HighestDistance((e1, e2) -> Double.compare(PlayerUtils.squaredDistanceTo(e2), PlayerUtils.squaredDistanceTo(e1))), + LowestHealth(SortPriority::sortHealth), + HighestHealth((e1, e2) -> sortHealth(e2, e1)), + ClosestAngle(SortPriority::sortAngle); + + private final Comparator comparator; + + SortPriority(Comparator comparator) { + this.comparator = comparator; + } + + @Override + public int compare(Entity o1, Entity o2) { + return comparator.compare(o1, o2); + } + + private static int sortHealth(Entity e1, Entity e2) { + boolean e1l = e1 instanceof LivingEntity; + boolean e2l = e2 instanceof LivingEntity; + + if (!e1l && !e2l) return 0; + else if (e1l && !e2l) return 1; + else if (!e1l) return -1; + + return Float.compare(((LivingEntity) e1).getHealth(), ((LivingEntity) e2).getHealth()); + } + + private static int sortAngle(Entity e1, Entity e2) { + boolean e1l = e1 instanceof LivingEntity; + boolean e2l = e2 instanceof LivingEntity; + + if (!e1l && !e2l) return 0; + else if (e1l && !e2l) return 1; + else if (!e1l) return -1; + + double e1yaw = Math.abs(Rotations.getYaw(e1) - mc.player.getYaw()); + double e2yaw = Math.abs(Rotations.getYaw(e2) - mc.player.getYaw()); + + double e1pitch = Math.abs(Rotations.getPitch(e1) - mc.player.getPitch()); + double e2pitch = Math.abs(Rotations.getPitch(e2) - mc.player.getPitch()); + + return Double.compare(e1yaw * e1yaw + e1pitch * e1pitch, e2yaw * e2yaw + e2pitch * e2pitch); + } } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/TargetUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/TargetUtils.java index b1721767ce..8c479876da 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/entity/TargetUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/entity/TargetUtils.java @@ -10,12 +10,11 @@ import meteordevelopment.meteorclient.utils.entity.fakeplayer.FakePlayerEntity; import meteordevelopment.meteorclient.utils.entity.fakeplayer.FakePlayerManager; import meteordevelopment.meteorclient.utils.player.PlayerUtils; -import meteordevelopment.meteorclient.utils.player.Rotations; import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.world.GameMode; +import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; import java.util.function.Predicate; @@ -25,6 +24,7 @@ public class TargetUtils { private static final List ENTITIES = new ArrayList<>(); + @Nullable public static Entity get(Predicate isGood, SortPriority sortPriority) { ENTITIES.clear(); getList(ENTITIES, isGood, sortPriority, 1); @@ -46,10 +46,12 @@ public static void getList(List targetList, Predicate isGood, So if (fp != null && isGood.test(fp)) targetList.add(fp); }); - targetList.sort((e1, e2) -> sort(e1, e2, sortPriority)); - targetList.removeIf(entity -> targetList.indexOf(entity) > maxCount -1); + targetList.sort(sortPriority); + // fast list trimming + for (int i = targetList.size() - 1; i >= maxCount; i--) targetList.remove(i); } + @Nullable public static PlayerEntity getPlayerTarget(double range, SortPriority priority) { if (!Utils.canUpdate()) return null; return (PlayerEntity) get(entity -> { @@ -65,42 +67,4 @@ public static boolean isBadTarget(PlayerEntity target, double range) { if (target == null) return true; return !PlayerUtils.isWithin(target, range) || !target.isAlive() || target.isDead() || target.getHealth() <= 0; } - - private static int sort(Entity e1, Entity e2, SortPriority priority) { - return switch (priority) { - case LowestDistance -> Double.compare(PlayerUtils.squaredDistanceTo(e1), PlayerUtils.squaredDistanceTo(e2)); - case HighestDistance -> Double.compare(PlayerUtils.squaredDistanceTo(e2), PlayerUtils.squaredDistanceTo(e1)); - case LowestHealth -> sortHealth(e1, e2); - case HighestHealth -> sortHealth(e2, e1); - case ClosestAngle -> sortAngle(e1, e2); - }; - } - - private static int sortHealth(Entity e1, Entity e2) { - boolean e1l = e1 instanceof LivingEntity; - boolean e2l = e2 instanceof LivingEntity; - - if (!e1l && !e2l) return 0; - else if (e1l && !e2l) return 1; - else if (!e1l) return -1; - - return Float.compare(((LivingEntity) e1).getHealth(), ((LivingEntity) e2).getHealth()); - } - - private static int sortAngle(Entity e1, Entity e2) { - boolean e1l = e1 instanceof LivingEntity; - boolean e2l = e2 instanceof LivingEntity; - - if (!e1l && !e2l) return 0; - else if (e1l && !e2l) return 1; - else if (!e1l) return -1; - - double e1yaw = Math.abs(Rotations.getYaw(e1) - mc.player.getYaw()); - double e2yaw = Math.abs(Rotations.getYaw(e2) - mc.player.getYaw()); - - double e1pitch = Math.abs(Rotations.getPitch(e1) - mc.player.getPitch()); - double e2pitch = Math.abs(Rotations.getPitch(e2) - mc.player.getPitch()); - - return Double.compare(e1yaw * e1yaw + e1pitch * e1pitch, e2yaw * e2yaw + e2pitch * e2pitch); - } } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/player/PlayerUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/player/PlayerUtils.java index 203cd5340f..57a6762229 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/player/PlayerUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/player/PlayerUtils.java @@ -227,6 +227,10 @@ else if (entity instanceof PlayerEntity player && !Friends.get().isFriend(player return damageTaken; } + public static double distance(double x1, double y1, double z1, double x2, double y2, double z2) { + return Math.sqrt(squaredDistance(x1, y1, z1, x2, y2, z2)); + } + public static double distanceTo(Entity entity) { return distanceTo(entity.getX(), entity.getY(), entity.getZ()); } @@ -256,9 +260,9 @@ public static double squaredDistanceTo(double x, double y, double z) { } public static double squaredDistance(double x1, double y1, double z1, double x2, double y2, double z2) { - float f = (float) (x1 - x2); - float g = (float) (y1 - y2); - float h = (float) (z1 - z2); + double f = x1 - x2; + double g = y1 - y2; + double h = z1 - z2; return org.joml.Math.fma(f, f, org.joml.Math.fma(g, g, h * h)); } From c2990cf6a62ca8413a129fdba683d9f5ddf12250 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Tue, 9 Apr 2024 20:11:12 +0100 Subject: [PATCH 244/357] fix substring OOB crash from enchantment names --- .../java/meteordevelopment/meteorclient/utils/Utils.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/utils/Utils.java b/src/main/java/meteordevelopment/meteorclient/utils/Utils.java index 6c137e9eee..79b2c6f922 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/Utils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/Utils.java @@ -7,7 +7,10 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.VertexSorter; -import it.unimi.dsi.fastutil.objects.*; +import it.unimi.dsi.fastutil.objects.Object2IntArrayMap; +import it.unimi.dsi.fastutil.objects.Object2IntMap; +import it.unimi.dsi.fastutil.objects.Reference2IntArrayMap; +import it.unimi.dsi.fastutil.objects.Reference2IntMap; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.gui.tabs.TabScreen; @@ -247,7 +250,8 @@ public static Reference2IntMap createStatusEffectMap() { } public static String getEnchantSimpleName(Enchantment enchantment, int length) { - return I18n.translate(enchantment.getTranslationKey()).substring(0, length); + String name = I18n.translate(enchantment.getTranslationKey()); + return name.length() > length ? name.substring(0, length) : name; } public static boolean searchTextDefault(String text, String filter, boolean caseSensitive) { From b69c1b5f4bf97b27f3b3faf44fc6af6160eacbb4 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Wed, 10 Apr 2024 00:58:57 +0100 Subject: [PATCH 245/357] Add block placement to the no ghost blocks module --- .../meteorclient/mixin/BlockItemMixin.java | 11 ++++++++ .../systems/modules/world/NoGhostBlocks.java | 27 +++++++++++++++++-- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BlockItemMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BlockItemMixin.java index d8c48698a5..e313064c6f 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BlockItemMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BlockItemMixin.java @@ -7,12 +7,17 @@ import meteordevelopment.meteorclient.MeteorClient; 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.util.math.BlockPos; +import net.minecraft.world.World; 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.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(BlockItem.class) @@ -21,4 +26,10 @@ public class BlockItemMixin { private void onPlace(ItemPlacementContext context, BlockState state, CallbackInfoReturnable info) { if (context.getWorld().isClient) MeteorClient.EVENT_BUS.post(PlaceBlockEvent.get(context.getBlockPos(), state.getBlock())); } + + @Redirect(method = "place(Lnet/minecraft/item/ItemPlacementContext;Lnet/minecraft/block/BlockState;)Z", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) + private boolean onPlace(World instance, BlockPos pos, BlockState state, int flags) { + if (Modules.get().get(NoGhostBlocks.class).placing()) return true; + return instance.setBlockState(pos, state, flags); + } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/NoGhostBlocks.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/NoGhostBlocks.java index 8320bae903..ff512fb518 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/NoGhostBlocks.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/NoGhostBlocks.java @@ -6,23 +6,46 @@ package meteordevelopment.meteorclient.systems.modules.world; import meteordevelopment.meteorclient.events.entity.player.BreakBlockEvent; +import meteordevelopment.meteorclient.settings.BoolSetting; +import meteordevelopment.meteorclient.settings.Setting; +import meteordevelopment.meteorclient.settings.SettingGroup; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.orbit.EventHandler; import net.minecraft.block.BlockState; public class NoGhostBlocks extends Module { + private final SettingGroup sgGeneral = settings.getDefaultGroup(); + + private final Setting breaking = sgGeneral.add(new BoolSetting.Builder() + .name("breaking") + .description("Whether to apply for block breaking actions.") + .defaultValue(true) + .build() + ); + + private final Setting placing = sgGeneral.add(new BoolSetting.Builder() + .name("placing") + .description("Whether to apply for block placement actions.") + .defaultValue(true) + .build() + ); + public NoGhostBlocks() { - super(Categories.World, "no-ghost-blocks", "Attempts to prevent ghost blocks arising from breaking blocks quickly. Especially useful with multiconnect."); + super(Categories.World, "no-ghost-blocks", "Attempts to prevent ghost blocks arising ."); } @EventHandler public void onBreakBlock(BreakBlockEvent event) { - if (mc.isInSingleplayer()) return; + if (mc.isInSingleplayer() || !breaking.get()) return; event.cancel(); BlockState blockState = mc.world.getBlockState(event.blockPos); blockState.getBlock().onBreak(mc.world, event.blockPos, blockState, mc.player); } + + public boolean placing() { + return isActive() && placing.get(); + } } From d290712d42d54f927294dfa6bfec64c0e5607f90 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Wed, 10 Apr 2024 20:38:26 +0100 Subject: [PATCH 246/357] Assorted consistency improvements --- .../events/entity/player/PlaceBlockEvent.java | 4 +++- .../gui/screens/CommitsScreen.java | 2 +- .../meteorclient/mixin/BlockItemMixin.java | 18 ++++++------------ .../ClientPlayerInteractionManagerMixin.java | 15 ++++++--------- .../IClientPlayerInteractionManager.java | 2 +- .../systems/modules/world/NoGhostBlocks.java | 12 ++++++++---- .../meteorclient/utils/network/Http.java | 6 +++--- .../meteorclient/utils/player/InvUtils.java | 2 +- .../utils/player/TitleScreenCredits.java | 2 +- 9 files changed, 30 insertions(+), 33 deletions(-) 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 b8e26d32f8..f38a18a802 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/entity/player/PlaceBlockEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/entity/player/PlaceBlockEvent.java @@ -5,16 +5,18 @@ package meteordevelopment.meteorclient.events.entity.player; +import meteordevelopment.meteorclient.events.Cancellable; import net.minecraft.block.Block; import net.minecraft.util.math.BlockPos; -public class PlaceBlockEvent { +public class PlaceBlockEvent extends Cancellable { private static final PlaceBlockEvent INSTANCE = new PlaceBlockEvent(); public BlockPos blockPos; public Block block; public static PlaceBlockEvent get(BlockPos blockPos, Block block) { + INSTANCE.setCancelled(false); INSTANCE.blockPos = blockPos; INSTANCE.block = block; return INSTANCE; diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/CommitsScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/CommitsScreen.java index 677a51acd2..69b980c827 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/CommitsScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/CommitsScreen.java @@ -36,7 +36,7 @@ public CommitsScreen(GuiTheme theme, MeteorAddon addon) { GithubRepo repo = addon.getRepo(); Http.Request request = Http.get(String.format("https://api.github.com/repos/%s/compare/%s...%s", repo.getOwnerName(), addon.getCommit(), repo.branch())); repo.authenticate(request); - HttpResponse res = request.sendJsonReponse(Response.class); + HttpResponse res = request.sendJsonResponse(Response.class); if (res.statusCode() == Http.SUCCESS) { commits = res.body().commits; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BlockItemMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BlockItemMixin.java index e313064c6f..89b8602fe1 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BlockItemMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BlockItemMixin.java @@ -7,29 +7,23 @@ import meteordevelopment.meteorclient.MeteorClient; 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.util.math.BlockPos; -import net.minecraft.world.World; 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.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(BlockItem.class) public class BlockItemMixin { - @Inject(method = "place(Lnet/minecraft/item/ItemPlacementContext;Lnet/minecraft/block/BlockState;)Z", at = @At("HEAD")) + @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) MeteorClient.EVENT_BUS.post(PlaceBlockEvent.get(context.getBlockPos(), state.getBlock())); - } + if (!context.getWorld().isClient) return; + + PlaceBlockEvent event = PlaceBlockEvent.get(context.getBlockPos(), state.getBlock()); + MeteorClient.EVENT_BUS.post(event); - @Redirect(method = "place(Lnet/minecraft/item/ItemPlacementContext;Lnet/minecraft/block/BlockState;)Z", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) - private boolean onPlace(World instance, BlockPos pos, BlockState state, int flags) { - if (Modules.get().get(NoGhostBlocks.class).placing()) return true; - return instance.setBlockState(pos, state, flags); + if (event.isCancelled()) info.setReturnValue(true); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerInteractionManagerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerInteractionManagerMixin.java index 7bbdcb9886..cf799b98a3 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerInteractionManagerMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerInteractionManagerMixin.java @@ -60,6 +60,9 @@ public abstract class ClientPlayerInteractionManagerMixin implements IClientPlay @Final private ClientPlayNetworkHandler networkHandler; + @Shadow + public abstract boolean breakBlock(BlockPos pos); + @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()) { @@ -108,7 +111,7 @@ private void onAttackBlock(BlockPos blockPos, Direction direction, CallbackInfoR if (!sm.instamine() || !sm.filter(state.getBlock())) return; if (state.calcBlockBreakingDelta(mc.player, mc.world, blockPos) > 0.5f) { - mc.world.breakBlock(blockPos, true, mc.player); + breakBlock(blockPos); networkHandler.sendPacket(new PlayerActionC2SPacket(PlayerActionC2SPacket.Action.START_DESTROY_BLOCK, blockPos, direction)); networkHandler.sendPacket(new PlayerActionC2SPacket(PlayerActionC2SPacket.Action.STOP_DESTROY_BLOCK, blockPos, direction)); info.setReturnValue(true); @@ -177,13 +180,7 @@ private float deltaChange(BlockState blockState, PlayerEntity player, BlockView @Inject(method = "breakBlock", at = @At("HEAD"), cancellable = true) private void onBreakBlock(BlockPos blockPos, CallbackInfoReturnable info) { - final BreakBlockEvent event = BreakBlockEvent.get(blockPos); - MeteorClient.EVENT_BUS.post(event); - - if (event.isCancelled()) { - info.setReturnValue(false); - info.cancel(); - } + if (MeteorClient.EVENT_BUS.post(BreakBlockEvent.get(blockPos)).isCancelled()) info.setReturnValue(false); } @Inject(method = "interactItem", at = @At("HEAD"), cancellable = true) @@ -206,7 +203,7 @@ private void onInteractItem(Args args) { } @Override - public void syncSelected() { + public void meteor$syncSelected() { syncSelectedSlot(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixininterface/IClientPlayerInteractionManager.java b/src/main/java/meteordevelopment/meteorclient/mixininterface/IClientPlayerInteractionManager.java index 0495f24ab4..7ee8ac3944 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixininterface/IClientPlayerInteractionManager.java +++ b/src/main/java/meteordevelopment/meteorclient/mixininterface/IClientPlayerInteractionManager.java @@ -6,5 +6,5 @@ package meteordevelopment.meteorclient.mixininterface; public interface IClientPlayerInteractionManager { - void syncSelected(); + void meteor$syncSelected(); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/NoGhostBlocks.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/NoGhostBlocks.java index ff512fb518..d01cf1cd4f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/NoGhostBlocks.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/NoGhostBlocks.java @@ -6,6 +6,7 @@ package meteordevelopment.meteorclient.systems.modules.world; import meteordevelopment.meteorclient.events.entity.player.BreakBlockEvent; +import meteordevelopment.meteorclient.events.entity.player.PlaceBlockEvent; import meteordevelopment.meteorclient.settings.BoolSetting; import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.settings.SettingGroup; @@ -32,11 +33,11 @@ public class NoGhostBlocks extends Module { ); public NoGhostBlocks() { - super(Categories.World, "no-ghost-blocks", "Attempts to prevent ghost blocks arising ."); + super(Categories.World, "no-ghost-blocks", "Attempts to prevent ghost blocks arising."); } @EventHandler - public void onBreakBlock(BreakBlockEvent event) { + private void onBreakBlock(BreakBlockEvent event) { if (mc.isInSingleplayer() || !breaking.get()) return; event.cancel(); @@ -45,7 +46,10 @@ public void onBreakBlock(BreakBlockEvent event) { blockState.getBlock().onBreak(mc.world, event.blockPos, blockState, mc.player); } - public boolean placing() { - return isActive() && placing.get(); + @EventHandler + private void onPlaceBlock(PlaceBlockEvent event) { + if (!placing.get()) return; + + event.cancel(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/network/Http.java b/src/main/java/meteordevelopment/meteorclient/utils/network/Http.java index 23d061a3e7..c581e5f715 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/network/Http.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/network/Http.java @@ -129,7 +129,7 @@ public InputStream sendInputStream() { return _send("*/*", HttpResponse.BodyHandlers.ofInputStream()); } - public HttpResponse sendInputStreamReponse() { + public HttpResponse sendInputStreamResponse() { return _sendResponse("*/*", HttpResponse.BodyHandlers.ofInputStream()); } @@ -138,7 +138,7 @@ public String sendString() { return _send("*/*", HttpResponse.BodyHandlers.ofString()); } - public HttpResponse sendStringReponse() { + public HttpResponse sendStringResponse() { return _sendResponse("*/*", HttpResponse.BodyHandlers.ofString()); } @@ -156,7 +156,7 @@ public T sendJson(Type type) { return _send("application/json", JsonBodyHandler.ofJson(GSON, type)); } - public HttpResponse sendJsonReponse(Type type) { + public HttpResponse sendJsonResponse(Type type) { return _sendResponse("*/*", JsonBodyHandler.ofJson(GSON, type)); } } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/player/InvUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/player/InvUtils.java index 620b77adc0..79b8624913 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/player/InvUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/player/InvUtils.java @@ -155,7 +155,7 @@ public static boolean swap(int slot, boolean swapBack) { else if (!swapBack) previousSlot = -1; mc.player.getInventory().selectedSlot = slot; - ((IClientPlayerInteractionManager) mc.interactionManager).syncSelected(); + ((IClientPlayerInteractionManager) mc.interactionManager).meteor$syncSelected(); return true; } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/player/TitleScreenCredits.java b/src/main/java/meteordevelopment/meteorclient/utils/player/TitleScreenCredits.java index cd3cc4c4b0..c7dc8ede43 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/player/TitleScreenCredits.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/player/TitleScreenCredits.java @@ -47,7 +47,7 @@ private static void init() { GithubRepo repo = credit.addon.getRepo(); Http.Request request = Http.get("https://api.github.com/repos/%s/branches/%s".formatted(repo.getOwnerName(), repo.branch())); repo.authenticate(request); - HttpResponse res = request.sendJsonReponse(Response.class); + HttpResponse res = request.sendJsonResponse(Response.class); switch (res.statusCode()) { case Http.UNAUTHORIZED -> { From 022c2dabca5c973fec445786fa533683adbd92c8 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Wed, 10 Apr 2024 20:42:40 +0100 Subject: [PATCH 247/357] forgor [skip ci] --- .../meteordevelopment/meteorclient/mixin/BlockItemMixin.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BlockItemMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BlockItemMixin.java index 89b8602fe1..f3f4657ddf 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BlockItemMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BlockItemMixin.java @@ -21,9 +21,6 @@ public class BlockItemMixin { private void onPlace(ItemPlacementContext context, BlockState state, CallbackInfoReturnable info) { if (!context.getWorld().isClient) return; - PlaceBlockEvent event = PlaceBlockEvent.get(context.getBlockPos(), state.getBlock()); - MeteorClient.EVENT_BUS.post(event); - - if (event.isCancelled()) info.setReturnValue(true); + if (MeteorClient.EVENT_BUS.post(PlaceBlockEvent.get(context.getBlockPos(), state.getBlock())).isCancelled()) info.setReturnValue(true); } } From ca50397b5817b59b09a14b74a0ae12befaa61295 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Mon, 15 Apr 2024 15:45:24 +0100 Subject: [PATCH 248/357] fixes and improvements to trajectories --- .../meteorclient/mixininterface/IVec3d.java | 1 + .../systems/modules/render/Trajectories.java | 36 ++++++++----- .../entity/ProjectileEntitySimulator.java | 54 ++++++++++--------- 3 files changed, 54 insertions(+), 37 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixininterface/IVec3d.java b/src/main/java/meteordevelopment/meteorclient/mixininterface/IVec3d.java index e812323789..79d201262b 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixininterface/IVec3d.java +++ b/src/main/java/meteordevelopment/meteorclient/mixininterface/IVec3d.java @@ -14,6 +14,7 @@ public interface IVec3d { default void set(Vec3i vec) { set(vec.getX(), vec.getY(), vec.getZ()); } + default void set(Vector3d vec) { set(vec.x, vec.y, vec.z); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java index 86cc51c39e..9f89f2fa98 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java @@ -27,6 +27,7 @@ import net.minecraft.util.hit.HitResult; import net.minecraft.util.math.Box; import net.minecraft.util.math.Direction; +import net.minecraft.util.math.MathHelper; import org.joml.Vector3d; import java.util.ArrayList; @@ -160,8 +161,8 @@ private void calculateFiredPath(Entity entity, double tickDelta) { for (Path path : paths) path.clear(); // Calculate paths - if (!simulator.set(entity, accurate.get(), tickDelta)) return; - getEmptyPath().calculate(); + if (!simulator.set(entity, accurate.get())) return; + getEmptyPath().setStart(entity, tickDelta).calculate(); } @EventHandler @@ -189,14 +190,16 @@ private class Path { private boolean hitQuad, hitQuadHorizontal; private double hitQuadX1, hitQuadY1, hitQuadZ1, hitQuadX2, hitQuadY2, hitQuadZ2; - private Entity entity; + private Entity collidingEntity; + public Vector3d lastPoint; public void clear() { for (Vector3d point : points) vec3s.free(point); points.clear(); hitQuad = false; - entity = null; + collidingEntity = null; + lastPoint = null; } public void calculate() { @@ -212,7 +215,16 @@ public void calculate() { addPoint(); } + } + public Path setStart(Entity entity, double tickDelta) { + lastPoint = new Vector3d( + MathHelper.lerp(tickDelta, entity.lastRenderX, entity.getX()), + MathHelper.lerp(tickDelta, entity.lastRenderY, entity.getY()), + MathHelper.lerp(tickDelta, entity.lastRenderZ, entity.getZ()) + ); + + return this; } private void addPoint() { @@ -256,16 +268,14 @@ else if (r.getSide() == Direction.NORTH || r.getSide() == Direction.SOUTH) { points.add(Utils.set(vec3s.get(), result.getPos())); } else if (result.getType() == HitResult.Type.ENTITY) { - entity = ((EntityHitResult) result).getEntity(); + collidingEntity = ((EntityHitResult) result).getEntity(); - points.add(Utils.set(vec3s.get(), result.getPos()).add(0, entity.getHeight() / 2, 0)); + points.add(Utils.set(vec3s.get(), result.getPos()).add(0, collidingEntity.getHeight() / 2, 0)); } } public void render(Render3DEvent event) { // Render path - Vector3d lastPoint = null; - for (Vector3d point : points) { if (lastPoint != null) event.renderer.line(lastPoint.x, lastPoint.y, lastPoint.z, point.x, point.y, point.z, lineColor.get()); lastPoint = point; @@ -278,12 +288,12 @@ public void render(Render3DEvent event) { } // Render entity - if (entity != null) { - double x = (entity.getX() - entity.prevX) * event.tickDelta; - double y = (entity.getY() - entity.prevY) * event.tickDelta; - double z = (entity.getZ() - entity.prevZ) * event.tickDelta; + if (collidingEntity != null) { + double x = (collidingEntity.getX() - collidingEntity.prevX) * event.tickDelta; + double y = (collidingEntity.getY() - collidingEntity.prevY) * event.tickDelta; + double z = (collidingEntity.getZ() - collidingEntity.prevZ) * event.tickDelta; - Box box = entity.getBoundingBox(); + Box box = collidingEntity.getBoundingBox(); event.renderer.box(x + box.minX, y + box.minY, z + box.minZ, x + box.maxX, y + box.maxY, z + box.maxZ, sideColor.get(), lineColor.get(), shapeMode.get(), 0); } } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/ProjectileEntitySimulator.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/ProjectileEntitySimulator.java index 555c6628ad..b3f84a35a7 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/entity/ProjectileEntitySimulator.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/entity/ProjectileEntitySimulator.java @@ -17,10 +17,7 @@ import net.minecraft.fluid.Fluids; import net.minecraft.item.*; import net.minecraft.util.hit.HitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Box; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.*; import net.minecraft.world.RaycastContext; import org.joml.Quaterniond; import org.joml.Vector3d; @@ -53,13 +50,13 @@ else if (item instanceof CrossbowItem) { if (CrossbowItem.hasProjectile(itemStack, Items.FIREWORK_ROCKET)) { set(user, 0, CrossbowItemAccessor.getSpeed(itemStack), simulated, 0, 0.6, accurate, tickDelta); } - else set(user, 0, CrossbowItemAccessor.getSpeed(itemStack), simulated, 0.05000000074505806, 0.6, accurate, tickDelta); + else set(user, 0, CrossbowItemAccessor.getSpeed(itemStack), simulated, 0.05, 0.6, accurate, tickDelta); } else if (item instanceof FishingRodItem) { setFishingBobber(user, tickDelta); } else if (item instanceof TridentItem) { - set(user, 0, 2.5, simulated, 0.05000000074505806, 0.99, accurate, tickDelta); + set(user, 0, 2.5, simulated, 0.05, 0.99, accurate, tickDelta); } else if (item instanceof SnowballItem || item instanceof EggItem || item instanceof EnderPearlItem) { set(user, 0, 1.5, simulated, 0.03, 0.8, accurate, tickDelta); @@ -114,24 +111,30 @@ public void set(Entity user, double roll, double speed, double simulated, double this.waterDrag = waterDrag; } - public boolean set(Entity entity, boolean accurate, double tickDelta) { + public boolean set(Entity entity, boolean accurate) { // skip entities in ground - if (entity instanceof PersistentProjectileEntity && ((ProjectileInGroundAccessor) entity).getInGround()) return false; + if (entity instanceof ProjectileInGroundAccessor ppe && ppe.getInGround()) return false; - if (entity instanceof ArrowEntity arrow) { - // im not sure if arrow.getVelocity().length() is correct but it works ¯\_(ツ)_/¯ - set(entity, arrow.getVelocity().length(), 0.05000000074505806, 0.6, accurate, tickDelta); - } else if (entity instanceof EnderPearlEntity || entity instanceof SnowballEntity || entity instanceof EggEntity) { - set(entity, 1.5, 0.03, 0.8, accurate, tickDelta); + if (entity instanceof ArrowEntity) { + set(entity, 0.05, 0.6, accurate); } else if (entity instanceof TridentEntity) { - set(entity, 2.5, 0.05000000074505806, 0.99, accurate, tickDelta); + set(entity, 0.05, 0.99, accurate); + } + + else if (entity instanceof EnderPearlEntity || entity instanceof SnowballEntity || entity instanceof EggEntity) { + set(entity, 0.03, 0.8, accurate); } else if (entity instanceof ExperienceBottleEntity) { - set(entity, 0.7, 0.07, 0.8, accurate, tickDelta); - } else if (entity instanceof ThrownEntity) { - set(entity, 0.5, 0.05, 0.8, accurate, tickDelta); - } else if (entity instanceof WitherSkullEntity || entity instanceof FireballEntity || entity instanceof DragonFireballEntity) { - set(entity, 0.95, 0, 0.8, accurate, tickDelta); - } else { + set(entity, 0.07, 0.8, accurate); + } else if (entity instanceof PotionEntity) { + set(entity, 0.05, 0.8, accurate); + } + + else if (entity instanceof WitherSkullEntity || entity instanceof FireballEntity || entity instanceof DragonFireballEntity || entity instanceof WindChargeEntity) { + // drag isn't actually 1, but this provides accurate results in 99.9% in of real situations. + set(entity, 0, 1.0, accurate); + this.airDrag = 1.0; + } + else { return false; } @@ -142,9 +145,10 @@ public boolean set(Entity entity, boolean accurate, double tickDelta) { return true; } - public void set(Entity entity, double speed, double gravity, double waterDrag, boolean accurate, double tickDelta) { - Utils.set(pos, entity, tickDelta); + public void set(Entity entity, double gravity, double waterDrag, boolean accurate) { + pos.set(entity.getX(), entity.getY(), entity.getZ()); + double speed = entity.getVelocity().length(); velocity.set(entity.getVelocity().x, entity.getVelocity().y, entity.getVelocity().z).normalize().mul(speed); if (accurate) { @@ -191,12 +195,14 @@ public HitResult tick() { if (pos.y < mc.world.getBottomY()) return MissHitResult.INSTANCE; // Check if chunk is loaded - int chunkX = (int) (pos.x / 16); - int chunkZ = (int) (pos.z / 16); + int chunkX = ChunkSectionPos.getSectionCoord(pos.x); + int chunkZ = ChunkSectionPos.getSectionCoord(pos.z); if (!mc.world.getChunkManager().isChunkLoaded(chunkX, chunkZ)) return MissHitResult.INSTANCE; // Check for collision ((IVec3d) pos3d).set(pos); + if (pos3d.equals(prevPos3d)) return MissHitResult.INSTANCE; + HitResult hitResult = getCollision(); return hitResult.getType() == HitResult.Type.MISS ? null : hitResult; From 7e5a303e60d462ed883a6b925a6130ce20f61608 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Mon, 15 Apr 2024 15:48:43 +0100 Subject: [PATCH 249/357] forgot to select this file :weary: --- .../meteorclient/systems/modules/combat/ArrowDodge.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/ArrowDodge.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/ArrowDodge.java index ed08eee3d5..8c2d51e4a3 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/ArrowDodge.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/ArrowDodge.java @@ -119,7 +119,7 @@ private void onTick(TickEvent.Pre event) { UUID owner = ((ProjectileEntityAccessor) e).getOwnerUuid(); if (owner != null && owner.equals(mc.player.getUuid())) continue; } - if (!simulator.set(e, accurate.get(), 0.5D)) continue; + if (!simulator.set(e, accurate.get())) continue; for (int i = 0; i < (simulationSteps.get() > 0 ? simulationSteps.get() : Integer.MAX_VALUE); i++) { points.add(vec3s.get().set(simulator.pos)); if (simulator.tick() != null) break; From 21ff8d612fb56a572018eff18c0e847baa0bc806 Mon Sep 17 00:00:00 2001 From: abb3v <166838215+abb3v@users.noreply.github.com> Date: Wed, 17 Apr 2024 01:36:36 +1000 Subject: [PATCH 250/357] Skip/change rendering opened containers in storage esp (#4519) --- .../systems/modules/render/StorageESP.java | 77 ++++++++++++++++++- 1 file changed, 76 insertions(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/StorageESP.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/StorageESP.java index 8633843ac7..fa0b140ede 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/StorageESP.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/StorageESP.java @@ -5,7 +5,12 @@ package meteordevelopment.meteorclient.systems.modules.render; +import meteordevelopment.meteorclient.events.entity.player.InteractBlockEvent; import meteordevelopment.meteorclient.events.render.Render3DEvent; +import meteordevelopment.meteorclient.gui.GuiTheme; +import meteordevelopment.meteorclient.gui.widgets.WWidget; +import meteordevelopment.meteorclient.gui.widgets.containers.WVerticalList; +import meteordevelopment.meteorclient.gui.widgets.pressable.WButton; import meteordevelopment.meteorclient.renderer.*; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Categories; @@ -20,16 +25,22 @@ import meteordevelopment.meteorclient.utils.render.postprocess.PostProcessShaders; import meteordevelopment.meteorclient.utils.world.Dir; import meteordevelopment.orbit.EventHandler; +import net.minecraft.util.math.BlockPos; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.ChestBlock; import net.minecraft.block.entity.*; import net.minecraft.block.enums.ChestType; +import net.minecraft.util.math.Direction; +import java.util.HashSet; +import java.util.Set; import java.util.List; public class StorageESP extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); + private final SettingGroup sgOpened = settings.createGroup("Opened Rendering"); + private final Set interactedBlocks = new HashSet<>(); public final Setting mode = sgGeneral.add(new EnumSetting.Builder() .name("mode") @@ -141,6 +152,21 @@ public class StorageESP extends Module { .build() ); + private final Setting hideOpened = sgOpened.add(new BoolSetting.Builder() + .name("hide-opened") + .description("Hides opened containers.") + .defaultValue(false) + .build() + ); + + private final Setting openedColor = sgOpened.add(new ColorSetting.Builder() + .name("opened-color") + .description("Optional setting to change colors of opened chests, as opposed to not rendering. Disabled at zero opacity.") + .defaultValue(new SettingColor(203, 90, 203, 0)) /// TRANSPARENT BY DEFAULT. + .build() + ); + + private final Color lineColor = new Color(0, 0, 0, 0); private final Color sideColor = new Color(0, 0, 0, 0); private boolean render; @@ -177,6 +203,43 @@ private void getBlockEntityColor(BlockEntity blockEntity) { } } + @Override + public WWidget getWidget(GuiTheme theme) { + WVerticalList list = theme.verticalList(); + + // Button to Clear Interacted Blocks + WButton clear = list.add(theme.button("Clear Rendering Cache")).expandX().widget(); + + clear.action = () -> { + interactedBlocks.clear(); + }; + + return list; + } + + @EventHandler + private void onBlockInteract(InteractBlockEvent event) { + BlockPos pos = event.result.getBlockPos(); + BlockEntity blockEntity = mc.world.getBlockEntity(pos); + + if (blockEntity == null) return; + + interactedBlocks.add(pos); + if (blockEntity instanceof ChestBlockEntity) { + ChestBlockEntity chest = (ChestBlockEntity) blockEntity; + BlockState state = chest.getCachedState(); + ChestType chestType = state.get(ChestBlock.CHEST_TYPE); + + if (chestType == ChestType.LEFT || chestType == ChestType.RIGHT) { + // It's part of a double chest + Direction facing = state.get(ChestBlock.FACING); + BlockPos otherPartPos = pos.offset(chestType == ChestType.LEFT ? facing.rotateYClockwise() : facing.rotateYCounterclockwise()); + + interactedBlocks.add(otherPartPos); + } + } + } + @EventHandler private void onRender(Render3DEvent event) { count = 0; @@ -184,8 +247,20 @@ private void onRender(Render3DEvent event) { if (mode.get() == Mode.Shader) mesh.begin(); for (BlockEntity blockEntity : Utils.blockEntities()) { + // Check if the block has been interacted with (opened) + boolean interacted = interactedBlocks.contains(blockEntity.getPos()); + if (interacted && hideOpened.get()) continue; // Skip rendering if "hideOpened" is true + getBlockEntityColor(blockEntity); + // Set the color to openedColor if its alpha is greater than 0 + if (interacted && openedColor.get().a > 0) { + // openedColor takes precedence. + lineColor.set(openedColor.get()); + sideColor.set(openedColor.get()); + sideColor.a = fillOpacity.get(); // Maintain fill opacity setting for consistency + } + if (render) { double dist = PlayerUtils.squaredDistanceTo(blockEntity.getPos().getX() + 0.5, blockEntity.getPos().getY() + 0.5, blockEntity.getPos().getZ() + 0.5); double a = 1; @@ -211,10 +286,10 @@ private void onRender(Render3DEvent event) { count++; } } - if (mode.get() == Mode.Shader) PostProcessShaders.STORAGE_OUTLINE.endRender(() -> mesh.render(event.matrices)); } + private void renderBox(Render3DEvent event, BlockEntity blockEntity) { double x1 = blockEntity.getPos().getX(); double y1 = blockEntity.getPos().getY(); From 4c1210773ba277194fe6ee49ea3961b67a47831d Mon Sep 17 00:00:00 2001 From: Julflips <104793554+Julflips@users.noreply.github.com> Date: Wed, 17 Apr 2024 18:13:24 +0200 Subject: [PATCH 251/357] Improve block placements (#4520) --- .../meteorclient/utils/world/BlockUtils.java | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java index d0c10efdc2..13c1919de6 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java @@ -10,10 +10,7 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.player.InstaMine; import meteordevelopment.meteorclient.utils.PreInit; -import meteordevelopment.meteorclient.utils.player.FindItemResult; -import meteordevelopment.meteorclient.utils.player.InvUtils; -import meteordevelopment.meteorclient.utils.player.Rotations; -import meteordevelopment.meteorclient.utils.player.SlotUtils; +import meteordevelopment.meteorclient.utils.player.*; import meteordevelopment.orbit.EventHandler; import meteordevelopment.orbit.EventPriority; import net.minecraft.block.*; @@ -159,6 +156,10 @@ public static boolean canPlace(BlockPos blockPos) { } public static Direction getPlaceSide(BlockPos blockPos) { + Vec3d lookVec = blockPos.toCenterPos().subtract(mc.player.getEyePos()); + double bestRelevancy = -Double.MAX_VALUE; + Direction bestSide = null; + for (Direction side : Direction.values()) { BlockPos neighbor = blockPos.offset(side); BlockState state = mc.world.getBlockState(neighbor); @@ -169,15 +170,20 @@ public static Direction getPlaceSide(BlockPos blockPos) { // Check if neighbour is a fluid if (!state.getFluidState().isEmpty()) continue; - return side; + double relevancy = side.getAxis().choose(lookVec.getX(), lookVec.getY(), lookVec.getZ()) * side.getDirection().offset(); + if (relevancy > bestRelevancy) { + bestRelevancy = relevancy; + bestSide = side; + } } - return null; + return bestSide; } public static Direction getClosestPlaceSide(BlockPos blockPos) { return getClosestPlaceSide(blockPos, mc.player.getEyePos()); } + public static Direction getClosestPlaceSide(BlockPos blockPos, Vec3d pos) { Direction closestSide = null; double closestDistance = Double.MAX_VALUE; @@ -279,6 +285,10 @@ public static float calcBlockBreakingDelta2(BlockPos blockPos, float breakSpeed) public static boolean isClickable(Block block) { return block instanceof CraftingTableBlock || block instanceof AnvilBlock + || block instanceof LoomBlock + || block instanceof CartographyTableBlock + || block instanceof GrindstoneBlock + || block instanceof StonecutterBlock || block instanceof ButtonBlock || block instanceof AbstractPressurePlateBlock || block instanceof BlockWithEntity From 2be5907493b454406579b4e3b325e60f40cb0f3d Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Thu, 18 Apr 2024 16:16:41 +0100 Subject: [PATCH 252/357] Update killaura 'ignore passive' setting --- .../meteorclient/systems/modules/combat/KillAura.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java index ba3a57e159..cba3a5d374 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java @@ -30,7 +30,6 @@ import net.minecraft.entity.mob.EndermanEntity; import net.minecraft.entity.mob.ZombifiedPiglinEntity; import net.minecraft.entity.passive.AnimalEntity; -import net.minecraft.entity.passive.LlamaEntity; import net.minecraft.entity.passive.WolfEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.AxeItem; @@ -346,10 +345,9 @@ private boolean entityCheck(Entity entity) { ) return false; } if (ignorePassive.get()) { - if (entity instanceof EndermanEntity enderman && !enderman.isAngryAt(mc.player)) return false; - if (entity instanceof ZombifiedPiglinEntity piglin && !piglin.isAngryAt(mc.player)) return false; + if (entity instanceof EndermanEntity enderman && !enderman.isAngry()) return false; + if (entity instanceof ZombifiedPiglinEntity piglin && !piglin.isAttacking()) return false; if (entity instanceof WolfEntity wolf && !wolf.isAttacking()) return false; - if (entity instanceof LlamaEntity llama && !llama.isAttacking()) return false; } if (entity instanceof PlayerEntity player) { if (player.isCreative()) return false; From 1e137485905ce3af36b954705464308b4e7e1f77 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Thu, 18 Apr 2024 17:02:04 +0100 Subject: [PATCH 253/357] Update enderman look, add 'stun hostiles' setting --- .../systems/modules/world/EndermanLook.java | 53 ++++++++++--------- 1 file changed, 29 insertions(+), 24 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/EndermanLook.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/EndermanLook.java index b0ab233df0..115e9d2c3b 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/EndermanLook.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/EndermanLook.java @@ -6,6 +6,7 @@ package meteordevelopment.meteorclient.systems.modules.world; import meteordevelopment.meteorclient.events.world.TickEvent; +import meteordevelopment.meteorclient.settings.BoolSetting; import meteordevelopment.meteorclient.settings.EnumSetting; import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.settings.SettingGroup; @@ -14,8 +15,10 @@ import meteordevelopment.meteorclient.utils.entity.Target; import meteordevelopment.meteorclient.utils.player.Rotations; import meteordevelopment.orbit.EventHandler; +import net.minecraft.block.Blocks; import net.minecraft.entity.Entity; import net.minecraft.entity.mob.EndermanEntity; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.math.Vec3d; public class EndermanLook extends Module { @@ -28,40 +31,42 @@ public class EndermanLook extends Module { .build() ); + private final Setting stun = sgGeneral.add(new BoolSetting.Builder() + .name("stun-hostiles") + .description("Automatically stares at hostile endermen to stun them in place.") + .defaultValue(true) + .visible(() -> lookMode.get() == Mode.Away) + .build() + ); + public EndermanLook() { super(Categories.World, "enderman-look", "Either looks at all Endermen or prevents you from looking at Endermen."); } @EventHandler private void onTick(TickEvent.Pre event) { - if (lookMode.get() == Mode.Away) { - if (mc.player.getAbilities().creativeMode || !shouldLook()) return; + // if either are true nothing happens when you look at an enderman + if (mc.player.getInventory().armor.get(3).isOf(Blocks.CARVED_PUMPKIN.asItem()) || mc.player.getAbilities().creativeMode) return; - Rotations.rotate(mc.player.getYaw(), 90, -75, null); - } - else { - for (Entity entity : mc.world.getEntities()) { - if (!(entity instanceof EndermanEntity enderman)) continue; - - if (enderman.isAngry() || !enderman.isAlive() || !mc.player.canSee(enderman)) continue; - - Rotations.rotate(Rotations.getYaw(enderman), Rotations.getPitch(enderman, Target.Head), -75, null); - break; - } - } - } - - private boolean shouldLook() { for (Entity entity : mc.world.getEntities()) { - if (!(entity instanceof EndermanEntity)) continue; - - if (entity.isAlive() && angleCheck(entity)) return true; + if (!(entity instanceof EndermanEntity enderman) || !enderman.isAlive() || !mc.player.canSee(enderman)) continue; + + switch (lookMode.get()) { + case Away -> { + if (enderman.isAngry() && stun.get()) Rotations.rotate(Rotations.getYaw(enderman), Rotations.getPitch(enderman, Target.Head), -75, null); + else if (angleCheck(enderman)) Rotations.rotate(mc.player.getYaw(), 90, -75, null); + } + case At -> { + if (!enderman.isAngry()) Rotations.rotate(Rotations.getYaw(enderman), Rotations.getPitch(enderman, Target.Head), -75, null); + } + } } - - return false; } - private boolean angleCheck(Entity entity) { + /** + * @see EndermanEntity#isPlayerStaring(PlayerEntity) + */ + private boolean angleCheck(EndermanEntity entity) { Vec3d vec3d = mc.player.getRotationVec(1.0F).normalize(); Vec3d vec3d2 = new Vec3d(entity.getX() - mc.player.getX(), entity.getEyeY() - mc.player.getEyeY(), entity.getZ() - mc.player.getZ()); @@ -69,7 +74,7 @@ private boolean angleCheck(Entity entity) { vec3d2 = vec3d2.normalize(); double e = vec3d.dotProduct(vec3d2); - return e > 1.0D - 0.025D / d && mc.player.canSee(entity); + return e > 1.0D - 0.025D / d; } public enum Mode { From 8a7079652a6bd42cc6acc5cfe8eb917e5d1d0199 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Thu, 18 Apr 2024 19:57:37 +0100 Subject: [PATCH 254/357] Allow selecting entity groups using the settings command (monster, animal, etc.) --- .../settings/EntityTypeListSettingScreen.java | 30 +++++++------- .../settings/EntityTypeListSetting.java | 41 ++++++++++++++++++- 2 files changed, 54 insertions(+), 17 deletions(-) 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 1caf20e89a..c6399c7975 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EntityTypeListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EntityTypeListSettingScreen.java @@ -171,28 +171,28 @@ public void initWidgets() { for (Pair, Integer> pair : entities) entityTypeForEach.accept(pair.getLeft()); } - if (animalsT.cells.size() == 0) list.cells.remove(animalsCell); - if (waterAnimalsT.cells.size() == 0) list.cells.remove(waterAnimalsCell); - if (monstersT.cells.size() == 0) list.cells.remove(monstersCell); - if (ambientT.cells.size() == 0) list.cells.remove(ambientCell); - if (miscT.cells.size() == 0) list.cells.remove(miscCell); + if (animalsT.cells.isEmpty()) list.cells.remove(animalsCell); + if (waterAnimalsT.cells.isEmpty()) list.cells.remove(waterAnimalsCell); + if (monstersT.cells.isEmpty()) list.cells.remove(monstersCell); + if (ambientT.cells.isEmpty()) list.cells.remove(ambientCell); + if (miscT.cells.isEmpty()) list.cells.remove(miscCell); if (first) { int totalCount = (hasWaterAnimal + waterAnimals.cells.size() + monsters.cells.size() + ambient.cells.size() + misc.cells.size()) / 2; if (totalCount <= 20) { - if (animalsT.cells.size() > 0) animals.setExpanded(true); - if (waterAnimalsT.cells.size() > 0) waterAnimals.setExpanded(true); - if (monstersT.cells.size() > 0) monsters.setExpanded(true); - if (ambientT.cells.size() > 0) ambient.setExpanded(true); - if (miscT.cells.size() > 0) misc.setExpanded(true); + if (!animalsT.cells.isEmpty()) animals.setExpanded(true); + if (!waterAnimalsT.cells.isEmpty()) waterAnimals.setExpanded(true); + if (!monstersT.cells.isEmpty()) monsters.setExpanded(true); + if (!ambientT.cells.isEmpty()) ambient.setExpanded(true); + if (!miscT.cells.isEmpty()) misc.setExpanded(true); } else { - if (animalsT.cells.size() > 0) animals.setExpanded(false); - if (waterAnimalsT.cells.size() > 0) waterAnimals.setExpanded(false); - if (monstersT.cells.size() > 0) monsters.setExpanded(false); - if (ambientT.cells.size() > 0) ambient.setExpanded(false); - if (miscT.cells.size() > 0) misc.setExpanded(false); + if (!animalsT.cells.isEmpty()) animals.setExpanded(false); + if (!waterAnimalsT.cells.isEmpty()) waterAnimals.setExpanded(false); + if (!monstersT.cells.isEmpty()) monsters.setExpanded(false); + if (!ambientT.cells.isEmpty()) ambient.setExpanded(false); + if (!miscT.cells.isEmpty()) misc.setExpanded(false); } } } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/EntityTypeListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/EntityTypeListSetting.java index c117333718..9fface86c9 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/EntityTypeListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/EntityTypeListSetting.java @@ -8,6 +8,7 @@ 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; @@ -15,12 +16,16 @@ import net.minecraft.registry.Registries; import net.minecraft.util.Identifier; +import java.util.ArrayList; +import java.util.List; import java.util.Set; import java.util.function.Consumer; import java.util.function.Predicate; public class EntityTypeListSetting extends Setting>> { public final Predicate> filter; + private static List suggestions; + private final static List groups = List.of("animal", "wateranimal", "monster", "ambient", "misc"); public EntityTypeListSetting(String name, String description, Set> defaultValue, Consumer>> onChanged, Consumer>>> onModuleActivated, IVisible visible, Predicate> filter) { super(name, description, defaultValue, onChanged, onModuleActivated, visible); @@ -42,6 +47,33 @@ protected Set> parseImpl(String str) { for (String value : values) { EntityType entity = parseId(Registries.ENTITY_TYPE, value); if (entity != null) entities.add(entity); + else { + String lowerValue = value.trim().toLowerCase(); + if (!groups.contains(lowerValue)) continue; + + Registries.ENTITY_TYPE.forEach(entityType -> { + switch (lowerValue) { + case "animal" -> { + if (entityType.getSpawnGroup() == SpawnGroup.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); + } + case "monster" -> { + if (entityType.getSpawnGroup() == SpawnGroup.MONSTER) entities.add(entityType); + } + case "ambient" -> { + if (entityType.getSpawnGroup() == SpawnGroup.AMBIENT) entities.add(entityType); + } + case "misc" -> { + if (entityType.getSpawnGroup() == SpawnGroup.MISC) entities.add(entityType); + } + } + }); + } } } catch (Exception ignored) {} @@ -54,8 +86,13 @@ protected boolean isValueValid(Set> value) { } @Override - public Iterable getIdentifierSuggestions() { - return Registries.ENTITY_TYPE.getIds(); + public List getSuggestions() { + if (suggestions == null) { + suggestions = new ArrayList<>(groups); + Registries.ENTITY_TYPE.getIds().forEach(id -> suggestions.add(id.toString())); + } + + return suggestions; } @Override From 53b141f12797234904b4968808e631ffb02919f9 Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Sun, 21 Apr 2024 23:19:16 +0200 Subject: [PATCH 255/357] Fix crash with latest Baritone builds --- .../meteorclient/pathing/BaritoneSettings.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/pathing/BaritoneSettings.java b/src/main/java/meteordevelopment/meteorclient/pathing/BaritoneSettings.java index cc790ceec5..d900c6419a 100644 --- a/src/main/java/meteordevelopment/meteorclient/pathing/BaritoneSettings.java +++ b/src/main/java/meteordevelopment/meteorclient/pathing/BaritoneSettings.java @@ -13,9 +13,7 @@ import net.minecraft.item.Item; import java.awt.*; -import java.lang.reflect.Field; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; +import java.lang.reflect.*; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -77,6 +75,8 @@ private void createWrappers() { Class klass = BaritoneAPI.getSettings().getClass(); for (Field field : klass.getDeclaredFields()) { + if (Modifier.isStatic(field.getModifiers())) continue; + Object obj = field.get(BaritoneAPI.getSettings()); if (!(obj instanceof baritone.api.Settings.Setting setting)) continue; From 95fb0dac0dc1c696c7d1bc154073bd73880eab4e Mon Sep 17 00:00:00 2001 From: Erica Buckmann Date: Wed, 24 Apr 2024 12:41:59 +0200 Subject: [PATCH 256/357] Allow Trajectories to be used with off-hand item --- .../meteorclient/systems/modules/render/Trajectories.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java index 9f89f2fa98..56ccee8f6b 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java @@ -142,7 +142,10 @@ private void calculatePath(PlayerEntity player, double tickDelta) { ItemStack itemStack = player.getMainHandStack(); if (itemStack == null) itemStack = player.getOffHandStack(); if (itemStack == null) return; - if (!items.get().contains(itemStack.getItem())) return; + if (!items.get().contains(itemStack.getItem())) { + itemStack = player.getOffHandStack(); + if (!items.get().contains(itemStack.getItem())) return; + } // Calculate paths if (!simulator.set(player, itemStack, 0, accurate.get(), tickDelta)) return; From 15036c7501b44b558ba90f2b9d13fade79a57579 Mon Sep 17 00:00:00 2001 From: Erica Buckmann Date: Wed, 24 Apr 2024 15:51:03 +0200 Subject: [PATCH 257/357] Remove unnecessary calls and checks --- .../meteorclient/systems/modules/render/Trajectories.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java index 56ccee8f6b..c20c13dba3 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java @@ -140,8 +140,6 @@ private void calculatePath(PlayerEntity player, double tickDelta) { // Get item ItemStack itemStack = player.getMainHandStack(); - if (itemStack == null) itemStack = player.getOffHandStack(); - if (itemStack == null) return; if (!items.get().contains(itemStack.getItem())) { itemStack = player.getOffHandStack(); if (!items.get().contains(itemStack.getItem())) return; From 181fb805dbfe9f90d87683572c49512efcbd6bec Mon Sep 17 00:00:00 2001 From: xEricL Date: Tue, 23 Apr 2024 20:29:20 -0400 Subject: [PATCH 258/357] add null check for Modules.get() in TextRendererMixin --- .../meteorclient/mixin/TextRendererMixin.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/TextRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/TextRendererMixin.java index a35c7be184..b9b7a3a2bb 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/TextRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/TextRendererMixin.java @@ -15,6 +15,9 @@ public class TextRendererMixin { @ModifyExpressionValue(method = "accept", at = @At(value = "INVOKE", target = "Lnet/minecraft/text/Style;isObfuscated()Z")) private boolean onRenderObfuscatedStyle(boolean original) { + if (Modules.get() == null || Modules.get().get(NoRender.class) == null) { + return original; + } return !Modules.get().get(NoRender.class).noObfuscation() && original; } } From f5422d8890d07acd7a87dfb78c34d8529b4b3782 Mon Sep 17 00:00:00 2001 From: tyrannus00 Date: Thu, 25 Apr 2024 18:46:44 +0200 Subject: [PATCH 259/357] Fixed NoGhostBlocks playing wrong sound when placing option is enabled --- .../meteorclient/mixin/BlockItemMixin.java | 31 +++++++++++++++++-- .../systems/modules/world/NoGhostBlocks.java | 2 +- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BlockItemMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BlockItemMixin.java index f3f4657ddf..6386182ebf 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BlockItemMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BlockItemMixin.java @@ -7,20 +7,47 @@ import meteordevelopment.meteorclient.MeteorClient; 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 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.ModifyVariable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(BlockItem.class) -public class BlockItemMixin { +public abstract class BlockItemMixin { + @Shadow + protected abstract BlockState getPlacementState(ItemPlacementContext 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; - if (MeteorClient.EVENT_BUS.post(PlaceBlockEvent.get(context.getBlockPos(), state.getBlock())).isCancelled()) info.setReturnValue(true); + if (MeteorClient.EVENT_BUS.post(PlaceBlockEvent.get(context.getBlockPos(), state.getBlock())).isCancelled()) { + info.setReturnValue(true); + } + } + + @ModifyVariable( + method = "place(Lnet/minecraft/item/ItemPlacementContext;)Lnet/minecraft/util/ActionResult;", + ordinal = 1, + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/block/BlockState;isOf(Lnet/minecraft/block/Block;)Z" + ) + ) + private BlockState modifyState(BlockState state, ItemPlacementContext context) { + var noGhostBlocks = Modules.get().get(NoGhostBlocks.class); + + if (noGhostBlocks.isActive() && noGhostBlocks.placing.get()) { + return getPlacementState(context); + } + + return state; } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/NoGhostBlocks.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/NoGhostBlocks.java index d01cf1cd4f..e05462d3ae 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/NoGhostBlocks.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/NoGhostBlocks.java @@ -25,7 +25,7 @@ public class NoGhostBlocks extends Module { .build() ); - private final Setting placing = sgGeneral.add(new BoolSetting.Builder() + public final Setting placing = sgGeneral.add(new BoolSetting.Builder() .name("placing") .description("Whether to apply for block placement actions.") .defaultValue(true) From 2517862a2b88f514c5302ccabcc50fbcc33e4fb5 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Sat, 27 Apr 2024 01:43:29 +0100 Subject: [PATCH 260/357] resolve some issues with highway builder --- .../systems/modules/combat/KillAura.java | 4 ++++ .../systems/modules/world/HighwayBuilder.java | 22 ++++++++++++++----- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java index cba3a5d374..595679320c 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java @@ -235,6 +235,7 @@ public class KillAura extends Module { private final List targets = new ArrayList<>(); private int switchTimer, hitTimer; private boolean wasPathing = false; + public boolean attacking; public KillAura() { super(Categories.Combat, "kill-aura", "Attacks specified entities around you."); @@ -243,6 +244,7 @@ public KillAura() { @Override public void onDeactivate() { targets.clear(); + attacking = false; } @EventHandler @@ -267,6 +269,7 @@ private void onTick(TickEvent.Pre event) { } if (targets.isEmpty()) { + attacking = false; if (wasPathing) { PathManagers.get().resume(); wasPathing = false; @@ -295,6 +298,7 @@ private void onTick(TickEvent.Pre event) { if (!itemInHand()) return; + attacking = true; if (rotation.get() == RotationMode.Always) Rotations.rotate(Rotations.getYaw(primary), Rotations.getPitch(primary, Target.Body)); if (pauseOnCombat.get() && PathManagers.get().isPathing() && !wasPathing) { PathManagers.get().pause(); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java index 4918be2c91..fb1acf7d63 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java @@ -12,6 +12,7 @@ import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.combat.KillAura; import meteordevelopment.meteorclient.systems.modules.player.AutoEat; import meteordevelopment.meteorclient.systems.modules.player.AutoGap; import meteordevelopment.meteorclient.systems.modules.player.AutoTool; @@ -213,7 +214,11 @@ public enum Rotation { private final Setting> trashItems = sgInventory.add(new ItemListSetting.Builder() .name("trash-items") .description("Items that are considered trash and can be thrown out.") - .defaultValue(Items.NETHERRACK, Items.QUARTZ, Items.GOLD_NUGGET, Items.GOLDEN_SWORD, Items.GLOWSTONE_DUST, Items.GLOWSTONE, Items.BLACKSTONE, Items.BASALT, Items.GHAST_TEAR, Items.SOUL_SAND, Items.SOUL_SOIL) + .defaultValue( + Items.NETHERRACK, Items.QUARTZ, Items.GOLD_NUGGET, Items.GOLDEN_SWORD, Items.GLOWSTONE_DUST, + Items.GLOWSTONE, Items.BLACKSTONE, Items.BASALT, Items.GHAST_TEAR, Items.SOUL_SAND, Items.SOUL_SOIL, + Items.ROTTEN_FLESH + ) .build() ); @@ -338,6 +343,7 @@ public HighwayBuilder() { - getting echests and picks from shulker boxes - refactor echest blockade to be more general purpose? - access to your ec - separate walking forwards from the current state to speed up actions + - fix issues related to y level changes */ @Override @@ -407,6 +413,7 @@ private void onTick(TickEvent.Pre event) { if (Modules.get().get(AutoEat.class).eating) return; if (Modules.get().get(AutoGap.class).isEating()) return; + if (Modules.get().get(KillAura.class).attacking) return; if (pauseOnLag.get() && TickRate.INSTANCE.getTimeSinceLastTick() >= 2.0f) return; @@ -964,8 +971,8 @@ private int findSlot(HighwayBuilder b, Predicate predicate, boolean h private int findHotbarSlot(HighwayBuilder b, boolean replaceTools) { int thrashSlot = -1; int slotsWithBlocks = 0; - int slotWithLeastBlocks = 65; - int slowWithLeastBlocksCount = 0; + int slotWithLeastBlocks = -1; + int slotWithLeastBlocksCount = Integer.MAX_VALUE; // Loop hotbar for (int i = 0; i < 9; i++) { @@ -984,8 +991,8 @@ private int findHotbarSlot(HighwayBuilder b, boolean replaceTools) { if (itemStack.getItem() instanceof BlockItem blockItem && b.blocksToPlace.get().contains(blockItem.getBlock())) { slotsWithBlocks++; - if (itemStack.getCount() < slowWithLeastBlocksCount) { - slowWithLeastBlocksCount = itemStack.getCount(); + if (itemStack.getCount() < slotWithLeastBlocksCount) { + slotWithLeastBlocksCount = itemStack.getCount(); slotWithLeastBlocks = i; } } @@ -1073,7 +1080,10 @@ protected int findAndMoveBestToolToHotbar(HighwayBuilder b, BlockState blockStat if (b.mc.player.getInventory().getStack(bestSlot).getItem() instanceof PickaxeItem ){ int count = countItem(b, stack -> stack.getItem() instanceof PickaxeItem); - if (count <= b.savePickaxes.get()) b.error("Found less than the selected amount of pickaxes required: " + count + "/" + (b.savePickaxes.get() + 1)); + if (count <= b.savePickaxes.get()) { + b.error("Found less than the selected amount of pickaxes required: " + count + "/" + (b.savePickaxes.get() + 1)); + return -1; + } } // Check if the tool is already in hotbar From 0f96cb1e3fb5414421b80e4869fe4f00a21b576f Mon Sep 17 00:00:00 2001 From: arlo Date: Fri, 3 May 2024 13:10:06 +0100 Subject: [PATCH 261/357] Add support for keyboard modifiers in keybinds Fix keybind settings from closing the screen when using escape to clear the bind --- .../commands/commands/ResetCommand.java | 4 +- .../meteorclient/gui/widgets/WKeybind.java | 29 +++-- .../meteorclient/settings/KeybindSetting.java | 11 +- .../meteorclient/systems/macros/Macro.java | 4 +- .../meteorclient/systems/macros/Macros.java | 4 +- .../meteorclient/systems/modules/Module.java | 5 +- .../meteorclient/systems/modules/Modules.java | 28 ++--- .../systems/modules/misc/InventoryTweaks.java | 4 +- .../systems/modules/render/CameraTweaks.java | 23 ++-- .../systems/modules/world/Excavator.java | 10 +- .../meteorclient/utils/misc/Keybind.java | 100 ++++++++++++++---- .../meteorclient/utils/misc/input/Input.java | 9 +- .../utils/misc/input/KeyBinds.java | 4 - 13 files changed, 150 insertions(+), 85 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ResetCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ResetCommand.java index 21d1f1b6d3..4b080c4c2e 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ResetCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ResetCommand.java @@ -47,13 +47,13 @@ public void build(LiteralArgumentBuilder builder) { .then(argument("module", ModuleArgumentType.create()).executes(context -> { Module module = context.getArgument("module", Module.class); - module.keybind.set(true, -1); + module.keybind.reset(); module.info("Reset bind."); return SINGLE_SUCCESS; })) .then(literal("all").executes(context -> { - Modules.get().getAll().forEach(module -> module.keybind.set(true, -1)); + Modules.get().getAll().forEach(module -> module.keybind.reset()); ChatUtils.infoPrefix("Modules", "Reset all binds."); return SINGLE_SUCCESS; })) diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WKeybind.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WKeybind.java index 6115d26865..16174de395 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WKeybind.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WKeybind.java @@ -14,7 +14,7 @@ public class WKeybind extends WHorizontalList { public Runnable action; public Runnable actionOnSet; - private WLabel label; + private WButton button; private final Keybind keybind; private final Keybind defaultValue; @@ -27,12 +27,10 @@ public WKeybind(Keybind keybind, Keybind defaultValue) { @Override public void init() { - label = add(theme.label("")).widget(); - - WButton set = add(theme.button("Set")).widget(); - set.action = () -> { + button = add(theme.button("")).widget(); + button.action = () -> { listening = true; - label.set("..."); + button.set("..."); if (actionOnSet != null) actionOnSet.run(); }; @@ -40,9 +38,20 @@ public void init() { refreshLabel(); } - public boolean onAction(boolean isKey, int value) { - if (listening && keybind.canBindTo(isKey, value)) { - keybind.set(isKey, value); + public boolean onClear() { + if (listening) { + keybind.reset(); + reset(); + + return true; + } + + return false; + } + + public boolean onAction(boolean isKey, int value, int modifiers) { + if (listening && keybind.canBindTo(isKey, value, modifiers)) { + keybind.set(isKey, value, modifiers); reset(); return true; @@ -65,6 +74,6 @@ public void reset() { } private void refreshLabel() { - label.set(keybind.toString()); + button.set(keybind.toString()); } } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/KeybindSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/KeybindSetting.java index dc926de11e..8bee87d929 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/KeybindSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/KeybindSetting.java @@ -14,6 +14,7 @@ import meteordevelopment.orbit.EventHandler; import meteordevelopment.orbit.EventPriority; import net.minecraft.nbt.NbtCompound; +import org.lwjgl.glfw.GLFW; import java.util.function.Consumer; @@ -30,24 +31,26 @@ public KeybindSetting(String name, String description, Keybind defaultValue, Con @EventHandler(priority = EventPriority.HIGHEST) private void onKeyBinding(KeyEvent event) { - if (event.action == KeyAction.Release && widget != null && widget.onAction(true, event.key)) event.cancel(); + 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(); } @EventHandler(priority = EventPriority.HIGHEST) private void onMouseButtonBinding(MouseButtonEvent event) { - if (event.action == KeyAction.Release && widget != null && widget.onAction(false, event.button)) 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) { - if (event.action == KeyAction.Release && get().matches(true, event.key) && (module == null || module.isActive()) && action != null) { + if (event.action == KeyAction.Release && get().matches(true, event.key, event.modifiers) && (module == null || module.isActive()) && action != null) { action.run(); } } @EventHandler(priority = EventPriority.HIGH) private void onMouseButton(MouseButtonEvent event) { - if (event.action == KeyAction.Release && get().matches(false, event.button) && (module == null || module.isActive()) && action != null) { + if (event.action == KeyAction.Release && get().matches(false, event.button, 0) && (module == null || module.isActive()) && action != null) { action.run(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/macros/Macro.java b/src/main/java/meteordevelopment/meteorclient/systems/macros/Macro.java index 81d7f31e6a..77d0e19e53 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/macros/Macro.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/macros/Macro.java @@ -55,8 +55,8 @@ public Macro(NbtElement tag) { fromTag((NbtCompound) tag); } - public boolean onAction(boolean isKey, int value) { - if (!keybind.get().matches(isKey, value) || mc.currentScreen != null) return false; + public boolean onAction(boolean isKey, int value, int modifiers) { + if (!keybind.get().matches(isKey, value, modifiers) || mc.currentScreen != null) return false; return onAction(); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/macros/Macros.java b/src/main/java/meteordevelopment/meteorclient/systems/macros/Macros.java index 5cd469baa3..e5842a25a1 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/macros/Macros.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/macros/Macros.java @@ -61,7 +61,7 @@ private void onKey(KeyEvent event) { if (event.action == KeyAction.Release) return; for (Macro macro : macros) { - if (macro.onAction(true, event.key)) return; + if (macro.onAction(true, event.key, event.modifiers)) return; } } @@ -70,7 +70,7 @@ private void onButton(MouseButtonEvent event) { if (event.action == KeyAction.Release) return; for (Macro macro : macros) { - if (macro.onAction(false, event.button)) return; + if (macro.onAction(false, event.button, 0)) return; } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/Module.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/Module.java index d864fddfa6..2b20b44d57 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/Module.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/Module.java @@ -131,7 +131,6 @@ public NbtCompound toTag() { tag.putBoolean("chatFeedback", chatFeedback); tag.putBoolean("favorite", favorite); tag.put("settings", settings.toTag()); - tag.putBoolean("active", active); return tag; @@ -140,9 +139,7 @@ public NbtCompound toTag() { @Override public Module fromTag(NbtCompound tag) { // General - if (tag.contains("key")) keybind.set(true, tag.getInt("key")); - else keybind.fromTag(tag.getCompound("keybind")); - + keybind.fromTag(tag.getCompound("keybind")); toggleOnBindRelease = tag.getBoolean("toggleOnKeyRelease"); chatFeedback = !tag.contains("chatFeedback") || tag.getBoolean("chatFeedback"); favorite = tag.getBoolean("favorite"); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java index 4bbc322a22..7b1edc6442 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java @@ -226,19 +226,19 @@ public boolean isBinding() { @EventHandler(priority = EventPriority.HIGHEST) private void onKeyBinding(KeyEvent event) { - if (event.action == KeyAction.Press && onBinding(true, event.key)) event.cancel(); + if (event.action == KeyAction.Release && onBinding(true, event.key, event.modifiers)) event.cancel(); } @EventHandler(priority = EventPriority.HIGHEST) private void onButtonBinding(MouseButtonEvent event) { - if (event.action == KeyAction.Press && onBinding(false, event.button)) event.cancel(); + if (event.action == KeyAction.Release && onBinding(false, event.button, 0)) event.cancel(); } - private boolean onBinding(boolean isKey, int value) { + private boolean onBinding(boolean isKey, int value, int modifiers) { if (!isBinding()) return false; - if (moduleToBind.keybind.canBindTo(isKey, value)) { - moduleToBind.keybind.set(isKey, value); + if (moduleToBind.keybind.canBindTo(isKey, value, modifiers)) { + moduleToBind.keybind.set(isKey, value, modifiers); moduleToBind.info("Bound to (highlight)%s(default).", moduleToBind.keybind); } else if (value == GLFW.GLFW_KEY_ESCAPE) { @@ -256,22 +256,22 @@ else if (value == GLFW.GLFW_KEY_ESCAPE) { @EventHandler(priority = EventPriority.HIGH) private void onKey(KeyEvent event) { if (event.action == KeyAction.Repeat) return; - onAction(true, event.key, event.action == KeyAction.Press); + onAction(true, event.key, event.modifiers, event.action == KeyAction.Press); } @EventHandler(priority = EventPriority.HIGH) private void onMouseButton(MouseButtonEvent event) { if (event.action == KeyAction.Repeat) return; - onAction(false, event.button, event.action == KeyAction.Press); + onAction(false, event.button, 0, event.action == KeyAction.Press); } - private void onAction(boolean isKey, int value, boolean isPress) { - if (mc.currentScreen == null && !Input.isKeyPressed(GLFW.GLFW_KEY_F3)) { - for (Module module : moduleInstances.values()) { - if (module.keybind.matches(isKey, value) && (isPress || module.toggleOnBindRelease)) { - module.toggle(); - module.sendToggledMsg(); - } + private void onAction(boolean isKey, int value, int modifiers, boolean isPress) { + if (mc.currentScreen != null || Input.isKeyPressed(GLFW.GLFW_KEY_F3)) return; + + for (Module module : moduleInstances.values()) { + if (module.keybind.matches(isKey, value, modifiers) && (isPress || module.toggleOnBindRelease)) { + module.toggle(); + module.sendToggledMsg(); } } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/InventoryTweaks.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/InventoryTweaks.java index c7bc6311ca..190de57dbb 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/InventoryTweaks.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/InventoryTweaks.java @@ -263,7 +263,7 @@ public void onDeactivate() { private void onKey(KeyEvent event) { if (event.action != KeyAction.Press) return; - if (sortingKey.get().matches(true, event.key)) { + if (sortingKey.get().matches(true, event.key, event.modifiers)) { if (sort()) event.cancel(); } } @@ -272,7 +272,7 @@ private void onKey(KeyEvent event) { private void onMouseButton(MouseButtonEvent event) { if (event.action != KeyAction.Press) return; - if (sortingKey.get().matches(false, event.button)) { + if (sortingKey.get().matches(false, event.button, 0)) { if (sort()) event.cancel(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/CameraTweaks.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/CameraTweaks.java index ffe10c9b24..234d41e432 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/CameraTweaks.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/CameraTweaks.java @@ -13,6 +13,7 @@ import meteordevelopment.meteorclient.utils.misc.Keybind; import meteordevelopment.orbit.EventHandler; import net.minecraft.client.option.Perspective; +import org.lwjgl.glfw.GLFW; public class CameraTweaks extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); @@ -39,26 +40,26 @@ public class CameraTweaks extends Module { // Scrolling private final Setting scrollingEnabled = sgScrolling.add(new BoolSetting.Builder() - .name("scrolling-enabled") + .name("scrolling") .description("Allows you to scroll to change camera distance.") .defaultValue(true) .build() ); - private final Setting scrollSensitivity = sgScrolling.add(new DoubleSetting.Builder() - .name("scroll-sensitivity") - .description("Scroll sensitivity when changing the cameras distance. 0 to disable.") + private final Setting scrollKeybind = sgScrolling.add(new KeybindSetting.Builder() + .name("bind") + .description("Binds camera distance scrolling to a key.") .visible(scrollingEnabled::get) - .defaultValue(1) - .min(0) + .defaultValue(Keybind.fromKey(GLFW.GLFW_KEY_LEFT_ALT)) .build() ); - private final Setting scrollKeybind = sgScrolling.add(new KeybindSetting.Builder() - .name("scroll-keybind") - .description("Makes it so a keybind needs to be pressed for scrolling to work.") + private final Setting scrollSensitivity = sgScrolling.add(new DoubleSetting.Builder() + .name("sensitivity") + .description("Sensitivity of the scroll wheel when changing the cameras distance.") .visible(scrollingEnabled::get) - .defaultValue(Keybind.none()) + .defaultValue(1) + .min(0.01) .build() ); @@ -80,7 +81,7 @@ private void onPerspectiveChanged(ChangePerspectiveEvent event) { @EventHandler private void onMouseScroll(MouseScrollEvent event) { - if (mc.options.getPerspective() == Perspective.FIRST_PERSON || mc.currentScreen != null || !scrollingEnabled.get() || (scrollKeybind.get().isValid() && !scrollKeybind.get().isPressed())) return; + if (mc.options.getPerspective() == Perspective.FIRST_PERSON || mc.currentScreen != null || !scrollingEnabled.get() || (scrollKeybind.get().isSet() && !scrollKeybind.get().isPressed())) return; if (scrollSensitivity.get() > 0) { distance -= event.value * 0.25 * (scrollSensitivity.get() * distance); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Excavator.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Excavator.java index 5f2f38a312..34f48d4b1e 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Excavator.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Excavator.java @@ -28,9 +28,9 @@ public class Excavator extends Module { private final SettingGroup sgRendering = settings.createGroup("Rendering"); // Keybindings - private final Setting selectionKey = sgGeneral.add(new KeybindSetting.Builder() - .name("selection-key") - .description("Key to draw the selection.") + private final Setting selectionBind = sgGeneral.add(new KeybindSetting.Builder() + .name("selection-bind") + .description("Bind to draw selection.") .defaultValue(Keybind.fromButton(GLFW.GLFW_MOUSE_BUTTON_RIGHT)) .build() ); @@ -94,7 +94,7 @@ public void onDeactivate() { @EventHandler private void onMouseButton(MouseButtonEvent event) { - if (event.action != KeyAction.Press || event.button != selectionKey.get().getValue() || mc.currentScreen != null) { + if (event.action != KeyAction.Press || !selectionBind.get().isPressed() || mc.currentScreen != null) { return; } selectCorners(); @@ -102,7 +102,7 @@ private void onMouseButton(MouseButtonEvent event) { @EventHandler private void onKey(KeyEvent event) { - if (event.action != KeyAction.Press || event.key != selectionKey.get().getValue() || mc.currentScreen != null) { + if (event.action != KeyAction.Press || !selectionBind.get().isPressed() || mc.currentScreen != null) { return; } selectCorners(); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/Keybind.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/Keybind.java index 6593b59d50..a1f4f73e11 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/Keybind.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/Keybind.java @@ -16,21 +16,26 @@ public class Keybind implements ISerializable, ICopyable { private boolean isKey; private int value; + private int modifiers; - private Keybind(boolean isKey, int value) { - set(isKey, value); + private Keybind(boolean isKey, int value, int modifiers) { + set(isKey, value, modifiers); } public static Keybind none() { - return new Keybind(true, -1); + return new Keybind(true, GLFW_KEY_UNKNOWN, 0); } public static Keybind fromKey(int key) { - return new Keybind(true, key); + return new Keybind(true, key, 0); + } + + public static Keybind fromKeys(int key, int modifiers) { + return new Keybind(true, key, modifiers); } public static Keybind fromButton(int button) { - return new Keybind(false, button); + return new Keybind(false, button, 0); } public int getValue() { @@ -38,53 +43,100 @@ public int getValue() { } public boolean isSet() { - return value != -1; + return value != GLFW_KEY_UNKNOWN; } - public boolean canBindTo(boolean isKey, int value) { - if (isKey) return value != GLFW_KEY_ESCAPE; - return value != GLFW_MOUSE_BUTTON_LEFT && value != GLFW_MOUSE_BUTTON_RIGHT; + public boolean isKey() { + return isKey; } - public void set(boolean isKey, int value) { + public boolean hasMods() { + return isKey && modifiers != 0; + } + + public void set(boolean isKey, int value, int modifiers) { this.isKey = isKey; this.value = value; + this.modifiers = modifiers; } @Override public Keybind set(Keybind value) { this.isKey = value.isKey; this.value = value.value; + this.modifiers = value.modifiers; return this; } - public boolean matches(boolean isKey, int value) { - if (this.isKey != isKey) return false; - return this.value == value; + public void reset() { + set(true, GLFW_KEY_UNKNOWN, 0); } - public boolean isValid() { - return value != -1; + public boolean canBindTo(boolean isKey, int value, int modifiers) { + if (isKey) { + if (modifiers != 0 && isKeyMod(value)) return false; + return value != GLFW_KEY_UNKNOWN && value != GLFW_KEY_ESCAPE; + } + return value != GLFW_MOUSE_BUTTON_LEFT && value != GLFW_MOUSE_BUTTON_RIGHT; } - public boolean isKey() { - return isKey; + public boolean matches(boolean isKey, int value, int modifiers) { + if (!this.isSet() || this.isKey != isKey) return false; + if (!hasMods()) return this.value == value; + return this.value == value && this.modifiers == modifiers; } public boolean isPressed() { - return isKey ? Input.isKeyPressed(value) : Input.isButtonPressed(value); + return isKey ? modifiersPressed() && Input.isKeyPressed(value) : Input.isButtonPressed(value); + } + + private boolean modifiersPressed() { + if (!hasMods()) return true; + + if (!isModPressed(GLFW_MOD_CONTROL, GLFW_KEY_LEFT_CONTROL, GLFW_KEY_RIGHT_CONTROL)) return false; + if (!isModPressed(GLFW_MOD_SUPER, GLFW_KEY_LEFT_SUPER, GLFW_KEY_RIGHT_SUPER)) return false; + if (!isModPressed(GLFW_MOD_ALT, GLFW_KEY_LEFT_ALT, GLFW_KEY_RIGHT_ALT)) return false; + if (!isModPressed(GLFW_MOD_SHIFT, GLFW_KEY_LEFT_SHIFT, GLFW_KEY_RIGHT_SHIFT)) return false; + + return true; + } + + private boolean isModPressed(int value, int... keys) { + if ((modifiers & value) == 0) return true; + + for (int key : keys) { + if (Input.isKeyPressed(key)) return true; + } + + return false; + } + + private boolean isKeyMod(int key) { + return key >= GLFW_KEY_LEFT_SHIFT && key <= GLFW_KEY_RIGHT_SUPER; } @Override public Keybind copy() { - return new Keybind(isKey, value); + return new Keybind(isKey, value, modifiers); } @Override public String toString() { - if (value == -1) return "None"; - return isKey ? Utils.getKeyName(value) : Utils.getButtonName(value); + if (!isSet()) return "None"; + if (!isKey) return Utils.getButtonName(value); + if (modifiers == 0) return Utils.getKeyName(value); + + StringBuilder label = new StringBuilder(); + if ((modifiers & GLFW_MOD_CONTROL) != 0) label.append("Ctrl + "); + if ((modifiers & GLFW_MOD_SUPER) != 0) label.append("Cmd + "); + if ((modifiers & GLFW_MOD_ALT) != 0) label.append("Alt + "); + if ((modifiers & GLFW_MOD_SHIFT) != 0) label.append("Shift + "); + if ((modifiers & GLFW_MOD_CAPS_LOCK) != 0) label.append("Caps Lock + "); + if ((modifiers & GLFW_MOD_NUM_LOCK) != 0) label.append("Num Lock + "); + label.append(Utils.getKeyName(value)); + + return label.toString(); } @Override @@ -92,12 +144,12 @@ public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Keybind keybind = (Keybind) o; - return isKey == keybind.isKey && value == keybind.value; + return isKey == keybind.isKey && value == keybind.value && modifiers == keybind.modifiers; } @Override public int hashCode() { - return Objects.hash(isKey, value); + return Objects.hash(isKey, value, modifiers); } // Serialization @@ -108,6 +160,7 @@ public NbtCompound toTag() { tag.putBoolean("isKey", isKey); tag.putInt("value", value); + tag.putInt("modifiers", modifiers); return tag; } @@ -116,6 +169,7 @@ public NbtCompound toTag() { public Keybind fromTag(NbtCompound tag) { isKey = tag.getBoolean("isKey"); value = tag.getInt("value"); + modifiers = tag.getInt("modifiers"); return this; } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/input/Input.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/input/Input.java index bf6f332e60..a2a6bf001e 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/input/Input.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/input/Input.java @@ -6,6 +6,7 @@ package meteordevelopment.meteorclient.utils.misc.input; import meteordevelopment.meteorclient.gui.GuiKeyEvents; +import meteordevelopment.meteorclient.mixin.KeyBindingAccessor; import meteordevelopment.meteorclient.utils.misc.CursorStyle; import net.minecraft.client.option.KeyBinding; import org.lwjgl.glfw.GLFW; @@ -26,12 +27,16 @@ public static void setButtonState(int button, boolean pressed) { if (button >= 0 && button < buttons.length) buttons[button] = pressed; } + public static int getKey(KeyBinding bind) { + return ((KeyBindingAccessor) bind).getKey().getCode(); + } + public static void setKeyState(KeyBinding bind, boolean pressed) { - setKeyState(KeyBinds.getKey(bind), pressed); + setKeyState(getKey(bind), pressed); } public static boolean isPressed(KeyBinding bind) { - return isKeyPressed(KeyBinds.getKey(bind)); + return isKeyPressed(getKey(bind)); } public static boolean isKeyPressed(int key) { diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/input/KeyBinds.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/input/KeyBinds.java index 769513b08d..ba3615df2b 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/input/KeyBinds.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/input/KeyBinds.java @@ -38,8 +38,4 @@ public static KeyBinding[] apply(KeyBinding[] binds) { return newBinds; } - - public static int getKey(KeyBinding bind) { - return ((KeyBindingAccessor) bind).getKey().getCode(); - } } From 20799ae3ab500a6ed0fc2cb18497befc45250cf5 Mon Sep 17 00:00:00 2001 From: Zgoly <46041044+Zgoly@users.noreply.github.com> Date: Fri, 3 May 2024 21:30:46 +0500 Subject: [PATCH 262/357] Starscript & Text preset for game mode (#4553) --- .../meteorclient/systems/hud/elements/MeteorTextHud.java | 2 ++ .../meteorclient/utils/misc/MeteorStarscript.java | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/MeteorTextHud.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/MeteorTextHud.java index 9188959a38..16259d95e2 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/MeteorTextHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/MeteorTextHud.java @@ -15,6 +15,7 @@ public class MeteorTextHud { public static final HudElementInfo.Preset TPS; public static final HudElementInfo.Preset PING; public static final HudElementInfo.Preset SPEED; + public static final HudElementInfo.Preset GAME_MODE; public static final HudElementInfo.Preset DURABILITY; public static final HudElementInfo.Preset POSITION; public static final HudElementInfo.Preset OPPOSITE_POSITION; @@ -37,6 +38,7 @@ public class MeteorTextHud { TPS = addPreset("TPS", "TPS: #1{round(server.tps, 1)}"); PING = addPreset("Ping", "Ping: #1{ping}"); SPEED = addPreset("Speed", "Speed: #1{round(player.speed, 1)}", 0); + GAME_MODE = addPreset("Game mode", "Game mode: #1{player.gamemode}", 0); DURABILITY = addPreset("Durability", "Durability: #1{player.hand_or_offhand.durability}"); POSITION = addPreset("Position", "Pos: #1{floor(camera.pos.x)}, {floor(camera.pos.y)}, {floor(camera.pos.z)}", 0); OPPOSITE_POSITION = addPreset("Opposite Position", "{player.opposite_dimension != \"End\" ? player.opposite_dimension + \":\" : \"\"} #1{player.opposite_dimension != \"End\" ? \"\" + floor(camera.opposite_dim_pos.x) + \", \" + floor(camera.opposite_dim_pos.y) + \", \" + floor(camera.opposite_dim_pos.z) : \"\"}", 0); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorStarscript.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorStarscript.java index 90a3cfb507..3d91196a0e 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorStarscript.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorStarscript.java @@ -147,6 +147,8 @@ public static void init() { .set("dimension", () -> Value.string(PlayerUtils.getDimension().name())) .set("opposite_dimension", () -> Value.string(PlayerUtils.getDimension().opposite().name())) + .set("gamemode", () -> mc.player != null ? Value.string(StringUtils.capitalize(PlayerUtils.getGameMode().getName())) : Value.null_()) + .set("pos", new ValueMap() .set("_toString", () -> posString(false, false)) .set("x", () -> Value.number(mc.player != null ? mc.player.getX() : 0)) From a1de9e0ba9d9b10cac711044034f55dbea259e44 Mon Sep 17 00:00:00 2001 From: Zgoly <46041044+Zgoly@users.noreply.github.com> Date: Fri, 3 May 2024 21:36:02 +0500 Subject: [PATCH 263/357] Prompt improvements (#4548) --- .../utils/render/prompts/OkPrompt.java | 24 ++++++++++++----- .../utils/render/prompts/YesNoPrompt.java | 26 ++++++++++++++----- 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/prompts/OkPrompt.java b/src/main/java/meteordevelopment/meteorclient/utils/render/prompts/OkPrompt.java index 39d8e09f11..6ec2986500 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/prompts/OkPrompt.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/prompts/OkPrompt.java @@ -26,6 +26,7 @@ public class OkPrompt { private String title = ""; private final List messages = new ArrayList<>(); + private boolean dontShowAgainCheckboxVisible = true; private String id = null; private Runnable onOk = () -> {}; @@ -62,6 +63,11 @@ public OkPrompt message(String message, Object... args) { return this; } + public OkPrompt dontShowAgainCheckboxVisible(boolean visible) { + this.dontShowAgainCheckboxVisible = visible; + return this; + } + public OkPrompt id(String from) { this.id = from; return this; @@ -72,9 +78,9 @@ public OkPrompt onOk(Runnable action) { return this; } - public void show() { + public boolean show() { if (id == null) this.id(this.title); - if (Config.get().dontShowAgainPrompts.contains(id)) return; + if (Config.get().dontShowAgainPrompts.contains(id)) return false; if (!RenderSystem.isOnRenderThread()) { RenderSystem.recordRenderCall(() -> mc.setScreen(new PromptScreen(theme))); @@ -82,6 +88,8 @@ public void show() { else { mc.setScreen(new PromptScreen(theme)); } + + return true; } private class PromptScreen extends WindowScreen { @@ -96,14 +104,18 @@ public void initWidgets() { for (String line : messages) add(theme.label(line)).expandX(); add(theme.horizontalSeparator()).expandX(); - WHorizontalList checkboxContainer = add(theme.horizontalList()).expandX().widget(); - WCheckbox dontShowAgainCheckbox = checkboxContainer.add(theme.checkbox(false)).widget(); - checkboxContainer.add(theme.label("Don't show this again.")).expandX(); + WCheckbox dontShowAgainCheckbox; + + if (dontShowAgainCheckboxVisible) { + WHorizontalList checkboxContainer = add(theme.horizontalList()).expandX().widget(); + dontShowAgainCheckbox = checkboxContainer.add(theme.checkbox(false)).widget(); + checkboxContainer.add(theme.label("Don't show this again.")).expandX(); + } else dontShowAgainCheckbox = null; WHorizontalList list = add(theme.horizontalList()).expandX().widget(); WButton okButton = list.add(theme.button("Ok")).expandX().widget(); okButton.action = () -> { - if (dontShowAgainCheckbox.checked) Config.get().dontShowAgainPrompts.add(id); + if (dontShowAgainCheckbox != null && dontShowAgainCheckbox.checked) Config.get().dontShowAgainPrompts.add(id); onOk.run(); close(); }; diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/prompts/YesNoPrompt.java b/src/main/java/meteordevelopment/meteorclient/utils/render/prompts/YesNoPrompt.java index 131028b9b9..edf8d4e9fb 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/prompts/YesNoPrompt.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/prompts/YesNoPrompt.java @@ -26,6 +26,7 @@ public class YesNoPrompt { private String title = ""; private final List messages = new ArrayList<>(); + private boolean dontShowAgainCheckboxVisible = true; private String id = null; private Runnable onYes = () -> {}; @@ -63,6 +64,11 @@ public YesNoPrompt message(String message, Object... args) { return this; } + public YesNoPrompt dontShowAgainCheckboxVisible(boolean visible) { + this.dontShowAgainCheckboxVisible = visible; + return this; + } + public YesNoPrompt id(String from) { this.id = from; return this; @@ -78,9 +84,9 @@ public YesNoPrompt onNo(Runnable action) { return this; } - public void show() { + public boolean show() { if (id == null) this.id(this.title); - if (Config.get().dontShowAgainPrompts.contains(id)) return; + if (Config.get().dontShowAgainPrompts.contains(id)) return false; if (!RenderSystem.isOnRenderThread()) { RenderSystem.recordRenderCall(() -> mc.setScreen(new PromptScreen(theme))); @@ -88,6 +94,8 @@ public void show() { else { mc.setScreen(new PromptScreen(theme)); } + + return true; } private class PromptScreen extends WindowScreen { @@ -102,22 +110,26 @@ public void initWidgets() { for (String line : messages) add(theme.label(line)).expandX(); add(theme.horizontalSeparator()).expandX(); - WHorizontalList checkboxContainer = add(theme.horizontalList()).expandX().widget(); - WCheckbox dontShowAgainCheckbox = checkboxContainer.add(theme.checkbox(false)).widget(); - checkboxContainer.add(theme.label("Don't show this again.")).expandX(); + WCheckbox dontShowAgainCheckbox; + + if (dontShowAgainCheckboxVisible) { + WHorizontalList checkboxContainer = add(theme.horizontalList()).expandX().widget(); + dontShowAgainCheckbox = checkboxContainer.add(theme.checkbox(false)).widget(); + checkboxContainer.add(theme.label("Don't show this again.")).expandX(); + } else dontShowAgainCheckbox = null; WHorizontalList list = add(theme.horizontalList()).expandX().widget(); WButton yesButton = list.add(theme.button("Yes")).expandX().widget(); yesButton.action = () -> { - if (dontShowAgainCheckbox.checked) Config.get().dontShowAgainPrompts.add(id); + if (dontShowAgainCheckbox != null && dontShowAgainCheckbox.checked) Config.get().dontShowAgainPrompts.add(id); onYes.run(); close(); }; WButton noButton = list.add(theme.button("No")).expandX().widget(); noButton.action = () -> { - if (dontShowAgainCheckbox.checked) Config.get().dontShowAgainPrompts.add(id); + if (dontShowAgainCheckbox != null && dontShowAgainCheckbox.checked) Config.get().dontShowAgainPrompts.add(id); onNo.run(); close(); }; From 52eee5c7ac05578b0808ef4e734b769437ad59dd Mon Sep 17 00:00:00 2001 From: Hackerokuz Date: Wed, 27 Mar 2024 17:40:58 +0100 Subject: [PATCH 264/357] Added glow ESP so that ESP can esily be used with shaders. --- .../mixin/WorldRendererMixin.java | 25 +++++++++++++++++++ .../systems/modules/render/ESP.java | 11 +++++--- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererMixin.java index 5baabf8289..78e732808c 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererMixin.java @@ -29,6 +29,12 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Local; +import com.llamalad7.mixinextras.sugar.ref.LocalRef; + @Mixin(WorldRenderer.class) public abstract class WorldRendererMixin { @Shadow @@ -97,6 +103,25 @@ private void onRender(MatrixStack matrices, float tickDelta, long limitTime, boo PostProcessShaders.endRender(); } + @ModifyExpressionValue(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/MinecraftClient;hasOutline(Lnet/minecraft/entity/Entity;)Z")) + private boolean shouldMobGlow(boolean original, @Local Entity entity) { + ESP esp = Modules.get().get(ESP.class); + Color entityGlowColor = esp.getColor(entity); + if (entityGlowColor == null) return original; + return esp.isGlow() && !esp.shouldSkip(entity) || original; + } + + @WrapOperation(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/OutlineVertexConsumerProvider;setColor(IIII)V")) + private void setGlowColor(OutlineVertexConsumerProvider instance, int red, int green, int blue, int alpha, Operation original, @Local LocalRef entity) { + ESP esp = Modules.get().get(ESP.class); + Color entityGlowColor = esp.getColor(entity.get()); + if (esp.isGlow() && !esp.shouldSkip(entity.get()) && entityGlowColor != null) { + instance.setColor(entityGlowColor.r, entityGlowColor.g, entityGlowColor.b, entityGlowColor.a); + } else { + original.call(instance, red, green, blue, alpha); + } + } + @Inject(method = "onResized", at = @At("HEAD")) private void onResized(int width, int height, CallbackInfo info) { PostProcessShaders.onResized(width, height); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ESP.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ESP.java index 080d164d8e..04277817ed 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ESP.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ESP.java @@ -74,6 +74,7 @@ public class ESP extends Module { public final Setting shapeMode = sgGeneral.add(new EnumSetting.Builder() .name("shape-mode") .description("How the shapes are rendered.") + .visible(() -> mode.get() != Mode.Glow) .defaultValue(ShapeMode.Both) .build() ); @@ -81,7 +82,7 @@ public class ESP extends Module { public final Setting fillOpacity = sgGeneral.add(new DoubleSetting.Builder() .name("fill-opacity") .description("The opacity of the shape fill.") - .visible(() -> shapeMode.get() != ShapeMode.Lines) + .visible(() -> shapeMode.get() != ShapeMode.Lines && mode.get() != Mode.Glow) .defaultValue(0.3) .range(0, 1) .sliderMax(1) @@ -348,13 +349,17 @@ public String getInfoString() { public boolean isShader() { return isActive() && mode.get() == Mode.Shader; } + + public boolean isGlow() { + return isActive() && mode.get() == Mode.Glow; + } public enum Mode { Box, Wireframe, _2D, - Shader; - + Shader, + Glow; @Override public String toString() { return this == _2D ? "2D" : super.toString(); From 2f4d59ad4232942001711b60b34ddd4093c69004 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Fri, 3 May 2024 18:05:35 +0100 Subject: [PATCH 265/357] code improvements --- .../mixin/WorldRendererMixin.java | 30 ++++++++++++------- .../systems/modules/render/ESP.java | 3 +- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererMixin.java index 78e732808c..7c31fd1567 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererMixin.java @@ -40,6 +40,8 @@ public abstract class WorldRendererMixin { @Shadow private Framebuffer entityOutlinesFramebuffer; + @Unique private ESP esp; + @Shadow protected abstract void renderEntity(Entity entity, double cameraX, double cameraY, double cameraZ, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers); @@ -105,20 +107,19 @@ private void onRender(MatrixStack matrices, float tickDelta, long limitTime, boo @ModifyExpressionValue(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/MinecraftClient;hasOutline(Lnet/minecraft/entity/Entity;)Z")) private boolean shouldMobGlow(boolean original, @Local Entity entity) { - ESP esp = Modules.get().get(ESP.class); - Color entityGlowColor = esp.getColor(entity); - if (entityGlowColor == null) return original; - return esp.isGlow() && !esp.shouldSkip(entity) || original; + if (!getESP().isGlow() || getESP().shouldSkip(entity)) return original; + + return getESP().getColor(entity) != null || original; } @WrapOperation(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/OutlineVertexConsumerProvider;setColor(IIII)V")) private void setGlowColor(OutlineVertexConsumerProvider instance, int red, int green, int blue, int alpha, Operation original, @Local LocalRef entity) { - ESP esp = Modules.get().get(ESP.class); - Color entityGlowColor = esp.getColor(entity.get()); - if (esp.isGlow() && !esp.shouldSkip(entity.get()) && entityGlowColor != null) { - instance.setColor(entityGlowColor.r, entityGlowColor.g, entityGlowColor.b, entityGlowColor.a); - } else { - original.call(instance, red, green, blue, alpha); + if (!getESP().isGlow() || getESP().shouldSkip(entity.get())) original.call(instance, red, green, blue, alpha); + else { + Color color = getESP().getColor(entity.get()); + + if (color == null) original.call(instance, red, green, blue, alpha); + else instance.setColor(color.r, color.g, color.b, color.a); } } @@ -160,4 +161,13 @@ private static int getLightmapCoordinatesModifySkyLight(int sky) { private static int getLightmapCoordinatesModifyBlockLight(int sky) { return Math.max(Modules.get().get(Fullbright.class).getLuminance(LightType.BLOCK), sky); } + + @Unique + private ESP getESP() { + if (esp == null) { + esp = Modules.get().get(ESP.class); + } + + return esp; + } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ESP.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ESP.java index 04277817ed..40e8f3eb35 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ESP.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ESP.java @@ -349,7 +349,7 @@ public String getInfoString() { public boolean isShader() { return isActive() && mode.get() == Mode.Shader; } - + public boolean isGlow() { return isActive() && mode.get() == Mode.Glow; } @@ -360,6 +360,7 @@ public enum Mode { _2D, Shader, Glow; + @Override public String toString() { return this == _2D ? "2D" : super.toString(); From eaddc5b69441d0a6cd45b2bb3f6306595ec2096a Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Fri, 3 May 2024 20:30:44 +0200 Subject: [PATCH 266/357] Publish the javadoc jar to maven --- build.gradle | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/build.gradle b/build.gradle index ca9435e84f..7e84894083 100644 --- a/build.gradle +++ b/build.gradle @@ -123,6 +123,7 @@ java { targetCompatibility = JavaVersion.VERSION_17 withSourcesJar() + withJavadocJar() } remapJar { @@ -135,11 +136,6 @@ javadoc { options.encoding = "UTF-8" } -tasks.register("javadocJar", Jar) { - from javadoc - archiveClassifier.set("javadoc") -} - build { dependsOn javadocJar } From 828ca949c020b42f226cdebaa5f63fe71828e705 Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Fri, 3 May 2024 20:46:26 +0200 Subject: [PATCH 267/357] Future version 0.5.7 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index b200c88762..eb5488c15f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,7 +7,7 @@ loader_version=0.15.2 fapi_version=0.95.3+1.20.4 # Mod Properties -mod_version=0.5.6 +mod_version=0.5.7 maven_group=meteordevelopment archives_base_name=meteor-client From f5e042f25bb62f2c2e0b036373992d51cf793f3d Mon Sep 17 00:00:00 2001 From: Big Iron <52252627+Big-Iron-Cheems@users.noreply.github.com> Date: Fri, 3 May 2024 21:09:42 +0200 Subject: [PATCH 268/357] 1.20.5/.6 update (#4534) --- .github/workflows/build.yml | 2 +- .github/workflows/publish.yml | 2 +- .github/workflows/pull-request.yml | 2 +- build.gradle | 102 ++++---- gradle.properties | 16 +- gradle/wrapper/gradle-wrapper.jar | Bin 62076 -> 43462 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 22 +- gradlew.bat | 184 ++++++------- .../meteordevelopment/meteorclient/Main.java | 6 +- .../meteorclient/MeteorClient.java | 2 +- .../arguments/CompoundNbtTagArgumentType.java | 8 +- .../commands/commands/CommandsCommand.java | 6 +- .../commands/commands/DisconnectCommand.java | 3 - .../commands/commands/EnchantCommand.java | 20 +- .../commands/commands/LocateCommand.java | 241 ++++++++++------- .../commands/commands/ModulesCommand.java | 2 +- .../commands/commands/NbtCommand.java | 68 +++-- .../commands/commands/NotebotCommand.java | 2 +- .../commands/commands/SaveMapCommand.java | 18 +- .../commands/commands/ServerCommand.java | 19 +- .../events/game/SectionVisibleEvent.java | 7 +- .../events/packets/PacketEvent.java | 9 +- .../meteorclient/gui/GuiKeyEvents.java | 3 + .../meteorclient/gui/GuiTheme.java | 1 - .../meteorclient/gui/GuiThemes.java | 3 + .../screens/EditBookTitleAndAuthorScreen.java | 14 +- .../gui/screens/MarkerScreen.java | 2 +- .../gui/screens/ModuleScreen.java | 2 +- .../gui/screens/ModulesScreen.java | 6 +- .../settings/BlockDataSettingScreen.java | 2 +- .../settings/LeftRightListSettingScreen.java | 4 +- ...StatusEffectAmplifierMapSettingScreen.java | 11 +- .../StatusEffectListSettingScreen.java | 11 +- .../meteorclient/gui/tabs/Tabs.java | 4 +- .../gui/utils/StarscriptTextBoxRenderer.java | 4 +- .../gui/widgets/WItemWithLabel.java | 17 +- .../meteorclient/gui/widgets/WMultiLabel.java | 2 +- .../gui/widgets/containers/WContainer.java | 2 +- .../gui/widgets/input/WBlockPosEdit.java | 3 +- .../gui/widgets/input/WTextBox.java | 2 +- .../mixin/AbstractBlockMixin.java | 4 +- .../mixin/AbstractBlockStateMixin.java | 4 +- .../AbstractClientPlayerEntityMixin.java | 2 +- .../mixin/AbstractSignEditScreenMixin.java | 2 +- .../mixin/ArmorFeatureRendererMixin.java | 2 +- .../mixin/AttributeContainerMixin.java | 38 --- .../mixin/BackgroundRendererMixin.java | 2 +- .../meteorclient/mixin/BakedQuadMixin.java | 2 +- .../mixin/BannerBlockEntityRendererMixin.java | 7 +- .../mixin/BeaconBlockEntityRendererMixin.java | 2 +- .../meteorclient/mixin/BeaconScreenMixin.java | 8 +- .../meteorclient/mixin/BiomeColorsMixin.java | 2 +- .../mixin/BlockCollisionSpliteratorMixin.java | 2 +- .../BlockEntityRenderDispatcherMixin.java | 2 +- .../mixin/BlockModelRendererMixin.java | 2 +- .../mixin/BlockRenderManagerMixin.java | 2 +- .../meteorclient/mixin/BlockStateMixin.java | 9 +- .../meteorclient/mixin/BoatEntityMixin.java | 2 +- .../meteorclient/mixin/BookScreenMixin.java | 4 +- .../meteorclient/mixin/BossBarHudMixin.java | 2 +- .../meteorclient/mixin/BoxMixin.java | 2 +- .../mixin/CapeFeatureRendererMixin.java | 2 +- .../meteorclient/mixin/ChatHudLineMixin.java | 2 +- .../mixin/ChatHudLineVisibleMixin.java | 2 +- .../meteorclient/mixin/ChatHudMixin.java | 77 +++--- .../mixin/ChunkBorderDebugRendererMixin.java | 2 +- .../mixin/ChunkOcclusionDataBuilderMixin.java | 2 +- .../mixin/ChunkSkyLightProviderMixin.java | 2 +- .../mixin/ClientConnectionMixin.java | 29 +- .../ClientPlayerInteractionManagerMixin.java | 11 - .../meteorclient/mixin/CobwebBlockMixin.java | 2 +- .../CompassAnglePredicateProviderMixin.java | 33 ++- .../mixin/ConnectScreenMixin.java | 7 +- .../meteorclient/mixin/CrashReportMixin.java | 2 +- .../meteorclient/mixin/CreativeSlotMixin.java | 2 +- .../mixin/CrossbowItemAccessor.java | 4 +- .../mixin/CustomPayloadS2CPacketMixin.java | 21 -- .../mixin/DefaultSkinHelperMixin.java | 2 +- .../mixin/DisconnectedScreenMixin.java | 2 +- .../meteorclient/mixin/DrawContextMixin.java | 2 +- ...chantingTableBlockEntityRendererMixin.java | 4 +- .../mixin/EntityAttributeInstanceMixin.java | 39 --- .../EntityEffectParticleEffectAccessor.java | 16 ++ .../mixin/EntityRendererMixin.java | 8 +- .../meteorclient/mixin/ExplosionMixin.java | 2 +- .../mixin/ExplosionS2CPacketMixin.java | 2 +- .../mixin/FireworksSparkParticleMixin.java | 5 +- .../mixin/FireworksSparkParticleSubMixin.java | 2 +- .../mixin/FishingBobberEntityMixin.java | 2 +- .../mixin/FluidRendererMixin.java | 2 +- .../mixin/FoliageColorsMixin.java | 2 +- .../meteorclient/mixin/GameOptionsMixin.java | 2 +- .../meteorclient/mixin/GameRendererMixin.java | 95 ++++--- .../mixin/HandledScreenMixin.java | 29 +- .../meteorclient/mixin/InGameHudMixin.java | 21 +- .../mixin/InGameOverlayRendererMixin.java | 2 +- .../meteorclient/mixin/ItemEntityMixin.java | 4 +- .../meteorclient/mixin/ItemMixin.java | 2 +- .../meteorclient/mixin/ItemRendererMixin.java | 2 +- .../meteorclient/mixin/ItemStackMixin.java | 11 +- .../mixin/KeyboardInputMixin.java | 2 +- .../mixin/LightmapTextureManagerMixin.java | 2 +- .../mixin/LightningEntityRendererMixin.java | 2 +- .../mixin/LivingEntityAccessor.java | 13 +- .../meteorclient/mixin/LivingEntityMixin.java | 19 +- .../mixin/LivingEntityRendererMixin.java | 1 - .../mixin/MapRendererAccessor.java | 3 +- .../meteorclient/mixin/MapRendererMixin.java | 8 +- .../mixin/MessageHandlerMixin.java | 2 +- .../mixin/MinecraftClientMixin.java | 4 +- .../MobSpawnerBlockEntityRendererMixin.java | 2 +- .../meteorclient/mixin/MouseMixin.java | 2 +- .../mixin/MultiplayerScreenMixin.java | 10 +- .../meteorclient/mixin/MutableTextMixin.java | 2 +- .../mixin/PacketByteBufMixin.java | 4 +- .../mixin/PlayerArmorSlotMixin.java | 2 +- .../meteorclient/mixin/PlayerEntityMixin.java | 12 + .../mixin/PlayerEntityRendererMixin.java | 2 +- .../PlayerInteractEntityC2SPacketMixin.java | 2 +- .../mixin/PlayerMoveC2SPacketMixin.java | 2 +- .../mixin/PowderSnowBlockMixin.java | 2 +- .../mixin/RaycastContextMixin.java | 2 +- .../meteorclient/mixin/RegistriesMixin.java | 2 +- .../meteorclient/mixin/RenderLayersMixin.java | 2 +- .../mixin/RenderTickCounterMixin.java | 2 +- .../meteorclient/mixin/ScreenMixin.java | 9 + .../mixin/ShulkerBoxBlockMixin.java | 12 +- .../mixin/ShulkerEntityAccessor.java | 25 -- .../mixin/SignBlockEntityRendererMixin.java | 2 +- .../meteorclient/mixin/SimpleOptionMixin.java | 2 +- .../meteorclient/mixin/SlimeBlockMixin.java | 2 +- .../meteorclient/mixin/SlotMixin.java | 2 +- .../meteorclient/mixin/SoundSystemMixin.java | 2 +- .../SplashTextResourceSupplierMixin.java | 13 +- .../mixin/StatusEffectAccessor.java | 20 ++ .../mixin/StatusEffectInstanceMixin.java | 4 +- .../meteorclient/mixin/StringHelperMixin.java | 2 +- .../mixin/SweetBerryBushBlockMixin.java | 2 +- .../meteorclient/mixin/TextRendererMixin.java | 2 +- .../meteorclient/mixin/TitleScreenMixin.java | 2 +- .../mixin/TransformationMixin.java | 2 +- .../meteorclient/mixin/TridentItemMixin.java | 2 +- .../meteorclient/mixin/Vec3dMixin.java | 2 +- .../meteorclient/mixin/VertexBufferMixin.java | 2 +- .../meteorclient/mixin/WorldChunkMixin.java | 2 +- .../mixin/WorldRendererMixin.java | 4 +- .../mixin/baritone/ComeCommandMixin.java | 2 +- .../canvas/CanvasWorldRendererMixin.java | 2 +- .../AbstractBlockRenderContextMixin.java | 2 +- .../mixin/indigo/AoCalculatorMixin.java | 2 +- .../AbstractBlockRenderContextMixin.java | 2 +- .../sodium/SodiumBiomeColorCacheMixin.java | 2 +- .../SodiumBlockOcclusionCacheMixin.java | 2 +- .../sodium/SodiumBlockRendererMixin.java | 2 +- .../sodium/SodiumFluidRendererMixin.java | 2 +- .../sodium/SodiumLightDataAccessMixin.java | 2 +- .../mixininterface/IAttributeContainer.java | 16 -- .../mixininterface/IChatHudLine.java | 2 + .../IEntityAttributeInstance.java | 15 -- .../meteorclient/pathing/BaritoneUtils.java | 3 + .../meteorclient/renderer/Fonts.java | 3 + .../meteorclient/renderer/GL.java | 3 + .../meteorclient/renderer/Mesh.java | 11 +- .../renderer/PostProcessRenderer.java | 3 + .../meteorclient/renderer/Shader.java | 2 +- .../meteorclient/renderer/Shaders.java | 3 + .../renderer/text/VanillaTextRenderer.java | 9 +- .../meteorclient/settings/SettingGroup.java | 3 +- .../meteorclient/settings/Settings.java | 3 +- .../settings/SoundEventListSetting.java | 2 - .../settings/StorageBlockListSetting.java | 5 - .../meteorclient/settings/StringSetting.java | 2 +- .../systems/accounts/Accounts.java | 3 +- .../systems/accounts/MicrosoftLogin.java | 3 + .../meteorclient/systems/hud/Hud.java | 1 + .../systems/hud/HudElementInfo.java | 2 +- .../meteorclient/systems/hud/HudGroup.java | 22 +- .../meteorclient/systems/hud/HudRenderer.java | 2 +- .../systems/hud/elements/CombatHud.java | 15 +- .../systems/hud/elements/InventoryHud.java | 1 - .../systems/hud/elements/PotionTimersHud.java | 8 +- .../systems/hud/elements/TextHud.java | 3 +- .../hud/screens/AddHudElementScreen.java | 2 +- .../meteorclient/systems/macros/Macro.java | 1 - .../meteorclient/systems/macros/Macros.java | 3 +- .../meteorclient/systems/modules/Modules.java | 5 - .../systems/modules/combat/AntiAnvil.java | 2 +- .../systems/modules/combat/AutoArmor.java | 4 +- .../systems/modules/combat/AutoTrap.java | 6 +- .../systems/modules/combat/AutoWeapon.java | 4 +- .../systems/modules/combat/CrystalAura.java | 2 +- .../systems/modules/combat/KillAura.java | 4 +- .../systems/modules/combat/Offhand.java | 7 +- .../systems/modules/combat/Quiver.java | 19 +- .../systems/modules/combat/SelfTrap.java | 4 +- .../systems/modules/combat/Surround.java | 2 +- .../systems/modules/misc/BookBot.java | 39 +-- .../systems/modules/misc/DiscordPresence.java | 4 +- .../systems/modules/misc/InventoryTweaks.java | 3 +- .../systems/modules/misc/NameProtect.java | 2 +- .../systems/modules/misc/Notebot.java | 14 +- .../systems/modules/misc/ServerSpoof.java | 92 ++++--- .../systems/modules/movement/Blink.java | 3 +- .../systems/modules/movement/ClickTP.java | 2 +- .../systems/modules/movement/ElytraBoost.java | 5 +- .../systems/modules/movement/Scaffold.java | 2 +- .../systems/modules/movement/Step.java | 7 +- .../systems/modules/movement/Velocity.java | 2 +- .../modules/movement/elytrafly/ElytraFly.java | 5 +- .../movement/elytrafly/modes/Bounce.java | 1 - .../systems/modules/player/AutoEat.java | 21 +- .../systems/modules/player/AutoGap.java | 3 +- .../systems/modules/player/AutoMend.java | 6 +- .../systems/modules/player/AutoReplenish.java | 4 +- .../systems/modules/player/AutoTool.java | 4 +- .../systems/modules/player/GhostHand.java | 4 +- .../systems/modules/player/PotionSaver.java | 28 +- .../systems/modules/player/PotionSpoof.java | 24 +- .../systems/modules/player/Reach.java | 9 +- .../modules/render/BetterTooltips.java | 193 +++++++------- .../modules/render/BlockSelection.java | 7 +- .../systems/modules/render/CityESP.java | 4 +- .../systems/modules/render/Freecam.java | 4 +- .../systems/modules/render/LightOverlay.java | 2 - .../systems/modules/render/Nametags.java | 20 +- .../systems/modules/render/StorageESP.java | 5 +- .../systems/modules/render/Tracers.java | 4 +- .../systems/modules/render/Xray.java | 2 +- .../modules/render/blockesp/ESPBlock.java | 19 +- .../modules/render/blockesp/ESPGroup.java | 8 +- .../modules/render/marker/BaseMarker.java | 2 - .../modules/render/marker/Sphere2dMarker.java | 2 + .../systems/modules/world/AirPlace.java | 12 +- .../systems/modules/world/AutoBrewer.java | 6 +- .../systems/modules/world/AutoSmelter.java | 2 +- .../systems/modules/world/EChestFarmer.java | 2 +- .../systems/modules/world/Nuker.java | 4 +- .../systems/modules/world/PacketMine.java | 4 +- .../systems/modules/world/SpawnProofer.java | 4 +- .../systems/modules/world/StashFinder.java | 2 +- .../systems/modules/world/VeinMiner.java | 8 +- .../systems/profiles/Profile.java | 1 - .../systems/profiles/Profiles.java | 3 +- .../meteorclient/systems/proxies/Proxy.java | 4 - .../systems/waypoints/Waypoints.java | 3 +- .../meteorclient/utils/ReflectInit.java | 18 +- .../meteorclient/utils/Utils.java | 101 +++---- .../utils/entity/DamageUtils.java | 21 +- .../utils/entity/EntityAttributeHelper.java | 98 ------- .../utils/entity/EntityUtils.java | 14 +- .../entity/ProjectileEntitySimulator.java | 7 +- .../utils/entity/StatusEffectHelper.java | 44 ---- .../utils/entity/TargetUtils.java | 5 +- .../effects/EffectAttributeModifier.java | 30 --- .../entity/effects/EntityEffectCache.java | 25 -- .../entity/effects/MutableParticleColor.java | 43 --- .../effects/StatusEffectBruteForce.java | 247 ------------------ .../entity/fakeplayer/FakePlayerEntity.java | 3 +- .../entity/fakeplayer/FakePlayerManager.java | 3 + .../meteorclient/utils/files/StreamUtils.java | 18 +- .../utils/json/UUIDSerializer.java | 23 -- .../meteorclient/utils/misc/CPSUtils.java | 3 + .../utils/misc/FakeClientPlayer.java | 9 +- .../utils/misc/MeteorStarscript.java | 31 +-- .../meteorclient/utils/misc/MyPotion.java | 7 +- .../meteorclient/utils/misc/Names.java | 11 +- .../meteorclient/utils/misc/NbtUtils.java | 3 + .../meteorclient/utils/misc/Pool.java | 2 +- .../meteorclient/utils/misc/input/Input.java | 3 + .../utils/misc/input/KeyAction.java | 8 +- .../utils/misc/input/KeyBinds.java | 3 + .../utils/misc/text/ColoredText.java | 32 +-- .../utils/misc/text/RunnableClickEvent.java | 19 ++ .../misc/text/StringCharacterVisitor.java | 20 -- .../utils/misc/text/TextUtils.java | 19 +- .../meteorclient/utils/network/Capes.java | 3 + .../utils/network/MeteorExecutor.java | 3 + .../utils/network/OnlinePlayers.java | 3 + .../utils/network/PacketUtils.java | 69 +++-- .../utils/network/PacketUtilsUtil.java | 17 +- .../meteorclient/utils/player/ChatUtils.java | 43 +-- .../utils/player/EChestMemory.java | 3 + .../utils/player/FindItemResult.java | 2 +- .../meteorclient/utils/player/InvUtils.java | 10 +- .../utils/player/InventorySorter.java | 10 +- .../meteorclient/utils/player/PathFinder.java | 4 +- .../utils/player/PlayerUtils.java | 8 +- .../meteorclient/utils/player/Rotations.java | 3 + .../meteorclient/utils/player/SlotUtils.java | 9 +- .../utils/player/TitleScreenCredits.java | 5 +- .../meteorclient/utils/render/FontUtils.java | 2 + .../utils/render/NametagUtils.java | 30 ++- .../utils/render/PlayerHeadUtils.java | 3 + .../utils/render/RenderUtils.java | 3 + .../utils/render/SimpleBlockRenderer.java | 3 + .../utils/render/WireframeEntityRenderer.java | 5 +- .../utils/render/color/RainbowColors.java | 3 + .../postprocess/PostProcessShaders.java | 3 + .../utils/tooltip/BannerTooltipComponent.java | 8 +- .../utils/tooltip/MapTooltipComponent.java | 5 +- .../utils/world/BlockEntityIterator.java | 2 +- .../utils/world/BlockIterator.java | 3 + .../meteorclient/utils/world/BlockUtils.java | 3 + .../meteorclient/utils/world/Dir.java | 3 + .../meteorclient/utils/world/TickRate.java | 2 +- src/main/resources/fabric.mod.json | 6 +- .../meteor-client-baritone.mixins.json | 2 +- .../meteor-client-canvas.mixins.json | 2 +- .../meteor-client-indigo.mixins.json | 2 +- .../meteor-client-indium.mixins.json | 2 +- .../meteor-client-lithium.mixins.json | 2 +- .../meteor-client-sodium.mixins.json | 2 +- .../resources/meteor-client.accesswidener | 4 +- src/main/resources/meteor-client.mixins.json | 8 +- 315 files changed, 1610 insertions(+), 2018 deletions(-) delete mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/AttributeContainerMixin.java delete mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/CustomPayloadS2CPacketMixin.java delete mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/EntityAttributeInstanceMixin.java create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/EntityEffectParticleEffectAccessor.java delete mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/ShulkerEntityAccessor.java create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/StatusEffectAccessor.java delete mode 100644 src/main/java/meteordevelopment/meteorclient/mixininterface/IAttributeContainer.java delete mode 100644 src/main/java/meteordevelopment/meteorclient/mixininterface/IEntityAttributeInstance.java delete mode 100644 src/main/java/meteordevelopment/meteorclient/utils/entity/EntityAttributeHelper.java delete mode 100644 src/main/java/meteordevelopment/meteorclient/utils/entity/StatusEffectHelper.java delete mode 100644 src/main/java/meteordevelopment/meteorclient/utils/entity/effects/EffectAttributeModifier.java delete mode 100644 src/main/java/meteordevelopment/meteorclient/utils/entity/effects/EntityEffectCache.java delete mode 100644 src/main/java/meteordevelopment/meteorclient/utils/entity/effects/MutableParticleColor.java delete mode 100644 src/main/java/meteordevelopment/meteorclient/utils/entity/effects/StatusEffectBruteForce.java delete mode 100644 src/main/java/meteordevelopment/meteorclient/utils/json/UUIDSerializer.java create mode 100644 src/main/java/meteordevelopment/meteorclient/utils/misc/text/RunnableClickEvent.java delete mode 100644 src/main/java/meteordevelopment/meteorclient/utils/misc/text/StringCharacterVisitor.java diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e46c243250..cb93b5771e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -18,7 +18,7 @@ jobs: - uses: actions/setup-java@v3 with: distribution: 'temurin' - java-version: '17' + java-version: '21' - run: chmod +x gradlew diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index fef4f28e2a..1501207e77 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -13,7 +13,7 @@ jobs: - uses: actions/setup-java@v3 with: distribution: 'temurin' - java-version: '17' + java-version: '21' - run: chmod +x gradlew diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 47b6be3582..930da1ca31 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -11,7 +11,7 @@ jobs: - uses: actions/setup-java@v3 with: distribution: 'temurin' - java-version: '17' + java-version: '21' - run: chmod +x gradlew diff --git a/build.gradle b/build.gradle index 7e84894083..97453581de 100644 --- a/build.gradle +++ b/build.gradle @@ -1,12 +1,14 @@ plugins { - id "fabric-loom" version "1.5-SNAPSHOT" + id "fabric-loom" version "1.6-SNAPSHOT" id "maven-publish" id "com.github.johnrengelman.shadow" version "8.1.1" } -archivesBaseName = project.archives_base_name -version = project.mod_version + (project.hasProperty("devbuild") ? ("-" + project.findProperty("devbuild")) : "") -group = project.maven_group +base { + archivesBaseName = project.archives_base_name + version = project.mod_version + (project.hasProperty("devbuild") ? ("-" + project.findProperty("devbuild")) : "") + group = project.maven_group +} repositories { maven { @@ -83,61 +85,67 @@ afterEvaluate { } } -shadowJar { - configurations = [project.configurations.shadow] - - dependencies { - exclude { - it.moduleGroup == "org.slf4j" +tasks { + processResources { + def propertyMap = [ + "version" : project.version, + "devbuild" : project.findProperty("devbuild") ?: "", + "commit" : project.findProperty("commit") ?: "", + "minecraft_version": project.minecraft_version, + "loader_version" : project.loader_version + ] + + inputs.properties(propertyMap) + filesMatching("fabric.mod.json") { + expand(propertyMap) } } -} -processResources { - def propertyMap = [ - "version" : project.version, - "devbuild" : project.findProperty("devbuild") ?: "", - "commit" : project.findProperty("commit") ?: "", - "minecraft_version": project.minecraft_version, - "loader_version" : project.loader_version - ] - - inputs.properties(propertyMap) - filesMatching("fabric.mod.json") { - expand(propertyMap) - } -} + jar { + from("LICENSE") { + rename { "${it}_${project.base.archivesBaseName}" } + } -jar { - from("LICENSE") { - rename { "${it}_${archivesBaseName}" } + manifest { + attributes("Main-Class": "meteordevelopment.meteorclient.Main") + } } - manifest { - attributes("Main-Class": "meteordevelopment.meteorclient.Main") + java { + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 + + withSourcesJar() + withJavadocJar() } -} -java { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 + shadowJar { + configurations = [project.configurations.shadow] - withSourcesJar() - withJavadocJar() -} + from("LICENSE") { + rename { "${it}_${project.base.archivesBaseName}" } + } -remapJar { - dependsOn shadowJar - inputFile.set(shadowJar.archiveFile) -} + dependencies { + exclude { + it.moduleGroup == "org.slf4j" + } + } + } -javadoc { - options.addStringOption("Xdoclint:none", "-quiet") - options.encoding = "UTF-8" -} + remapJar { + dependsOn shadowJar + inputFile.set(shadowJar.archiveFile) + } -build { - dependsOn javadocJar + javadoc { + options.addStringOption("Xdoclint:none", "-quiet") + options.encoding = "UTF-8" + } + + build { + dependsOn javadocJar + } } publishing { diff --git a/gradle.properties b/gradle.properties index eb5488c15f..cad87af402 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,10 +1,10 @@ org.gradle.jvmargs=-Xmx2G # Fabric (https://fabricmc.net/develop) -minecraft_version=1.20.4 -yarn_mappings=1.20.4+build.3 -loader_version=0.15.2 -fapi_version=0.95.3+1.20.4 +minecraft_version=1.20.6 +yarn_mappings=1.20.6+build.1 +loader_version=0.15.10 +fapi_version=0.97.8+1.20.6 # Mod Properties mod_version=0.5.7 @@ -17,16 +17,16 @@ archives_base_name=meteor-client baritone_version=1.20.4 # Sodium (https://github.com/CaffeineMC/sodium-fabric) -sodium_version=mc1.20.3-0.5.7 +sodium_version=mc1.20.6-0.5.8 # Lithium (https://github.com/CaffeineMC/lithium-fabric) -lithium_version=mc1.20.4-0.12.1 +lithium_version=mc1.20.6-0.12.3 # Iris (https://github.com/IrisShaders/Iris) -iris_version=1.6.14+1.20.4 +iris_version=1.7.0+1.20.6 # Indium (https://github.com/comp500/Indium) -indium_version=1.0.28+mc1.20.4 +indium_version=1.0.30+mc1.20.4 # Orbit (https://github.com/MeteorDevelopment/orbit) orbit_version=0.2.4 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index c1962a79e29d3e0ab67b14947c167a862655af9b..d64cd4917707c1f8861d8cb53dd15194d4248596 100644 GIT binary patch literal 43462 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 literal 62076 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a595206642..48c0a02ca4 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index aeb74cbb43..1aa94a4269 100755 --- a/gradlew +++ b/gradlew @@ -83,7 +83,8 @@ done # This is normally unused # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -130,10 +131,13 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. @@ -141,7 +145,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -149,7 +153,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -198,11 +202,11 @@ fi # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ diff --git a/gradlew.bat b/gradlew.bat index 93e3f59f13..6689b85bee 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,92 +1,92 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%"=="" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%"=="" set DIRNAME=. -@rem This is normally unused -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if %ERRORLEVEL% equ 0 goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/launch/src/main/java/meteordevelopment/meteorclient/Main.java b/launch/src/main/java/meteordevelopment/meteorclient/Main.java index b58a11a321..868c666f68 100644 --- a/launch/src/main/java/meteordevelopment/meteorclient/Main.java +++ b/launch/src/main/java/meteordevelopment/meteorclient/Main.java @@ -9,6 +9,8 @@ import java.io.File; import java.io.IOException; import java.net.MalformedURLException; +import java.net.URI; +import java.net.URISyntaxException; import java.net.URL; import java.util.Locale; @@ -83,8 +85,8 @@ public void open(URL url) { public void open(String url) { try { - open(new URL(url)); - } catch (MalformedURLException e) { + open(new URI(url).toURL()); + } catch (URISyntaxException | MalformedURLException e) { e.printStackTrace(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/MeteorClient.java b/src/main/java/meteordevelopment/meteorclient/MeteorClient.java index 519c61767b..27507f9e0f 100644 --- a/src/main/java/meteordevelopment/meteorclient/MeteorClient.java +++ b/src/main/java/meteordevelopment/meteorclient/MeteorClient.java @@ -163,7 +163,7 @@ private void onMouseButton(MouseButtonEvent event) { private void toggleGui() { if (Utils.canCloseGui()) mc.currentScreen.close(); - else if (Utils.canOpenGui()) Tabs.get().get(0).openScreen(GuiThemes.get()); + else if (Utils.canOpenGui()) Tabs.get().getFirst().openScreen(GuiThemes.get()); } // Hide HUD diff --git a/src/main/java/meteordevelopment/meteorclient/commands/arguments/CompoundNbtTagArgumentType.java b/src/main/java/meteordevelopment/meteorclient/commands/arguments/CompoundNbtTagArgumentType.java index 4a36a93677..23d761922d 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/arguments/CompoundNbtTagArgumentType.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/arguments/CompoundNbtTagArgumentType.java @@ -12,14 +12,14 @@ import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.StringNbtReader; -import java.util.Arrays; import java.util.Collection; +import java.util.List; import static net.minecraft.nbt.StringNbtReader.EXPECTED_VALUE; public class CompoundNbtTagArgumentType implements ArgumentType { private static final CompoundNbtTagArgumentType INSTANCE = new CompoundNbtTagArgumentType(); - private static final Collection EXAMPLES = Arrays.asList("{foo:bar}", "{foo:[aa, bb],bar:15}"); + private static final Collection EXAMPLES = List.of("{foo:bar}", "{foo:[aa, bb],bar:15}"); public static CompoundNbtTagArgumentType create() { return INSTANCE; @@ -53,8 +53,8 @@ else if (reader.peek() == '}') { reader.expect('}'); b.append('}'); return StringNbtReader.parse(b.toString() - .replace("$", "\u00a7") - .replace("\u00a7\u00a7", "$") + .replace("$", "§") + .replace("§§", "$") ); } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java index 4a06db080b..d58aed7a2f 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java @@ -45,12 +45,12 @@ private MutableText getCommandText(Command command) { tooltip.append(Text.literal(Utils.nameToTitle(command.getName())).formatted(Formatting.BLUE, Formatting.BOLD)).append("\n"); MutableText aliases = Text.literal(Config.get().prefix.get() + command.getName()); - if (command.getAliases().size() > 0) { + if (!command.getAliases().isEmpty()) { aliases.append(", "); for (String alias : command.getAliases()) { if (alias.isEmpty()) continue; aliases.append(Config.get().prefix.get() + alias); - if (!alias.equals(command.getAliases().get(command.getAliases().size() - 1))) aliases.append(", "); + if (!alias.equals(command.getAliases().getLast())) aliases.append(", "); } } tooltip.append(aliases.formatted(Formatting.GRAY)).append("\n\n"); @@ -59,7 +59,7 @@ private MutableText getCommandText(Command command) { // Text MutableText text = Text.literal(Utils.nameToTitle(command.getName())); - if (command != Commands.COMMANDS.get(Commands.COMMANDS.size() - 1)) + if (command != Commands.COMMANDS.getLast()) text.append(Text.literal(", ").formatted(Formatting.GRAY)); text.setStyle(text .getStyle() diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/DisconnectCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/DisconnectCommand.java index 227ac3ae77..f87c0ff178 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/DisconnectCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/DisconnectCommand.java @@ -5,12 +5,9 @@ package meteordevelopment.meteorclient.commands.commands; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.brigadier.arguments.ArgumentType; import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import meteordevelopment.meteorclient.commands.Command; -import net.minecraft.client.gui.screen.DisconnectedScreen; import net.minecraft.command.CommandSource; import net.minecraft.network.packet.s2c.common.DisconnectS2CPacket; import net.minecraft.text.Text; diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/EnchantCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/EnchantCommand.java index c667d4c398..f8b981b22a 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/EnchantCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/EnchantCommand.java @@ -14,7 +14,7 @@ import meteordevelopment.meteorclient.utils.Utils; import net.minecraft.client.gui.screen.ingame.InventoryScreen; import net.minecraft.command.CommandSource; -import net.minecraft.command.argument.RegistryEntryArgumentType; +import net.minecraft.command.argument.RegistryEntryReferenceArgumentType; import net.minecraft.enchantment.Enchantment; import net.minecraft.item.ItemStack; import net.minecraft.registry.Registries; @@ -22,14 +22,14 @@ import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.text.Text; -import java.util.function.Function; +import java.util.function.ToIntFunction; import static com.mojang.brigadier.Command.SINGLE_SUCCESS; import static meteordevelopment.meteorclient.MeteorClient.mc; public class EnchantCommand 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 NOT_HOLDING_ITEM = new SimpleCommandExceptionType(Text.literal("You need to hold some item to enchant.")); + 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.")); public EnchantCommand() { super("enchant", "Enchants the item in your hand. REQUIRES Creative mode."); @@ -37,7 +37,7 @@ public EnchantCommand() { @Override public void build(LiteralArgumentBuilder builder) { - builder.then(literal("one").then(argument("enchantment", RegistryEntryArgumentType.registryEntry(REGISTRY_ACCESS, RegistryKeys.ENCHANTMENT)) + builder.then(literal("one").then(argument("enchantment", RegistryEntryReferenceArgumentType.registryEntry(REGISTRY_ACCESS, RegistryKeys.ENCHANTMENT)) .then(literal("level").then(argument("level", IntegerArgumentType.integer()).executes(context -> { one(context, enchantment -> context.getArgument("level", Integer.class)); return SINGLE_SUCCESS; @@ -78,7 +78,7 @@ public void build(LiteralArgumentBuilder builder) { return SINGLE_SUCCESS; })); - builder.then(literal("remove").then(argument("enchantment", RegistryEntryArgumentType.registryEntry(REGISTRY_ACCESS, RegistryKeys.ENCHANTMENT)).executes(context -> { + builder.then(literal("remove").then(argument("enchantment", RegistryEntryReferenceArgumentType.registryEntry(REGISTRY_ACCESS, RegistryKeys.ENCHANTMENT)).executes(context -> { ItemStack itemStack = tryGetItemStack(); RegistryEntry.Reference enchantment = context.getArgument("enchantment", RegistryEntry.Reference.class); Utils.removeEnchantment(itemStack, enchantment.value()); @@ -88,21 +88,21 @@ public void build(LiteralArgumentBuilder builder) { }))); } - private void one(CommandContext context, Function level) throws CommandSyntaxException { + private void one(CommandContext context, ToIntFunction level) throws CommandSyntaxException { ItemStack itemStack = tryGetItemStack(); RegistryEntry.Reference enchantment = context.getArgument("enchantment", RegistryEntry.Reference.class); - Utils.addEnchantment(itemStack, enchantment.value(), level.apply(enchantment.value())); + Utils.addEnchantment(itemStack, enchantment.value(), level.applyAsInt(enchantment.value())); syncItem(); } - private void all(boolean onlyPossible, Function level) throws CommandSyntaxException { + private void all(boolean onlyPossible, ToIntFunction level) throws CommandSyntaxException { ItemStack itemStack = tryGetItemStack(); for (Enchantment enchantment : Registries.ENCHANTMENT) { if (!onlyPossible || enchantment.isAcceptableItem(itemStack)) { - Utils.addEnchantment(itemStack, enchantment, level.apply(enchantment)); + Utils.addEnchantment(itemStack, enchantment, level.applyAsInt(enchantment)); } } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/LocateCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/LocateCommand.java index fbddc68791..82892f461f 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/LocateCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/LocateCommand.java @@ -18,12 +18,14 @@ 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.nbt.NbtCompound; -import net.minecraft.nbt.NbtList; import net.minecraft.network.packet.s2c.play.EntitySpawnS2CPacket; import net.minecraft.network.packet.s2c.play.PlaySoundS2CPacket; import net.minecraft.sound.SoundEvents; @@ -31,8 +33,9 @@ import net.minecraft.text.Text; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; +import org.jetbrains.annotations.Nullable; -import java.util.Arrays; import java.util.List; import static com.mojang.brigadier.Command.SINGLE_SUCCESS; @@ -44,104 +47,141 @@ public class LocateCommand extends Command { private Vec3d secondStart; private Vec3d secondEnd; - private final List netherFortressBlocks = Arrays.asList( + private final List netherFortressBlocks = List.of( Blocks.NETHER_BRICKS, Blocks.NETHER_BRICK_FENCE, Blocks.NETHER_WART ); - private final List monumentBlocks = Arrays.asList( + private final List monumentBlocks = List.of( Blocks.PRISMARINE_BRICKS, Blocks.SEA_LANTERN, Blocks.DARK_PRISMARINE ); - private final List strongholdBlocks = Arrays.asList( + private final List strongholdBlocks = List.of( Blocks.END_PORTAL_FRAME ); + private final List endCityBlocks = List.of( + Blocks.PURPUR_BLOCK, + Blocks.PURPUR_PILLAR, + Blocks.PURPUR_SLAB, + Blocks.PURPUR_STAIRS, + Blocks.END_STONE_BRICKS, + Blocks.END_ROD + ); + public LocateCommand() { super("locate", "Locates structures", "loc"); } @Override public void build(LiteralArgumentBuilder builder) { + // Overworld structures + builder.then(literal("buried_treasure").executes(s -> { ItemStack stack = mc.player.getInventory().getMainHandStack(); - if (stack.getItem() != Items.FILLED_MAP) { - error("You need to hold a treasure map first"); + 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())) { + error("You need to hold a (highlight)buried treasure map(default)!"); return SINGLE_SUCCESS; } - NbtCompound tag = stack.getNbt(); - NbtList nbt1 = (NbtList) tag.get("Decorations"); - if (nbt1 == null) { - error("Couldn't locate the cross. Are you holding a (highlight)treasure map(default)?"); + + MapDecorationsComponent mapDecorationsComponent = stack.get(DataComponentTypes.MAP_DECORATIONS); + if (mapDecorationsComponent == null) { + error("Couldn't locate the map icons!"); return SINGLE_SUCCESS; } - NbtCompound iconNBT = nbt1.getCompound(0); - if (iconNBT == null) { - error("Couldn't locate the cross. Are you holding a (highlight)treasure map(default)?"); - return SINGLE_SUCCESS; + for (MapDecorationsComponent.Decoration 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 "); + text.append(ChatUtils.formatCoords(coords)); + text.append("."); + info(text); + return SINGLE_SUCCESS; + } } - Vec3d coords = new Vec3d(iconNBT.getDouble("x"), iconNBT.getDouble("y"), iconNBT.getDouble("z")); - MutableText text = Text.literal("Buried Treasure located at "); - text.append(ChatUtils.formatCoords(coords)); - text.append("."); - info(text); + error("Couldn't locate the buried treasure!"); return SINGLE_SUCCESS; })); - builder.then(literal("lodestone").executes(s -> { + builder.then(literal("mansion").executes(s -> { ItemStack stack = mc.player.getInventory().getMainHandStack(); - if (stack.getItem() != Items.COMPASS) { - error("You need to hold a lodestone compass"); + 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())) { + error("You need to hold a (highlight)woodland explorer map(default)!"); return SINGLE_SUCCESS; } - NbtCompound tag = stack.getNbt(); - if (tag == null) { - error("Couldn't get the NBT data. Are you holding a (highlight)lodestone(default) compass?"); + + MapDecorationsComponent mapDecorationsComponent = stack.get(DataComponentTypes.MAP_DECORATIONS); + if (mapDecorationsComponent == null) { + error("Couldn't locate the map icons!"); return SINGLE_SUCCESS; } - NbtCompound nbt1 = tag.getCompound("LodestonePos"); - if (nbt1 == null) { - error("Couldn't get the NBT data. Are you holding a (highlight)lodestone(default) compass?"); - return SINGLE_SUCCESS; + + for (MapDecorationsComponent.Decoration 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 "); + text.append(ChatUtils.formatCoords(coords)); + text.append("."); + info(text); + return SINGLE_SUCCESS; + } } - Vec3d coords = new Vec3d(nbt1.getDouble("X"), nbt1.getDouble("Y"), nbt1.getDouble("Z")); - MutableText text = Text.literal("Lodestone located at "); - text.append(ChatUtils.formatCoords(coords)); - text.append("."); - info(text); + error("Couldn't locate the mansion!"); return SINGLE_SUCCESS; })); - builder.then(literal("mansion").executes(s -> { + builder.then(literal("monument").executes(s -> { ItemStack stack = mc.player.getInventory().getMainHandStack(); - if (stack.getItem() != Items.FILLED_MAP) { - error("You need to hold a woodland explorer map first"); - return SINGLE_SUCCESS; - } - NbtCompound tag = stack.getNbt(); - NbtList nbt1 = (NbtList) tag.get("Decorations"); - if (nbt1 == null) { - error("Couldn't locate the mansion. Are you holding a (highlight)woodland explorer map(default)?"); + 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())) { + + MapDecorationsComponent mapDecorationsComponent = stack.get(DataComponentTypes.MAP_DECORATIONS); + if (mapDecorationsComponent == null) { + error("Couldn't locate the map icons!"); + return SINGLE_SUCCESS; + } + + for (MapDecorationsComponent.Decoration 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 "); + text.append(ChatUtils.formatCoords(coords)); + text.append("."); + info(text); + return SINGLE_SUCCESS; + } + } + + error("Couldn't locate the monument!"); return SINGLE_SUCCESS; } - NbtCompound iconNBT = nbt1.getCompound(0); - if (iconNBT == null) { - error("Couldn't locate the mansion. Are you holding a (highlight)woodland explorer map(default)?"); + // If the player is not holding a valid map, try to locate the monument using Baritone + if (BaritoneUtils.IS_AVAILABLE) { + Vec3d 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 "); + text.append(ChatUtils.formatCoords(coords)); + text.append("."); + info(text); return SINGLE_SUCCESS; } - Vec3d coords = new Vec3d(iconNBT.getDouble("x"), iconNBT.getDouble("y"), iconNBT.getDouble("z")); - MutableText text = Text.literal("Mansion located at "); - text.append(ChatUtils.formatCoords(coords)); - text.append("."); - info(text); + error("Locating this structure without an (highlight)ocean explorer map(default) requires Baritone."); return SINGLE_SUCCESS; })); @@ -154,7 +194,7 @@ public void build(LiteralArgumentBuilder builder) { boolean foundEye = InvUtils.testInHotbar(Items.ENDER_EYE); if (foundEye) { - PathManagers.get().follow(entity -> entity instanceof EyeOfEnderEntity); + PathManagers.get().follow(EyeOfEnderEntity.class::isInstance); firstStart = null; firstEnd = null; secondStart = null; @@ -175,7 +215,14 @@ public void build(LiteralArgumentBuilder builder) { return SINGLE_SUCCESS; })); + // Nether structures + builder.then(literal("nether_fortress").executes(s -> { + if (mc.world.getRegistryKey() != World.NETHER) { + error("You need to be in the nether to locate a nether fortress."); + return SINGLE_SUCCESS; + } + if (!BaritoneUtils.IS_AVAILABLE) { error("Locating this structure requires Baritone."); return SINGLE_SUCCESS; @@ -193,36 +240,57 @@ public void build(LiteralArgumentBuilder builder) { return SINGLE_SUCCESS; })); - builder.then(literal("monument").executes(s -> { + // End structures + + builder.then(literal("end_city").executes(s -> { + if (mc.world.getRegistryKey() != World.END) { + error("You need to be in the end to locate an end city."); + return SINGLE_SUCCESS; + } + if (!BaritoneUtils.IS_AVAILABLE) { error("Locating this structure requires Baritone."); return SINGLE_SUCCESS; } + Vec3d coords = findByBlockList(endCityBlocks); + if (coords == null) { + error("No end city found."); + return SINGLE_SUCCESS; + } + MutableText text = Text.literal("End city located at "); + text.append(ChatUtils.formatCoords(coords)); + text.append("."); + info(text); + return SINGLE_SUCCESS; + })); + + // Misc structures + + builder.then(literal("lodestone").executes(s -> { ItemStack stack = mc.player.getInventory().getMainHandStack(); - if (stack.getItem() == Items.FILLED_MAP) { - NbtCompound tag = stack.getNbt(); - if (tag != null) { - NbtList nbt1 = (NbtList) tag.get("Decorations"); - if (nbt1 != null) { - NbtCompound iconNBT = nbt1.getCompound(0); - if (iconNBT != null) { - Vec3d coords = new Vec3d(iconNBT.getDouble("x"), iconNBT.getDouble("y"), iconNBT.getDouble("z")); - MutableText text = Text.literal("Monument located at "); - text.append(ChatUtils.formatCoords(coords)); - text.append("."); - info(text); - return SINGLE_SUCCESS; - } - } - } + if (stack.getItem() != Items.COMPASS) { + error("You need to hold a (highlight)lodestone(default) compass!"); + return SINGLE_SUCCESS; } - Vec3d coords = findByBlockList(monumentBlocks); - if (coords == null) { - error("No monument found. You can try using a (highlight)Ocean explorer map(default) for more success."); + ComponentMap components = stack.getComponents(); + if (components == null) { + error("Couldn't get the components data. Are you holding a (highlight)lodestone(default) compass?"); return SINGLE_SUCCESS; } - MutableText text = Text.literal("Monument located at "); + LodestoneTrackerComponent lodestoneTrackerComponent = components.get(DataComponentTypes.LODESTONE_TRACKER); + if (lodestoneTrackerComponent == null) { + error("Couldn't get the components data. Are you holding a (highlight)lodestone(default) compass?"); + return SINGLE_SUCCESS; + } + + if (lodestoneTrackerComponent.target().isEmpty()) { + error("Couldn't get the lodestone's target!"); + return SINGLE_SUCCESS; + } + + Vec3d coords = Vec3d.of(lodestoneTrackerComponent.target().get().pos()); + MutableText text = Text.literal("Lodestone located at "); text.append(ChatUtils.formatCoords(coords)); text.append("."); info(text); @@ -240,7 +308,7 @@ private void cancel() { MeteorClient.EVENT_BUS.unsubscribe(this); } - private Vec3d findByBlockList(List blockList) { + private @Nullable Vec3d findByBlockList(List blockList) { List posList = BaritoneAPI.getProvider().getWorldScanner().scanChunkRadius(BaritoneAPI.getProvider().getPrimaryBaritone().getPlayerContext(), blockList, 64, 10, 32); if (posList.isEmpty()) { return null; @@ -248,20 +316,17 @@ private Vec3d findByBlockList(List blockList) { if (posList.size() < 3) { warning("Only %d block(s) found. This search might be a false positive.", posList.size()); } - return new Vec3d(posList.get(0).getX(), posList.get(0).getY(), posList.get(0).getZ()); + return new Vec3d(posList.getFirst().getX(), posList.getFirst().getY(), posList.getFirst().getZ()); } @EventHandler private void onReadPacket(PacketEvent.Receive event) { - if (event.packet instanceof EntitySpawnS2CPacket packet) { - if (packet.getEntityType() == EntityType.EYE_OF_ENDER) { - firstPosition(packet.getX(), packet.getY(), packet.getZ()); - } + if (event.packet instanceof EntitySpawnS2CPacket packet && packet.getEntityType() == EntityType.EYE_OF_ENDER) { + firstPosition(packet.getX(), packet.getY(), packet.getZ()); } - if (event.packet instanceof PlaySoundS2CPacket packet) { - if (packet.getSound().value() == SoundEvents.ENTITY_ENDER_EYE_DEATH) { - lastPosition(packet.getX(), packet.getY(), packet.getZ()); - } + + if (event.packet instanceof PlaySoundS2CPacket packet && packet.getSound().value() == SoundEvents.ENTITY_ENDER_EYE_DEATH) { + lastPosition(packet.getX(), packet.getY(), packet.getZ()); } } @@ -269,8 +334,7 @@ private void firstPosition(double x, double y, double z) { Vec3d pos = new Vec3d(x, y, z); if (this.firstStart == null) { this.firstStart = pos; - } - else { + } else { this.secondStart = pos; } } @@ -281,8 +345,7 @@ private void lastPosition(double x, double y, double z) { if (this.firstEnd == null) { this.firstEnd = pos; info("Please throw the second Eye Of Ender from a different location."); - } - else { + } else { this.secondEnd = pos; findStronghold(); } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ModulesCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ModulesCommand.java index a343199ebb..da7b3ad220 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ModulesCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ModulesCommand.java @@ -48,7 +48,7 @@ private MutableText getModuleText(Module module) { MutableText finalModule = Text.literal(module.title); if (!module.isActive()) finalModule.formatted(Formatting.GRAY); - if (!module.equals(Modules.get().getGroup(module.category).get(Modules.get().getGroup(module.category).size() - 1))) finalModule.append(Text.literal(", ").formatted(Formatting.GRAY)); + if (!module.equals(Modules.get().getGroup(module.category).getLast())) finalModule.append(Text.literal(", ").formatted(Formatting.GRAY)); finalModule.setStyle(finalModule.getStyle().withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, tooltip))); return finalModule; diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/NbtCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/NbtCommand.java index 2b8a8935de..9bbb3b39fd 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/NbtCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/NbtCommand.java @@ -14,9 +14,9 @@ import meteordevelopment.meteorclient.utils.misc.text.MeteorClickEvent; import net.minecraft.command.CommandSource; import net.minecraft.command.argument.NbtPathArgumentType; +import net.minecraft.component.ComponentMap; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtHelper; import net.minecraft.network.packet.c2s.play.CreativeInventoryActionC2SPacket; import net.minecraft.text.ClickEvent; import net.minecraft.text.HoverEvent; @@ -34,16 +34,23 @@ public NbtCommand() { @Override public void build(LiteralArgumentBuilder builder) { - builder.then(literal("add").then(argument("nbt", CompoundNbtTagArgumentType.create()).executes(s -> { + builder.executes(context -> { + error("This command is not yet updated for 1.20.5 and above!"); + return SINGLE_SUCCESS; + }); + + // TODO: Update using Components over NBT + /*builder.then(literal("add").then(argument("nbt", CompoundNbtTagArgumentType.create()).executes(s -> { ItemStack stack = mc.player.getInventory().getMainHandStack(); if (validBasic(stack)) { NbtCompound tag = CompoundNbtTagArgumentType.get(s); - NbtCompound source = stack.getOrCreateNbt(); if (tag != null) { - source.copyFrom(tag); - setStack(stack); + ItemStack newStack = ItemStack.fromNbtOrEmpty(mc.world.getRegistryManager(), tag); + newStack.applyComponentsFrom(stack.getComponents()); + + setStack(newStack); } else { error("Some of the NBT data could not be found, try using: " + Config.get().prefix.get() + "nbt set {nbt}"); } @@ -56,7 +63,7 @@ public void build(LiteralArgumentBuilder builder) { ItemStack stack = mc.player.getInventory().getMainHandStack(); if (validBasic(stack)) { - stack.setNbt(CompoundNbtTagArgumentType.get(context)); + stack = ItemStack.fromNbtOrEmpty(mc.world.getRegistryManager(), CompoundNbtTagArgumentType.get(context)); setStack(stack); } @@ -68,7 +75,7 @@ public void build(LiteralArgumentBuilder builder) { if (validBasic(stack)) { NbtPathArgumentType.NbtPath path = context.getArgument("nbt_path", NbtPathArgumentType.NbtPath.class); - path.remove(stack.getNbt()); + path.remove(stack.encode(mc.world.getRegistryManager())); } return SINGLE_SUCCESS; @@ -80,25 +87,25 @@ public void build(LiteralArgumentBuilder builder) { if (stack == null) { error("You must hold an item in your main hand."); } else { - NbtCompound tag = stack.getNbt(); + ComponentMap components = stack.getComponents(); MutableText copyButton = Text.literal("NBT"); copyButton.setStyle(copyButton.getStyle() - .withFormatting(Formatting.UNDERLINE) - .withClickEvent(new MeteorClickEvent( - ClickEvent.Action.RUN_COMMAND, - this.toString("copy") - )) - .withHoverEvent(new HoverEvent( - HoverEvent.Action.SHOW_TEXT, - Text.literal("Copy the NBT data to your clipboard.") - ))); + .withFormatting(Formatting.UNDERLINE) + .withClickEvent(new MeteorClickEvent( + ClickEvent.Action.RUN_COMMAND, + this.toString("copy") + )) + .withHoverEvent(new HoverEvent( + HoverEvent.Action.SHOW_TEXT, + Text.literal("Copy the NBT data to your clipboard.") + ))); MutableText text = Text.literal(""); text.append(copyButton); - if (tag == null) text.append("{}"); - else text.append(" ").append(NbtHelper.toPrettyPrintedText(tag)); + if (components == null) text.append("{}"); + else text.append(" ").append(Text.of(components.toString())); info(text); } @@ -112,15 +119,15 @@ public void build(LiteralArgumentBuilder builder) { if (stack == null) { error("You must hold an item in your main hand."); } else { - NbtCompound tag = stack.getOrCreateNbt(); - mc.keyboard.setClipboard(tag.toString()); + ComponentMap components = stack.getComponents(); + mc.keyboard.setClipboard(components.toString()); MutableText nbt = Text.literal("NBT"); nbt.setStyle(nbt.getStyle() - .withFormatting(Formatting.UNDERLINE) - .withHoverEvent(new HoverEvent( - HoverEvent.Action.SHOW_TEXT, - NbtHelper.toPrettyPrintedText(tag) - ))); + .withFormatting(Formatting.UNDERLINE) + .withHoverEvent(new HoverEvent( + HoverEvent.Action.SHOW_TEXT, + Text.of(components.toString()) + ))); MutableText text = Text.literal(""); text.append(nbt); @@ -136,7 +143,10 @@ public void build(LiteralArgumentBuilder builder) { ItemStack stack = mc.player.getInventory().getMainHandStack(); if (validBasic(stack)) { - stack.setNbt(CompoundNbtTagArgumentType.create().parse(new StringReader(mc.keyboard.getClipboard()))); + NbtCompound nbt = CompoundNbtTagArgumentType.create().parse(new StringReader(mc.keyboard.getClipboard())); + + stack = ItemStack.fromNbtOrEmpty(mc.world.getRegistryManager(), nbt); + setStack(stack); } @@ -150,11 +160,11 @@ public void build(LiteralArgumentBuilder builder) { int count = IntegerArgumentType.getInteger(context, "count"); stack.setCount(count); setStack(stack); - info("Set mainhand stack count to %s.",count); + info("Set mainhand stack count to %s.", count); } return SINGLE_SUCCESS; - }))); + })));*/ } private void setStack(ItemStack stack) { diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/NotebotCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/NotebotCommand.java index 3f226bb9ec..f506ec017b 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/NotebotCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/NotebotCommand.java @@ -157,7 +157,7 @@ private void onReadPacket(PacketEvent.Receive event) { } private void saveRecording(Path path) { - if (song.size() < 1) { + if (song.isEmpty()) { MeteorClient.EVENT_BUS.unsubscribe(this); return; } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/SaveMapCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/SaveMapCommand.java index e1dfdc29ab..75d71a301c 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/SaveMapCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/SaveMapCommand.java @@ -12,11 +12,14 @@ import meteordevelopment.meteorclient.mixin.MapRendererAccessor; import net.minecraft.client.render.MapRenderer; 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 org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.lwjgl.BufferUtils; import org.lwjgl.PointerBuffer; import org.lwjgl.system.MemoryUtil; @@ -79,11 +82,11 @@ public void build(LiteralArgumentBuilder builder) { })); } - private void saveMap(ItemStack map, MapState state, String path, int scale) { + private void saveMap(@NotNull ItemStack map, MapState state, String path, int scale) { //this is horrible code but it somehow works MapRenderer mapRenderer = mc.gameRenderer.getMapRenderer(); - MapRenderer.MapTexture texture = ((MapRendererAccessor) mapRenderer).invokeGetMapTexture(FilledMapItem.getMapId(map), state); + MapRenderer.MapTexture texture = ((MapRendererAccessor) mapRenderer).invokeGetMapTexture(map.get(DataComponentTypes.MAP_ID), state); int[] data = texture.texture.getImage().makePixelArray(); BufferedImage image = new BufferedImage(128, 128, 2); @@ -104,17 +107,14 @@ private void saveMap(ItemStack map, MapState state, String path, int scale) { } } - private MapState getMapState() { + private @Nullable MapState getMapState() { ItemStack map = getMap(); if (map == null) return null; - MapState state = FilledMapItem.getMapState(FilledMapItem.getMapId(map), mc.world); - if (state == null) return null; - - return state; + return FilledMapItem.getMapState(map.get(DataComponentTypes.MAP_ID), mc.world); } - private String getPath() { + private @Nullable String getPath() { String path = TinyFileDialogs.tinyfd_saveFileDialog("Save image", null, filters, null); if (path == null) return null; if (!path.endsWith(".png")) path += ".png"; @@ -122,7 +122,7 @@ private String getPath() { return path; } - private ItemStack getMap() { + private @Nullable ItemStack getMap() { ItemStack itemStack = mc.player.getMainHandStack(); if (itemStack.getItem() == Items.FILLED_MAP) return itemStack; diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java index a43077b949..0bb768307f 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java @@ -23,7 +23,6 @@ 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.registry.RegistryWrapper; import net.minecraft.server.integrated.IntegratedServer; import net.minecraft.text.ClickEvent; import net.minecraft.text.HoverEvent; @@ -35,16 +34,16 @@ import java.net.InetAddress; import java.net.UnknownHostException; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.Random; +import java.util.Set; import static com.mojang.brigadier.Command.SINGLE_SUCCESS; import static meteordevelopment.meteorclient.MeteorClient.mc; public class ServerCommand extends Command { - private static final List ANTICHEAT_LIST = Arrays.asList("nocheatplus", "negativity", "warden", "horizon", "illegalstack", "coreprotect", "exploitsx", "vulcan", "abc", "spartan", "kauri", "anticheatreloaded", "witherac", "godseye", "matrix", "wraith", "antixrayheuristics", "grimac"); - private static final String[] VERSION_ALIASES = {"version", "ver", "about", "bukkit:version", "bukkit:ver", "bukkit:about"}; // aliases for bukkit:version + private static final Set ANTICHEAT_LIST = Set.of("nocheatplus", "negativity", "warden", "horizon", "illegalstack", "coreprotect", "exploitsx", "vulcan", "abc", "spartan", "kauri", "anticheatreloaded", "witherac", "godseye", "matrix", "wraith", "antixrayheuristics", "grimac"); + private static final Set VERSION_ALIASES = Set.of("version", "ver", "about", "bukkit:version", "bukkit:ver", "bukkit:about"); // aliases for bukkit:version private String alias; private int ticks = 0; private boolean tick = false; @@ -228,23 +227,21 @@ private void onReadPacket(PacketEvent.Receive event) { // 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.packetListener; + ClientPlayNetworkHandlerAccessor handler = (ClientPlayNetworkHandlerAccessor) 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((RegistryWrapper.WrapperLookup) handler.getCombinedDynamicRegistries(), handler.getEnabledFeatures())).getChildren().forEach(node -> { + packet.getCommandTree(CommandRegistryAccess.of(handler.getCombinedDynamicRegistries(), handler.getEnabledFeatures())).getChildren().forEach(node -> { String[] split = node.getName().split(":"); if (split.length > 1) { if (!commandTreePlugins.contains(split[0])) commandTreePlugins.add(split[0]); } // checking if any of the bukkit:version commands are available, which we can also grab plugins from - if (alias == null) { - for (String a : VERSION_ALIASES) { - if (node.getName().equals(a)) alias = a; - } + if (alias == null && VERSION_ALIASES.contains(node.getName())) { + alias = node.getName(); } }); @@ -256,7 +253,7 @@ private void onReadPacket(PacketEvent.Receive event) { if (event.packet instanceof CommandSuggestionsS2CPacket packet) { Suggestions matches = packet.getSuggestions(); - if (matches == null) { + if (matches.isEmpty()) { error("An error occurred while trying to find plugins."); return; } diff --git a/src/main/java/meteordevelopment/meteorclient/events/game/SectionVisibleEvent.java b/src/main/java/meteordevelopment/meteorclient/events/game/SectionVisibleEvent.java index c92f9fc55c..726faf7966 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/game/SectionVisibleEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/game/SectionVisibleEvent.java @@ -5,15 +5,16 @@ package meteordevelopment.meteorclient.events.game; -import net.minecraft.item.ItemStack; +import net.minecraft.component.DataComponentType; + public class SectionVisibleEvent { private static final SectionVisibleEvent INSTANCE = new SectionVisibleEvent(); - public ItemStack.TooltipSection section; + public DataComponentType section; public boolean visible; - public static SectionVisibleEvent get(ItemStack.TooltipSection section, boolean visible) { + public static SectionVisibleEvent get(DataComponentType section, boolean visible) { INSTANCE.section = section; INSTANCE.visible = visible; 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 dfc2bb93eb..d525056c51 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/packets/PacketEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/packets/PacketEvent.java @@ -6,7 +6,7 @@ package meteordevelopment.meteorclient.events.packets; import meteordevelopment.meteorclient.events.Cancellable; -import net.minecraft.network.listener.PacketListener; +import net.minecraft.network.ClientConnection; import net.minecraft.network.packet.Packet; public class PacketEvent { @@ -14,12 +14,12 @@ public static class Receive extends Cancellable { private static final Receive INSTANCE = new Receive(); public Packet packet; - public PacketListener packetListener; + public ClientConnection connection; - public static Receive get(Packet packet, PacketListener listener) { + public static Receive get(Packet packet, ClientConnection connection) { INSTANCE.setCancelled(false); INSTANCE.packet = packet; - INSTANCE.packetListener = listener; + INSTANCE.connection = connection; return INSTANCE; } } @@ -27,6 +27,7 @@ public static Receive get(Packet packet, PacketListener listener) { public static class Send extends Cancellable { private static final Send INSTANCE = new Send(); + // overwriting this will overwrite the packet being sent public Packet packet; public static Send get(Packet packet) { diff --git a/src/main/java/meteordevelopment/meteorclient/gui/GuiKeyEvents.java b/src/main/java/meteordevelopment/meteorclient/gui/GuiKeyEvents.java index 2579002c99..bc89a81dfd 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/GuiKeyEvents.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/GuiKeyEvents.java @@ -7,4 +7,7 @@ public class GuiKeyEvents { public static boolean canUseKeys = true; + + private GuiKeyEvents() { + } } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/GuiTheme.java b/src/main/java/meteordevelopment/meteorclient/gui/GuiTheme.java index 8f96e5fbfc..14d3678c12 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/GuiTheme.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/GuiTheme.java @@ -33,7 +33,6 @@ import net.minecraft.nbt.NbtCompound; import net.minecraft.util.math.BlockPos; -import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/meteordevelopment/meteorclient/gui/GuiThemes.java b/src/main/java/meteordevelopment/meteorclient/gui/GuiThemes.java index 2b528f16c7..3cfa2f8d46 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/GuiThemes.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/GuiThemes.java @@ -26,6 +26,9 @@ public class GuiThemes { private static final List themes = new ArrayList<>(); private static GuiTheme theme; + private GuiThemes() { + } + @PreInit public static void init() { add(new MeteorGuiTheme()); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/EditBookTitleAndAuthorScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/EditBookTitleAndAuthorScreen.java index 092d90a480..062729d00b 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/EditBookTitleAndAuthorScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/EditBookTitleAndAuthorScreen.java @@ -10,8 +10,11 @@ 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 java.util.ArrayList; @@ -35,18 +38,19 @@ public void initWidgets() { WTable t = add(theme.table()).expandX().widget(); t.add(theme.label("Title")); - WTextBox title = t.add(theme.textBox(itemStack.getOrCreateNbt().getString("title"))).minWidth(220).expandX().widget(); + WTextBox title = t.add(theme.textBox(itemStack.get(DataComponentTypes.WRITTEN_BOOK_CONTENT).title().get(mc.shouldFilterText()))).minWidth(220).expandX().widget(); t.row(); t.add(theme.label("Author")); - WTextBox author = t.add(theme.textBox(itemStack.getNbt().getString("author"))).minWidth(220).expandX().widget(); + WTextBox author = t.add(theme.textBox(itemStack.get(DataComponentTypes.WRITTEN_BOOK_CONTENT).author())).minWidth(220).expandX().widget(); t.row(); t.add(theme.button("Done")).expandX().widget().action = () -> { - itemStack.getNbt().putString("author", author.get()); - itemStack.getNbt().putString("title", title.get()); + 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); - BookScreen.Contents contents = new BookScreen.WrittenBookContents(itemStack); + BookScreen.Contents contents = new BookScreen.Contents(itemStack.get(DataComponentTypes.WRITTEN_BOOK_CONTENT).getPages(mc.shouldFilterText())); List pages = new ArrayList<>(contents.getPageCount()); for (int i = 0; i < contents.getPageCount(); i++) pages.add(contents.getPage(i).getString()); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/MarkerScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/MarkerScreen.java index ee26217760..809b919f7e 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/MarkerScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/MarkerScreen.java @@ -25,7 +25,7 @@ public MarkerScreen(GuiTheme theme, BaseMarker marker) { @Override public void initWidgets() { // Settings - if (marker.settings.groups.size() > 0) { + if (!marker.settings.groups.isEmpty()) { settingsContainer = add(theme.verticalList()).expandX().widget(); settingsContainer.add(theme.settings(marker.settings)).expandX(); } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/ModuleScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/ModuleScreen.java index 22e14a8596..d106a5604d 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/ModuleScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/ModuleScreen.java @@ -47,7 +47,7 @@ public void initWidgets() { add(theme.label(module.description, getWindowWidth() / 2.0)); // Settings - if (module.settings.groups.size() > 0) { + if (!module.settings.groups.isEmpty()) { settingsContainer = add(theme.verticalList()).expandX().widget(); settingsContainer.add(theme.settings(module.settings)).expandX(); } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/ModulesScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/ModulesScreen.java index 908e9f34b5..ce6c19a803 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/ModulesScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/ModulesScreen.java @@ -32,7 +32,7 @@ public class ModulesScreen extends TabScreen { private WCategoryController controller; public ModulesScreen(GuiTheme theme) { - super(theme, Tabs.get().get(0)); + super(theme, Tabs.get().getFirst()); } @Override @@ -82,7 +82,7 @@ protected void createSearchW(WContainer w, String text) { // Titles Set modules = Modules.get().searchTitles(text); - if (modules.size() > 0) { + if (!modules.isEmpty()) { WSection section = w.add(theme.section("Modules")).expandX().widget(); section.spacing = 0; @@ -97,7 +97,7 @@ protected void createSearchW(WContainer w, String text) { // Settings modules = Modules.get().searchSettingTitles(text); - if (modules.size() > 0) { + if (!modules.isEmpty()) { WSection section = w.add(theme.section("Settings")).expandX().widget(); section.spacing = 0; 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 ccf9df4017..8da1bc054e 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockDataSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockDataSettingScreen.java @@ -60,7 +60,7 @@ public & ISerializable & IChangeable & IBlockData> for (Block block : Registries.BLOCK) { T blockData = (T) setting.get().get(block); - if (blockData != null && blockData.isChanged()) BLOCKS.add(0, block); + if (blockData != null && blockData.isChanged()) BLOCKS.addFirst(block); else BLOCKS.add(block); } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/LeftRightListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/LeftRightListSettingScreen.java index ad90f9270f..407bb72a74 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/LeftRightListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/LeftRightListSettingScreen.java @@ -73,7 +73,7 @@ private void initWidgets(Registry registry) { if (v != null) addValue(registry, v); }); - if (left.cells.size() > 0) table.add(theme.verticalSeparator()).expandWidgetY(); + if (!left.cells.isEmpty()) table.add(theme.verticalSeparator()).expandWidgetY(); // Right (selected) abc(pairs -> { @@ -132,7 +132,7 @@ private WTable abc(Consumer>> addValues, boolean isLeft, C if (!filterText.isEmpty()) values.sort(Comparator.comparingInt(value -> -value.getRight())); for (Pair pair : values) forEach.accept(pair.getLeft()); - if (table.cells.size() > 0) cell.expandX(); + if (!table.cells.isEmpty()) cell.expandX(); return table; } 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 09849ffd5b..6914e30680 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/StatusEffectAmplifierMapSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/StatusEffectAmplifierMapSettingScreen.java @@ -13,6 +13,8 @@ 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; @@ -21,6 +23,7 @@ import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.Optional; public class StatusEffectAmplifierMapSettingScreen extends WindowScreen { private final Setting> setting; @@ -74,7 +77,13 @@ private void initTable() { private ItemStack getPotionStack(StatusEffect effect) { ItemStack potion = Items.POTION.getDefaultStack(); - potion.getOrCreateNbt().putInt("CustomPotionColor", effect.getColor()); + + potion.set(DataComponentTypes.POTION_CONTENTS, new PotionContentsComponent( + potion.get(DataComponentTypes.POTION_CONTENTS).potion(), + Optional.of(effect.getColor()), + potion.get(DataComponentTypes.POTION_CONTENTS).customEffects()) + ); + return potion; } } 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 39ba69ed93..b2172ed11c 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/StatusEffectListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/StatusEffectListSettingScreen.java @@ -9,12 +9,15 @@ 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 java.util.List; +import java.util.Optional; public class StatusEffectListSettingScreen extends LeftRightListSettingScreen { public StatusEffectListSettingScreen(GuiTheme theme, Setting> setting) { @@ -33,7 +36,13 @@ protected String getValueName(StatusEffect value) { private ItemStack getPotionStack(StatusEffect effect) { ItemStack potion = Items.POTION.getDefaultStack(); - potion.getOrCreateNbt().putInt("CustomPotionColor", effect.getColor()); + + potion.set(DataComponentTypes.POTION_CONTENTS, new PotionContentsComponent( + potion.get(DataComponentTypes.POTION_CONTENTS).potion(), + Optional.of(effect.getColor()), + potion.get(DataComponentTypes.POTION_CONTENTS).customEffects()) + ); + return potion; } } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/tabs/Tabs.java b/src/main/java/meteordevelopment/meteorclient/gui/tabs/Tabs.java index 704eb5989e..d98cbd382d 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/tabs/Tabs.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/tabs/Tabs.java @@ -6,7 +6,6 @@ package meteordevelopment.meteorclient.gui.tabs; import meteordevelopment.meteorclient.gui.tabs.builtin.*; -import meteordevelopment.meteorclient.pathing.BaritoneUtils; import meteordevelopment.meteorclient.pathing.PathManagers; import meteordevelopment.meteorclient.utils.PreInit; @@ -16,6 +15,9 @@ public class Tabs { private static final List tabs = new ArrayList<>(); + private Tabs() { + } + @PreInit(dependencies = PathManagers.class) public static void init() { add(new ModulesTab()); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/utils/StarscriptTextBoxRenderer.java b/src/main/java/meteordevelopment/meteorclient/gui/utils/StarscriptTextBoxRenderer.java index 130ef022aa..a5831f7390 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/utils/StarscriptTextBoxRenderer.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/utils/StarscriptTextBoxRenderer.java @@ -62,11 +62,11 @@ private void generate(GuiTheme theme, String text, Color defaultColor) { int charDepth = depth; if (result.hasErrors()) { - if (i == result.errors.get(0).character) { + if (i == result.errors.getFirst().character) { sections.add(new Section(sb.toString(), charDepth > 0 ? theme.starscriptTextColor() : defaultColor)); sb.setLength(0); } - else if (i > result.errors.get(0).character) { + else if (i > result.errors.getFirst().character) { sb.append(c); continue; } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItemWithLabel.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItemWithLabel.java index 017ae3ffca..cd7b4decfc 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItemWithLabel.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItemWithLabel.java @@ -7,13 +7,13 @@ 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.potion.PotionUtil; -import java.util.List; +import java.util.Iterator; import static meteordevelopment.meteorclient.MeteorClient.mc; @@ -39,16 +39,15 @@ private String getStringToAppend() { String str = ""; if (itemStack.getItem() == Items.POTION) { - List effects = PotionUtil.getPotion(itemStack).getEffects(); + Iterator effects = itemStack.getItem().getComponents().get(DataComponentTypes.POTION_CONTENTS).getEffects().iterator(); + if (!effects.hasNext()) return str; - if (!effects.isEmpty()) { - str += " "; + str += " "; - StatusEffectInstance effect = effects.get(0); - if (effect.getAmplifier() > 0) str += "%d ".formatted(effect.getAmplifier() + 1); + StatusEffectInstance 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(StatusEffectUtil.getDurationText(effect, 1, mc.world != null ? mc.world.getTickManager().getTickRate() : 20.0F).getString()); } return str; diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WMultiLabel.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WMultiLabel.java index 9e986a3ee9..0f2d54b86d 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WMultiLabel.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WMultiLabel.java @@ -63,7 +63,7 @@ protected void onCalculateSize() { } } - if (sb.length() > 0) lines.add(sb.toString()); + if (!sb.isEmpty()) lines.add(sb.toString()); width = maxLineWidth; height = theme.textHeight(title) * lines.size(); 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 59764e78bb..4ae00b5ffe 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/containers/WContainer.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/containers/WContainer.java @@ -34,7 +34,7 @@ public Cell add(T widget) { } public void clear() { - if (cells.size() > 0) { + if (!cells.isEmpty()) { cells.clear(); invalidate(); } 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 08538d5723..cca613b5fb 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WBlockPosEdit.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WBlockPosEdit.java @@ -44,8 +44,7 @@ public void init() { if (canUpdate()) { WButton click = add(theme.button("Click")).expandX().widget(); click.action = () -> { - String sb = "Click!\n" + "Right click to pick a new position.\n" + - "Left click to cancel."; + String sb = "Click!\nRight click to pick a new position.\nLeft click to cancel."; Modules.get().get(Marker.class).info(sb); clicking = true; 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 61846c92cb..b2e1c9efd1 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WTextBox.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WTextBox.java @@ -613,7 +613,7 @@ private void cursorChanged() { completions = renderer.getCompletions(text, this.cursor); completionsStart = 0; completionsW = null; - if (completions != null && completions.size() > 0) createCompletions(0); + if (completions != null && !completions.isEmpty()) createCompletions(0); } protected void onCursorChanged() {} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/AbstractBlockMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractBlockMixin.java index 45fed77b49..9fcfb85976 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/AbstractBlockMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractBlockMixin.java @@ -14,6 +14,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.BlockView; 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; @@ -21,7 +22,8 @@ import java.util.Random; @Mixin(AbstractBlock.class) -public class AbstractBlockMixin { +public abstract class AbstractBlockMixin { + @Unique private static final Random RANDOM = new Random(); @Inject(method = "getAmbientOcclusionLightLevel", at = @At("HEAD"), cancellable = true) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/AbstractBlockStateMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractBlockStateMixin.java index ff19c95594..c48dc7272d 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/AbstractBlockStateMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractBlockStateMixin.java @@ -10,13 +10,15 @@ import net.minecraft.block.AbstractBlock; import net.minecraft.util.math.BlockPos; 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.ModifyVariable; import java.util.Random; @Mixin(AbstractBlock.AbstractBlockState.class) -public class AbstractBlockStateMixin { +public abstract class AbstractBlockStateMixin { + @Unique private static final Random RANDOM = new Random(); @ModifyVariable(method = "getModelOffset", at = @At("HEAD"), argsOnly = true) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/AbstractClientPlayerEntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractClientPlayerEntityMixin.java index 9f0d700cb3..b43b644e8d 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/AbstractClientPlayerEntityMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractClientPlayerEntityMixin.java @@ -16,7 +16,7 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; @Mixin(AbstractClientPlayerEntity.class) -public class AbstractClientPlayerEntityMixin { +public abstract class AbstractClientPlayerEntityMixin { // Player model rendering in main menu @Inject(method = "getPlayerListEntry", at = @At("HEAD"), cancellable = true) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/AbstractSignEditScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractSignEditScreenMixin.java index 1c4fbbed07..68cb072b41 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/AbstractSignEditScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractSignEditScreenMixin.java @@ -15,7 +15,7 @@ import java.util.stream.Stream; @Mixin(AbstractSignEditScreen.class) -public class AbstractSignEditScreenMixin { +public abstract class AbstractSignEditScreenMixin { @ModifyExpressionValue(method = "(Lnet/minecraft/block/entity/SignBlockEntity;ZZLnet/minecraft/text/Text;)V", at = @At(value = "INVOKE", target = "Ljava/util/stream/IntStream;mapToObj(Ljava/util/function/IntFunction;)Ljava/util/stream/Stream;")) private Stream modifyTranslatableText(Stream original) { return original.map(this::modifyText); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ArmorFeatureRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ArmorFeatureRendererMixin.java index d493a00087..e4ce233fd4 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ArmorFeatureRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ArmorFeatureRendererMixin.java @@ -20,7 +20,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(ArmorFeatureRenderer.class) -public class ArmorFeatureRendererMixin, A extends BipedEntityModel> { +public abstract class ArmorFeatureRendererMixin, A extends BipedEntityModel> { @Inject(method = "renderArmor", at = @At("HEAD"), cancellable = true) private void onRenderArmor(MatrixStack matrices, VertexConsumerProvider vertexConsumers, T livingEntity, EquipmentSlot equipmentSlot, int i, A bipedEntityModel, CallbackInfo info) { if (livingEntity instanceof PlayerEntity && Modules.get().get(NoRender.class).noArmor()) info.cancel(); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/AttributeContainerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/AttributeContainerMixin.java deleted file mode 100644 index cad576fb1e..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/AttributeContainerMixin.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 meteordevelopment.meteorclient.mixininterface.IAttributeContainer; -import meteordevelopment.meteorclient.mixininterface.IEntityAttributeInstance; -import net.minecraft.entity.attribute.AttributeContainer; -import net.minecraft.entity.attribute.EntityAttribute; -import net.minecraft.entity.attribute.EntityAttributeInstance; -import org.jetbrains.annotations.Nullable; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; - -import java.util.Map; -import java.util.Set; - -@Mixin(AttributeContainer.class) -public abstract class AttributeContainerMixin implements IAttributeContainer { - @Shadow @Final private Map custom; - @Shadow @Final private Set tracked; - - @Override - public void meteor$copyFrom(AttributeContainer other) { - for (var otherInstance : ((AttributeContainerMixin) (Object) other).custom.values()) { - @Nullable EntityAttributeInstance instance = custom.get(otherInstance.getAttribute()); - if (instance != null) { - ((IEntityAttributeInstance) instance).meteor$copyFrom(otherInstance); - } else { - custom.put(otherInstance.getAttribute(), otherInstance); - if (otherInstance.getAttribute().isTracked()) tracked.add(otherInstance); - } - } - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BackgroundRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BackgroundRendererMixin.java index aca68480c3..514d2a369a 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BackgroundRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BackgroundRendererMixin.java @@ -19,7 +19,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(BackgroundRenderer.class) -public class BackgroundRendererMixin { +public abstract class BackgroundRendererMixin { @Inject(method = "applyFog", at = @At("TAIL")) private static void onApplyFog(Camera camera, BackgroundRenderer.FogType fogType, float viewDistance, boolean thickFog, float tickDelta, CallbackInfo info) { if (Modules.get().get(NoRender.class).noFog() || Modules.get().isActive(Xray.class)) { diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BakedQuadMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BakedQuadMixin.java index b474caf293..98847500f8 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BakedQuadMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BakedQuadMixin.java @@ -12,7 +12,7 @@ import org.spongepowered.asm.mixin.Shadow; @Mixin(BakedQuad.class) -public class BakedQuadMixin implements IBakedQuad { +public abstract class BakedQuadMixin implements IBakedQuad { @Shadow @Final protected int[] vertexData; @Override diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BannerBlockEntityRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BannerBlockEntityRendererMixin.java index c91b941616..313160110d 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BannerBlockEntityRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BannerBlockEntityRendererMixin.java @@ -22,12 +22,13 @@ 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 class BannerBlockEntityRendererMixin { +public abstract class BannerBlockEntityRendererMixin { @Final @Shadow private ModelPart pillar; @@ -56,11 +57,12 @@ else if (renderMode == NoRender.BannerRenderMode.Pillar) { } } + @Unique private void renderPillar(BannerBlockEntity bannerBlockEntity, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, int j) { matrixStack.push(); BlockState blockState = bannerBlockEntity.getCachedState(); matrixStack.translate(0.5D, 0.5D, 0.5D); - float h = (float)(-(Integer)blockState.get(BannerBlock.ROTATION) * 360) / 16.0F; + float h = (-(Integer)blockState.get(BannerBlock.ROTATION) * 360) / 16.0F; matrixStack.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(h)); matrixStack.push(); matrixStack.scale(0.6666667F, -0.6666667F, -0.6666667F); @@ -70,6 +72,7 @@ private void renderPillar(BannerBlockEntity bannerBlockEntity, MatrixStack matri matrixStack.pop(); } + @Unique private void renderCrossbar(BannerBlockEntity bannerBlockEntity, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, int j) { matrixStack.push(); BlockState blockState = bannerBlockEntity.getCachedState(); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BeaconBlockEntityRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BeaconBlockEntityRendererMixin.java index 7d2dc86390..7145c8d5d1 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BeaconBlockEntityRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BeaconBlockEntityRendererMixin.java @@ -17,7 +17,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(BeaconBlockEntityRenderer.class) -public class BeaconBlockEntityRendererMixin { +public abstract class BeaconBlockEntityRendererMixin { @Inject(method = "render(Lnet/minecraft/block/entity/BeaconBlockEntity;FLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;II)V", at = @At("HEAD"), cancellable = true) private void onRender(BeaconBlockEntity beaconBlockEntity, float f, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, int j, CallbackInfo info) { if (Modules.get().get(NoRender.class).noBeaconBeams()) info.cancel(); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BeaconScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BeaconScreenMixin.java index 0051b9ded8..eb9f7250d5 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BeaconScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BeaconScreenMixin.java @@ -15,6 +15,7 @@ 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 org.spongepowered.asm.mixin.Mixin; @@ -23,7 +24,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import java.util.Arrays; +import java.util.Collection; import java.util.List; @Mixin(BeaconScreen.class) @@ -38,12 +39,11 @@ public BeaconScreenMixin(BeaconScreenHandler handler, PlayerInventory inventory, @Inject(method = "init", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/ingame/BeaconScreen;addButton(Lnet/minecraft/client/gui/widget/ClickableWidget;)V", ordinal = 1, shift = At.Shift.AFTER), cancellable = true) private void changeButtons(CallbackInfo ci) { if (!Modules.get().get(BetterBeacons.class).isActive()) return; - List effects = Arrays.stream(BeaconBlockEntity.EFFECTS_BY_LEVEL).flatMap(Arrays::stream).toList(); - + List> effects = BeaconBlockEntity.EFFECTS_BY_LEVEL.stream().flatMap(Collection::stream).toList(); if (MinecraftClient.getInstance().currentScreen instanceof BeaconScreen beaconScreen) { for (int x = 0; x < 3; x++) { for (int y = 0; y < 2; y++) { - StatusEffect effect = effects.get(x * 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)); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BiomeColorsMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BiomeColorsMixin.java index b14093abab..2166d8690c 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BiomeColorsMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BiomeColorsMixin.java @@ -16,7 +16,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(BiomeColors.class) -public class BiomeColorsMixin { +public abstract class BiomeColorsMixin { /** * @author Walaryne */ diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BlockCollisionSpliteratorMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BlockCollisionSpliteratorMixin.java index f51dc897b0..e40b859046 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BlockCollisionSpliteratorMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BlockCollisionSpliteratorMixin.java @@ -20,7 +20,7 @@ import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(BlockCollisionSpliterator.class) -public class BlockCollisionSpliteratorMixin { +public abstract class BlockCollisionSpliteratorMixin { @Redirect(method = "computeNext", at = @At(value = "INVOKE", target = "Lnet/minecraft/block/BlockState;getCollisionShape(Lnet/minecraft/world/BlockView;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/ShapeContext;)Lnet/minecraft/util/shape/VoxelShape;")) private VoxelShape onComputeNextCollisionBox(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { VoxelShape shape = state.getCollisionShape(world, pos, context); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BlockEntityRenderDispatcherMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BlockEntityRenderDispatcherMixin.java index 958eb5b8dc..5774208d4b 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BlockEntityRenderDispatcherMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BlockEntityRenderDispatcherMixin.java @@ -17,7 +17,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(BlockEntityRenderDispatcher.class) -public class BlockEntityRenderDispatcherMixin { +public abstract class BlockEntityRenderDispatcherMixin { @Inject(method = "render(Lnet/minecraft/block/entity/BlockEntity;FLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;)V", at = @At("HEAD"), cancellable = true) private void onRenderEntity(E blockEntity, float tickDelta, MatrixStack matrix, VertexConsumerProvider vertexConsumerProvider, CallbackInfo info) { RenderBlockEntityEvent event = MeteorClient.EVENT_BUS.post(RenderBlockEntityEvent.get(blockEntity)); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BlockModelRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BlockModelRendererMixin.java index ec49bc8e38..cb90791d7d 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BlockModelRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BlockModelRendererMixin.java @@ -23,7 +23,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(BlockModelRenderer.class) -public class BlockModelRendererMixin { +public abstract class BlockModelRendererMixin { @Unique private final ThreadLocal alphas = new ThreadLocal<>(); @Inject(method = "render(Lnet/minecraft/world/BlockRenderView;Lnet/minecraft/client/render/model/BakedModel;Lnet/minecraft/block/BlockState;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumer;ZLnet/minecraft/util/math/random/Random;JI)V", at = @At("HEAD"), cancellable = true) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BlockRenderManagerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BlockRenderManagerMixin.java index 05ae764d48..7e7fc2892a 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BlockRenderManagerMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BlockRenderManagerMixin.java @@ -20,7 +20,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(BlockRenderManager.class) -public class BlockRenderManagerMixin { +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 af438f17cb..353f279c9c 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BlockStateMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BlockStateMixin.java @@ -5,8 +5,8 @@ package meteordevelopment.meteorclient.mixin; -import com.google.common.collect.ImmutableMap; 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; @@ -15,20 +15,19 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.state.property.Property; import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; import net.minecraft.util.hit.BlockHitResult; import net.minecraft.world.World; import org.spongepowered.asm.mixin.Mixin; @Mixin(BlockState.class) public abstract class BlockStateMixin extends AbstractBlock.AbstractBlockState { - public BlockStateMixin(Block block, ImmutableMap, Comparable> propertyMap, MapCodec mapCodec) { + public BlockStateMixin(Block block, Reference2ObjectArrayMap, Comparable> propertyMap, MapCodec mapCodec) { super(block, propertyMap, mapCodec); } @Override - public ActionResult onUse(World world, PlayerEntity player, Hand hand, BlockHitResult hit) { + public ActionResult onUse(World world, PlayerEntity player, BlockHitResult hit) { MeteorClient.EVENT_BUS.post(BlockActivateEvent.get((BlockState) (Object) this)); - return super.onUse(world, player, hand, hit); + return super.onUse(world, player, hit); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BoatEntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BoatEntityMixin.java index c24b8974f8..cda37c9e0c 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BoatEntityMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BoatEntityMixin.java @@ -18,7 +18,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(BoatEntity.class) -public class BoatEntityMixin { +public abstract class BoatEntityMixin { @Shadow private boolean pressingLeft; @Shadow private boolean pressingRight; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BookScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BookScreenMixin.java index b66e8e7575..4da1997a8a 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BookScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BookScreenMixin.java @@ -36,7 +36,7 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; @Mixin(BookScreen.class) -public class BookScreenMixin extends Screen { +public abstract class BookScreenMixin extends Screen { @Shadow private BookScreen.Contents contents; @@ -67,7 +67,7 @@ private void onInit(CallbackInfo info) { } String encoded = Base64.getEncoder().encodeToString(bytes.array); - + @SuppressWarnings("resource") long available = MemoryStack.stackGet().getPointer(); long size = MemoryUtil.memLengthUTF8(encoded, true); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BossBarHudMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BossBarHudMixin.java index da61a33382..0b6d51bac4 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BossBarHudMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BossBarHudMixin.java @@ -20,7 +20,7 @@ import java.util.Iterator; @Mixin(BossBarHud.class) -public class BossBarHudMixin { +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(); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BoxMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BoxMixin.java index b964e24f26..b4983c84c2 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BoxMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BoxMixin.java @@ -13,7 +13,7 @@ import org.spongepowered.asm.mixin.Shadow; @Mixin(Box.class) -public class BoxMixin implements IBox { +public abstract class BoxMixin implements IBox { @Shadow @Final @Mutable public double minX; @Shadow @Final @Mutable public double minY; @Shadow @Final @Mutable public double minZ; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/CapeFeatureRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/CapeFeatureRendererMixin.java index 4e9368a904..a9a942d007 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/CapeFeatureRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/CapeFeatureRendererMixin.java @@ -16,7 +16,7 @@ import org.spongepowered.asm.mixin.injection.At; @Mixin(CapeFeatureRenderer.class) -public class CapeFeatureRendererMixin { +public abstract class CapeFeatureRendererMixin { @ModifyExpressionValue(method = "render(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;ILnet/minecraft/client/network/AbstractClientPlayerEntity;FFFFFF)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/SkinTextures;capeTexture()Lnet/minecraft/util/Identifier;")) private Identifier modifyCapeTexture(Identifier original, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, AbstractClientPlayerEntity abstractClientPlayerEntity, float f, float g, float h, float j, float k, float l) { Identifier id = Capes.get(abstractClientPlayerEntity); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudLineMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudLineMixin.java index 77a94679a0..60b9b5fff6 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudLineMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudLineMixin.java @@ -15,7 +15,7 @@ import org.spongepowered.asm.mixin.Unique; @Mixin(value = ChatHudLine.class) -public class ChatHudLineMixin implements IChatHudLine { +public abstract class ChatHudLineMixin implements IChatHudLine { @Shadow @Final private Text content; @Unique private int id; @Unique private GameProfile sender; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudLineVisibleMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudLineVisibleMixin.java index f797b6401b..c616b282ec 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudLineVisibleMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudLineVisibleMixin.java @@ -15,7 +15,7 @@ import org.spongepowered.asm.mixin.Unique; @Mixin(ChatHudLine.Visible.class) -public class ChatHudLineVisibleMixin implements IChatHudLineVisible { +public abstract class ChatHudLineVisibleMixin implements IChatHudLineVisible { @Shadow @Final private OrderedText content; @Unique private int id; @Unique private GameProfile sender; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java index b74600affb..c0093d7974 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java @@ -33,7 +33,6 @@ 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.Slice; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.LocalCapture; @@ -41,16 +40,25 @@ @Mixin(ChatHud.class) public abstract class ChatHudMixin implements IChatHud { - @Shadow @Final private MinecraftClient client; - @Shadow @Final private List visibleMessages; - @Shadow @Final private List messages; + @Shadow + @Final + private MinecraftClient client; + @Shadow + @Final + private List visibleMessages; + @Shadow + @Final + private List messages; - @Unique private BetterChat betterChat; - @Unique private int nextId; - @Unique private boolean skipOnAddMessage; + @Unique + private BetterChat betterChat; + @Unique + private int nextId; + @Unique + private boolean skipOnAddMessage; @Shadow - protected abstract void addMessage(Text message, @Nullable MessageSignatureData signature, int ticks, @Nullable MessageIndicator indicator, boolean refresh); + public abstract void addMessage(Text message, @Nullable MessageSignatureData signatureData, @Nullable MessageIndicator indicator); @Shadow public abstract void addMessage(Text message); @@ -62,19 +70,19 @@ public abstract class ChatHudMixin implements IChatHud { nextId = 0; } - @Inject(method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;ILnet/minecraft/client/gui/hud/MessageIndicator;Z)V", at = @At(value = "INVOKE", target = "Ljava/util/List;add(ILjava/lang/Object;)V", ordinal = 0, shift = At.Shift.AFTER)) - private void onAddMessageAfterNewChatHudLineVisible(Text message, MessageSignatureData signature, int ticks, MessageIndicator indicator, boolean refresh, CallbackInfo info) { - ((IChatHudLine) (Object) visibleMessages.get(0)).meteor$setId(nextId); + @Inject(method = "addVisibleMessage", at = @At(value = "INVOKE", target = "Ljava/util/List;add(ILjava/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/text/Text;Lnet/minecraft/network/message/MessageSignatureData;ILnet/minecraft/client/gui/hud/MessageIndicator;Z)V", at = @At(value = "INVOKE", target = "Ljava/util/List;add(ILjava/lang/Object;)V", ordinal = 1, shift = At.Shift.AFTER)) - private void onAddMessageAfterNewChatHudLine(Text message, MessageSignatureData signature, int ticks, MessageIndicator indicator, boolean refresh, CallbackInfo info) { - ((IChatHudLine) (Object) messages.get(0)).meteor$setId(nextId); + @Inject(method = "addMessage(Lnet/minecraft/client/gui/hud/ChatHudLine;)V", at = @At(value = "INVOKE", target = "Ljava/util/List;add(ILjava/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 = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;ILnet/minecraft/client/gui/hud/MessageIndicator;Z)V", 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, @Local(ordinal = 2) int j) { + @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, @Local(ordinal = 1) int j) { IMessageHandler handler = (IMessageHandler) client.getMessageHandler(); if (handler == null) return line; @@ -86,7 +94,7 @@ private ChatHudLine.Visible onAddMessage_modifyChatHudLineVisible(ChatHudLine.Vi return line; } - @ModifyExpressionValue(method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;ILnet/minecraft/client/gui/hud/MessageIndicator;Z)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;")) + @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; @@ -95,17 +103,17 @@ private ChatHudLine onAddMessage_modifyChatHudLine(ChatHudLine line) { return line; } - @Inject(at = @At("HEAD"), method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;ILnet/minecraft/client/gui/hud/MessageIndicator;Z)V", cancellable = true) - private void onAddMessage(Text message, @Nullable MessageSignatureData signature, int ticks, @Nullable MessageIndicator indicator, boolean refresh, CallbackInfo info) { + @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) { if (skipOnAddMessage) return; ReceiveMessageEvent event = MeteorClient.EVENT_BUS.post(ReceiveMessageEvent.get(message, indicator, nextId)); - if (event.isCancelled()) info.cancel(); + 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--) { + for (int i = messages.size() - 1; i > -1; i--) { if (((IChatHudLine) (Object) messages.get(i)).meteor$getId() == nextId && nextId != 0) { messages.remove(i); Modules.get().get(BetterChat.class).lines.removeInt(i); @@ -113,23 +121,30 @@ private void onAddMessage(Text message, @Nullable MessageSignatureData signature } if (event.isModified()) { - info.cancel(); + ci.cancel(); skipOnAddMessage = true; - addMessage(event.getMessage(), signature, ticks, event.getIndicator(), refresh); + addMessage(event.getMessage(), signatureData, event.getIndicator()); skipOnAddMessage = false; } } } //modify max lengths for messages and visible messages - @ModifyExpressionValue(method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;ILnet/minecraft/client/gui/hud/MessageIndicator;Z)V", at = @At(value = "CONSTANT", args = "intValue=100")) + @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", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/math/MathHelper;ceil(F)I")) @@ -152,24 +167,22 @@ private MessageIndicator onRender_modifyIndicator(MessageIndicator indicator) { // Anti spam - @Inject(method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;ILnet/minecraft/client/gui/hud/MessageIndicator;Z)V", - at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/ChatHud;isChatFocused()Z"), locals = LocalCapture.CAPTURE_FAILSOFT) - private void onBreakChatMessageLines(Text message, MessageSignatureData signature, int ticks, MessageIndicator indicator, boolean refresh, CallbackInfo ci, int i, List list) { + @Inject(method = "addVisibleMessage", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/ChatHud;isChatFocused()Z"), locals = LocalCapture.CAPTURE_FAILSOFT) + private void onBreakChatMessageLines(ChatHudLine message, CallbackInfo ci, int i, MessageIndicator.Icon icon, List list) { if (Modules.get() == null) return; // baritone calls addMessage before we initialise - getBetterChat().lines.add(0, list.size()); + getBetterChat().lines.addFirst(list.size()); } - @Inject(method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;ILnet/minecraft/client/gui/hud/MessageIndicator;Z)V", - slice = @Slice(from = @At(value = "FIELD", target = "Lnet/minecraft/client/gui/hud/ChatHud;messages:Ljava/util/List;")), at = @At(value = "INVOKE", target = "Ljava/util/List;remove(I)Ljava/lang/Object;")) - private void onRemoveMessage(Text message, MessageSignatureData signature, int ticks, MessageIndicator indicator, boolean refresh, CallbackInfo ci) { + @Inject(method = "addMessage(Lnet/minecraft/client/gui/hud/ChatHudLine;)V", at = @At(value = "INVOKE", target = "Ljava/util/List;remove(I)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.removeInt(size - 1); + betterChat.lines.removeLast(); size--; } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChunkBorderDebugRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChunkBorderDebugRendererMixin.java index fa0bb28354..3481e15180 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChunkBorderDebugRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChunkBorderDebugRendererMixin.java @@ -19,7 +19,7 @@ import org.spongepowered.asm.mixin.injection.At; @Mixin(ChunkBorderDebugRenderer.class) -public class ChunkBorderDebugRendererMixin { +public abstract class ChunkBorderDebugRendererMixin { @Shadow @Final private MinecraftClient client; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChunkOcclusionDataBuilderMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChunkOcclusionDataBuilderMixin.java index 478e346bd4..6d53a458a9 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChunkOcclusionDataBuilderMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChunkOcclusionDataBuilderMixin.java @@ -15,7 +15,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(ChunkOcclusionDataBuilder.class) -public class ChunkOcclusionDataBuilderMixin { +public abstract class ChunkOcclusionDataBuilderMixin { @Inject(method = "markClosed", at = @At("HEAD"), cancellable = true) private void onMarkClosed(BlockPos pos, CallbackInfo info) { ChunkOcclusionEvent event = MeteorClient.EVENT_BUS.post(ChunkOcclusionEvent.get()); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChunkSkyLightProviderMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChunkSkyLightProviderMixin.java index fe22f39148..e05e1e90f4 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChunkSkyLightProviderMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChunkSkyLightProviderMixin.java @@ -14,7 +14,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(ChunkSkyLightProvider.class) -public class ChunkSkyLightProviderMixin { +public abstract class ChunkSkyLightProviderMixin { @Inject(at = @At("HEAD"), method = "method_51531", cancellable = true) private void recalculateLevel(long blockPos, long l, int lightLevel, CallbackInfo ci) { if (Modules.get().get(NoRender.class).noSkylightUpdates()) ci.cancel(); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java index 95fb825805..b959abbe97 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java @@ -5,6 +5,8 @@ package meteordevelopment.meteorclient.mixin; +import com.llamalad7.mixinextras.sugar.Local; +import com.llamalad7.mixinextras.sugar.ref.LocalRef; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelPipeline; import io.netty.handler.proxy.Socks4ProxyHandler; @@ -23,7 +25,6 @@ import net.minecraft.network.handler.PacketEncoderException; import net.minecraft.network.handler.PacketSizeLogger; import net.minecraft.network.listener.ClientPlayPacketListener; -import net.minecraft.network.listener.PacketListener; import net.minecraft.network.packet.Packet; import net.minecraft.network.packet.s2c.play.BundleS2CPacket; import net.minecraft.text.MutableText; @@ -39,20 +40,21 @@ import java.util.Iterator; @Mixin(ClientConnection.class) -public class ClientConnectionMixin { - @Inject(method = "handlePacket", at = @At("HEAD"), cancellable = true) - private static void onHandlePacket(Packet packet, PacketListener listener, CallbackInfo info) { +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(PacketEvent.Receive.get(it.next(), listener)).isCancelled()) it.remove(); + for (Iterator> it = bundle.getPackets().iterator(); it.hasNext(); ) { + if (MeteorClient.EVENT_BUS.post(PacketEvent.Receive.get(it.next(), (ClientConnection) (Object) this)).isCancelled()) it.remove(); } - } else if (MeteorClient.EVENT_BUS.post(PacketEvent.Receive.get(packet, listener)).isCancelled()) info.cancel(); + } else if (MeteorClient.EVENT_BUS.post(PacketEvent.Receive.get(packet, (ClientConnection) (Object) this)).isCancelled()) ci.cancel(); } @Inject(method = "disconnect", at = @At("HEAD")) private void disconnect(Text disconnectReason, CallbackInfo ci) { if (Modules.get().get(HighwayBuilder.class).isActive()) { - MutableText text = Text.literal(String.format("\n\n%s[%sHighway Builder%s] Statistics:", Formatting.GRAY, Formatting.BLUE, Formatting.GRAY)).append("\n"); + 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); @@ -65,8 +67,13 @@ private static void onConnect(InetSocketAddress address, boolean useEpoll, Clien } @Inject(at = @At("HEAD"), method = "send(Lnet/minecraft/network/packet/Packet;)V", cancellable = true) - private void onSendPacketHead(Packet packet, CallbackInfo info) { - if (MeteorClient.EVENT_BUS.post(PacketEvent.Send.get(packet)).isCancelled()) info.cancel(); + private void onSendPacketHead(CallbackInfo info, @Local LocalRef> packet) { + PacketEvent.Send processedPacket = MeteorClient.EVENT_BUS.post(PacketEvent.Send.get(packet.get())); + if (processedPacket.isCancelled()) { + info.cancel(); + } else { + packet.set(processedPacket.packet); + } } @Inject(method = "send(Lnet/minecraft/network/packet/Packet;)V", at = @At("TAIL")) @@ -84,7 +91,7 @@ private void exceptionCaught(ChannelHandlerContext context, Throwable throwable, } @Inject(method = "addHandlers", at = @At("RETURN")) - private static void onAddHandlers(ChannelPipeline pipeline, NetworkSide side, PacketSizeLogger packetSizeLogger, CallbackInfo ci) { + private static void onAddHandlers(ChannelPipeline pipeline, NetworkSide side, boolean local, PacketSizeLogger packetSizeLogger, CallbackInfo ci) { if (side != NetworkSide.CLIENTBOUND) return; Proxy proxy = Proxies.get().getEnabled(); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerInteractionManagerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerInteractionManagerMixin.java index cf799b98a3..feb31e918e 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerInteractionManagerMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerInteractionManagerMixin.java @@ -12,7 +12,6 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.misc.InventoryTweaks; import meteordevelopment.meteorclient.systems.modules.player.BreakDelay; -import meteordevelopment.meteorclient.systems.modules.player.Reach; import meteordevelopment.meteorclient.systems.modules.player.SpeedMine; import meteordevelopment.meteorclient.utils.player.Rotations; import meteordevelopment.meteorclient.utils.world.BlockUtils; @@ -139,16 +138,6 @@ private void onDropCreativeStack(ItemStack stack, CallbackInfo info) { if (MeteorClient.EVENT_BUS.post(DropItemsEvent.get(stack)).isCancelled()) info.cancel(); } - @Inject(method = "getReachDistance", at = @At("HEAD"), cancellable = true) - private void onGetReachDistance(CallbackInfoReturnable info) { - info.setReturnValue(Modules.get().get(Reach.class).blockReach()); - } - - @Inject(method = "hasExtendedReach", at = @At("HEAD"), cancellable = true) - private void onHasExtendedReach(CallbackInfoReturnable info) { - if (Modules.get().isActive(Reach.class)) info.setReturnValue(false); - } - @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)); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/CobwebBlockMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/CobwebBlockMixin.java index 59c0655bf6..ec594fb381 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/CobwebBlockMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/CobwebBlockMixin.java @@ -20,7 +20,7 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; @Mixin(CobwebBlock.class) -public class CobwebBlockMixin { +public abstract class CobwebBlockMixin { @Inject(method = "onEntityCollision", at = @At("HEAD"), cancellable = true) private void onEntityCollision(BlockState state, World world, BlockPos pos, Entity entity, CallbackInfo info) { if (entity == mc.player && Modules.get().get(NoSlow.class).cobweb()) info.cancel(); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/CompassAnglePredicateProviderMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/CompassAnglePredicateProviderMixin.java index feb2bc261a..a08ed2263d 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/CompassAnglePredicateProviderMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/CompassAnglePredicateProviderMixin.java @@ -5,23 +5,36 @@ 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.item.CompassAnglePredicateProvider; +import net.minecraft.client.render.Camera; +import net.minecraft.entity.Entity; +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(CompassAnglePredicateProvider.class) -public class CompassAnglePredicateProviderMixin { - // TODO: I don't fucking know, someone fix this - /*@Redirect(method = "method_43213", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;getBodyYaw()F")) - private float callLivingEntityGetYaw(Entity entity) { +public abstract class CompassAnglePredicateProviderMixin { + @ModifyExpressionValue(method = "getBodyYaw", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;getBodyYaw()F")) + private float callLivingEntityGetYaw(float original) { if (Modules.get().isActive(Freecam.class)) return mc.gameRenderer.getCamera().getYaw(); - return entity.getYaw(); - }*/ + return original; + } - /*@Inject(method = "getAngleTo", at = @At("HEAD"), cancellable = true) - private void onGetAngleToPos(Entity entity, long time, BlockPos pos, CallbackInfoReturnable info) { + @ModifyReturnValue(method = "getAngleTo(Lnet/minecraft/entity/Entity;Lnet/minecraft/util/math/BlockPos;)D", at = @At("RETURN")) + private double modifyGetAngleTo(double original, Entity entity, BlockPos pos) { if (Modules.get().isActive(Freecam.class)) { + Vec3d vec3d = Vec3d.ofCenter(pos); Camera camera = mc.gameRenderer.getCamera(); - info.setReturnValue((float) Math.atan2(pos.getZ() - camera.getPos().z, pos.getX() - camera.getPos().x)); + return Math.atan2(vec3d.getZ() - camera.getPos().z, vec3d.getX() - camera.getPos().x) / (float) (Math.PI * 2); } - }*/ + + return original; + } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ConnectScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ConnectScreenMixin.java index fac824368d..6d2e056e5d 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ConnectScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ConnectScreenMixin.java @@ -9,6 +9,7 @@ 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 org.spongepowered.asm.mixin.Mixin; @@ -17,9 +18,9 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(ConnectScreen.class) -public class ConnectScreenMixin { - @Inject(method = "connect(Lnet/minecraft/client/MinecraftClient;Lnet/minecraft/client/network/ServerAddress;Lnet/minecraft/client/network/ServerInfo;)V", at = @At("HEAD")) - private void tryConnectEvent(MinecraftClient client, ServerAddress address, ServerInfo info, CallbackInfo ci) { +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)); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/CrashReportMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/CrashReportMixin.java index 68749a5d6f..33f82ea3d9 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/CrashReportMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/CrashReportMixin.java @@ -21,7 +21,7 @@ import java.util.List; @Mixin(CrashReport.class) -public class CrashReportMixin { +public abstract class CrashReportMixin { @Inject(method = "addStackTrace", at = @At("TAIL")) private void onAddStackTrace(StringBuilder sb, CallbackInfo info) { sb.append("\n\n-- Meteor Client --\n\n"); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/CreativeSlotMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/CreativeSlotMixin.java index d78cf6050e..80b24bc223 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/CreativeSlotMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/CreativeSlotMixin.java @@ -12,7 +12,7 @@ import org.spongepowered.asm.mixin.Shadow; @Mixin(targets = "net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen$CreativeSlot") -public class CreativeSlotMixin implements ISlot { +public abstract class CreativeSlotMixin implements ISlot { @Shadow @Final Slot slot; @Override diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/CrossbowItemAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/CrossbowItemAccessor.java index 1691cff90f..5ce1875a9d 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/CrossbowItemAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/CrossbowItemAccessor.java @@ -5,13 +5,13 @@ package meteordevelopment.meteorclient.mixin; +import net.minecraft.component.type.ChargedProjectilesComponent; import net.minecraft.item.CrossbowItem; -import net.minecraft.item.ItemStack; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; @Mixin(CrossbowItem.class) public interface CrossbowItemAccessor { @Invoker("getSpeed") - static float getSpeed(ItemStack itemStack) { return 0; } + static float getSpeed(ChargedProjectilesComponent itemStack) { return 0; } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/CustomPayloadS2CPacketMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/CustomPayloadS2CPacketMixin.java deleted file mode 100644 index 01a3ff3fef..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/CustomPayloadS2CPacketMixin.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 meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.systems.modules.misc.AntiPacketKick; -import net.minecraft.network.packet.s2c.common.CustomPayloadS2CPacket; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.Constant; -import org.spongepowered.asm.mixin.injection.ModifyConstant; - -@Mixin(CustomPayloadS2CPacket.class) -public class CustomPayloadS2CPacketMixin { - @ModifyConstant(method = "readUnknownPayload", constant = @Constant(intValue = 1048576)) - private static int maxValue(int value) { - return Modules.get().isActive(AntiPacketKick.class) ? Integer.MAX_VALUE : value; - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/DefaultSkinHelperMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/DefaultSkinHelperMixin.java index a710fc3c87..22c5e91ef2 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/DefaultSkinHelperMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/DefaultSkinHelperMixin.java @@ -14,7 +14,7 @@ import java.util.UUID; @Mixin(DefaultSkinHelper.class) -public class DefaultSkinHelperMixin { +public abstract class DefaultSkinHelperMixin { // Player model rendering in main menu @Inject(method = "getSkinTextures(Ljava/util/UUID;)Lnet/minecraft/client/util/SkinTextures;", at = @At("HEAD"), cancellable = true) private static void onShouldUseSlimModel(UUID uuid, CallbackInfoReturnable info) { diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/DisconnectedScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/DisconnectedScreenMixin.java index 44d87fbacc..f96e6c603c 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/DisconnectedScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/DisconnectedScreenMixin.java @@ -78,6 +78,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); + ConnectScreen.connect(new TitleScreen(), mc, lastServer.left(), lastServer.right(), false, null); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/DrawContextMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/DrawContextMixin.java index 52d2aa8e69..904d377e5c 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/DrawContextMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/DrawContextMixin.java @@ -23,7 +23,7 @@ import java.util.function.Consumer; @Mixin(value = DrawContext.class) -public class DrawContextMixin { +public abstract class DrawContextMixin { @Inject(method = "drawTooltip(Lnet/minecraft/client/font/TextRenderer;Ljava/util/List;Ljava/util/Optional;II)V", at = @At(value = "INVOKE", target = "Ljava/util/Optional;ifPresent(Ljava/util/function/Consumer;)V", shift = At.Shift.BEFORE), locals = LocalCapture.CAPTURE_FAILHARD) private void onDrawTooltip(TextRenderer textRenderer, List text, Optional data, int x, int y, CallbackInfo ci, List list) { if (data.isPresent() && data.get() instanceof MeteorTooltipData meteorTooltipData) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/EnchantingTableBlockEntityRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/EnchantingTableBlockEntityRendererMixin.java index f429468f36..d17f55bb69 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/EnchantingTableBlockEntityRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/EnchantingTableBlockEntityRendererMixin.java @@ -5,7 +5,7 @@ package meteordevelopment.meteorclient.mixin; -import com.llamalad7.mixinextras.injector.WrapWithCondition; +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.NoRender; import net.minecraft.client.render.VertexConsumer; @@ -16,7 +16,7 @@ import org.spongepowered.asm.mixin.injection.At; @Mixin(EnchantingTableBlockEntityRenderer.class) -public class EnchantingTableBlockEntityRendererMixin { +public abstract class EnchantingTableBlockEntityRendererMixin { @WrapWithCondition(method = "render(Lnet/minecraft/block/entity/EnchantingTableBlockEntity;FLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;II)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/entity/model/BookModel;renderBook(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumer;IIFFFF)V")) private boolean onRenderBookModelRenderProxy(BookModel model, MatrixStack matrixStack, VertexConsumer vertexConsumer, int i, int j, float f, float g, float h, float k) { return !Modules.get().get(NoRender.class).noEnchTableBook(); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/EntityAttributeInstanceMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/EntityAttributeInstanceMixin.java deleted file mode 100644 index 58cf2eb80c..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/EntityAttributeInstanceMixin.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.mixininterface.IEntityAttributeInstance; -import net.minecraft.entity.attribute.EntityAttributeInstance; -import net.minecraft.entity.attribute.EntityAttributeModifier; -import org.jetbrains.annotations.Nullable; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; - -import java.util.Map; -import java.util.Set; -import java.util.UUID; - -@Mixin(EntityAttributeInstance.class) -public abstract class EntityAttributeInstanceMixin implements IEntityAttributeInstance { - @Shadow @Final private Map idToModifiers; - @Shadow @Final private Set persistentModifiers; - @Shadow public abstract Set getModifiers(EntityAttributeModifier.Operation operation); - @Shadow protected abstract void onUpdate(); - - @Override - public void meteor$copyFrom(EntityAttributeInstance other) { - for (var modifier : other.getModifiers()) { - @Nullable EntityAttributeModifier old = idToModifiers.put(modifier.getId(), modifier); - if (old != null) { - getModifiers(old.getOperation()).remove(old); - persistentModifiers.remove(old); - } - getModifiers(modifier.getOperation()).add(modifier); - } - onUpdate(); - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/EntityEffectParticleEffectAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/EntityEffectParticleEffectAccessor.java new file mode 100644 index 0000000000..e071573e53 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/EntityEffectParticleEffectAccessor.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.particle.EntityEffectParticleEffect; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(EntityEffectParticleEffect.class) +public interface EntityEffectParticleEffectAccessor { + @Accessor + int getColor(); +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/EntityRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/EntityRendererMixin.java index d7d227aedc..4409222e3d 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/EntityRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/EntityRendererMixin.java @@ -36,12 +36,12 @@ public abstract class EntityRendererMixin implements IEntityRe public abstract Identifier getTexture(Entity entity); @Inject(method = "renderLabelIfPresent", at = @At("HEAD"), cancellable = true) - private void onRenderLabel(T entity, Text text, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, CallbackInfo info) { - if (PostProcessShaders.rendering) info.cancel(); - if (Modules.get().get(NoRender.class).noNametags()) info.cancel(); + private void onRenderLabel(T entity, Text text, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, float tickDelta, CallbackInfo ci) { + if (PostProcessShaders.rendering) ci.cancel(); + if (Modules.get().get(NoRender.class).noNametags()) ci.cancel(); if (!(entity instanceof PlayerEntity)) return; if (Modules.get().get(Nametags.class).playerNametags() && !(EntityUtils.getGameMode((PlayerEntity) entity) == null && Modules.get().get(Nametags.class).excludeBots())) - info.cancel(); + ci.cancel(); } @Inject(method = "shouldRender", at = @At("HEAD"), cancellable = true) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ExplosionMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ExplosionMixin.java index 7e8a98d5a7..249df8bc33 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ExplosionMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ExplosionMixin.java @@ -19,7 +19,7 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; @Mixin(Explosion.class) -public class ExplosionMixin implements IExplosion { +public abstract class ExplosionMixin implements IExplosion { @Shadow @Final @Mutable private World world; @Shadow @Final @Mutable @Nullable private Entity entity; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ExplosionS2CPacketMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ExplosionS2CPacketMixin.java index 1a36efd412..e837f1aaaa 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ExplosionS2CPacketMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ExplosionS2CPacketMixin.java @@ -13,7 +13,7 @@ import org.spongepowered.asm.mixin.Shadow; @Mixin(ExplosionS2CPacket.class) -public class ExplosionS2CPacketMixin implements IExplosionS2CPacket { +public abstract class ExplosionS2CPacketMixin implements IExplosionS2CPacket { @Shadow @Final @Mutable private float playerVelocityX; @Shadow @Final @Mutable private float playerVelocityY; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/FireworksSparkParticleMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/FireworksSparkParticleMixin.java index d486d8e346..a87d415071 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/FireworksSparkParticleMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/FireworksSparkParticleMixin.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.mixin; +import it.unimi.dsi.fastutil.ints.IntList; import net.minecraft.client.particle.FireworksSparkParticle; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -13,9 +14,9 @@ import org.spongepowered.asm.mixin.injection.callback.LocalCapture; @Mixin(FireworksSparkParticle.FireworkParticle.class) -public class FireworksSparkParticleMixin { +public abstract class FireworksSparkParticleMixin { @Inject(method = "addExplosionParticle", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/FireworksSparkParticle$Explosion;setTrail(Z)V"), cancellable = true, locals = LocalCapture.CAPTURE_FAILSOFT) - private void onAddExplosion(double x, double y, double z, double velocityX, double velocityY, double velocityZ, int[] colors, int[] fadeColors, boolean trail, boolean flicker, CallbackInfo info, FireworksSparkParticle.Explosion explosion) { + 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, FireworksSparkParticle.Explosion explosion) { if (explosion == null) info.cancel(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/FireworksSparkParticleSubMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/FireworksSparkParticleSubMixin.java index 0a6cc1e2e6..4f99f06fc0 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/FireworksSparkParticleSubMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/FireworksSparkParticleSubMixin.java @@ -16,7 +16,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(value = {FireworksSparkParticle.Explosion.class, FireworksSparkParticle.Flash.class}) -public class FireworksSparkParticleSubMixin { +public abstract class FireworksSparkParticleSubMixin { @Inject(method = "buildGeometry", at = @At("HEAD"), cancellable = true) private void buildExplosionGeometry(VertexConsumer vertexConsumer, Camera camera, float tickDelta, CallbackInfo info) { if (Modules.get().get(NoRender.class).noFireworkExplosions()) info.cancel(); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/FishingBobberEntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/FishingBobberEntityMixin.java index 01cc2d60e3..5aa409b185 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/FishingBobberEntityMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/FishingBobberEntityMixin.java @@ -17,7 +17,7 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; @Mixin(FishingBobberEntity.class) -public class FishingBobberEntityMixin { +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.getWorld().isClient || entity != mc.player) 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 e54bc17f84..53dab9cadd 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/FluidRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/FluidRendererMixin.java @@ -23,7 +23,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(FluidRenderer.class) -public class FluidRendererMixin { +public abstract class FluidRendererMixin { @Unique private final ThreadLocal alphas = new ThreadLocal<>(); @Inject(method = "render", at = @At("HEAD"), cancellable = true) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/FoliageColorsMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/FoliageColorsMixin.java index f27714a9a6..bc1e7e2282 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/FoliageColorsMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/FoliageColorsMixin.java @@ -13,7 +13,7 @@ import org.spongepowered.asm.mixin.injection.At; @Mixin(FoliageColors.class) -public class FoliageColorsMixin { +public abstract class FoliageColorsMixin { @ModifyReturnValue(method = "getBirchColor", at = @At("RETURN")) private static int onGetBirchColor(int original) { diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/GameOptionsMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/GameOptionsMixin.java index 632785a171..1b98414e94 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/GameOptionsMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/GameOptionsMixin.java @@ -26,7 +26,7 @@ import java.io.File; @Mixin(GameOptions.class) -public class GameOptionsMixin { +public abstract class GameOptionsMixin { @Shadow @Final @Mutable public KeyBinding[] allKeys; @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)) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java index da6f192634..5eeb4c42ad 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java @@ -15,7 +15,6 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.player.LiquidInteract; import meteordevelopment.meteorclient.systems.modules.player.NoMiningTrace; -import meteordevelopment.meteorclient.systems.modules.player.Reach; import meteordevelopment.meteorclient.systems.modules.render.Freecam; import meteordevelopment.meteorclient.systems.modules.render.NoRender; import meteordevelopment.meteorclient.systems.modules.render.Zoom; @@ -31,44 +30,87 @@ import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.util.hit.HitResult; -import org.joml.Matrix3f; import org.joml.Matrix4f; 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.*; +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.LocalCapture; @Mixin(GameRenderer.class) public abstract class GameRendererMixin { - @Shadow @Final MinecraftClient client; + @Shadow + @Final + MinecraftClient client; - @Shadow public abstract void updateTargetedEntity(float tickDelta); + @Shadow + public abstract void updateCrosshairTarget(float tickDelta); - @Shadow public abstract void reset(); + @Shadow + public abstract void reset(); - @Shadow @Final private Camera camera; - @Unique private Renderer3D renderer; + @Shadow + @Final + private Camera camera; - @Inject(method = "renderWorld", at = @At(value = "INVOKE_STRING", target = "Lnet/minecraft/util/profiler/Profiler;swap(Ljava/lang/String;)V", args = { "ldc=hand" }), locals = LocalCapture.CAPTURE_FAILEXCEPTION) - private void onRenderWorld(float tickDelta, long limitTime, MatrixStack matrices, CallbackInfo ci, boolean bl, Camera camera, Entity entity, MatrixStack matrixStack, double d, float f, float g, Matrix4f matrix4f, Matrix3f matrix3f) { + @Shadow + protected abstract void bobView(MatrixStack matrices, float tickDelta); + + @Shadow + protected abstract void tiltViewWhenHurt(MatrixStack matrices, float tickDelta); + + @Unique + private Renderer3D renderer; + + @Unique + private final MatrixStack matrices = new MatrixStack(); + + // FIXME: unsure + @Inject(method = "renderWorld", at = @At(value = "INVOKE_STRING", target = "Lnet/minecraft/util/profiler/Profiler;swap(Ljava/lang/String;)V", args = {"ldc=hand"}), locals = LocalCapture.CAPTURE_FAILEXCEPTION) + private void onRenderWorld(float tickDelta, long limitTime, CallbackInfo ci, boolean bl, Camera camera, Entity entity, double d, Matrix4f matrix4f, MatrixStack matrixStack, float f, float g, Matrix4f matrix4f2) { if (!Utils.canUpdate()) return; client.getProfiler().push(MeteorClient.MOD_ID + "_render"); + // Create renderer and event + if (renderer == null) renderer = new Renderer3D(); - Render3DEvent event = Render3DEvent.get(matrices, renderer, tickDelta, camera.getPos().x, camera.getPos().y, camera.getPos().z); + Render3DEvent event = Render3DEvent.get(matrixStack, renderer, tickDelta, camera.getPos().x, camera.getPos().y, camera.getPos().z); + + // Call utility classes RenderUtils.updateScreenCenter(); - NametagUtils.onRender(matrices, matrix4f); + NametagUtils.onRender(matrix4f2); + + // Update model view matrix + + RenderSystem.getModelViewStack().pushMatrix().mul(matrix4f2); + + matrices.push(); + + tiltViewWhenHurt(matrices, camera.getLastTickDelta()); + if (client.options.getBobView().getValue()) bobView(matrices, camera.getLastTickDelta()); + + RenderSystem.getModelViewStack().mul(matrices.peek().getPositionMatrix().invert()); + matrices.pop(); + + RenderSystem.applyModelViewMatrix(); + + // Render renderer.begin(); MeteorClient.EVENT_BUS.post(event); - renderer.render(matrices); + renderer.render(matrixStack); + // Revert model view matrix + + RenderSystem.getModelViewStack().popMatrix(); RenderSystem.applyModelViewMatrix(); + client.getProfiler().pop(); } @@ -77,7 +119,7 @@ private void onRenderWorldTail(CallbackInfo info) { MeteorClient.EVENT_BUS.post(RenderAfterWorldEvent.get()); } - @Inject(method = "updateTargetedEntity", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/projectile/ProjectileUtil;raycast(Lnet/minecraft/entity/Entity;Lnet/minecraft/util/math/Vec3d;Lnet/minecraft/util/math/Vec3d;Lnet/minecraft/util/math/Box;Ljava/util/function/Predicate;D)Lnet/minecraft/util/hit/EntityHitResult;"), cancellable = true) + @Inject(method = "updateCrosshairTarget", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/GameRenderer;findCrosshairTarget(Lnet/minecraft/entity/Entity;DDF)Lnet/minecraft/util/hit/HitResult;"), cancellable = true) private void onUpdateTargetedEntity(float tickDelta, CallbackInfo info) { if (Modules.get().get(NoMiningTrace.class).canWork() && client.crosshairTarget.getType() == HitResult.Type.BLOCK) { client.getProfiler().pop(); @@ -85,7 +127,7 @@ private void onUpdateTargetedEntity(float tickDelta, CallbackInfo info) { } } - @Redirect(method = "updateTargetedEntity", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;raycast(DFZ)Lnet/minecraft/util/hit/HitResult;")) + @Redirect(method = "findCrosshairTarget", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;raycast(DFZ)Lnet/minecraft/util/hit/HitResult;")) private HitResult updateTargetedEntityEntityRayTraceProxy(Entity entity, double maxDistance, float tickDelta, boolean includeFluids) { if (Modules.get().isActive(LiquidInteract.class)) { HitResult result = entity.raycast(maxDistance, tickDelta, includeFluids); @@ -110,9 +152,10 @@ private float applyCameraTransformationsMathHelperLerpProxy(float original) { // Freecam + @Unique private boolean freecamSet = false; - @Inject(method = "updateTargetedEntity", at = @At("HEAD"), cancellable = true) + @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); @@ -135,8 +178,7 @@ private void updateTargetedEntityInvoke(float tickDelta, CallbackInfo info) { if (highwayBuilder) { cameraE.setYaw(camera.getYaw()); cameraE.setPitch(camera.getPitch()); - } - else { + } else { ((IVec3d) cameraE.getPos()).set(freecam.pos.x, freecam.pos.y - cameraE.getEyeHeight(cameraE.getPose()), freecam.pos.z); cameraE.prevX = freecam.prevPos.x; cameraE.prevY = freecam.prevPos.y - cameraE.getEyeHeight(cameraE.getPose()); @@ -148,7 +190,7 @@ private void updateTargetedEntityInvoke(float tickDelta, CallbackInfo info) { } freecamSet = true; - updateTargetedEntity(tickDelta); + updateCrosshairTarget(tickDelta); freecamSet = false; ((IVec3d) cameraE.getPos()).set(x, y, z); @@ -163,20 +205,9 @@ private void updateTargetedEntityInvoke(float tickDelta, CallbackInfo info) { } @Inject(method = "renderHand", at = @At("HEAD"), cancellable = true) - private void renderHand(MatrixStack matrices, Camera camera, float tickDelta, CallbackInfo info) { + private void renderHand(Camera camera, float tickDelta, Matrix4f matrix4f, CallbackInfo ci) { if (!Modules.get().get(Freecam.class).renderHands() || !Modules.get().get(Zoom.class).renderHands()) - info.cancel(); - } - - @ModifyConstant(method = "updateTargetedEntity", constant = @Constant(doubleValue = 6)) - private double updateTargetedEntityModifySurvivalReach(double d) { - return Modules.get().get(Reach.class).entityReach(); - } - - @ModifyConstant(method = "updateTargetedEntity", constant = @Constant(doubleValue = 9)) - private double updateTargetedEntityModifySquaredMaxReach(double d) { - Reach reach = Modules.get().get(Reach.class); - return reach.entityReach() * reach.entityReach(); + ci.cancel(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/HandledScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/HandledScreenMixin.java index 18a7658299..66072bc939 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/HandledScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/HandledScreenMixin.java @@ -21,9 +21,11 @@ import net.minecraft.screen.slot.Slot; import net.minecraft.screen.slot.SlotActionType; import net.minecraft.text.Text; +import org.jetbrains.annotations.Nullable; import org.lwjgl.glfw.GLFW; 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; @@ -34,19 +36,28 @@ @Mixin(HandledScreen.class) public abstract class HandledScreenMixin extends Screen implements ScreenHandlerProvider { - @Shadow protected Slot focusedSlot; + @Shadow + protected Slot focusedSlot; - @Shadow protected int x; - @Shadow protected int y; + @Shadow + protected int x; + @Shadow + protected int y; - @Shadow @org.jetbrains.annotations.Nullable protected abstract Slot getSlotAt(double xPosition, double yPosition); + @Shadow + @Nullable + protected abstract Slot getSlotAt(double xPosition, double yPosition); - @Shadow public abstract T getScreenHandler(); + @Shadow + public abstract T getScreenHandler(); - @Shadow private boolean doubleClicking; + @Shadow + private boolean doubleClicking; - @Shadow protected abstract void onMouseClick(Slot slot, int invSlot, int clickData, SlotActionType actionType); + @Shadow + protected abstract void onMouseClick(Slot slot, int invSlot, int clickData, SlotActionType actionType); + @Unique private static final ItemStack[] ITEMS = new ItemStack[27]; public HandledScreenMixin(Text title) { @@ -60,14 +71,14 @@ private void onInit(CallbackInfo info) { if (invTweaks.isActive() && invTweaks.showButtons() && invTweaks.canSteal(getScreenHandler())) { addDrawableChild( new ButtonWidget.Builder(Text.literal("Steal"), button -> invTweaks.steal(getScreenHandler())) - .position(width / 2 - 41, 3) + .position(x, y - 22) .size(40, 20) .build() ); addDrawableChild( new ButtonWidget.Builder(Text.literal("Dump"), button -> invTweaks.dump(getScreenHandler())) - .position(width / 2 + 2, 3) + .position(x + 42, y - 22) .size(40, 20) .build() ); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/InGameHudMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/InGameHudMixin.java index c6dc40d4ce..ec05796a14 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/InGameHudMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/InGameHudMixin.java @@ -17,8 +17,6 @@ import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.hud.InGameHud; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.client.option.Perspective; import net.minecraft.entity.Entity; import net.minecraft.scoreboard.ScoreboardObjective; import org.spongepowered.asm.mixin.Final; @@ -32,10 +30,6 @@ @Mixin(InGameHud.class) public abstract class InGameHudMixin { - @Shadow private int scaledWidth; - - @Shadow private int scaledHeight; - @Shadow @Final private MinecraftClient client; @Shadow public abstract void clear(); @@ -46,7 +40,7 @@ private void onRender(DrawContext context, float tickDelta, CallbackInfo ci) { Utils.unscaledProjection(); - MeteorClient.EVENT_BUS.post(Render2DEvent.get(context, scaledWidth, scaledHeight, tickDelta)); + MeteorClient.EVENT_BUS.post(Render2DEvent.get(context, context.getScaledWindowWidth(), context.getScaledWindowWidth(), tickDelta)); Utils.scaledProjection(); RenderSystem.applyModelViewMatrix(); @@ -64,12 +58,12 @@ private void onRenderPortalOverlay(DrawContext context, float nauseaStrength, Ca if (Modules.get().get(NoRender.class).noPortalOverlay()) ci.cancel(); } - @ModifyArgs(method = "render", 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)) + @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 = "render", 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)) + @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); } @@ -79,11 +73,16 @@ private void onRenderVignetteOverlay(DrawContext context, Entity entity, Callbac if (Modules.get().get(NoRender.class).noVignette()) ci.cancel(); } - @Inject(method = "renderScoreboardSidebar", at = @At("HEAD"), cancellable = true) + @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;F)V", at = @At("HEAD"), cancellable = true) + private void onRenderScoreboardSidebar(DrawContext context, float tickDelta, 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(); @@ -95,7 +94,7 @@ private boolean alwaysRenderCrosshairInFreecam(boolean firstPerson) { } @Inject(method = "renderCrosshair", at = @At("HEAD"), cancellable = true) - private void onRenderCrosshair(DrawContext context, CallbackInfo ci) { + private void onRenderCrosshair(DrawContext context, float tickDelta, CallbackInfo ci) { if (Modules.get().get(NoRender.class).noCrosshair()) ci.cancel(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/InGameOverlayRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/InGameOverlayRendererMixin.java index 7a0dbdfa0c..402975e34d 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/InGameOverlayRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/InGameOverlayRendererMixin.java @@ -17,7 +17,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(InGameOverlayRenderer.class) -public class InGameOverlayRendererMixin { +public abstract class InGameOverlayRendererMixin { @Inject(method = "renderFireOverlay", at = @At("HEAD"), cancellable = true) private static void onRenderFireOverlay(MinecraftClient minecraftClient, MatrixStack matrixStack, CallbackInfo info) { if (Modules.get().get(NoRender.class).noFireOverlay()) info.cancel(); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ItemEntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ItemEntityMixin.java index 0819c38866..c24f735bed 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ItemEntityMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ItemEntityMixin.java @@ -9,9 +9,11 @@ import net.minecraft.entity.ItemEntity; import net.minecraft.util.math.Vec3d; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; @Mixin(ItemEntity.class) -public class ItemEntityMixin implements IItemEntity { +public abstract class ItemEntityMixin implements IItemEntity { + @Unique private Vec3d rotation = new Vec3d(0, 0, 0); @Override diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ItemMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ItemMixin.java index c608ec1586..9a0971069a 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ItemMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ItemMixin.java @@ -18,7 +18,7 @@ import java.util.Optional; @Mixin(Item.class) -public class ItemMixin { +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)); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ItemRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ItemRendererMixin.java index fca37ed5ad..039cc037ee 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ItemRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ItemRendererMixin.java @@ -23,7 +23,7 @@ import org.spongepowered.asm.mixin.injection.invoke.arg.Args; @Mixin(ItemRenderer.class) -public class ItemRendererMixin { +public abstract class ItemRendererMixin { @ModifyArgs( method = "renderItem(Lnet/minecraft/item/ItemStack;Lnet/minecraft/client/render/model/json/ModelTransformationMode;ZLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;IILnet/minecraft/client/render/model/BakedModel;)V", at = @At( diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ItemStackMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ItemStackMixin.java index f48799196e..370aca9ebf 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ItemStackMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ItemStackMixin.java @@ -10,11 +10,8 @@ import meteordevelopment.meteorclient.events.entity.player.FinishUsingItemEvent; import meteordevelopment.meteorclient.events.entity.player.StoppedUsingItemEvent; import meteordevelopment.meteorclient.events.game.ItemStackTooltipEvent; -import meteordevelopment.meteorclient.events.game.SectionVisibleEvent; import meteordevelopment.meteorclient.utils.Utils; -import net.minecraft.client.item.TooltipContext; import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.text.Text; import net.minecraft.world.World; @@ -31,7 +28,7 @@ @Mixin(ItemStack.class) public abstract class ItemStackMixin { @ModifyReturnValue(method = "getTooltip", at = @At("RETURN")) - private List onGetTooltip(List original, PlayerEntity player, TooltipContext context) { + private List onGetTooltip(List original) { if (Utils.canUpdate()) { ItemStackTooltipEvent event = MeteorClient.EVENT_BUS.post(ItemStackTooltipEvent.get((ItemStack) (Object) this, original)); return event.list; @@ -53,10 +50,4 @@ private void onStoppedUsing(World world, LivingEntity user, int remainingUseTick MeteorClient.EVENT_BUS.post(StoppedUsingItemEvent.get((ItemStack) (Object) this)); } } - - @ModifyReturnValue(method = "isSectionVisible", at = @At("RETURN")) - private static boolean onSectionVisible(boolean original, int flags, ItemStack.TooltipSection tooltipSection) { - SectionVisibleEvent event = MeteorClient.EVENT_BUS.post(SectionVisibleEvent.get(tooltipSection, original)); - return event.visible; - } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/KeyboardInputMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/KeyboardInputMixin.java index e6acfcbfef..83c38782e3 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/KeyboardInputMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/KeyboardInputMixin.java @@ -15,7 +15,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(KeyboardInput.class) -public class KeyboardInputMixin extends Input { +public abstract class KeyboardInputMixin extends Input { @Inject(method = "tick", at = @At("TAIL")) private void isPressed(boolean slowDown, float f, CallbackInfo ci) { if (Modules.get().get(Sneak.class).doVanilla()) sneaking = true; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LightmapTextureManagerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LightmapTextureManagerMixin.java index 2872b3d765..a55a800623 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/LightmapTextureManagerMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LightmapTextureManagerMixin.java @@ -18,7 +18,7 @@ import org.spongepowered.asm.mixin.injection.invoke.arg.Args; @Mixin(LightmapTextureManager.class) -public class LightmapTextureManagerMixin { +public abstract class LightmapTextureManagerMixin { @ModifyArgs(method = "update", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/texture/NativeImage;setColor(III)V")) private void update(Args args) { if (Modules.get().get(Fullbright.class).getGamma() || Modules.get().isActive(Xray.class)) { diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LightningEntityRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LightningEntityRendererMixin.java index fd7e1e2f8e..a8bbb09df0 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/LightningEntityRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LightningEntityRendererMixin.java @@ -17,7 +17,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(LightningEntityRenderer.class) -public class LightningEntityRendererMixin { +public abstract class LightningEntityRendererMixin { /** * @author Walaryne */ diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityAccessor.java index 63d613eeec..2b8e2046d6 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityAccessor.java @@ -8,11 +8,14 @@ import net.minecraft.entity.LivingEntity; import net.minecraft.entity.data.TrackedData; import net.minecraft.fluid.Fluid; +import net.minecraft.particle.ParticleEffect; import net.minecraft.registry.tag.TagKey; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.gen.Invoker; +import java.util.List; + @Mixin(LivingEntity.class) public interface LivingEntityAccessor { @Invoker("swimUpward") @@ -26,14 +29,4 @@ public interface LivingEntityAccessor { @Accessor("jumpingCooldown") void setJumpCooldown(int cooldown); - - @Accessor("POTION_SWIRLS_COLOR") - static TrackedData meteor$getPotionSwirlsColor() { - throw new AssertionError(); - } - - @Accessor("POTION_SWIRLS_AMBIENT") - static TrackedData meteor$getPotionSwirlsAmbient() { - throw new AssertionError(); - } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java index 5b5f763453..e11f9e9b0c 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java @@ -18,6 +18,7 @@ import meteordevelopment.meteorclient.systems.modules.render.HandView; import meteordevelopment.meteorclient.systems.modules.render.NoRender; import meteordevelopment.meteorclient.utils.Utils; +import net.minecraft.component.DataComponentTypes; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; import net.minecraft.entity.EquipmentSlot; @@ -25,14 +26,15 @@ import net.minecraft.entity.damage.DamageSource; import net.minecraft.entity.effect.StatusEffect; import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffects; 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 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.*; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @@ -65,18 +67,10 @@ private boolean onCanWalkOnFluid(boolean original, FluidState fluidState) { return event.walkOnFluid; } - @Redirect(method = "travel", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;hasNoGravity()Z")) - private boolean travelHasNoGravityProxy(LivingEntity self) { - if (activeStatusEffects.containsKey(StatusEffects.LEVITATION) && Modules.get().get(PotionSpoof.class).shouldBlock(StatusEffects.LEVITATION)) { - return !Modules.get().get(PotionSpoof.class).applyGravity.get(); - } - return self.hasNoGravity(); - } - @Inject(method = "spawnItemParticles", at = @At("HEAD"), cancellable = true) private void spawnItemParticles(ItemStack stack, int count, CallbackInfo info) { NoRender noRender = Modules.get().get(NoRender.class); - if (noRender.noEatParticles() && stack.isFood()) info.cancel(); + if (noRender.noEatParticles() && stack.getComponents().contains(DataComponentTypes.FOOD)) info.cancel(); } @Inject(method = "onEquipStack", at = @At("HEAD"), cancellable = true) @@ -111,6 +105,7 @@ private boolean isFallFlyingHook(boolean original) { return original; } + @Unique private boolean previousElytra = false; @Inject(method = "isFallFlying", at = @At("TAIL"), cancellable = true) @@ -124,8 +119,8 @@ public void recastOnLand(CallbackInfoReturnable cir) { } @ModifyReturnValue(method = "hasStatusEffect", at = @At("RETURN")) - private boolean hasStatusEffect(boolean original, StatusEffect effect) { - if (Modules.get().get(PotionSpoof.class).shouldBlock(effect)) return false; + private boolean hasStatusEffect(boolean original, RegistryEntry effect) { + if (Modules.get().get(PotionSpoof.class).shouldBlock(effect.value())) return false; return original; } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityRendererMixin.java index a69f012d37..8d86e3a5cf 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityRendererMixin.java @@ -21,7 +21,6 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.scoreboard.AbstractTeam; import net.minecraft.scoreboard.Team; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MapRendererAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/MapRendererAccessor.java index 33d3461119..d2565ef54d 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/MapRendererAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/MapRendererAccessor.java @@ -6,6 +6,7 @@ package meteordevelopment.meteorclient.mixin; import net.minecraft.client.render.MapRenderer; +import net.minecraft.component.type.MapIdComponent; import net.minecraft.item.map.MapState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; @@ -13,5 +14,5 @@ @Mixin(MapRenderer.class) public interface MapRendererAccessor { @Invoker("getMapTexture") - MapRenderer.MapTexture invokeGetMapTexture(int id, MapState state); + MapRenderer.MapTexture invokeGetMapTexture(MapIdComponent id, MapState state); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MapRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/MapRendererMixin.java index c123142c41..0394134d7e 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/MapRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/MapRendererMixin.java @@ -10,14 +10,14 @@ import meteordevelopment.meteorclient.systems.modules.render.NoRender; import meteordevelopment.meteorclient.utils.misc.EmptyIterator; import net.minecraft.client.render.MapRenderer; -import net.minecraft.item.map.MapIcon; +import net.minecraft.item.map.MapDecoration; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @Mixin(MapRenderer.MapTexture.class) -public class MapRendererMixin { - @ModifyExpressionValue(method = "draw(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;ZI)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/map/MapState;getIcons()Ljava/lang/Iterable;")) - private Iterable getIconsProxy(Iterable original) { +public abstract class MapRendererMixin { + @ModifyExpressionValue(method = "draw(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;ZI)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/map/MapState;getDecorations()Ljava/lang/Iterable;")) + private Iterable getIconsProxy(Iterable original) { return (Modules.get().get(NoRender.class).noMapMarkers()) ? EmptyIterator::new : original; } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MessageHandlerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/MessageHandlerMixin.java index ef2ef3f283..6643158efc 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/MessageHandlerMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/MessageHandlerMixin.java @@ -20,7 +20,7 @@ import java.time.Instant; @Mixin(MessageHandler.class) -public class MessageHandlerMixin implements IMessageHandler { +public abstract class MessageHandlerMixin implements IMessageHandler { @Unique private GameProfile sender; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftClientMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftClientMixin.java index 94c0bad093..dc829daf43 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftClientMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftClientMixin.java @@ -111,8 +111,8 @@ private void onDoItemUse(CallbackInfo info) { doItemUseCalled = true; } - @Inject(method = "disconnect(Lnet/minecraft/client/gui/screen/Screen;)V", at = @At("HEAD")) - private void onDisconnect(Screen screen, CallbackInfo info) { + @Inject(method = "disconnect(Lnet/minecraft/client/gui/screen/Screen;Z)V", at = @At("HEAD")) + private void onDisconnect(Screen screen, boolean transferring, CallbackInfo info) { if (world != null) { MeteorClient.EVENT_BUS.post(GameLeftEvent.get()); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MobSpawnerBlockEntityRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/MobSpawnerBlockEntityRendererMixin.java index 6f6313d1b9..7cce6558a6 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/MobSpawnerBlockEntityRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/MobSpawnerBlockEntityRendererMixin.java @@ -14,7 +14,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(MobSpawnerBlockEntityRenderer.class) -public class MobSpawnerBlockEntityRendererMixin { +public abstract class MobSpawnerBlockEntityRendererMixin { @Inject(method = "render(Lnet/minecraft/block/entity/MobSpawnerBlockEntity;FLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;II)V", at = @At("HEAD"), cancellable = true) private void onRender(CallbackInfo ci) { if (Modules.get().get(NoRender.class).noMobInSpawner()) ci.cancel(); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MouseMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/MouseMixin.java index 9feb07814a..d9b5fcf5de 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/MouseMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/MouseMixin.java @@ -30,7 +30,7 @@ import static org.lwjgl.glfw.GLFW.GLFW_RELEASE; @Mixin(Mouse.class) -public class MouseMixin { +public abstract class MouseMixin { @Shadow @Final private MinecraftClient client; @Inject(method = "onMouseButton", at = @At("HEAD"), cancellable = true) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MultiplayerScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/MultiplayerScreenMixin.java index 33de30691b..d206b5fd8c 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/MultiplayerScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/MultiplayerScreenMixin.java @@ -11,15 +11,13 @@ import meteordevelopment.meteorclient.systems.proxies.Proxies; import meteordevelopment.meteorclient.systems.proxies.Proxy; import meteordevelopment.meteorclient.utils.render.color.Color; -import net.minecraft.client.font.TextRenderer; 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.client.render.BufferBuilder; -import net.minecraft.client.render.VertexConsumerProvider; 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.CallbackInfo; @@ -27,11 +25,15 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; @Mixin(MultiplayerScreen.class) -public class MultiplayerScreenMixin extends Screen { +public abstract class MultiplayerScreenMixin extends Screen { + @Unique private int textColor1; + @Unique private int textColor2; + @Unique private String loggedInAs; + @Unique private int loggedInAsLength; public MultiplayerScreenMixin(Text title) { diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MutableTextMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/MutableTextMixin.java index 0c28c3023c..e5a84e3e70 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/MutableTextMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/MutableTextMixin.java @@ -13,7 +13,7 @@ import org.spongepowered.asm.mixin.Shadow; @Mixin(MutableText.class) -public class MutableTextMixin implements IText { +public abstract class MutableTextMixin implements IText { @Shadow private @Nullable Language language; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PacketByteBufMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/PacketByteBufMixin.java index 2a6083c6bf..b0007ab418 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PacketByteBufMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/PacketByteBufMixin.java @@ -15,8 +15,8 @@ @Mixin(PacketByteBuf.class) public abstract class PacketByteBufMixin { - @ModifyArg(method = "readNbt()Lnet/minecraft/nbt/NbtCompound;", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/PacketByteBuf;readNbt(Lnet/minecraft/nbt/NbtSizeTracker;)Lnet/minecraft/nbt/NbtElement;")) - private NbtSizeTracker xlPackets(NbtSizeTracker sizeTracker) { + @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; } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerArmorSlotMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerArmorSlotMixin.java index b6233dbbe9..d4f3bac608 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerArmorSlotMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerArmorSlotMixin.java @@ -14,7 +14,7 @@ import org.spongepowered.asm.mixin.injection.At; @Mixin(targets = "net/minecraft/screen/PlayerScreenHandler$1") -public class PlayerArmorSlotMixin { +public abstract class PlayerArmorSlotMixin { @ModifyReturnValue(method = "getMaxItemCount", at = @At("RETURN")) private int onGetMaxItemCount(int original) { if (Modules.get().get(InventoryTweaks.class).armorStorage()) return 64; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityMixin.java index 66916b2273..a135ee99e0 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityMixin.java @@ -14,6 +14,7 @@ import meteordevelopment.meteorclient.systems.modules.movement.Flight; import meteordevelopment.meteorclient.systems.modules.movement.NoSlow; import meteordevelopment.meteorclient.systems.modules.movement.Scaffold; +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; @@ -111,4 +112,15 @@ private void onGetOffGroundSpeed(CallbackInfoReturnable info) { float speed = Modules.get().get(Flight.class).getOffGroundSpeed(); if (speed != -1) info.setReturnValue(speed); } + + + @ModifyReturnValue(method = "getBlockInteractionRange", at = @At("RETURN")) + private double modifyBlockInteractionRange(double original) { + return Modules.get().get(Reach.class).blockReach(); + } + + @ModifyReturnValue(method = "getEntityInteractionRange", at = @At("RETURN")) + private double modifyEntityInteractionRange(double original) { + return 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 index 434a79f3d7..44e999799c 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityRendererMixin.java @@ -24,7 +24,7 @@ import org.spongepowered.asm.mixin.injection.invoke.arg.Args; @Mixin(PlayerEntityRenderer.class) -public class PlayerEntityRendererMixin { +public abstract class PlayerEntityRendererMixin { @ModifyArgs(method = "renderArm", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/model/ModelPart;render(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumer;II)V", ordinal = 0)) private void modifyRenderLayer(Args args, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, AbstractClientPlayerEntity player, ModelPart arm, ModelPart sleeve) { Chams chams = Modules.get().get(Chams.class); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerInteractEntityC2SPacketMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerInteractEntityC2SPacketMixin.java index 54cd77cbd9..4e919c46fe 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerInteractEntityC2SPacketMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerInteractEntityC2SPacketMixin.java @@ -20,7 +20,7 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; @Mixin(PlayerInteractEntityC2SPacket.class) -public class PlayerInteractEntityC2SPacketMixin implements IPlayerInteractEntityC2SPacket { +public abstract class PlayerInteractEntityC2SPacketMixin implements IPlayerInteractEntityC2SPacket { @Shadow @Final private PlayerInteractEntityC2SPacket.InteractTypeHandler type; @Shadow @Final private int entityId; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerMoveC2SPacketMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerMoveC2SPacketMixin.java index fdec8b5d5d..c7cf3a4e91 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerMoveC2SPacketMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerMoveC2SPacketMixin.java @@ -11,7 +11,7 @@ import org.spongepowered.asm.mixin.Unique; @Mixin(PlayerMoveC2SPacket.class) -public class PlayerMoveC2SPacketMixin implements IPlayerMoveC2SPacket { +public abstract class PlayerMoveC2SPacketMixin implements IPlayerMoveC2SPacket { @Unique private int tag; @Override diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PowderSnowBlockMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/PowderSnowBlockMixin.java index 62161b7a3b..4b879762f5 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PowderSnowBlockMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/PowderSnowBlockMixin.java @@ -16,7 +16,7 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; @Mixin(PowderSnowBlock.class) -public class PowderSnowBlockMixin { +public abstract class PowderSnowBlockMixin { @ModifyReturnValue(method = "canWalkOnPowderSnow", at = @At("RETURN")) private static boolean onCanWalkOnPowderSnow(boolean original, Entity entity) { if (entity == mc.player && Modules.get().get(Jesus.class).canWalkOnPowderSnow()) return true; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/RaycastContextMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/RaycastContextMixin.java index 659dc3160d..cb25de2505 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/RaycastContextMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/RaycastContextMixin.java @@ -16,7 +16,7 @@ import org.spongepowered.asm.mixin.Shadow; @Mixin(RaycastContext.class) -public class RaycastContextMixin implements IRaycastContext { +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; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/RegistriesMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/RegistriesMixin.java index 625ec10ba5..090c49ad6c 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/RegistriesMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/RegistriesMixin.java @@ -14,7 +14,7 @@ @Mixin(Registries.class) public abstract class RegistriesMixin { - @Redirect(method = "create(Lnet/minecraft/registry/RegistryKey;Lnet/minecraft/registry/MutableRegistry;Lnet/minecraft/registry/Registries$Initializer;Lcom/mojang/serialization/Lifecycle;)Lnet/minecraft/registry/MutableRegistry;", at = @At(value = "INVOKE", target = "Lnet/minecraft/Bootstrap;ensureBootstrapped(Ljava/util/function/Supplier;)V")) + @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/RenderLayersMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/RenderLayersMixin.java index 0a8c4646cd..1e4441421e 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/RenderLayersMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/RenderLayersMixin.java @@ -16,7 +16,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(RenderLayers.class) -public class RenderLayersMixin { +public abstract class RenderLayersMixin { @Inject(method = "getBlockLayer", at = @At("HEAD"), cancellable = true) private static void onGetBlockLayer(BlockState state, CallbackInfoReturnable info) { if (Modules.get() == null) return; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/RenderTickCounterMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/RenderTickCounterMixin.java index 32c40cba93..97bd3f4dde 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/RenderTickCounterMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/RenderTickCounterMixin.java @@ -16,7 +16,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(RenderTickCounter.class) -public class RenderTickCounterMixin { +public abstract class RenderTickCounterMixin { @Shadow public float lastFrameDuration; @Inject(method = "beginRenderTick", at = @At(value = "FIELD", target = "Lnet/minecraft/client/render/RenderTickCounter;prevTimeMillis:J", opcode = Opcodes.PUTFIELD)) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ScreenMixin.java index 13767eb998..053a43dde6 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ScreenMixin.java @@ -13,6 +13,7 @@ import meteordevelopment.meteorclient.systems.modules.render.NoRender; import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.misc.text.MeteorClickEvent; +import meteordevelopment.meteorclient.utils.misc.text.RunnableClickEvent; import net.minecraft.client.gui.screen.ChatScreen; import net.minecraft.client.gui.screen.Screen; import net.minecraft.text.Style; @@ -34,6 +35,14 @@ private void onRenderBackground(CallbackInfo info) { info.cancel(); } + @Inject(method = "handleTextClick", at = @At(value = "HEAD"), cancellable = true) + private void onInvalidClickEvent(Style style, CallbackInfoReturnable cir) { + if (!(style.getClickEvent() instanceof RunnableClickEvent runnableClickEvent)) return; + + runnableClickEvent.runnable.run(); + cir.setReturnValue(true); + } + @Inject(method = "handleTextClick", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;error(Ljava/lang/String;Ljava/lang/Object;)V", ordinal = 1, remap = false), cancellable = true) private void onRunCommand(Style style, CallbackInfoReturnable cir) { if (style.getClickEvent() instanceof MeteorClickEvent clickEvent && clickEvent.getValue().startsWith(Config.get().prefix.get())) { diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ShulkerBoxBlockMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ShulkerBoxBlockMixin.java index 4dd696c2b8..0d5c17c436 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ShulkerBoxBlockMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ShulkerBoxBlockMixin.java @@ -8,10 +8,10 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.BetterTooltips; import net.minecraft.block.ShulkerBoxBlock; -import net.minecraft.client.item.TooltipContext; +import net.minecraft.client.item.TooltipType; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.text.Text; -import net.minecraft.world.BlockView; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -20,16 +20,16 @@ import java.util.List; @Mixin(ShulkerBoxBlock.class) -public class ShulkerBoxBlockMixin { +public abstract class ShulkerBoxBlockMixin { @Inject(method = "appendTooltip", at = @At("HEAD"), cancellable = true) - private void onAppendTooltip(ItemStack stack, BlockView view, List tooltip, TooltipContext options, CallbackInfo info) { + private void onAppendTooltip(ItemStack stack, Item.TooltipContext context, List tooltip, TooltipType options, CallbackInfo ci) { if (Modules.get() == null) return; BetterTooltips tooltips = Modules.get().get(BetterTooltips.class); if (tooltips.isActive()) { - if (tooltips.previewShulkers()) info.cancel(); + if (tooltips.previewShulkers()) ci.cancel(); else if (tooltips.shulkerCompactTooltip()) { - info.cancel(); + ci.cancel(); tooltips.applyCompactShulkerTooltip(stack, tooltip); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ShulkerEntityAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/ShulkerEntityAccessor.java deleted file mode 100644 index 715dfab8b5..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ShulkerEntityAccessor.java +++ /dev/null @@ -1,25 +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.attribute.EntityAttributeModifier; -import net.minecraft.entity.data.TrackedData; -import net.minecraft.entity.mob.ShulkerEntity; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(ShulkerEntity.class) -public interface ShulkerEntityAccessor { - @Accessor("PEEK_AMOUNT") - static TrackedData meteor$getPeekAmount() { - throw new AssertionError(); - } - - @Accessor("COVERED_ARMOR_BONUS") - static EntityAttributeModifier meteor$getCoveredArmorBonus() { - throw new AssertionError(); - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/SignBlockEntityRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/SignBlockEntityRendererMixin.java index dbc96a9a22..cad1b62f5e 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/SignBlockEntityRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/SignBlockEntityRendererMixin.java @@ -13,7 +13,7 @@ import org.spongepowered.asm.mixin.injection.At; @Mixin(SignBlockEntityRenderer.class) -public class SignBlockEntityRendererMixin { +public abstract class SignBlockEntityRendererMixin { @ModifyExpressionValue(method = "renderText", at = @At(value = "CONSTANT", args = {"intValue=4", "ordinal=1"})) private int loopTextLengthProxy(int i) { if (Modules.get().get(NoRender.class).noSignText()) return 0; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/SimpleOptionMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/SimpleOptionMixin.java index ee22308152..b0b0f109ce 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/SimpleOptionMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/SimpleOptionMixin.java @@ -16,7 +16,7 @@ import java.util.function.Consumer; @Mixin(SimpleOption.class) -public class SimpleOptionMixin implements ISimpleOption { +public abstract class SimpleOptionMixin implements ISimpleOption { @Shadow Object value; @Shadow @Final private Consumer changeCallback; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/SlimeBlockMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/SlimeBlockMixin.java index 27a0d7455e..6bbadb9476 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/SlimeBlockMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/SlimeBlockMixin.java @@ -20,7 +20,7 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; @Mixin(SlimeBlock.class) -public class SlimeBlockMixin { +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(); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/SlotMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/SlotMixin.java index 27ceaa570a..ff09a3dbf6 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/SlotMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/SlotMixin.java @@ -12,7 +12,7 @@ import org.spongepowered.asm.mixin.Shadow; @Mixin(Slot.class) -public class SlotMixin implements ISlot { +public abstract class SlotMixin implements ISlot { @Shadow public int id; @Shadow @Final private int index; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/SoundSystemMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/SoundSystemMixin.java index dbf1fca2dd..4ae0e2081f 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/SoundSystemMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/SoundSystemMixin.java @@ -15,7 +15,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(SoundSystem.class) -public class SoundSystemMixin { +public abstract class SoundSystemMixin { @Inject(method = "play(Lnet/minecraft/client/sound/SoundInstance;)V", at = @At("HEAD"), cancellable = true) private void onPlay(SoundInstance soundInstance, CallbackInfo info) { PlaySoundEvent event = MeteorClient.EVENT_BUS.post(PlaySoundEvent.get(soundInstance)); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/SplashTextResourceSupplierMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/SplashTextResourceSupplierMixin.java index d891196a7e..75a1faf0ce 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/SplashTextResourceSupplierMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/SplashTextResourceSupplierMixin.java @@ -9,19 +9,21 @@ import net.minecraft.client.gui.screen.SplashTextRenderer; import net.minecraft.client.resource.SplashTextResourceSupplier; 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.util.Arrays; import java.util.List; import java.util.Random; @Mixin(SplashTextResourceSupplier.class) -public class SplashTextResourceSupplierMixin { +public abstract class SplashTextResourceSupplierMixin { + @Unique private boolean override = true; - private final Random random = new Random(); - + @Unique + private static final Random random = new Random(); + @Unique private final List meteorSplashes = getMeteorSplashes(); @Inject(method = "get", at = @At("HEAD"), cancellable = true) @@ -32,8 +34,9 @@ private void onApply(CallbackInfoReturnable cir) { override = !override; } + @Unique private static List getMeteorSplashes() { - return Arrays.asList( + return List.of( "Meteor on Crack!", "Star Meteor Client on GitHub!", "Based utility mod.", diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/StatusEffectAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/StatusEffectAccessor.java new file mode 100644 index 0000000000..1359060789 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/StatusEffectAccessor.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.entity.attribute.EntityAttribute; +import net.minecraft.entity.effect.StatusEffect; +import net.minecraft.registry.entry.RegistryEntry; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.Map; + +@Mixin(StatusEffect.class) +public interface StatusEffectAccessor { + @Accessor + Map, StatusEffect.EffectAttributeModifierCreator> getAttributeModifiers(); +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/StatusEffectInstanceMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/StatusEffectInstanceMixin.java index 0b737cd1b3..b82ec5f656 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/StatusEffectInstanceMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/StatusEffectInstanceMixin.java @@ -16,14 +16,14 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(StatusEffectInstance.class) -public class StatusEffectInstanceMixin { +public abstract class StatusEffectInstanceMixin { @Shadow private int duration; @Inject(method = "updateDuration", at = @At("HEAD"), cancellable = true) private void tick(CallbackInfoReturnable info) { if (!Utils.canUpdate()) return; - if (Modules.get().get(PotionSaver.class).shouldFreeze(((StatusEffectInstance) (Object) this).getEffectType())) { + if (Modules.get().get(PotionSaver.class).shouldFreeze(((StatusEffectInstance) (Object) this).getEffectType().value())) { info.setReturnValue(duration); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/StringHelperMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/StringHelperMixin.java index 1375bbb0b8..4d525d5c0c 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/StringHelperMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/StringHelperMixin.java @@ -13,7 +13,7 @@ import org.spongepowered.asm.mixin.injection.ModifyArg; @Mixin(StringHelper.class) -public class StringHelperMixin { +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) 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 342e5f9cd8..7d42da76af 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/SweetBerryBushBlockMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/SweetBerryBushBlockMixin.java @@ -20,7 +20,7 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; @Mixin(SweetBerryBushBlock.class) -public class SweetBerryBushBlockMixin { +public abstract class SweetBerryBushBlockMixin { @Inject(method = "onEntityCollision", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;slowMovement(Lnet/minecraft/block/BlockState;Lnet/minecraft/util/math/Vec3d;)V"), cancellable = true) private void onEntityCollision(BlockState state, World world, BlockPos pos, Entity entity, CallbackInfo info) { if (entity == mc.player && Modules.get().get(NoSlow.class).berryBush()) info.cancel(); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/TextRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/TextRendererMixin.java index b9b7a3a2bb..9fdfc235a0 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/TextRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/TextRendererMixin.java @@ -12,7 +12,7 @@ import org.spongepowered.asm.mixin.injection.At; @Mixin(targets = "net.minecraft.client.font.TextRenderer$Drawer") -public class TextRendererMixin { +public abstract class TextRendererMixin { @ModifyExpressionValue(method = "accept", at = @At(value = "INVOKE", target = "Lnet/minecraft/text/Style;isObfuscated()Z")) private boolean onRenderObfuscatedStyle(boolean original) { if (Modules.get() == null || Modules.get().get(NoRender.class) == null) { diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/TitleScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/TitleScreenMixin.java index 48b61f097e..cccfafa192 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/TitleScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/TitleScreenMixin.java @@ -28,7 +28,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(TitleScreen.class) -public class TitleScreenMixin extends Screen { +public abstract class TitleScreenMixin extends Screen { public TitleScreenMixin(Text title) { super(title); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/TransformationMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/TransformationMixin.java index a11a4982f6..145052e07c 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/TransformationMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/TransformationMixin.java @@ -15,7 +15,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(Transformation.class) -public class TransformationMixin { +public abstract class TransformationMixin { @Inject(method = "apply", at = @At("HEAD"), cancellable = true) private void onApply(boolean leftHanded, MatrixStack matrices, CallbackInfo info) { ApplyTransformationEvent event = MeteorClient.EVENT_BUS.post(ApplyTransformationEvent.get((Transformation) (Object) this, leftHanded, matrices)); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/TridentItemMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/TridentItemMixin.java index 2af0193ece..4bbdf059c0 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/TridentItemMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/TridentItemMixin.java @@ -23,7 +23,7 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; @Mixin(TridentItem.class) -public class TridentItemMixin { +public abstract class TridentItemMixin { @Inject(method = "onStoppedUsing", at = @At("HEAD")) private void onStoppedUsingHead(ItemStack stack, World world, LivingEntity user, int remainingUseTicks, CallbackInfo info) { if (user == mc.player) Utils.isReleasingTrident = true; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/Vec3dMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/Vec3dMixin.java index a418404943..ac71e313f9 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/Vec3dMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/Vec3dMixin.java @@ -13,7 +13,7 @@ import org.spongepowered.asm.mixin.Shadow; @Mixin(Vec3d.class) -public class Vec3dMixin implements IVec3d { +public abstract class Vec3dMixin implements IVec3d { @Shadow @Final @Mutable public double x; @Shadow @Final @Mutable public double y; @Shadow @Final @Mutable public double z; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/VertexBufferMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/VertexBufferMixin.java index 167fe1bbb5..c0f052beaa 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/VertexBufferMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/VertexBufferMixin.java @@ -18,7 +18,7 @@ import java.nio.ByteBuffer; @Mixin(VertexBuffer.class) -public class VertexBufferMixin { +public abstract class VertexBufferMixin { @Shadow private int indexBufferId; @Inject(method = "uploadIndexBuffer", at = @At("RETURN")) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/WorldChunkMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/WorldChunkMixin.java index 3bad44baf5..ce6435aaca 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/WorldChunkMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/WorldChunkMixin.java @@ -19,7 +19,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(WorldChunk.class) -public class WorldChunkMixin { +public abstract class WorldChunkMixin { @Shadow @Final World world; @Inject(method = "setBlockState", at = @At("TAIL")) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererMixin.java index 7c31fd1567..bba18185e9 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererMixin.java @@ -75,7 +75,7 @@ private void hasBlindnessOrDarkness(Camera camera, CallbackInfoReturnable FONT_FAMILIES = new ArrayList<>(); public static CustomTextRenderer RENDERER; + private Fonts() { + } + @PreInit(dependencies = Shaders.class) public static void refresh() { FONT_FAMILIES.clear(); diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/GL.java b/src/main/java/meteordevelopment/meteorclient/renderer/GL.java index 6047ac64c9..21b6ffeeae 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/GL.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/GL.java @@ -37,6 +37,9 @@ public class GL { public static int CURRENT_IBO; private static int prevIbo; + private GL() { + } + @PreInit public static void init() { if (FabricLoader.getInstance().isModLoaded("canvas")) changeBufferRenderer = false; diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/Mesh.java b/src/main/java/meteordevelopment/meteorclient/renderer/Mesh.java index 4ac1b2a396..47bd3ba575 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/Mesh.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/Mesh.java @@ -10,6 +10,7 @@ import meteordevelopment.meteorclient.utils.render.color.Color; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.util.math.Vec3d; +import org.joml.Matrix4fStack; import org.lwjgl.BufferUtils; import java.nio.ByteBuffer; @@ -252,13 +253,13 @@ public void beginRender(MatrixStack matrices) { GL.enableLineSmooth(); if (rendering3D) { - MatrixStack matrixStack = RenderSystem.getModelViewStack(); - matrixStack.push(); + Matrix4fStack matrixStack = RenderSystem.getModelViewStack(); + matrixStack.pushMatrix(); - if (matrices != null) matrixStack.multiplyPositionMatrix(matrices.peek().getPositionMatrix()); + if (matrices != null) matrixStack.mul(matrices.peek().getPositionMatrix()); Vec3d cameraPos = mc.gameRenderer.getCamera().getPos(); - matrixStack.translate(0, -cameraPos.y, 0); + matrixStack.translate(0, (float) -cameraPos.y, 0); } beganRendering = true; @@ -288,7 +289,7 @@ public void render(MatrixStack matrices) { } public void endRender() { - if (rendering3D) RenderSystem.getModelViewStack().pop(); + if (rendering3D) RenderSystem.getModelViewStack().popMatrix(); GL.restoreState(); diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/PostProcessRenderer.java b/src/main/java/meteordevelopment/meteorclient/renderer/PostProcessRenderer.java index 578f6af092..bff8e8b3ad 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/PostProcessRenderer.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/PostProcessRenderer.java @@ -12,6 +12,9 @@ public class PostProcessRenderer { private static Mesh mesh; private static final MatrixStack matrices = new MatrixStack(); + private PostProcessRenderer() { + } + @PreInit public static void init() { mesh = new Mesh(DrawMode.Triangles, Mesh.Attrib.Vec2); diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/Shader.java b/src/main/java/meteordevelopment/meteorclient/renderer/Shader.java index dd3cf4aecc..c32961df57 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/Shader.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/Shader.java @@ -104,6 +104,6 @@ public void set(String name, Matrix4f mat) { public void setDefaults() { set("u_Proj", RenderSystem.getProjectionMatrix()); - set("u_ModelView", RenderSystem.getModelViewStack().peek().getPositionMatrix()); + set("u_ModelView", RenderSystem.getModelViewStack()); } } diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/Shaders.java b/src/main/java/meteordevelopment/meteorclient/renderer/Shaders.java index 982aba0373..9e8093b06b 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/Shaders.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/Shaders.java @@ -12,6 +12,9 @@ public class Shaders { public static Shader POS_TEX_COLOR; public static Shader TEXT; + private Shaders() { + } + @PreInit public static void init() { POS_COLOR = new Shader("pos_color.vert", "pos_color.frag"); diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/text/VanillaTextRenderer.java b/src/main/java/meteordevelopment/meteorclient/renderer/text/VanillaTextRenderer.java index 5e41938cbc..33d8855e1b 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/text/VanillaTextRenderer.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/text/VanillaTextRenderer.java @@ -13,6 +13,7 @@ import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.util.math.MatrixStack; import org.joml.Matrix4f; +import org.joml.Matrix4fStack; import static meteordevelopment.meteorclient.MeteorClient.mc; @@ -98,17 +99,17 @@ public boolean isBuilding() { public void end(MatrixStack matrices) { if (!building) throw new RuntimeException("VanillaTextRenderer.end() called without calling begin()"); - MatrixStack matrixStack = RenderSystem.getModelViewStack(); + Matrix4fStack matrixStack = RenderSystem.getModelViewStack(); RenderSystem.disableDepthTest(); - matrixStack.push(); - if (matrices != null) matrixStack.multiplyPositionMatrix(matrices.peek().getPositionMatrix()); + matrixStack.pushMatrix(); + if (matrices != null) matrixStack.mul(matrices.peek().getPositionMatrix()); if (!scaleIndividually) matrixStack.scale((float) scale, (float) scale, 1); RenderSystem.applyModelViewMatrix(); immediate.draw(); - matrixStack.pop(); + matrixStack.popMatrix(); RenderSystem.enableDepthTest(); RenderSystem.applyModelViewMatrix(); diff --git a/src/main/java/meteordevelopment/meteorclient/settings/SettingGroup.java b/src/main/java/meteordevelopment/meteorclient/settings/SettingGroup.java index 7a24ba4aa3..073db9d7e6 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/SettingGroup.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/SettingGroup.java @@ -9,6 +9,7 @@ import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtElement; import net.minecraft.nbt.NbtList; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.Iterator; @@ -44,7 +45,7 @@ public Setting getByIndex(int index) { } @Override - public Iterator> iterator() { + public @NotNull Iterator> iterator() { return settings.iterator(); } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/Settings.java b/src/main/java/meteordevelopment/meteorclient/settings/Settings.java index 63c3aea065..f8ab30951e 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/Settings.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/Settings.java @@ -15,6 +15,7 @@ import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtElement; import net.minecraft.nbt.NbtList; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.Iterator; @@ -120,7 +121,7 @@ public void tick(WContainer settings, GuiTheme theme) { } @Override - public Iterator iterator() { + public @NotNull Iterator iterator() { return groups.iterator(); } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/SoundEventListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/SoundEventListSetting.java index b5513aa4d7..b656b6ffef 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/SoundEventListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/SoundEventListSetting.java @@ -78,8 +78,6 @@ public List load(NbtCompound tag) { return get(); } - - public static class Builder extends SettingBuilder, SoundEventListSetting> { public Builder() { super(new ArrayList<>(0)); diff --git a/src/main/java/meteordevelopment/meteorclient/settings/StorageBlockListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/StorageBlockListSetting.java index d9379d4cae..7b364efde6 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/StorageBlockListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/StorageBlockListSetting.java @@ -146,11 +146,6 @@ public BlockEntityType get(@Nullable Identifier id) { return null; } - @Override - public Lifecycle getEntryLifecycle(BlockEntityType object) { - return null; - } - @Override public Lifecycle getLifecycle() { return null; diff --git a/src/main/java/meteordevelopment/meteorclient/settings/StringSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/StringSetting.java index 85a44694ac..382df1b480 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/StringSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/StringSetting.java @@ -54,7 +54,7 @@ public static class Builder extends SettingBuilder renderer) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/accounts/Accounts.java b/src/main/java/meteordevelopment/meteorclient/systems/accounts/Accounts.java index 30c6bb09c6..e09a4963b8 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/accounts/Accounts.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/accounts/Accounts.java @@ -15,6 +15,7 @@ import meteordevelopment.meteorclient.utils.misc.NbtUtils; import meteordevelopment.meteorclient.utils.network.MeteorExecutor; import net.minecraft.nbt.NbtCompound; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.Iterator; @@ -51,7 +52,7 @@ public int size() { } @Override - public Iterator> iterator() { + public @NotNull Iterator> iterator() { return accounts.iterator(); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/accounts/MicrosoftLogin.java b/src/main/java/meteordevelopment/meteorclient/systems/accounts/MicrosoftLogin.java index cc0bdf877c..bc0590358d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/accounts/MicrosoftLogin.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/accounts/MicrosoftLogin.java @@ -22,6 +22,9 @@ import java.util.function.Consumer; public class MicrosoftLogin { + private MicrosoftLogin() { + } + public static class LoginData { public String mcToken; public String newRefreshToken; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/Hud.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/Hud.java index 4e8b962de7..b5d898e329 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/Hud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/Hud.java @@ -94,6 +94,7 @@ public class Hud extends System implements Iterable { ); // Keybindings + @SuppressWarnings("unused") private final Setting keybind = sgKeybind.add(new KeybindSetting.Builder() .name("bind") .defaultValue(Keybind.none()) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/HudElementInfo.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/HudElementInfo.java index 63c927adbf..3da6cabf6a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/HudElementInfo.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/HudElementInfo.java @@ -46,7 +46,7 @@ public Preset addPreset(String title, Consumer callback) { } public boolean hasPresets() { - return presets.size() > 0; + return !presets.isEmpty(); } public HudElement create() { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/HudGroup.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/HudGroup.java index c87d137cec..39a28fe394 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/HudGroup.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/HudGroup.java @@ -5,25 +5,5 @@ package meteordevelopment.meteorclient.systems.hud; -import java.util.Objects; - -public class HudGroup { - public final String title; - - public HudGroup(String title) { - this.title = title; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - HudGroup hudGroup = (HudGroup) o; - return Objects.equals(title, hudGroup.title); - } - - @Override - public int hashCode() { - return Objects.hash(title); - } +public record HudGroup(String title) { } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/HudRenderer.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/HudRenderer.java index 8cd48e50d5..0108406f85 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/HudRenderer.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/HudRenderer.java @@ -45,7 +45,7 @@ public class HudRenderer { .maximumSize(4) .expireAfterAccess(Duration.ofMinutes(10)) .removalListener(notification -> { - if (notification.wasEvicted()) //noinspection ConstantConditions + if (notification.wasEvicted()) ((FontHolder) notification.getValue()).destroy(); }) .build(CacheLoader.from(HudRenderer::loadFont)); 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 fe2e31086f..77d66f3206 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/CombatHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/CombatHud.java @@ -23,7 +23,7 @@ import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.render.color.SettingColor; import net.minecraft.client.gui.screen.ingame.InventoryScreen; -import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.component.type.ItemEnchantmentsComponent; import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.player.PlayerEntity; @@ -33,6 +33,7 @@ import net.minecraft.item.SwordItem; import net.minecraft.registry.Registries; import net.minecraft.util.math.MathHelper; +import org.joml.Matrix4fStack; import java.util.ArrayList; import java.util.HashMap; @@ -333,9 +334,9 @@ public void render(HudRenderer renderer) { int slot = 5; // Drawing armor - MatrixStack matrices = RenderSystem.getModelViewStack(); + Matrix4fStack matrices = RenderSystem.getModelViewStack(); - matrices.push(); + matrices.pushMatrix(); matrices.scale(scale.get().floatValue(), scale.get().floatValue(), 1); x /= scale.get(); @@ -353,12 +354,12 @@ public void render(HudRenderer renderer) { armorY += 18; - Map enchantments = EnchantmentHelper.get(itemStack); + ItemEnchantmentsComponent enchantments = EnchantmentHelper.getEnchantments(itemStack); Map enchantmentsToShow = new HashMap<>(); for (Enchantment enchantment : displayedEnchantments.get()) { - if (enchantments.containsKey(enchantment)) { - enchantmentsToShow.put(enchantment, enchantments.get(enchantment)); + if (enchantments.getEnchantments().contains(Registries.ENCHANTMENT.getEntry(enchantment))) { + enchantmentsToShow.put(enchantment, enchantments.getLevel(enchantment)); } } @@ -414,7 +415,7 @@ public void render(HudRenderer renderer) { Renderer2D.COLOR.quad(x + healthWidth, y, absorbWidth, 7, healthColor2.get(), healthColor3.get(), healthColor3.get(), healthColor2.get()); Renderer2D.COLOR.render(null); - matrices.pop(); + matrices.popMatrix(); }); } 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 0e192325f5..d4ae09dffa 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/InventoryHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/InventoryHud.java @@ -12,7 +12,6 @@ import meteordevelopment.meteorclient.systems.hud.HudRenderer; import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.misc.MeteorIdentifier; -import meteordevelopment.meteorclient.utils.render.RenderUtils; import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.render.color.SettingColor; import net.minecraft.item.ItemStack; 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 332c9ef4a0..c2f1a351b2 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PotionTimersHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PotionTimersHud.java @@ -185,7 +185,7 @@ public void tick(HudRenderer renderer) { texts.clear(); for (StatusEffectInstance statusEffectInstance : mc.player.getStatusEffects()) { - if (hiddenEffects.get().contains(statusEffectInstance.getEffectType())) continue; + if (hiddenEffects.get().contains(statusEffectInstance.getEffectType().value())) continue; if (!showAmbient.get() && statusEffectInstance.isAmbient()) continue; String text = getString(statusEffectInstance); texts.add(new ObjectObjectImmutablePair<>(statusEffectInstance, text)); @@ -219,7 +219,7 @@ public void render(HudRenderer renderer) { for (Pair potionEffectEntry : texts) { Color color = switch (colorMode.get()) { case Effect -> { - int c = potionEffectEntry.left().getEffectType().getColor(); + int c = potionEffectEntry.left().getEffectType().value().getColor(); yield new Color(c).a(255); } case Flat -> { @@ -241,7 +241,7 @@ public void render(HudRenderer renderer) { } private String getString(StatusEffectInstance statusEffectInstance) { - return String.format("%s %d (%s)", Names.get(statusEffectInstance.getEffectType()), statusEffectInstance.getAmplifier() + 1, StatusEffectUtil.getDurationText(statusEffectInstance, 1, mc.world.getTickManager().getTickRate()).getString()); + return String.format("%s %d (%s)", Names.get(statusEffectInstance.getEffectType().value()), statusEffectInstance.getAmplifier() + 1, StatusEffectUtil.getDurationText(statusEffectInstance, 1, mc.world.getTickManager().getTickRate()).getString()); } private double getScale() { @@ -250,7 +250,7 @@ private double getScale() { private boolean hasNoVisibleEffects() { for (StatusEffectInstance statusEffectInstance : mc.player.getStatusEffects()) { - if (hiddenEffects.get().contains(statusEffectInstance.getEffectType())) continue; + if (hiddenEffects.get().contains(statusEffectInstance.getEffectType().value())) continue; if (!showAmbient.get() && statusEffectInstance.isAmbient()) continue; return false; } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/TextHud.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/TextHud.java index 3bf670b0ed..19224a0823 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/TextHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/TextHud.java @@ -89,7 +89,6 @@ public class TextHud extends HudElement { .name("condition") .description("Condition to check when shown is not Always.") .visible(() -> shown.get() != Shown.Always) - .defaultValue("") .onChanged(s -> recompile()) .renderer(StarscriptTextBoxRenderer.class) .build() @@ -196,7 +195,7 @@ private void runTick(HudRenderer renderer) { if (result.hasErrors()) { script = null; - section = new Section(0, result.errors.get(0).toString()); + section = new Section(0, result.errors.getFirst().toString()); calculateSize(renderer); } else script = Compiler.compile(result); 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 b4ac74cbfe..23657e77ae 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/screens/AddHudElementScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/screens/AddHudElementScreen.java @@ -71,7 +71,7 @@ public void initWidgets() { // Create widgets for (HudGroup group : grouped.keySet()) { - WSection section = add(theme.section(group.title)).expandX().widget(); + WSection section = add(theme.section(group.title())).expandX().widget(); for (Item item : grouped.get(group)) { WHorizontalList l = section.add(theme.horizontalList()).expandX().widget(); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/macros/Macro.java b/src/main/java/meteordevelopment/meteorclient/systems/macros/Macro.java index 77d0e19e53..f01d904cf0 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/macros/Macro.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/macros/Macro.java @@ -29,7 +29,6 @@ public class Macro implements ISerializable { public Setting name = sgGeneral.add(new StringSetting.Builder() .name("name") .description("The name of the macro.") - .defaultValue("") .build() ); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/macros/Macros.java b/src/main/java/meteordevelopment/meteorclient/systems/macros/Macros.java index e5842a25a1..fba8cbb281 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/macros/Macros.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/macros/Macros.java @@ -15,6 +15,7 @@ import meteordevelopment.orbit.EventHandler; import meteordevelopment.orbit.EventPriority; import net.minecraft.nbt.NbtCompound; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.Iterator; @@ -79,7 +80,7 @@ public boolean isEmpty() { } @Override - public Iterator iterator() { + public @NotNull Iterator iterator() { return macros.iterator(); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java index 7b1edc6442..695a28548b 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java @@ -607,11 +607,6 @@ public Module get(Identifier id) { return null; } - @Override - public Lifecycle getEntryLifecycle(Module object) { - return null; - } - @Override public Lifecycle getLifecycle() { return null; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AntiAnvil.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AntiAnvil.java index fde09c0dd2..3285309807 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AntiAnvil.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AntiAnvil.java @@ -41,7 +41,7 @@ public AntiAnvil() { @EventHandler private void onTick(TickEvent.Pre event) { - for (int i = 0; i <= mc.interactionManager.getReachDistance(); i++) { + for (int i = 0; i <= mc.player.getBlockInteractionRange(); i++) { BlockPos pos = mc.player.getBlockPos().add(0, i + 3, 0); if (mc.world.getBlockState(pos).getBlock() == Blocks.ANVIL && mc.world.getBlockState(pos.down()).isAir()) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoArmor.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoArmor.java index 24bc1e8add..40906739c9 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoArmor.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoArmor.java @@ -170,8 +170,8 @@ private int getScore(ItemStack itemStack) { score += enchantments.getInt(Enchantments.PROJECTILE_PROTECTION); score += enchantments.getInt(Enchantments.UNBREAKING); score += 2 * enchantments.getInt(Enchantments.MENDING); - score += itemStack.getItem() instanceof ArmorItem ? ((ArmorItem) itemStack.getItem()).getProtection() : 0; - score += itemStack.getItem() instanceof ArmorItem ? ((ArmorItem) itemStack.getItem()).getToughness() : 0; + score += itemStack.getItem() instanceof ArmorItem armorItem ? armorItem.getProtection() : 0; + score += itemStack.getItem() instanceof ArmorItem armorItem ? (int) armorItem.getToughness() : 0; return score; } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoTrap.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoTrap.java index 613bbca1ee..09291ac369 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoTrap.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoTrap.java @@ -180,8 +180,8 @@ private void onTick(TickEvent.Pre event) { fillPlaceArray(target); - if (timer >= delay.get() && placePositions.size() > 0) { - BlockPos blockPos = placePositions.get(placePositions.size() - 1); + if (timer >= delay.get() && !placePositions.isEmpty()) { + BlockPos blockPos = placePositions.getLast(); if (BlockUtils.place(blockPos, itemResult, rotate.get(), 50, true)) { placePositions.remove(blockPos); @@ -201,7 +201,7 @@ private void onRender(Render3DEvent event) { if (!render.get() || placePositions.isEmpty()) return; for (BlockPos pos : placePositions) { - boolean isFirst = pos.equals(placePositions.get(placePositions.size() - 1)); + boolean isFirst = pos.equals(placePositions.getLast()); Color side = isFirst ? nextSideColor.get() : sideColor.get(); Color line = isFirst ? nextLineColor.get() : lineColor.get(); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoWeapon.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoWeapon.java index 99ba212131..c8341f6e25 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoWeapon.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoWeapon.java @@ -13,7 +13,7 @@ import meteordevelopment.meteorclient.utils.player.InvUtils; import meteordevelopment.orbit.EventHandler; import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.entity.EntityGroup; +import net.minecraft.entity.EntityType; import net.minecraft.item.AxeItem; import net.minecraft.item.ItemStack; import net.minecraft.item.SwordItem; @@ -51,7 +51,7 @@ private void onAttack(AttackEntityEvent event) { InvUtils.swap(getBestWeapon(EntityUtils.getGroup(event.entity)), false); } - private int getBestWeapon(EntityGroup group) { + private int getBestWeapon(EntityType group) { int slotS = mc.player.getInventory().selectedSlot; int slotA = mc.player.getInventory().selectedSlot; double damageS = 0; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/CrystalAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/CrystalAura.java index 7ddc907718..433777833a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/CrystalAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/CrystalAura.java @@ -699,7 +699,7 @@ private void onPreTick(TickEvent.Pre event) { // Find targets, break and place findTargets(); - if (targets.size() > 0) { + if (!targets.isEmpty()) { if (!didRotateThisTick) doBreak(); if (!didRotateThisTick) doPlace(); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java index 595679320c..78e44c6316 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java @@ -277,7 +277,7 @@ private void onTick(TickEvent.Pre event) { return; } - Entity primary = targets.get(0); + Entity primary = targets.getFirst(); if (autoSwitch.get()) { Predicate predicate = switch (weapon.get()) { @@ -406,7 +406,7 @@ private boolean itemInHand() { } public Entity getTarget() { - if (!targets.isEmpty()) return targets.get(0); + if (!targets.isEmpty()) return targets.getFirst(); return null; } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Offhand.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Offhand.java index 54851c022f..53a262fb59 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Offhand.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Offhand.java @@ -16,6 +16,7 @@ import meteordevelopment.meteorclient.utils.player.InvUtils; import meteordevelopment.meteorclient.utils.player.PlayerUtils; import meteordevelopment.orbit.EventHandler; +import net.minecraft.component.DataComponentTypes; import net.minecraft.entity.EquipmentSlot; import net.minecraft.item.*; @@ -144,7 +145,7 @@ public void onActivate() { } @EventHandler(priority = HIGHEST + 999) - private void onTick(TickEvent.Pre event) throws InterruptedException { + private void onTick(TickEvent.Pre event) { FindItemResult result = InvUtils.find(Items.TOTEM_OF_UNDYING); totems = result.count(); @@ -245,7 +246,7 @@ private boolean usableItem() { return mc.player.getMainHandStack().getItem() == Items.BOW || mc.player.getMainHandStack().getItem() == Items.TRIDENT || mc.player.getMainHandStack().getItem() == Items.CROSSBOW - || mc.player.getMainHandStack().getItem().isFood(); + || mc.player.getMainHandStack().getItem().getComponents().contains(DataComponentTypes.FOOD); } @Override @@ -261,7 +262,7 @@ public enum Item { Totem(Items.TOTEM_OF_UNDYING), Shield(Items.SHIELD), Potion(Items.POTION); - net.minecraft.item.Item item; + final net.minecraft.item.Item item; Item(net.minecraft.item.Item item) { this.item = item; } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Quiver.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Quiver.java index c0efef35bd..981ba9b1ce 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Quiver.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Quiver.java @@ -17,6 +17,7 @@ import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; +import net.minecraft.component.DataComponentTypes; import net.minecraft.entity.effect.StatusEffect; import net.minecraft.entity.effect.StatusEffectInstance; import net.minecraft.entity.effect.StatusEffects; @@ -25,11 +26,11 @@ import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket; -import net.minecraft.potion.PotionUtil; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; public class Quiver extends Module { @@ -40,7 +41,7 @@ public class Quiver extends Module { private final Setting> effects = sgGeneral.add(new StatusEffectListSetting.Builder() .name("effects") .description("Which effects to shoot you with.") - .defaultValue(StatusEffects.STRENGTH) + .defaultValue(StatusEffects.STRENGTH.value()) .build() ); @@ -136,11 +137,11 @@ public void onActivate() { if (item.getItem() != Items.TIPPED_ARROW) continue; - List effects = PotionUtil.getPotionEffects(item); + Iterator effects = item.getItem().getComponents().get(DataComponentTypes.POTION_CONTENTS).getEffects().iterator(); - if (effects.isEmpty()) continue; + if (!effects.hasNext()) continue; - StatusEffect effect = effects.get(0).getEffectType(); + StatusEffect effect = effects.next().getEffectType().value(); if (this.effects.get().contains(effect) && !usedEffects.contains(effect) @@ -176,12 +177,12 @@ private void onTick(TickEvent.Pre event) { boolean charging = mc.options.useKey.isPressed(); if (!charging) { - InvUtils.move().from(arrowSlots.get(0)).to(9); + InvUtils.move().from(arrowSlots.getFirst()).to(9); mc.options.useKey.setPressed(true); } else { if (BowItem.getPullProgress(mc.player.getItemUseTime()) >= 0.12) { - int targetSlot = arrowSlots.get(0); - arrowSlots.remove(0); + int targetSlot = arrowSlots.getFirst(); + arrowSlots.removeFirst(); mc.getNetworkHandler().sendPacket(new PlayerMoveC2SPacket.LookAndOnGround(mc.player.getYaw(), -90, mc.player.isOnGround())); mc.options.useKey.setPressed(false); @@ -239,7 +240,7 @@ private boolean headIsOpen() { private boolean hasEffect(StatusEffect effect) { for (StatusEffectInstance statusEffect : mc.player.getStatusEffects()) { - if (statusEffect.getEffectType() == effect) return true; + if (statusEffect.getEffectType().value().equals(effect)) return true; } return false; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/SelfTrap.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/SelfTrap.java index d9504f4126..d1706de6b9 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/SelfTrap.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/SelfTrap.java @@ -156,8 +156,8 @@ private void onTick(TickEvent.Pre event) { findPlacePos(currentBlock); - if (delay >= delaySetting.get() && placePositions.size() > 0) { - BlockPos blockPos = placePositions.get(placePositions.size() - 1); + if (delay >= delaySetting.get() && !placePositions.isEmpty()) { + BlockPos blockPos = placePositions.getLast(); if (BlockUtils.place(blockPos, itemResult, rotate.get(), 50)) { placePositions.remove(blockPos); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java index 2584880c19..6e41fcdd76 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java @@ -397,7 +397,7 @@ private boolean place(CardinalDirection direction, int y) { @EventHandler private void onPacketReceive(PacketEvent.Receive event) { if (event.packet instanceof DeathMessageS2CPacket packet) { - Entity entity = mc.world.getEntityById(packet.getEntityId()); + Entity entity = mc.world.getEntityById(packet.playerId()); if (entity == mc.player && toggleOnDeath.get()) { toggle(); info("Toggled off because you died."); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BookBot.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BookBot.java index e3f6980b8b..8f3223a2d9 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BookBot.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BookBot.java @@ -20,15 +20,14 @@ import meteordevelopment.meteorclient.utils.player.InvUtils; import meteordevelopment.orbit.EventHandler; import net.minecraft.client.font.TextHandler; -import net.minecraft.item.*; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.WritableBookContentComponent; +import net.minecraft.component.type.WrittenBookContentComponent; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtList; -import net.minecraft.nbt.NbtString; import net.minecraft.network.packet.c2s.play.BookUpdateC2SPacket; -import net.minecraft.text.ClickEvent; -import net.minecraft.text.MutableText; -import net.minecraft.text.Style; -import net.minecraft.text.Text; +import net.minecraft.text.*; import net.minecraft.util.Formatting; import org.lwjgl.BufferUtils; import org.lwjgl.PointerBuffer; @@ -40,7 +39,10 @@ import java.io.FileReader; import java.io.IOException; import java.nio.ByteBuffer; -import java.util.*; +import java.util.ArrayList; +import java.util.Optional; +import java.util.PrimitiveIterator; +import java.util.Random; import java.util.function.Predicate; public class BookBot extends Module { @@ -165,8 +167,10 @@ public void onActivate() { @EventHandler private void onTick(TickEvent.Post event) { - Predicate bookPredicate = i -> - i.getItem() == Items.WRITABLE_BOOK && (i.getNbt() == null || i.getNbt().get("pages") == null || ((NbtList) i.getNbt().get("pages")).isEmpty()); + Predicate bookPredicate = i -> { + WritableBookContentComponent component = i.get(DataComponentTypes.WRITABLE_BOOK_CONTENT); + return i.getItem() == Items.WRITABLE_BOOK && (component != null || component.pages().isEmpty()); + }; FindItemResult writableBook = InvUtils.find(bookPredicate); @@ -217,8 +221,8 @@ private void onTick(TickEvent.Post event) { message.append(Text.literal("The bookbot file is empty! ").formatted(Formatting.RED)); message.append(Text.literal("Click here to edit it.") .setStyle(Style.EMPTY - .withFormatting(Formatting.UNDERLINE, Formatting.RED) - .withClickEvent(new ClickEvent(ClickEvent.Action.OPEN_FILE, file.getAbsolutePath())) + .withFormatting(Formatting.UNDERLINE, Formatting.RED) + .withClickEvent(new ClickEvent(ClickEvent.Action.OPEN_FILE, file.getAbsolutePath())) ) ); info(message); @@ -247,6 +251,7 @@ private void onTick(TickEvent.Post event) { private void writeBook(PrimitiveIterator.OfInt chars) { ArrayList pages = new ArrayList<>(); + ArrayList> filteredPages = new ArrayList<>(); TextHandler.WidthRetriever widthRetriever = ((TextHandlerAccessor) mc.textRenderer.getTextHandler()).getWidthRetriever(); int maxPages = mode.get() == Mode.File ? 100 : this.pages.get(); @@ -285,6 +290,7 @@ private void writeBook(PrimitiveIterator.OfInt chars) { // Reached end of page if (lineIndex == 14) { + filteredPages.add(RawFilteredPair.of(Text.of(page.toString()))); pages.add(page.toString()); page.setLength(0); pageIndex++; @@ -302,6 +308,7 @@ private void writeBook(PrimitiveIterator.OfInt chars) { // No more characters, end current page if (!page.isEmpty() && pageIndex != maxPages) { + filteredPages.add(RawFilteredPair.of(Text.of(page.toString()))); pages.add(page.toString()); } @@ -310,13 +317,7 @@ private void writeBook(PrimitiveIterator.OfInt chars) { if (count.get() && bookCount != 0) title += " #" + bookCount; // Write data to book - mc.player.getMainHandStack().setSubNbt("title", NbtString.of(title)); - mc.player.getMainHandStack().setSubNbt("author", NbtString.of(mc.player.getGameProfile().getName())); - - // Write pages NBT - NbtList pageNbt = new NbtList(); - pages.stream().map(NbtString::of).forEach(pageNbt::add); - if (!pages.isEmpty()) mc.player.getMainHandStack().setSubNbt("pages", pageNbt); + mc.player.getMainHandStack().set(DataComponentTypes.WRITTEN_BOOK_CONTENT, new WrittenBookContentComponent(RawFilteredPair.of(title), mc.player.getGameProfile().getName(), 0, filteredPages, true)); // Send book update to server mc.player.networkHandler.sendPacket(new BookUpdateC2SPacket(mc.player.getInventory().selectedSlot, pages, sign.get() ? Optional.of(title) : Optional.empty())); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/DiscordPresence.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/DiscordPresence.java index 3ddd3c98ca..e02b173356 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/DiscordPresence.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/DiscordPresence.java @@ -208,7 +208,7 @@ private void onTick(TickEvent.Post event) { if (Utils.canUpdate()) { // Line 1 if (line1Ticks >= line1UpdateDelay.get() || forceUpdate) { - if (line1Scripts.size() > 0) { + if (!line1Scripts.isEmpty()) { int i = Utils.random(0, line1Scripts.size()); if (line1SelectMode.get() == SelectMode.Sequential) { if (line1I >= line1Scripts.size()) line1I = 0; @@ -225,7 +225,7 @@ private void onTick(TickEvent.Post event) { // Line 2 if (line2Ticks >= line2UpdateDelay.get() || forceUpdate) { - if (line2Scripts.size() > 0) { + if (!line2Scripts.isEmpty()) { int i = Utils.random(0, line2Scripts.size()); if (line2SelectMode.get() == SelectMode.Sequential) { if (line2I >= line2Scripts.size()) line2I = 0; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/InventoryTweaks.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/InventoryTweaks.java index 190de57dbb..5c3b7b72d2 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/InventoryTweaks.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/InventoryTweaks.java @@ -36,7 +36,6 @@ import net.minecraft.screen.slot.Slot; import org.lwjgl.glfw.GLFW; -import java.util.Arrays; import java.util.List; import java.util.concurrent.ThreadLocalRandom; @@ -141,7 +140,7 @@ public class InventoryTweaks extends Module { public final Setting>> stealScreens = sgStealDump.add(new ScreenHandlerListSetting.Builder() .name("steal-screens") .description("Select the screens to display buttons and auto steal.") - .defaultValue(Arrays.asList(ScreenHandlerType.GENERIC_9X3, ScreenHandlerType.GENERIC_9X6)) + .defaultValue(List.of(ScreenHandlerType.GENERIC_9X3, ScreenHandlerType.GENERIC_9X6)) .build() ); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/NameProtect.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/NameProtect.java index a1bb503b55..fc5987e75e 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/NameProtect.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/NameProtect.java @@ -57,7 +57,7 @@ public String replaceName(String string) { } public String getName(String original) { - if (name.get().length() > 0 && isActive()) { + if (!name.get().isEmpty() && isActive()) { return name.get(); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notebot.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notebot.java index 00caf88242..0bc2c6009c 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notebot.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notebot.java @@ -36,9 +36,9 @@ import net.minecraft.block.Blocks; import net.minecraft.block.NoteBlock; import net.minecraft.block.enums.Instrument; +import net.minecraft.entity.attribute.EntityAttributes; import net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket; import net.minecraft.network.packet.c2s.play.PlayerInteractBlockC2SPacket; -import net.minecraft.server.network.ServerPlayNetworkHandler; import net.minecraft.sound.SoundEvents; import net.minecraft.util.Hand; import net.minecraft.util.hit.BlockHitResult; @@ -483,7 +483,7 @@ private void setupNoteblocksMap() { if (uniqueNotesToUse.contains(note)) { // Add correct noteblock position to a noteBlockPositions - noteBlockPositions.put(note, noteblocks.remove(0)); + noteBlockPositions.put(note, noteblocks.removeFirst()); uniqueNotesToUse.remove(note); } @@ -514,7 +514,7 @@ private void setupNoteblocksMap() { for (BlockPos pos : positions) { if (foundNotes.isEmpty()) break; - Note note = foundNotes.remove(0); + Note note = foundNotes.removeFirst(); noteBlockPositions.put(note, pos); uniqueNotesToUse.remove(note); @@ -523,7 +523,7 @@ private void setupNoteblocksMap() { for (BlockPos pos : positions) { if (uniqueNotesToUse.isEmpty()) break; - Note note = uniqueNotesToUse.remove(0); + Note note = uniqueNotesToUse.removeFirst(); noteBlockPositions.put(note, pos); } } @@ -766,8 +766,8 @@ public boolean loadFileToMap(File file, Runnable callback) { private void scanForNoteblocks() { if (mc.interactionManager == null || mc.world == null || mc.player == null) return; scannedNoteblocks.clear(); - int min = (int) (-mc.interactionManager.getReachDistance()) - 2; - int max = (int) mc.interactionManager.getReachDistance() + 2; + int min = (int) (-mc.player.getBlockInteractionRange()) - 2; + int max = (int) mc.player.getBlockInteractionRange() + 2; // Scan for noteblocks horizontally // 6^3 kek @@ -782,7 +782,7 @@ private void scanForNoteblocks() { // Copied from ServerPlayNetworkHandler#onPlayerInteractBlock Vec3d vec3d2 = Vec3d.ofCenter(pos); double sqDist = mc.player.getEyePos().squaredDistanceTo(vec3d2); - if (sqDist > ServerPlayNetworkHandler.MAX_BREAK_SQUARED_DISTANCE) continue; + if (sqDist > mc.player.getAttributeValue(EntityAttributes.PLAYER_BLOCK_INTERACTION_RANGE)) continue; if (!isValidScanSpot(pos)) continue; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/ServerSpoof.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/ServerSpoof.java index dd0b910d15..1f20b8aaa8 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/ServerSpoof.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/ServerSpoof.java @@ -5,16 +5,15 @@ package meteordevelopment.meteorclient.systems.modules.misc; -import io.netty.buffer.Unpooled; -import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.packets.PacketEvent; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; +import meteordevelopment.meteorclient.utils.misc.text.RunnableClickEvent; import meteordevelopment.orbit.EventHandler; -import net.minecraft.network.PacketByteBuf; import net.minecraft.network.packet.BrandCustomPayload; import net.minecraft.network.packet.c2s.common.CustomPayloadC2SPacket; +import net.minecraft.network.packet.c2s.common.ResourcePackStatusC2SPacket; import net.minecraft.network.packet.s2c.common.ResourcePackSendS2CPacket; import net.minecraft.text.ClickEvent; import net.minecraft.text.HoverEvent; @@ -61,7 +60,7 @@ public class ServerSpoof extends Module { private final Setting> channels = sgGeneral.add(new StringListSetting.Builder() .name("channels") .description("If the channel contains the keyword, this outgoing channel will be blocked.") - .defaultValue("minecraft:register") + .defaultValue("fabric", "minecraft:register") .visible(blockChannels::get) .build() ); @@ -69,49 +68,60 @@ public class ServerSpoof extends Module { public ServerSpoof() { super(Categories.Misc, "server-spoof", "Spoof client brand, resource pack and channels."); - MeteorClient.EVENT_BUS.subscribe(new Listener()); + runInMainMenu = true; } - private class Listener { - @EventHandler - private void onPacketSend(PacketEvent.Send event) { - if (!isActive()) return; - if (!(event.packet instanceof CustomPayloadC2SPacket)) return; - Identifier id = ((CustomPayloadC2SPacket) event.packet).payload().id(); - - if (spoofBrand.get() && id.equals(BrandCustomPayload.ID)) - event.packet.write(new PacketByteBuf(Unpooled.buffer()).writeString(brand.get())); - - if (blockChannels.get()) { - for (String channel : channels.get()) { - if (StringUtils.containsIgnoreCase(channel, id.toString())) { - event.cancel(); - return; - } + @EventHandler + private void onPacketSend(PacketEvent.Send event) { + if (!isActive() || !(event.packet instanceof CustomPayloadC2SPacket)) return; + Identifier id = ((CustomPayloadC2SPacket) event.packet).payload().getId().id(); + + if (spoofBrand.get() && id.equals(BrandCustomPayload.ID.id())) + event.packet = new CustomPayloadC2SPacket(new BrandCustomPayload(brand.get())); + + if (blockChannels.get()) { + for (String channel : channels.get()) { + if (StringUtils.containsIgnoreCase(id.toString(), channel)) { + event.cancel(); + return; } } } + } - @EventHandler - private void onPacketRecieve(PacketEvent.Receive event) { - if (!isActive()) return; - - if (resourcePack.get()) { - if (!(event.packet instanceof ResourcePackSendS2CPacket packet)) return; - event.cancel(); - MutableText msg = Text.literal("This server has "); - msg.append(packet.required() ? "a required " : "an optional "); - MutableText link = Text.literal("resource pack"); - link.setStyle(link.getStyle() - .withColor(Formatting.BLUE) - .withUnderline(true) - .withClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, packet.url())) - .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Text.literal("Click to download"))) - ); - msg.append(link); - msg.append("."); - info(msg); - } + @EventHandler + private void onPacketReceive(PacketEvent.Receive event) { + if (!isActive()) return; + + if (resourcePack.get()) { + if (!(event.packet instanceof ResourcePackSendS2CPacket packet)) return; + event.cancel(); + + MutableText msg = Text.literal("This server has "); + msg.append(packet.required() ? "a required " : "an optional ").append("resource pack. "); + + MutableText link = Text.literal("[Download]"); + link.setStyle(link.getStyle() + .withColor(Formatting.BLUE) + .withUnderline(true) + .withClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, packet.url())) + .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Text.literal("Click to download"))) + ); + + MutableText acceptance = Text.literal("[Spoof Acceptance]"); + link.setStyle(link.getStyle() + .withColor(Formatting.DARK_GREEN) + .withUnderline(true) + .withClickEvent(new RunnableClickEvent(() -> { + event.connection.send(new ResourcePackStatusC2SPacket(packet.id(), ResourcePackStatusC2SPacket.Status.ACCEPTED)); + event.connection.send(new ResourcePackStatusC2SPacket(packet.id(), ResourcePackStatusC2SPacket.Status.SUCCESSFULLY_LOADED)); + })) + .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Text.literal("Click to spoof accepting the recourse pack."))) + ); + + msg.append(link).append(" "); + msg.append(acceptance).append("."); + info(msg); } } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Blink.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Blink.java index ee95718c4a..c23b5f6a7f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Blink.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Blink.java @@ -33,6 +33,7 @@ public class Blink extends Module { .build() ); + @SuppressWarnings("unused") private final Setting cancelBlink = sgGeneral.add(new KeybindSetting.Builder() .name("cancel-blink") .description("Cancels sending packets and sends you back to your original position.") @@ -84,7 +85,7 @@ private void onSendPacket(PacketEvent.Send event) { if (!(event.packet instanceof PlayerMoveC2SPacket p)) return; event.cancel(); - PlayerMoveC2SPacket prev = packets.size() == 0 ? null : packets.get(packets.size() - 1); + PlayerMoveC2SPacket prev = packets.isEmpty() ? null : packets.getLast(); if (prev != null && p.isOnGround() == prev.isOnGround() && diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/ClickTP.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/ClickTP.java index 64fe9dd512..64b555feef 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/ClickTP.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/ClickTP.java @@ -49,7 +49,7 @@ private void onTick(TickEvent.Post event) { BlockPos pos = ((BlockHitResult) hitResult).getBlockPos(); Direction side = ((BlockHitResult) hitResult).getSide(); - if (mc.world.getBlockState(pos).onUse(mc.world, mc.player, Hand.MAIN_HAND, (BlockHitResult) hitResult) != ActionResult.PASS) return; + if (mc.world.getBlockState(pos).onUse(mc.world, mc.player, (BlockHitResult) hitResult) != ActionResult.PASS) return; BlockState state = mc.world.getBlockState(pos); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/ElytraBoost.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/ElytraBoost.java index 4248fadda2..493e3d0d9b 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/ElytraBoost.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/ElytraBoost.java @@ -13,6 +13,8 @@ import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.misc.Keybind; import meteordevelopment.orbit.EventHandler; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.FireworksComponent; import net.minecraft.entity.Entity; import net.minecraft.entity.projectile.FireworkRocketEntity; import net.minecraft.item.FireworkRocketItem; @@ -51,6 +53,7 @@ public class ElytraBoost extends Module { .build() ); + @SuppressWarnings("unused") private final Setting keybind = sgGeneral.add(new KeybindSetting.Builder() .name("keybind") .description("The keybind to boost.") @@ -90,7 +93,7 @@ private void boost() { if (mc.player.isFallFlying() && mc.currentScreen == null) { ItemStack itemStack = Items.FIREWORK_ROCKET.getDefaultStack(); - itemStack.getOrCreateSubNbt("Fireworks").putByte("Flight", fireworkLevel.get().byteValue()); + itemStack.set(DataComponentTypes.FIREWORKS, new FireworksComponent(fireworkLevel.get(), itemStack.get(DataComponentTypes.FIREWORKS).explosions())); FireworkRocketEntity entity = new FireworkRocketEntity(mc.world, itemStack, mc.player); fireworks.add(entity); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Scaffold.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Scaffold.java index 4859cc63eb..3a9fa6ab3a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Scaffold.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Scaffold.java @@ -233,7 +233,7 @@ private void onTick(TickEvent.Pre event) { blockPosArray.sort(Comparator.comparingDouble((blockPos) -> blockPos.getSquaredDistance(targetBlock))); - bp.set(blockPosArray.get(0)); + bp.set(blockPosArray.getFirst()); } if (airPlace.get()) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Step.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Step.java index 04a9f24bf9..f10f65065f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Step.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Step.java @@ -14,6 +14,7 @@ import meteordevelopment.meteorclient.utils.entity.DamageUtils; import meteordevelopment.orbit.EventHandler; import net.minecraft.entity.Entity; +import net.minecraft.entity.attribute.EntityAttributes; import net.minecraft.entity.decoration.EndCrystalEntity; import java.util.OptionalDouble; @@ -73,16 +74,16 @@ private void onTick(TickEvent.Post event) { boolean work = (activeWhen.get() == ActiveWhen.Always) || (activeWhen.get() == ActiveWhen.Sneaking && mc.player.isSneaking()) || (activeWhen.get() == ActiveWhen.NotSneaking && !mc.player.isSneaking()); mc.player.setBoundingBox(mc.player.getBoundingBox().offset(0, 1, 0)); if (work && (!safeStep.get() || (getHealth() > stepHealth.get() && getHealth() - getExplosionDamage() > stepHealth.get()))){ - mc.player.setStepHeight(height.get().floatValue()); + mc.player.getAttributeInstance(EntityAttributes.GENERIC_STEP_HEIGHT).setBaseValue(height.get()); } else { - mc.player.setStepHeight(prevStepHeight); + mc.player.getAttributeInstance(EntityAttributes.GENERIC_STEP_HEIGHT).setBaseValue(prevStepHeight); } mc.player.setBoundingBox(mc.player.getBoundingBox().offset(0, -1, 0)); } @Override public void onDeactivate() { - mc.player.setStepHeight(prevStepHeight); + mc.player.getAttributeInstance(EntityAttributes.GENERIC_STEP_HEIGHT).setBaseValue(prevStepHeight); PathManagers.get().getSettings().getStep().set(prevPathManagerStep); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Velocity.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Velocity.java index 1687e6ca20..f10a263548 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Velocity.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Velocity.java @@ -150,7 +150,7 @@ private void onTick(TickEvent.Post event) { @EventHandler private void onPacketReceive(PacketEvent.Receive event) { if (knockback.get() && event.packet instanceof EntityVelocityUpdateS2CPacket packet - && ((EntityVelocityUpdateS2CPacket) event.packet).getId() == mc.player.getId()) { + && packet.getId() == mc.player.getId()) { double velX = (packet.getVelocityX() / 8000d - mc.player.getVelocity().x) * knockbackHorizontal.get(); double velY = (packet.getVelocityY() / 8000d - mc.player.getVelocity().y) * knockbackVertical.get(); double velZ = (packet.getVelocityZ() / 8000d - mc.player.getVelocity().z) * knockbackHorizontal.get(); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFly.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFly.java index 35f20b7a5e..0fccaba54e 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFly.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFly.java @@ -24,6 +24,7 @@ import meteordevelopment.orbit.EventHandler; import net.minecraft.block.Block; import net.minecraft.block.BlockState; +import net.minecraft.component.DataComponentTypes; import net.minecraft.entity.EquipmentSlot; import net.minecraft.item.ElytraItem; import net.minecraft.item.Items; @@ -264,8 +265,8 @@ public class ElytraFly extends Module { .name("replace-durability") .description("The durability threshold your elytra will be replaced at.") .defaultValue(2) - .range(1, Items.ELYTRA.getMaxDamage() - 1) - .sliderRange(1, Items.ELYTRA.getMaxDamage() - 1) + .range(1, Items.ELYTRA.getComponents().get(DataComponentTypes.MAX_DAMAGE) - 1) + .sliderRange(1, Items.ELYTRA.getComponents().get(DataComponentTypes.MAX_DAMAGE) - 1) .visible(replace::get) .build() ); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/modes/Bounce.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/modes/Bounce.java index deceb1f5a5..380ba802fd 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/modes/Bounce.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/modes/Bounce.java @@ -12,7 +12,6 @@ import meteordevelopment.meteorclient.events.packets.PacketEvent; import meteordevelopment.meteorclient.systems.modules.movement.elytrafly.ElytraFlightMode; import meteordevelopment.meteorclient.systems.modules.movement.elytrafly.ElytraFlightModes; -import meteordevelopment.meteorclient.systems.modules.player.Rotation; import meteordevelopment.meteorclient.utils.misc.input.Input; import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.client.option.KeyBinding; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoEat.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoEat.java index 307854c048..d41edba613 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoEat.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoEat.java @@ -21,6 +21,8 @@ import meteordevelopment.meteorclient.utils.player.SlotUtils; import meteordevelopment.orbit.EventHandler; import meteordevelopment.orbit.EventPriority; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.FoodComponent; import net.minecraft.item.Item; import net.minecraft.item.Items; @@ -29,7 +31,7 @@ import java.util.function.BiPredicate; public class AutoEat extends Module { - private static final Class[] AURAS = new Class[] { KillAura.class, CrystalAura.class, AnchorAura.class, BedAura.class }; + private static final Class[] AURAS = new Class[]{KillAura.class, CrystalAura.class, AnchorAura.class, BedAura.class}; private final SettingGroup sgGeneral = settings.getDefaultGroup(); private final SettingGroup sgThreshold = settings.createGroup("Threshold"); @@ -50,7 +52,7 @@ public class AutoEat extends Module { Items.SPIDER_EYE, Items.SUSPICIOUS_STEW ) - .filter(Item::isFood) + .filter(item -> item.getComponents().get(DataComponentTypes.FOOD) != null) .build() ); @@ -118,10 +120,10 @@ private void onTick(TickEvent.Pre event) { if (Modules.get().get(AutoGap.class).isEating()) return; if (eating) { - // If we are eating check if we should still be still eating + // If we are eating check if we should still be eating if (shouldEat()) { // Check if the item in current slot is not food - if (!mc.player.getInventory().getStack(slot).isFood()) { + if (mc.player.getInventory().getStack(slot).get(DataComponentTypes.FOOD) != null) { // If not try finding a new slot int slot = findSlot(); @@ -143,8 +145,7 @@ private void onTick(TickEvent.Pre event) { else { stopEating(); } - } - else { + } else { // If we are not eating check if we should start eating if (shouldEat()) { // Try to find a valid slot @@ -240,10 +241,11 @@ private int findSlot() { for (int i = 0; i < 9; i++) { // Skip if item isn't food Item item = mc.player.getInventory().getStack(i).getItem(); - if (!item.isFood()) continue; + FoodComponent foodComponent = item.getComponents().get(DataComponentTypes.FOOD); + if (foodComponent == null) continue; // Check if hunger value is better - int hunger = item.getFoodComponent().getHunger(); + int hunger = foodComponent.nutrition(); if (hunger > bestHunger) { // Skip if item is in blacklist if (blacklist.get().contains(item)) continue; @@ -255,7 +257,8 @@ private int findSlot() { } Item offHandItem = mc.player.getOffHandStack().getItem(); - if (offHandItem.isFood() && !blacklist.get().contains(offHandItem) && offHandItem.getFoodComponent().getHunger() > bestHunger) slot = SlotUtils.OFFHAND; + if (offHandItem.getComponents().get(DataComponentTypes.FOOD) != null && !blacklist.get().contains(offHandItem) && offHandItem.getComponents().get(DataComponentTypes.FOOD).nutrition() > bestHunger) + slot = SlotUtils.OFFHAND; return slot; } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoGap.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoGap.java index 5ce30960c1..053e933072 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoGap.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoGap.java @@ -28,6 +28,7 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; +import net.minecraft.registry.entry.RegistryEntry; import java.util.ArrayList; import java.util.List; @@ -250,7 +251,7 @@ private boolean shouldEat() { } private boolean shouldEatPotions() { - Map effects = mc.player.getActiveStatusEffects(); + Map, StatusEffectInstance> effects = mc.player.getActiveStatusEffects(); // Regeneration if (potionsRegeneration.get() && !effects.containsKey(StatusEffects.REGENERATION)) return true; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoMend.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoMend.java index ed2fa04905..243e67a35a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoMend.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoMend.java @@ -14,6 +14,7 @@ import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.player.InvUtils; import meteordevelopment.orbit.EventHandler; +import net.minecraft.component.DataComponentTypes; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.enchantment.Enchantments; import net.minecraft.item.Item; @@ -27,7 +28,7 @@ public class AutoMend extends Module { private final Setting> blacklist = sgGeneral.add(new ItemListSetting.Builder() .name("blacklist") .description("Item blacklist.") - .filter(Item::isDamageable) + .filter(item -> item.getComponents().get(DataComponentTypes.DAMAGE) != null) .build() ); @@ -73,8 +74,7 @@ private void onTick(TickEvent.Pre event) { toggle(); } - } - else { + } else { InvUtils.move().from(slot).toOffhand(); didMove = true; } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoReplenish.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoReplenish.java index a96403e2f7..943b60ed80 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoReplenish.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoReplenish.java @@ -147,7 +147,7 @@ private int findItem(ItemStack itemStack, int excludedSlot, int goodEnoughCount) for (int i = mc.player.getInventory().size() - 2; i >= (searchHotbar.get() ? 0 : 9); i--) { ItemStack stack = mc.player.getInventory().getStack(i); - if (i != excludedSlot && stack.getItem() == itemStack.getItem() && ItemStack.canCombine(itemStack, stack)) { + if (i != excludedSlot && stack.getItem() == itemStack.getItem() && ItemStack.areItemsAndComponentsEqual(itemStack, stack)) { if (stack.getCount() > count) { slot = i; count = stack.getCount(); @@ -184,7 +184,7 @@ private void setItem(int slot, ItemStack stack) { ItemStack s = items[slot]; ((ItemStackAccessor) (Object) s).setItem(stack.getItem()); s.setCount(stack.getCount()); - s.setNbt(stack.getNbt()); + s.applyComponentsFrom(stack.getComponents()); if (stack.isEmpty()) ((ItemStackAccessor) (Object) s).setItem(Items.AIR); } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java index 2dbaf5d492..c8cd0e1287 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java @@ -19,6 +19,7 @@ import meteordevelopment.orbit.EventHandler; import meteordevelopment.orbit.EventPriority; import net.minecraft.block.*; +import net.minecraft.component.DataComponentTypes; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.enchantment.Enchantments; import net.minecraft.item.*; @@ -215,8 +216,7 @@ && isFortunable(state.getBlock()) if (enchantPreference == EnchantPreference.SilkTouch) score += EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, itemStack); if (itemStack.getItem() instanceof SwordItem item && (state.getBlock() instanceof BambooBlock || state.getBlock() instanceof BambooShootBlock)) - score += 9000 + (item.getMaterial().getMiningLevel() * 1000); - + score += 9000 + (item.getComponents().get(DataComponentTypes.TOOL).getSpeed(state) * 1000); return score; } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/GhostHand.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/GhostHand.java index 7c3afe395e..1e9f5a7a42 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/GhostHand.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/GhostHand.java @@ -29,7 +29,7 @@ public GhostHand() { private void onTick(TickEvent.Pre event) { if (!mc.options.useKey.isPressed() || mc.player.isSneaking()) return; - if (mc.world.getBlockState(BlockPos.ofFloored(mc.player.raycast(mc.interactionManager.getReachDistance(), mc.getTickDelta(), false).getPos())).hasBlockEntity()) return; + if (mc.world.getBlockState(BlockPos.ofFloored(mc.player.raycast(mc.player.getBlockInteractionRange(), mc.getTickDelta(), false).getPos())).hasBlockEntity()) return; Vec3d direction = new Vec3d(0, 0, 0.1) .rotateX(-(float) Math.toRadians(mc.player.getPitch())) @@ -37,7 +37,7 @@ private void onTick(TickEvent.Pre event) { posList.clear(); - for (int i = 1; i < mc.interactionManager.getReachDistance() * 10; i++) { + for (int i = 1; i < mc.player.getBlockInteractionRange() * 10; i++) { BlockPos pos = BlockPos.ofFloored(mc.player.getCameraPosVec(mc.getTickDelta()).add(direction.multiply(i))); if (posList.contains(pos)) continue; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/PotionSaver.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/PotionSaver.java index d833f12131..44e2079955 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/PotionSaver.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/PotionSaver.java @@ -25,20 +25,20 @@ public class PotionSaver extends Module { .name("effects") .description("The effects to preserve.") .defaultValue( - STRENGTH, - ABSORPTION, - RESISTANCE, - FIRE_RESISTANCE, - SPEED, - HASTE, - REGENERATION, - WATER_BREATHING, - SATURATION, - LUCK, - SLOW_FALLING, - DOLPHINS_GRACE, - CONDUIT_POWER, - HERO_OF_THE_VILLAGE + STRENGTH.value(), + ABSORPTION.value(), + RESISTANCE.value(), + FIRE_RESISTANCE.value(), + SPEED.value(), + HASTE.value(), + REGENERATION.value(), + WATER_BREATHING.value(), + SATURATION.value(), + LUCK.value(), + SLOW_FALLING.value(), + DOLPHINS_GRACE.value(), + CONDUIT_POWER.value(), + HERO_OF_THE_VILLAGE.value() ) .build() ); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/PotionSpoof.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/PotionSpoof.java index dc0669ac88..a24a3271e5 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/PotionSpoof.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/PotionSpoof.java @@ -15,6 +15,7 @@ import meteordevelopment.orbit.EventHandler; import net.minecraft.entity.effect.StatusEffect; import net.minecraft.entity.effect.StatusEffectInstance; +import net.minecraft.registry.Registries; import java.util.List; @@ -41,21 +42,14 @@ public class PotionSpoof extends Module { .name("blocked-potions") .description("Potions to block.") .defaultValue( - LEVITATION, - JUMP_BOOST, - SLOW_FALLING, - DOLPHINS_GRACE + LEVITATION.value(), + JUMP_BOOST.value(), + SLOW_FALLING.value(), + DOLPHINS_GRACE.value() ) .build() ); - public final Setting applyGravity = sgGeneral.add(new BoolSetting.Builder() - .name("gravity") - .description("Applies gravity when levitating.") - .defaultValue(false) - .build() - ); - public PotionSpoof() { super(Categories.Player, "potion-spoof", "Spoofs potion statuses for you. SOME effects DO NOT work."); } @@ -66,7 +60,7 @@ public void onDeactivate() { for (Reference2IntMap.Entry entry : spoofPotions.get().reference2IntEntrySet()) { if (entry.getIntValue() <= 0) continue; - if (mc.player.hasStatusEffect(entry.getKey())) mc.player.removeStatusEffect(entry.getKey()); + if (mc.player.hasStatusEffect(Registries.STATUS_EFFECT.getEntry(entry.getKey()))) mc.player.removeStatusEffect(Registries.STATUS_EFFECT.getEntry(entry.getKey())); } } @@ -76,12 +70,12 @@ private void onTick(TickEvent.Post event) { int level = entry.getIntValue(); if (level <= 0) continue; - if (mc.player.hasStatusEffect(entry.getKey())) { - StatusEffectInstance instance = mc.player.getStatusEffect(entry.getKey()); + if (mc.player.hasStatusEffect(Registries.STATUS_EFFECT.getEntry(entry.getKey()))) { + StatusEffectInstance instance = mc.player.getStatusEffect(Registries.STATUS_EFFECT.getEntry(entry.getKey())); ((StatusEffectInstanceAccessor) instance).setAmplifier(level - 1); if (instance.getDuration() < 20) ((StatusEffectInstanceAccessor) instance).setDuration(20); } else { - mc.player.addStatusEffect(new StatusEffectInstance(entry.getKey(), 20, level - 1)); + mc.player.addStatusEffect(new StatusEffectInstance(Registries.STATUS_EFFECT.getEntry(entry.getKey()), 20, level - 1)); } } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/Reach.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/Reach.java index c280f6b58a..b85f72935a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/Reach.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/Reach.java @@ -10,6 +10,7 @@ import meteordevelopment.meteorclient.settings.SettingGroup; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; +import net.minecraft.entity.attribute.EntityAttributes; public class Reach extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); @@ -36,13 +37,13 @@ public Reach() { super(Categories.Player, "reach", "Gives you super long arms."); } - public float blockReach() { - if (!isActive()) return mc.interactionManager.getCurrentGameMode().isCreative() ? 5.0F : 4.5F; + public double blockReach() { + if (!isActive()) return mc.player.getAttributeValue(EntityAttributes.PLAYER_BLOCK_INTERACTION_RANGE); return blockReach.get().floatValue(); } - public float entityReach() { - if (!isActive()) return 3; + public double entityReach() { + if (!isActive()) return mc.player.getAttributeValue(EntityAttributes.PLAYER_ENTITY_INTERACTION_RANGE); return entityReach.get().floatValue(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java index dd22f2b97f..48fca09f5e 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java @@ -23,24 +23,23 @@ import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.tooltip.*; import meteordevelopment.orbit.EventHandler; -import net.minecraft.block.entity.BannerPattern; -import net.minecraft.block.entity.BannerPatterns; +import net.minecraft.component.ComponentMap; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.*; +import net.minecraft.component.type.BannerPatternsComponent.Layer; +import net.minecraft.component.type.SuspiciousStewEffectsComponent.StewEffect; import net.minecraft.entity.Bucketable; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; -import net.minecraft.entity.effect.StatusEffect; import net.minecraft.entity.effect.StatusEffectInstance; import net.minecraft.entity.effect.StatusEffectUtil; import net.minecraft.inventory.Inventories; import net.minecraft.item.*; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtElement; import net.minecraft.nbt.NbtList; -import net.minecraft.registry.Registries; -import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.registry.DynamicRegistryManager; import net.minecraft.text.MutableText; +import net.minecraft.text.RawFilteredPair; import net.minecraft.text.Text; -import net.minecraft.util.DyeColor; import net.minecraft.util.Formatting; import net.minecraft.util.collection.DefaultedList; @@ -217,6 +216,13 @@ public class BetterTooltips extends Module { .build() ); + private final Setting upgrades = sgHideFlags.add(new BoolSetting.Builder() + .name("armor-trim") + .description("Show armor trims when it's hidden.") + .defaultValue(false) + .build() + ); + public BetterTooltips() { super(Categories.Render, "better-tooltips", "Displays more useful tooltips for certain items."); } @@ -226,34 +232,17 @@ private void appendTooltip(ItemStackTooltipEvent event) { // Status effects if (statusEffects.get()) { if (event.itemStack.getItem() == Items.SUSPICIOUS_STEW) { - NbtCompound tag = event.itemStack.getNbt(); - - if (tag != null) { - NbtList effects = tag.getList("effects", 10); - - if (effects != null) { - for (int i = 0; i < effects.size(); i++) { - NbtCompound effectTag = effects.getCompound(i); - byte effectId = effectTag.getByte("EffectId"); - int effectDuration = effectTag.contains("EffectDuration") ? effectTag.getInt("EffectDuration") : 160; - StatusEffect type = Registries.STATUS_EFFECT.get(effectId); - - if (type != null) { - StatusEffectInstance effect = new StatusEffectInstance(type, effectDuration, 0); - event.list.add(1, getStatusText(effect)); - } - } + SuspiciousStewEffectsComponent stewEffectsComponent = event.itemStack.get(DataComponentTypes.SUSPICIOUS_STEW_EFFECTS); + if (stewEffectsComponent != null) { + for (StewEffect effectTag : stewEffectsComponent.effects()) { + StatusEffectInstance effect = new StatusEffectInstance(effectTag.effect(), effectTag.duration(), 0); + event.list.add(1, getStatusText(effect)); } } - } - else if (event.itemStack.getItem().isFood()) { - FoodComponent food = event.itemStack.getItem().getFoodComponent(); - + } else { + FoodComponent food = event.itemStack.get(DataComponentTypes.FOOD); if (food != null) { - food.getStatusEffects().forEach((e) -> { - StatusEffectInstance effect = e.getFirst(); - event.list.add(1, getStatusText(effect)); - }); + food.effects().forEach(e -> event.list.add(1, getStatusText(e.effect()))); } } } @@ -261,20 +250,17 @@ else if (event.itemStack.getItem().isFood()) { //Beehive if (beehive.get()) { if (event.itemStack.getItem() == Items.BEEHIVE || event.itemStack.getItem() == Items.BEE_NEST) { - NbtCompound tag = event.itemStack.getNbt(); - - if (tag != null) { - NbtCompound blockStateTag = tag.getCompound("BlockStateTag"); - if (blockStateTag != null) { - int level = blockStateTag.getInt("honey_level"); - event.list.add(1, Text.literal(String.format("%sHoney level: %s%d%s.", Formatting.GRAY, Formatting.YELLOW, level, Formatting.GRAY))); - } + ComponentMap components = event.itemStack.getComponents(); + BlockStateComponent blockStateComponent = components.get(DataComponentTypes.BLOCK_STATE); + if (blockStateComponent != null) { + String level = blockStateComponent.properties().get("honey_level"); + event.list.add(1, Text.literal(String.format("%sHoney level: %s%s%s.", Formatting.GRAY, Formatting.YELLOW, level, Formatting.GRAY))); + } - NbtCompound blockEntityTag = tag.getCompound("BlockEntityTag"); - if (blockEntityTag != null) { - NbtList beesTag = blockEntityTag.getList("Bees", 10); - event.list.add(1, Text.literal(String.format("%sBees: %s%d%s.", Formatting.GRAY, Formatting.YELLOW, beesTag.size(), Formatting.GRAY))); - } + NbtComponent nbtComponent = components.get(DataComponentTypes.BLOCK_ENTITY_DATA); + if (nbtComponent != null) { + NbtList beesTag = nbtComponent.copyNbt().getList("Bees", 10); + event.list.add(1, Text.literal(String.format("%sBees: %s%d%s.", Formatting.GRAY, Formatting.YELLOW, beesTag.size(), Formatting.GRAY))); } } } @@ -282,7 +268,7 @@ else if (event.itemStack.getItem().isFood()) { // Item size tooltip if (byteSize.get()) { try { - event.itemStack.writeNbt(new NbtCompound()).write(ByteCountDataOutput.INSTANCE); + event.itemStack.encode(mc.player.getRegistryManager()).write(ByteCountDataOutput.INSTANCE); int byteCount = ByteCountDataOutput.INSTANCE.getCount(); String count; @@ -306,7 +292,7 @@ else if (event.itemStack.getItem().isFood()) { || (event.itemStack.getItem() == Items.WRITTEN_BOOK && books.get() && !previewBooks()) || (event.itemStack.getItem() instanceof EntityBucketItem && entitiesInBuckets.get() && !previewEntities()) || (event.itemStack.getItem() instanceof BannerItem && banners.get() && !previewBanners()) - || (event.itemStack.getItem() instanceof BannerPatternItem && banners.get() && !previewBanners()) + || (event.itemStack.getItem() instanceof BannerPatternItem && banners.get() && !previewBanners()) || (event.itemStack.getItem() == Items.SHIELD && banners.get() && !previewBanners())) { event.list.add(Text.literal("")); event.list.add(Text.literal("Hold " + Formatting.YELLOW + keybind + Formatting.RESET + " to preview")); @@ -317,22 +303,25 @@ else if (event.itemStack.getItem().isFood()) { private void getTooltipData(TooltipDataEvent event) { // Container preview if (previewShulkers() && Utils.hasItems(event.itemStack)) { - NbtCompound compoundTag = event.itemStack.getSubNbt("BlockEntityTag"); - DefaultedList itemStacks = DefaultedList.ofSize(27, ItemStack.EMPTY); - Inventories.readNbt(compoundTag, itemStacks); - event.tooltipData = new ContainerTooltipComponent(itemStacks, Utils.getShulkerColor(event.itemStack)); + NbtComponent nbtComponent = event.itemStack.get(DataComponentTypes.BLOCK_ENTITY_DATA); + if (nbtComponent != null) { + DefaultedList itemStacks = DefaultedList.ofSize(27, ItemStack.EMPTY); + Inventories.readNbt(nbtComponent.copyNbt(), itemStacks, DynamicRegistryManager.EMPTY); + event.tooltipData = new ContainerTooltipComponent(itemStacks, Utils.getShulkerColor(event.itemStack)); + } } // EChest preview else if (event.itemStack.getItem() == Items.ENDER_CHEST && previewEChest()) { - event.tooltipData = EChestMemory.isKnown() ? new ContainerTooltipComponent(EChestMemory.ITEMS, ECHEST_COLOR) + event.tooltipData = EChestMemory.isKnown() + ? new ContainerTooltipComponent(EChestMemory.ITEMS, ECHEST_COLOR) : new TextTooltipComponent(Text.literal("Unknown ender chest inventory.").formatted(Formatting.DARK_RED)); } // Map preview else if (event.itemStack.getItem() == Items.FILLED_MAP && previewMaps()) { - Integer mapId = FilledMapItem.getMapId(event.itemStack); - if (mapId != null) event.tooltipData = new MapTooltipComponent(mapId); + MapIdComponent mapIdComponent = event.itemStack.get(DataComponentTypes.MAP_ID); + if (mapIdComponent != null) event.tooltipData = new MapTooltipComponent(mapIdComponent.id()); } // Book preview @@ -344,14 +333,12 @@ else if ((event.itemStack.getItem() == Items.WRITABLE_BOOK || event.itemStack.ge // Banner preview else if (event.itemStack.getItem() instanceof BannerItem && previewBanners()) { event.tooltipData = new BannerTooltipComponent(event.itemStack); - } - else if (event.itemStack.getItem() instanceof BannerPatternItem patternItem && previewBanners()) { - boolean present = Registries.BANNER_PATTERN.getEntryList(patternItem.getPattern()).isPresent() && Registries.BANNER_PATTERN.getEntryList(patternItem.getPattern()).get().size() != 0; - - RegistryEntry bannerPattern = (present ? Registries.BANNER_PATTERN.getEntryList(patternItem.getPattern()).get().get(0) : null); - if (bannerPattern != null) event.tooltipData = new BannerTooltipComponent(createBannerFromPattern(bannerPattern)); - } - else if (event.itemStack.getItem() == Items.SHIELD && previewBanners()) { + } else if (event.itemStack.getItem() instanceof BannerPatternItem patternItem && previewBanners()) { + BannerPatternsComponent bannerPatternsComponent = event.itemStack.get(DataComponentTypes.BANNER_PATTERNS); + if (bannerPatternsComponent != null) { + event.tooltipData = new BannerTooltipComponent(createBannerFromLayers(bannerPatternsComponent.layers())); + } + } else if (event.itemStack.getItem() == Items.SHIELD && previewBanners()) { ItemStack banner = createBannerFromShield(event.itemStack); if (banner != null) event.tooltipData = new BannerTooltipComponent(banner); } @@ -361,7 +348,7 @@ else if (event.itemStack.getItem() instanceof EntityBucketItem bucketItem && pre EntityType type = ((EntityBucketItemAccessor) bucketItem).getEntityType(); Entity entity = type.create(mc.world); if (entity != null) { - ((Bucketable) entity).copyDataFromNbt(event.itemStack.getOrCreateNbt()); + ((Bucketable) entity).copyDataFromNbt(event.itemStack.get(DataComponentTypes.BUCKET_ENTITY_DATA).copyNbt()); ((EntityAccessor) entity).setInWater(true); event.tooltipData = new EntityTooltipComponent(entity); } @@ -370,27 +357,29 @@ else if (event.itemStack.getItem() instanceof EntityBucketItem bucketItem && pre @EventHandler private void onSectionVisible(SectionVisibleEvent event) { - if (enchantments.get() && event.section == ItemStack.TooltipSection.ENCHANTMENTS || - modifiers.get() && event.section == ItemStack.TooltipSection.MODIFIERS || - unbreakable.get() && event.section == ItemStack.TooltipSection.UNBREAKABLE || - canDestroy.get() && event.section == ItemStack.TooltipSection.CAN_DESTROY || - canPlaceOn.get() && event.section == ItemStack.TooltipSection.CAN_PLACE || - additional.get() && event.section == ItemStack.TooltipSection.ADDITIONAL || - dye.get() && event.section == ItemStack.TooltipSection.DYE) + // todo investigate how section visibility works now + if (enchantments.get() && event.section == DataComponentTypes.STORED_ENCHANTMENTS || + modifiers.get() && event.section == DataComponentTypes.ATTRIBUTE_MODIFIERS || + unbreakable.get() && event.section == DataComponentTypes.UNBREAKABLE || + canDestroy.get() && event.section == DataComponentTypes.CAN_BREAK || + canPlaceOn.get() && event.section == DataComponentTypes.CAN_PLACE_ON || + //additional.get() && event.section == ItemStack.TooltipSection.ADDITIONAL || + dye.get() && event.section == DataComponentTypes.DYED_COLOR || + upgrades.get() && event.section == DataComponentTypes.TRIM) event.visible = true; } - public void applyCompactShulkerTooltip(ItemStack stack, List tooltip) { - NbtCompound tag = stack.getSubNbt("BlockEntityTag"); + public void applyCompactShulkerTooltip(ItemStack shulkerItem, List tooltip) { + NbtComponent nbtComponent = shulkerItem.get(DataComponentTypes.BLOCK_ENTITY_DATA); - if (tag != null) { - if (tag.contains("LootTable", 8)) { + if (nbtComponent != null) { + if (nbtComponent.contains("LootTable")) { tooltip.add(Text.literal("???????")); } - if (tag.contains("Items", 9)) { + if (nbtComponent.contains("Items")) { DefaultedList items = DefaultedList.ofSize(27, ItemStack.EMPTY); - Inventories.readNbt(tag, items); + Inventories.readNbt(nbtComponent.copyNbt(), items, DynamicRegistryManager.EMPTY); Object2IntMap counts = new Object2IntOpenHashMap<>(); @@ -418,51 +407,47 @@ private MutableText getStatusText(StatusEffectInstance effect) { MutableText text = Text.translatable(effect.getTranslationKey()); if (effect.getAmplifier() != 0) { text.append(String.format(" %d (%s)", effect.getAmplifier() + 1, StatusEffectUtil.getDurationText(effect, 1, mc.world.getTickManager().getTickRate()).getString())); - } - else { + } else { text.append(String.format(" (%s)", StatusEffectUtil.getDurationText(effect, 1, mc.world.getTickManager().getTickRate()).getString())); } - if (effect.getEffectType().isBeneficial()) return text.formatted(Formatting.BLUE); + if (effect.getEffectType().value().isBeneficial()) return text.formatted(Formatting.BLUE); return text.formatted(Formatting.RED); } - private Text getFirstPage(ItemStack stack) { - NbtCompound tag = stack.getNbt(); - if (tag == null) return null; + private Text getFirstPage(ItemStack bookItem) { + ComponentMap components = bookItem.getComponents(); + if (components == ComponentMap.EMPTY) return null; - NbtList pages = tag.getList("pages", 8); - if (pages.size() < 1) return null; - if (stack.getItem() == Items.WRITABLE_BOOK) return Text.literal(pages.getString(0)); + List> pages = components.get(DataComponentTypes.WRITABLE_BOOK_CONTENT).pages(); + if (pages.isEmpty()) return null; + if (bookItem.getItem() == Items.WRITABLE_BOOK) return Text.literal(pages.getFirst().get(false)); try { - return Text.Serialization.fromLenientJson(pages.getString(0)); + return Text.Serialization.fromLenientJson(pages.getFirst().get(false), DynamicRegistryManager.EMPTY); } catch (JsonParseException e) { return Text.literal("Invalid book data"); } } - private ItemStack createBannerFromPattern(RegistryEntry pattern) { - ItemStack itemStack = new ItemStack(Items.GRAY_BANNER); - NbtCompound nbt = itemStack.getOrCreateSubNbt("BlockEntityTag"); - NbtList listNbt = new BannerPattern.Patterns().add(BannerPatterns.BASE, DyeColor.BLACK).add(pattern, DyeColor.WHITE).toNbt(); - nbt.put("Patterns", listNbt); - return itemStack; + private ItemStack createBannerFromLayers(List pattern) { + ItemStack bannerItem = new ItemStack(Items.GRAY_BANNER); + BannerPatternsComponent bannerPatterns = bannerItem.get(DataComponentTypes.BANNER_PATTERNS); + bannerPatterns.layers().addAll(pattern); + bannerItem.set(DataComponentTypes.BANNER_PATTERNS, bannerPatterns); + return bannerItem; } - private ItemStack createBannerFromShield(ItemStack item) { - if (!item.hasNbt() - || !item.getNbt().contains("BlockEntityTag") - || !item.getNbt().getCompound("BlockEntityTag").contains("Base")) + private ItemStack createBannerFromShield(ItemStack shieldItem) { + if (!shieldItem.getComponents().isEmpty() + || shieldItem.get(DataComponentTypes.BLOCK_ENTITY_DATA) == null + || shieldItem.get(DataComponentTypes.BASE_COLOR) == null) return null; - NbtList listNbt = new BannerPattern.Patterns().add(BannerPatterns.BASE, ShieldItem.getColor(item)).toNbt(); - NbtCompound nbt = item.getOrCreateSubNbt("BlockEntityTag"); ItemStack bannerItem = new ItemStack(Items.GRAY_BANNER); - NbtCompound bannerTag = bannerItem.getOrCreateSubNbt("BlockEntityTag"); - bannerTag.put("Patterns", listNbt); - if (!nbt.contains("Patterns")) return bannerItem; - NbtList shieldPatterns = nbt.getList("Patterns", NbtElement.COMPOUND_TYPE); - listNbt.addAll(shieldPatterns); + BannerPatternsComponent bannerPatternsComponent = bannerItem.get(DataComponentTypes.BANNER_PATTERNS); + BannerPatternsComponent shieldPatternsComponent = shieldItem.get(DataComponentTypes.BANNER_PATTERNS); + if (shieldPatternsComponent == null) return bannerItem; + bannerPatternsComponent.layers().addAll(shieldPatternsComponent.layers()); return bannerItem; } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BlockSelection.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BlockSelection.java index f2a392f56d..a45948b7bc 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BlockSelection.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BlockSelection.java @@ -12,8 +12,8 @@ import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.render.color.SettingColor; import meteordevelopment.orbit.EventHandler; -import net.minecraft.block.BlockState; import net.minecraft.util.hit.BlockHitResult; +import net.minecraft.util.hit.HitResult; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Box; import net.minecraft.util.math.Direction; @@ -70,15 +70,14 @@ public BlockSelection() { @EventHandler private void onRender(Render3DEvent event) { - if (mc.crosshairTarget == null || !(mc.crosshairTarget instanceof BlockHitResult result)) return; + if (mc.crosshairTarget == null || !(mc.crosshairTarget instanceof BlockHitResult result) || result.getType() == HitResult.Type.MISS) return; if (hideInside.get() && result.isInsideBlock()) return; BlockPos bp = result.getBlockPos(); Direction side = result.getSide(); - BlockState state = mc.world.getBlockState(bp); - VoxelShape shape = state.getOutlineShape(mc.world, bp); + VoxelShape shape = mc.world.getBlockState(bp).getOutlineShape(mc.world, bp); if (shape.isEmpty()) return; Box box = shape.getBoundingBox(); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/CityESP.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/CityESP.java index d12d1f0e83..6d9816db96 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/CityESP.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/CityESP.java @@ -56,9 +56,9 @@ public CityESP() { @EventHandler private void onTick(TickEvent.Post event) { - PlayerEntity targetEntity = TargetUtils.getPlayerTarget(mc.interactionManager.getReachDistance() + 2, SortPriority.LowestDistance); + PlayerEntity targetEntity = TargetUtils.getPlayerTarget(mc.player.getBlockInteractionRange() + 2, SortPriority.LowestDistance); - if (TargetUtils.isBadTarget(targetEntity, mc.interactionManager.getReachDistance() + 2)) { + if (TargetUtils.isBadTarget(targetEntity, mc.player.getBlockInteractionRange() + 2)) { target = null; } else { target = EntityUtils.getCityBlock(targetEntity); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Freecam.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Freecam.java index 3d85e15f92..d224d919e5 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Freecam.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Freecam.java @@ -168,7 +168,7 @@ public void onDeactivate() { if (reloadChunks.get()) mc.worldRenderer.reload(); mc.options.setPerspective(perspective); if (staticView.get()) { - mc.options.getFovEffectScale().setValue((double)fovScale); + mc.options.getFovEffectScale().setValue(fovScale); mc.options.getBobView().setValue(bobView); } } @@ -374,7 +374,7 @@ private void onGameLeft(GameLeftEvent event) { @EventHandler private void onPacketReceive(PacketEvent.Receive event) { if (event.packet instanceof DeathMessageS2CPacket packet) { - Entity entity = mc.world.getEntityById(packet.getEntityId()); + Entity entity = mc.world.getEntityById(packet.playerId()); if (entity == mc.player && toggleOnDeath.get()) { toggle(); info("Toggled off because you died."); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/LightOverlay.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/LightOverlay.java index 32b3f02be0..a7d080d128 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/LightOverlay.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/LightOverlay.java @@ -80,8 +80,6 @@ public class LightOverlay extends Module { private final Pool crossPool = new Pool<>(Cross::new); private final List crosses = new ArrayList<>(); - private final BlockPos.Mutable bp = new BlockPos.Mutable(); - private final Mesh mesh = new ShaderMesh(Shaders.POS_COLOR, DrawMode.Lines, Mesh.Attrib.Vec3, Mesh.Attrib.Color); public LightOverlay() { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java index aa9c22d7ec..77bf49b9aa 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java @@ -25,6 +25,7 @@ import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.render.color.SettingColor; import meteordevelopment.orbit.EventHandler; +import net.minecraft.component.type.ItemEnchantmentsComponent; import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.enchantment.Enchantments; @@ -32,6 +33,7 @@ import net.minecraft.entity.decoration.ItemFrameEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; +import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; import net.minecraft.world.GameMode; @@ -479,12 +481,12 @@ private void renderNametagPlayer(Render2DEvent event, PlayerEntity player, boole if (!itemStack.isEmpty()) hasItems = true; if (displayEnchants.get()) { - Map enchantments = EnchantmentHelper.get(itemStack); + ItemEnchantmentsComponent enchantments = EnchantmentHelper.getEnchantments(itemStack); int size = 0; - for (var enchantment : enchantments.keySet()) { - if (!shownEnchantments.get().contains(enchantment)) continue; - String enchantName = Utils.getEnchantSimpleName(enchantment, enchantLength.get()) + " " + enchantments.get(enchantment); + for (RegistryEntry enchantment : enchantments.getEnchantments()) { + if (!shownEnchantments.get().contains(enchantment.value())) continue; + String enchantName = Utils.getEnchantSimpleName(enchantment.value(), enchantLength.get()) + " " + enchantments.getLevel(enchantment.value()); itemWidths[i] = Math.max(itemWidths[i], (text.getWidth(enchantName, shadow) / 2)); size++; } @@ -524,12 +526,12 @@ private void renderNametagPlayer(Render2DEvent event, PlayerEntity player, boole if (maxEnchantCount > 0 && displayEnchants.get()) { text.begin(0.5 * enchantTextScale.get(), false, true); - Map enchantments = EnchantmentHelper.get(stack); + ItemEnchantmentsComponent enchantments = EnchantmentHelper.getEnchantments(stack); Map enchantmentsToShow = new HashMap<>(); - for (Enchantment enchantment : enchantments.keySet()) { - if (shownEnchantments.get().contains(enchantment)) { - enchantmentsToShow.put(enchantment, enchantments.get(enchantment)); + for (RegistryEntry enchantment : enchantments.getEnchantments()) { + if (shownEnchantments.get().contains(enchantment.value())) { + enchantmentsToShow.put(enchantment.value(), enchantments.getLevel(enchantment.value())); } } @@ -691,7 +693,7 @@ public enum Durability { public enum DistanceColorMode { Gradient, - Flat; + Flat } public boolean excludeBots() { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/StorageESP.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/StorageESP.java index fa0b140ede..9655ef5215 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/StorageESP.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/StorageESP.java @@ -225,9 +225,8 @@ private void onBlockInteract(InteractBlockEvent event) { if (blockEntity == null) return; interactedBlocks.add(pos); - if (blockEntity instanceof ChestBlockEntity) { - ChestBlockEntity chest = (ChestBlockEntity) blockEntity; - BlockState state = chest.getCachedState(); + if (blockEntity instanceof ChestBlockEntity chestBlockEntity) { + BlockState state = chestBlockEntity.getCachedState(); ChestType chestType = state.get(ChestBlock.CHEST_TYPE); if (chestType == ChestType.LEFT || chestType == ChestType.RIGHT) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Tracers.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Tracers.java index d2c751ada8..e227505bf9 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Tracers.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Tracers.java @@ -41,7 +41,7 @@ public class Tracers extends Module { public enum TracerStyle { Lines, Offscreen - }; + } // General @@ -305,7 +305,7 @@ public void onRender2D(Render2DEvent event) { Vector2f newPoint = new Vector2f(screenCenter.x + distanceOffscreen.get() * (float) Math.cos(angleYawRad), screenCenter.y + distanceOffscreen.get() * (float) Math.sin(angleYawRad)); - Vector2f trianglePoints[] = { + Vector2f[] trianglePoints = { new Vector2f(newPoint.x - sizeOffscreen.get(), newPoint.y - sizeOffscreen.get()), new Vector2f(newPoint.x + sizeOffscreen.get() * 0.73205f, newPoint.y), new Vector2f(newPoint.x - sizeOffscreen.get(), newPoint.y + sizeOffscreen.get()) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Xray.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Xray.java index 2ab23b7150..1b33af413c 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Xray.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Xray.java @@ -31,7 +31,7 @@ public class Xray extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - public static final List ORES = List.of(Blocks.COAL_ORE, Blocks.DEEPSLATE_COAL_ORE, Blocks.IRON_ORE, Blocks.DEEPSLATE_IRON_ORE, Blocks.GOLD_ORE, Blocks.DEEPSLATE_GOLD_ORE, Blocks.LAPIS_ORE, Blocks.DEEPSLATE_LAPIS_ORE, Blocks.REDSTONE_ORE, Blocks.REDSTONE_ORE, Blocks.DIAMOND_ORE, Blocks.DEEPSLATE_DIAMOND_ORE, Blocks.EMERALD_ORE, Blocks.DEEPSLATE_EMERALD_ORE, Blocks.COPPER_ORE, Blocks.DEEPSLATE_COPPER_ORE, Blocks.NETHER_GOLD_ORE, Blocks.NETHER_QUARTZ_ORE, Blocks.ANCIENT_DEBRIS); + public static final List ORES = List.of(Blocks.COAL_ORE, Blocks.DEEPSLATE_COAL_ORE, Blocks.IRON_ORE, Blocks.DEEPSLATE_IRON_ORE, Blocks.GOLD_ORE, Blocks.DEEPSLATE_GOLD_ORE, Blocks.LAPIS_ORE, Blocks.DEEPSLATE_LAPIS_ORE, Blocks.REDSTONE_ORE, Blocks.DEEPSLATE_REDSTONE_ORE, Blocks.DIAMOND_ORE, Blocks.DEEPSLATE_DIAMOND_ORE, Blocks.EMERALD_ORE, Blocks.DEEPSLATE_EMERALD_ORE, Blocks.COPPER_ORE, Blocks.DEEPSLATE_COPPER_ORE, Blocks.NETHER_GOLD_ORE, Blocks.NETHER_QUARTZ_ORE, Blocks.ANCIENT_DEBRIS); private final Setting> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("whitelist") diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/blockesp/ESPBlock.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/blockesp/ESPBlock.java index 47e4f160a9..809ea49ed5 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/blockesp/ESPBlock.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/blockesp/ESPBlock.java @@ -59,16 +59,15 @@ public ESPBlock(int x, int y, int z) { } public ESPBlock getSideBlock(int side) { - switch (side) { - case FO: return blockEsp.getBlock(x, y, z + 1); - case BA: return blockEsp.getBlock(x, y, z - 1); - case LE: return blockEsp.getBlock(x - 1, y, z); - case RI: return blockEsp.getBlock(x + 1, y, z); - case TO: return blockEsp.getBlock(x, y + 1, z); - case BO: return blockEsp.getBlock(x, y - 1, z); - } - - return null; + return switch (side) { + case FO -> blockEsp.getBlock(x, y, z + 1); + case BA -> blockEsp.getBlock(x, y, z - 1); + case LE -> blockEsp.getBlock(x - 1, y, z); + case RI -> blockEsp.getBlock(x + 1, y, z); + case TO -> blockEsp.getBlock(x, y + 1, z); + case BO -> blockEsp.getBlock(x, y - 1, z); + default -> null; + }; } private void assignGroup() { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/blockesp/ESPGroup.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/blockesp/ESPGroup.java index 6f4c109f2f..f103f75c79 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/blockesp/ESPGroup.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/blockesp/ESPGroup.java @@ -73,9 +73,9 @@ private void trySplit(ESPBlock block) { Set remainingBlocks = new ObjectOpenHashSet<>(blocks); Queue blocksToCheck = new ArrayDeque<>(); - blocksToCheck.offer(blocks.get(0)); - remainingBlocks.remove(blocks.get(0)); - neighbours.remove(blocks.get(0)); + blocksToCheck.offer(blocks.getFirst()); + remainingBlocks.remove(blocks.getFirst()); + neighbours.remove(blocks.getFirst()); loop: { while (!blocksToCheck.isEmpty()) { @@ -96,7 +96,7 @@ private void trySplit(ESPBlock block) { } } - if (neighbours.size() > 0) { + if (!neighbours.isEmpty()) { ESPGroup group = blockEsp.newGroup(this.block); group.blocks.ensureCapacity(remainingBlocks.size()); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/BaseMarker.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/BaseMarker.java index f18dcc6c70..81617cd0cb 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/BaseMarker.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/BaseMarker.java @@ -24,14 +24,12 @@ public abstract class BaseMarker implements ISerializable { public final Setting name = sgBase.add(new StringSetting.Builder() .name("name") .description("Custom name for this marker.") - .defaultValue("") .build() ); protected final Setting description = sgBase.add(new StringSetting.Builder() .name("description") .description("Custom description for this marker.") - .defaultValue("") .build() ); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/Sphere2dMarker.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/Sphere2dMarker.java index f638b90b1a..53b57e9a48 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/Sphere2dMarker.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/Sphere2dMarker.java @@ -105,6 +105,7 @@ public Block(int x, int y, int z) { // Keybinding + @SuppressWarnings("unused") private final Setting nextLayerKey = sgKeybinding.add(new KeybindSetting.Builder() .name("next-layer-keybind") .description("Keybind to increment layer") @@ -114,6 +115,7 @@ public Block(int x, int y, int z) { .build() ); + @SuppressWarnings("unused") private final Setting prevLayerKey = sgKeybinding.add(new KeybindSetting.Builder() .name("prev-layer-keybind") .description("Keybind to increment layer") diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AirPlace.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AirPlace.java index 16df2177f2..ac2729c18d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AirPlace.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AirPlace.java @@ -81,23 +81,23 @@ public AirPlace() { @EventHandler private void onTick(TickEvent.Post event) { - double r = customRange.get() ? range.get() : mc.interactionManager.getReachDistance(); + double r = customRange.get() ? range.get() : mc.player.getBlockInteractionRange(); hitResult = mc.getCameraEntity().raycast(r, 0, false); - if (!(hitResult instanceof BlockHitResult) || !(mc.player.getMainHandStack().getItem() instanceof BlockItem) && !(mc.player.getMainHandStack().getItem() instanceof SpawnEggItem)) return; + if (!(hitResult instanceof BlockHitResult blockHitResult) || !(mc.player.getMainHandStack().getItem() instanceof BlockItem) && !(mc.player.getMainHandStack().getItem() instanceof SpawnEggItem)) return; if (mc.options.useKey.isPressed()) { - BlockUtils.place(((BlockHitResult) hitResult).getBlockPos(), Hand.MAIN_HAND, mc.player.getInventory().selectedSlot, false, 0, true, true, false); + BlockUtils.place(blockHitResult.getBlockPos(), Hand.MAIN_HAND, mc.player.getInventory().selectedSlot, false, 0, true, true, false); } } @EventHandler private void onRender(Render3DEvent event) { - if (!(hitResult instanceof BlockHitResult) - || !mc.world.getBlockState(((BlockHitResult) hitResult).getBlockPos()).isReplaceable() + if (!(hitResult instanceof BlockHitResult blockHitResult) + || !mc.world.getBlockState(blockHitResult.getBlockPos()).isReplaceable() || !(mc.player.getMainHandStack().getItem() instanceof BlockItem) && !(mc.player.getMainHandStack().getItem() instanceof SpawnEggItem) || !render.get()) return; - event.renderer.box(((BlockHitResult) hitResult).getBlockPos(), sideColor.get(), lineColor.get(), shapeMode.get(), 0); + event.renderer.box(blockHitResult.getBlockPos(), sideColor.get(), lineColor.get(), shapeMode.get(), 0); } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoBrewer.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoBrewer.java index e184be0104..212c4adc04 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoBrewer.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoBrewer.java @@ -13,10 +13,10 @@ import meteordevelopment.meteorclient.utils.misc.MyPotion; import meteordevelopment.meteorclient.utils.player.InvUtils; import net.minecraft.client.resource.language.I18n; +import net.minecraft.component.DataComponentTypes; import net.minecraft.item.Item; import net.minecraft.item.Items; import net.minecraft.potion.Potion; -import net.minecraft.potion.PotionUtil; import net.minecraft.potion.Potions; import net.minecraft.screen.BrewingStandScreenHandler; @@ -138,8 +138,8 @@ private boolean insertWaterBottles(BrewingStandScreenHandler c) { for (int slotI = 5; slotI < c.slots.size(); slotI++) { if (c.slots.get(slotI).getStack().getItem() == Items.POTION) { - Potion potion = PotionUtil.getPotion(c.slots.get(slotI).getStack()); - if (potion == Potions.WATER) { + Potion potion = c.slots.get(slotI).getStack().get(DataComponentTypes.POTION_CONTENTS).potion().get().value(); + if (potion == Potions.WATER.value()) { slot = slotI; break; } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSmelter.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSmelter.java index f74847aa5b..fd07a778bf 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSmelter.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSmelter.java @@ -85,7 +85,7 @@ public void tick(AbstractFurnaceScreenHandler c) { } private void insertItems(AbstractFurnaceScreenHandler c) { - ItemStack inputItemStack = c.slots.get(0).getStack(); + ItemStack inputItemStack = c.slots.getFirst().getStack(); if (!inputItemStack.isEmpty()) return; int slot = -1; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/EChestFarmer.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/EChestFarmer.java index dc4a2bded9..0f6667e89c 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/EChestFarmer.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/EChestFarmer.java @@ -187,7 +187,7 @@ private void onTick(TickEvent.Pre event) { private void onRender(Render3DEvent event) { if (target == null || !render.get() || Modules.get().get(PacketMine.class).isMiningBlock(target)) return; - Box box = SHAPE.getBoundingBoxes().get(0); + Box box = SHAPE.getBoundingBoxes().getFirst(); event.renderer.box(target.getX() + box.minX, target.getY() + box.minY, target.getZ() + box.minZ, target.getX() + box.maxX, target.getY() + box.maxY, target.getZ() + box.maxZ, sideColor.get(), lineColor.get(), shapeMode.get(), 0); } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java index ff2eff1a99..42801dc61f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java @@ -389,11 +389,11 @@ else if (sortMode.get() != SortMode.None) } // Update timer - if (!firstBlock && !lastBlockPos.equals(blocks.get(0))) { + if (!firstBlock && !lastBlockPos.equals(blocks.getFirst())) { timer = delay.get(); firstBlock = false; - lastBlockPos.set(blocks.get(0)); + lastBlockPos.set(blocks.getFirst()); if (timer > 0) return; } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/PacketMine.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/PacketMine.java index 43ec364019..98b8b7091f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/PacketMine.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/PacketMine.java @@ -169,7 +169,7 @@ private void onTick(TickEvent.Pre event) { shouldUpdateSlot = false; } - if (!blocks.isEmpty()) blocks.get(0).mine(); + if (!blocks.isEmpty()) blocks.getFirst().mine(); if (!swapped && autoSwitch.get() && (!mc.player.isUsingItem() || !notOnUse.get())) { for (MyBlock block : blocks) { @@ -220,7 +220,7 @@ public MyBlock set(StartBreakingBlockEvent event) { } public boolean shouldRemove() { - boolean remove = mc.world.getBlockState(blockPos).getBlock() != block || Utils.distance(mc.player.getX() - 0.5, mc.player.getY() + mc.player.getEyeHeight(mc.player.getPose()), mc.player.getZ() - 0.5, blockPos.getX() + direction.getOffsetX(), blockPos.getY() + direction.getOffsetY(), blockPos.getZ() + direction.getOffsetZ()) > mc.interactionManager.getReachDistance(); + boolean remove = mc.world.getBlockState(blockPos).getBlock() != block || Utils.distance(mc.player.getX() - 0.5, mc.player.getY() + mc.player.getEyeHeight(mc.player.getPose()), mc.player.getZ() - 0.5, blockPos.getX() + direction.getOffsetX(), blockPos.getY() + direction.getOffsetY(), blockPos.getZ() + direction.getOffsetZ()) > mc.player.getBlockInteractionRange(); if (remove) { mc.getNetworkHandler().sendPacket(new PlayerActionC2SPacket(PlayerActionC2SPacket.Action.ABORT_DESTROY_BLOCK, blockPos, direction)); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/SpawnProofer.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/SpawnProofer.java index 0e7354008a..6b586f93c4 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/SpawnProofer.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/SpawnProofer.java @@ -137,7 +137,7 @@ private void onTickPost(TickEvent.Post event) { // Find lowest light level int lowestLightLevel = 16; - BlockPos.Mutable selectedBlockPos = spawns.get(0); + BlockPos.Mutable selectedBlockPos = spawns.getFirst(); for (BlockPos blockPos : spawns) { int lightLevel = mc.world.getLightLevel(blockPos); @@ -150,7 +150,7 @@ private void onTickPost(TickEvent.Post event) { BlockUtils.place(selectedBlockPos, block, rotate.get(), -50, false); } else { - BlockUtils.place(spawns.get(0), block, rotate.get(), -50, false); + BlockUtils.place(spawns.getFirst(), block, rotate.get(), -50, false); } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/StashFinder.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/StashFinder.java index 92b79a7c65..6e9e89dc9a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/StashFinder.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/StashFinder.java @@ -146,7 +146,7 @@ public WWidget getWidget(GuiTheme theme) { WButton clear = list.add(theme.button("Clear")).widget(); WTable table = new WTable(); - if (chunks.size() > 0) list.add(table); + if (!chunks.isEmpty()) list.add(table); clear.action = () -> { chunks.clear(); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/VeinMiner.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/VeinMiner.java index 53937e680d..7dc22f6cf0 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/VeinMiner.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/VeinMiner.java @@ -179,12 +179,12 @@ private void onTick(TickEvent.Pre event) { blocks.removeIf(MyBlock::shouldRemove); if (!blocks.isEmpty()) { - if (tick < delay.get() && !blocks.get(0).mining) { + if (tick < delay.get() && !blocks.getFirst().mining) { tick++; return; } tick = 0; - blocks.get(0).mine(); + blocks.getFirst().mine(); } } @@ -216,7 +216,7 @@ public void set(BlockPos pos, Direction dir) { } public boolean shouldRemove() { - return mc.world.getBlockState(blockPos).getBlock() != originalBlock || Utils.distance(mc.player.getX() - 0.5, mc.player.getY() + mc.player.getEyeHeight(mc.player.getPose()), mc.player.getZ() - 0.5, blockPos.getX() + direction.getOffsetX(), blockPos.getY() + direction.getOffsetY(), blockPos.getZ() + direction.getOffsetZ()) > mc.interactionManager.getReachDistance(); + return mc.world.getBlockState(blockPos).getBlock() != originalBlock || Utils.distance(mc.player.getX() - 0.5, mc.player.getY() + mc.player.getEyeHeight(mc.player.getPose()), mc.player.getZ() - 0.5, blockPos.getX() + direction.getOffsetX(), blockPos.getY() + direction.getOffsetY(), blockPos.getZ() + direction.getOffsetZ()) > mc.player.getBlockInteractionRange(); } public void mine() { @@ -259,7 +259,7 @@ private void mineNearbyBlocks(Item item, BlockPos pos, Direction dir, int depth) if (depth<=0) return; if (foundBlockPositions.contains(pos)) return; foundBlockPositions.add(pos); - if (Utils.distance(mc.player.getX() - 0.5, mc.player.getY() + mc.player.getEyeHeight(mc.player.getPose()), mc.player.getZ() - 0.5, pos.getX(), pos.getY(), pos.getZ()) > mc.interactionManager.getReachDistance()) return; + if (Utils.distance(mc.player.getX() - 0.5, mc.player.getY() + mc.player.getEyeHeight(mc.player.getPose()), mc.player.getZ() - 0.5, pos.getX(), pos.getY(), pos.getZ()) > mc.player.getBlockInteractionRange()) return; for(Vec3i neighbourOffset: blockNeighbours) { BlockPos neighbour = pos.add(neighbourOffset); if (mc.world.getBlockState(neighbour).getBlock().asItem() == item) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/profiles/Profile.java b/src/main/java/meteordevelopment/meteorclient/systems/profiles/Profile.java index 57fe89ce26..90827196f2 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/profiles/Profile.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/profiles/Profile.java @@ -30,7 +30,6 @@ public class Profile implements ISerializable { public Setting name = sgGeneral.add(new StringSetting.Builder() .name("name") .description("The name of the profile.") - .defaultValue("") .filter(Utils::nameFilter) .build() ); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/profiles/Profiles.java b/src/main/java/meteordevelopment/meteorclient/systems/profiles/Profiles.java index 04ace37373..cbf7b80537 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/profiles/Profiles.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/profiles/Profiles.java @@ -13,6 +13,7 @@ import meteordevelopment.meteorclient.utils.misc.NbtUtils; import meteordevelopment.orbit.EventHandler; import net.minecraft.nbt.NbtCompound; +import org.jetbrains.annotations.NotNull; import java.io.File; import java.util.ArrayList; @@ -76,7 +77,7 @@ public boolean isEmpty() { } @Override - public Iterator iterator() { + public @NotNull Iterator iterator() { return profiles.iterator(); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/proxies/Proxy.java b/src/main/java/meteordevelopment/meteorclient/systems/proxies/Proxy.java index 0f9ddbe5b5..194b759235 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/proxies/Proxy.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/proxies/Proxy.java @@ -23,7 +23,6 @@ public class Proxy implements ISerializable { public Setting name = sgGeneral.add(new StringSetting.Builder() .name("name") .description("The name of the proxy.") - .defaultValue("") .build() ); @@ -37,7 +36,6 @@ public class Proxy implements ISerializable { public Setting address = sgGeneral.add(new StringSetting.Builder() .name("address") .description("The ip address of the proxy.") - .defaultValue("") .filter(Utils::ipFilter) .build() ); @@ -64,14 +62,12 @@ public class Proxy implements ISerializable { public Setting username = sgOptional.add(new StringSetting.Builder() .name("username") .description("The username of the proxy.") - .defaultValue("") .build() ); public Setting password = sgOptional.add(new StringSetting.Builder() .name("password") .description("The password of the proxy.") - .defaultValue("") .visible(() -> type.get().equals(ProxyType.Socks5)) .build() ); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/waypoints/Waypoints.java b/src/main/java/meteordevelopment/meteorclient/systems/waypoints/Waypoints.java index 2c624f37e9..5c7e74932e 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/waypoints/Waypoints.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/waypoints/Waypoints.java @@ -21,6 +21,7 @@ import net.minecraft.client.texture.NativeImage; import net.minecraft.client.texture.NativeImageBackedTexture; import net.minecraft.nbt.NbtCompound; +import org.jetbrains.annotations.NotNull; import java.io.File; import java.io.FileInputStream; @@ -127,7 +128,7 @@ public boolean isEmpty() { } @Override - public Iterator iterator() { + public @NotNull Iterator iterator() { return waypoints.values().iterator(); } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/ReflectInit.java b/src/main/java/meteordevelopment/meteorclient/utils/ReflectInit.java index 1a2564fefa..402264a9ba 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/ReflectInit.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/ReflectInit.java @@ -20,6 +20,9 @@ public class ReflectInit { private static final List reflections = new ArrayList<>(); + private ReflectInit() { + } + public static void registerPackages() { add(MeteorClient.ADDON); @@ -46,7 +49,7 @@ public static void init(Class annotation) { Map, List> byClass = initTasks.stream().collect(Collectors.groupingBy(Method::getDeclaringClass)); Set left = new HashSet<>(initTasks); - for (Method m; (m = left.stream().findAny().orElse(null)) != null;) { + for (Method m; (m = left.stream().findAny().orElse(null)) != null; ) { reflectInit(m, annotation, left, byClass); } } @@ -75,13 +78,10 @@ private static void reflectInit(Method task, Class ann private static Class[] getDependencies(Method task, Class annotation) { T init = task.getAnnotation(annotation); - if (init instanceof PreInit pre) { - return pre.dependencies(); - } - else if (init instanceof PostInit post) { - return post.dependencies(); - } - - return new Class[]{}; + return switch (init) { + case PreInit pre -> pre.dependencies(); + case PostInit post -> post.dependencies(); + default -> new Class[]{}; + }; } } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/Utils.java b/src/main/java/meteordevelopment/meteorclient/utils/Utils.java index 79b2c6f922..2cb5525606 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/Utils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/Utils.java @@ -36,16 +36,19 @@ import net.minecraft.client.gui.screen.world.SelectWorldScreen; import net.minecraft.client.resource.ResourceReloadLogger; import net.minecraft.client.resource.language.I18n; +import net.minecraft.component.ComponentMap; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.ItemEnchantmentsComponent; +import net.minecraft.component.type.NbtComponent; import net.minecraft.enchantment.Enchantment; +import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.Entity; import net.minecraft.entity.effect.StatusEffect; import net.minecraft.item.*; import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtElement; import net.minecraft.nbt.NbtList; -import net.minecraft.registry.Registries; +import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.util.DyeColor; -import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; @@ -60,10 +63,7 @@ import java.io.IOException; import java.io.InputStream; import java.net.InetSocketAddress; -import java.util.Arrays; -import java.util.Iterator; -import java.util.Locale; -import java.util.Random; +import java.util.*; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -82,6 +82,9 @@ public class Utils { public static Screen screenToOpen; public static VertexSorter vertexSorter; + private Utils() { + } + @PreInit public static void init() { MeteorClient.EVENT_BUS.subscribe(Utils.class); @@ -142,12 +145,12 @@ public static void getEnchantments(ItemStack itemStack, Object2IntMap> itemEnchantments = itemStack.getItem() == Items.ENCHANTED_BOOK + ? itemStack.get(DataComponentTypes.STORED_ENCHANTMENTS).getEnchantments() + : itemStack.getEnchantments().getEnchantments(); - Registries.ENCHANTMENT.getOrEmpty(Identifier.tryParse(tag.getString("id"))).ifPresent((enchantment) -> enchantments.put(enchantment, tag.getInt("lvl"))); + for (RegistryEntry itemEnchantment : itemEnchantments) { + enchantments.put(itemEnchantment.value(), itemStack.getEnchantments().getLevel(itemEnchantment.value())); } } } @@ -210,17 +213,18 @@ public static void getItemsInContainerItem(ItemStack itemStack, ItemStack[] item } Arrays.fill(items, ItemStack.EMPTY); - NbtCompound nbt = itemStack.getNbt(); + ComponentMap components = itemStack.getComponents(); - if (nbt != null && nbt.contains("BlockEntityTag")) { - NbtCompound nbt2 = nbt.getCompound("BlockEntityTag"); + if (components != null && components.contains(DataComponentTypes.BLOCK_ENTITY_DATA)) { + NbtComponent nbt2 = components.get(DataComponentTypes.BLOCK_ENTITY_DATA); if (nbt2.contains("Items")) { - NbtList nbt3 = (NbtList) nbt2.get("Items"); + NbtList nbt3 = (NbtList) nbt2.getNbt().get("Items"); for (int i = 0; i < nbt3.size(); i++) { int slot = nbt3.getCompound(i).getByte("Slot"); // Apparently shulker boxes can store more than 27 items, good job Mojang - if (slot >= 0 && slot < items.length) items[slot] = ItemStack.fromNbt(nbt3.getCompound(i)); + // now NPEs when mc.world == null + if (slot >= 0 && slot < items.length) items[slot] = ItemStack.fromNbtOrEmpty(mc.player.getRegistryManager(), nbt3.getCompound(i)); } } } @@ -241,7 +245,8 @@ public static Color getShulkerColor(ItemStack shulkerItem) { } public static boolean hasItems(ItemStack itemStack) { - NbtCompound compoundTag = itemStack.getSubNbt("BlockEntityTag"); + NbtCompound compoundTag = itemStack.getComponents().getOrDefault(DataComponentTypes.BLOCK_ENTITY_DATA, NbtComponent.DEFAULT).getNbt(); +// itemStack.getComponents().get(DataComponentTypes.CONTAINER).??? return compoundTag != null && compoundTag.contains("Items", 9); } @@ -298,9 +303,9 @@ public static int levenshteinDistance(String from, String to, int insCost, int s // Find best route for (int i = 1; i <= textLength; i++) { for (int j = 1; j <= filterLength; j++) { - int sCost = d[i-1][j-1] + (from.charAt(i-1) == to.charAt(j-1) ? 0 : subCost); - int dCost = d[i-1][j] + delCost; - int iCost = d[i][j-1] + insCost; + int sCost = d[i - 1][j - 1] + (from.charAt(i - 1) == to.charAt(j - 1) ? 0 : subCost); + int dCost = d[i - 1][j] + delCost; + int iCost = d[i][j - 1] + insCost; d[i][j] = Math.min(Math.min(dCost, iCost), sCost); } } @@ -490,59 +495,18 @@ public static boolean isThrowable(Item item) { } public static void addEnchantment(ItemStack itemStack, Enchantment enchantment, int level) { - NbtCompound tag = itemStack.getOrCreateNbt(); - NbtList listTag; - - // Get list tag - if (!tag.contains("Enchantments", 9)) { - listTag = new NbtList(); - tag.put("Enchantments", listTag); - } else { - listTag = tag.getList("Enchantments", 10); - } - - // Check if item already has the enchantment and modify the level - String enchId = Registries.ENCHANTMENT.getId(enchantment).toString(); - - for (NbtElement _t : listTag) { - NbtCompound t = (NbtCompound) _t; - - if (t.getString("id").equals(enchId)) { - t.putShort("lvl", (short) level); - return; - } - } + ItemEnchantmentsComponent.Builder b = new ItemEnchantmentsComponent.Builder(EnchantmentHelper.getEnchantments(itemStack)); + b.add(enchantment, level); - // Add the enchantment if it doesn't already have it - NbtCompound enchTag = new NbtCompound(); - enchTag.putString("id", enchId); - enchTag.putShort("lvl", (short) level); - - listTag.add(enchTag); + EnchantmentHelper.set(itemStack, b.build()); } public static void clearEnchantments(ItemStack itemStack) { - NbtCompound nbt = itemStack.getNbt(); - if (nbt != null) nbt.remove("Enchantments"); + EnchantmentHelper.apply(itemStack, components -> components.remove(a -> true)); } public static void removeEnchantment(ItemStack itemStack, Enchantment enchantment) { - NbtCompound nbt = itemStack.getNbt(); - if (nbt == null) return; - - if (!nbt.contains("Enchantments", 9)) return; - NbtList list = nbt.getList("Enchantments", 10); - - String enchId = Registries.ENCHANTMENT.getId(enchantment).toString(); - - for (Iterator it = list.iterator(); it.hasNext();) { - NbtCompound ench = (NbtCompound) it.next(); - - if (ench.getString("id").equals(enchId)) { - it.remove(); - break; - } - } + EnchantmentHelper.apply(itemStack, components -> components.remove(enchantment1 -> enchantment1.value().equals(enchantment))); } public static Color lerp(Color first, Color second, @Range(from = 0, to = 1) float v) { @@ -565,8 +529,7 @@ public static int parsePort(String full) { try { port = Integer.parseInt(full.substring(full.lastIndexOf(':') + 1, full.length() - 1)); - } - catch (NumberFormatException ignored) { + } catch (NumberFormatException ignored) { port = -1; } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/DamageUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/DamageUtils.java index 4028523a6c..fe0a0d2855 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/entity/DamageUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/entity/DamageUtils.java @@ -33,6 +33,9 @@ @SuppressWarnings("JavadocReference") public class DamageUtils { + private DamageUtils() { + } + // Explosion damage /** @@ -132,11 +135,11 @@ public static RaycastFactory getOverridingHitFactory(BlockPos overridePos, Block * @see PlayerEntity#attack(Entity) */ public static float getAttackDamage(LivingEntity attacker, LivingEntity target) { - float itemDamage = (float) EntityAttributeHelper.getAttributeValue(attacker, EntityAttributes.GENERIC_ATTACK_DAMAGE); + float itemDamage = (float) attacker.getAttributeValue(EntityAttributes.GENERIC_ATTACK_DAMAGE); // Get enchant damage ItemStack stack = attacker.getStackInHand(attacker.getActiveHand()); - float enchantDamage = EnchantmentHelper.getAttackDamage(stack, target.getGroup()); + float enchantDamage = EnchantmentHelper.getAttackDamage(stack, target.getType()); // Factor charge if (attacker instanceof PlayerEntity playerEntity) { @@ -155,7 +158,7 @@ public static float getAttackDamage(LivingEntity attacker, LivingEntity target) damage = calculateReductions(damage, target, attacker instanceof PlayerEntity player ? mc.world.getDamageSources().playerAttack(player) : mc.world.getDamageSources().mobAttack(attacker)); // Factor Fire Aspect - if (EnchantmentHelper.getFireAspect(attacker) > 0 && !StatusEffectHelper.hasStatusEffect(target, StatusEffects.FIRE_RESISTANCE)) { + if (EnchantmentHelper.getFireAspect(attacker) > 0 && !target.hasStatusEffect(StatusEffects.FIRE_RESISTANCE)) { damage++; } @@ -169,7 +172,7 @@ public static float getAttackDamage(LivingEntity attacker, LivingEntity target) */ public static float fallDamage(LivingEntity entity) { if (entity instanceof PlayerEntity player && player.getAbilities().flying) return 0f; - if (StatusEffectHelper.hasStatusEffect(entity, StatusEffects.SLOW_FALLING) || StatusEffectHelper.hasStatusEffect(entity, StatusEffects.LEVITATION)) return 0f; + if (entity.hasStatusEffect(StatusEffects.SLOW_FALLING) || entity.hasStatusEffect(StatusEffects.LEVITATION)) return 0f; // Fast path - Above the surface int surface = mc.world.getWorldChunk(entity.getBlockPos()).getHeightmap(Heightmap.Type.MOTION_BLOCKING).get(entity.getBlockX() & 15, entity.getBlockZ() & 15); @@ -184,7 +187,7 @@ public static float fallDamage(LivingEntity entity) { private static float fallDamageReductions(LivingEntity entity, int surface) { int fallHeight = (int) (entity.getY() - surface + entity.fallDistance - 3d); - @Nullable StatusEffectInstance jumpBoostInstance = StatusEffectHelper.getStatusEffect(entity, StatusEffects.JUMP_BOOST); + @Nullable StatusEffectInstance jumpBoostInstance = entity.getStatusEffect(StatusEffects.JUMP_BOOST); if (jumpBoostInstance != null) fallHeight -= jumpBoostInstance.getAmplifier() + 1; return calculateReductions(fallHeight, entity, mc.world.getDamageSources().fall()); @@ -204,7 +207,7 @@ public static float calculateReductions(float damage, LivingEntity entity, Damag } // Armor reduction - damage = DamageUtil.getDamageLeft(damage, getArmor(entity), (float) EntityAttributeHelper.getAttributeValue(entity, EntityAttributes.GENERIC_ARMOR_TOUGHNESS)); + damage = DamageUtil.getDamageLeft(damage, damageSource, getArmor(entity), (float) entity.getAttributeValue(EntityAttributes.GENERIC_ARMOR_TOUGHNESS)); // Resistance reduction damage = resistanceReduction(entity, damage); @@ -216,13 +219,13 @@ public static float calculateReductions(float damage, LivingEntity entity, Damag } private static float getArmor(LivingEntity entity) { - return (float) Math.floor(EntityAttributeHelper.getAttributeValue(entity, EntityAttributes.GENERIC_ARMOR)); + return (float) Math.floor(entity.getAttributeValue(EntityAttributes.GENERIC_ARMOR)); } /** * @see LivingEntity#modifyAppliedDamage(DamageSource, float) */ - private static float protectionReduction(Entity player, float damage, DamageSource source) { + private static float protectionReduction(LivingEntity player, float damage, DamageSource source) { int protLevel = EnchantmentHelper.getProtectionAmount(player.getArmorItems(), source); return DamageUtil.getInflictedDamage(damage, protLevel); } @@ -231,7 +234,7 @@ private static float protectionReduction(Entity player, float damage, DamageSour * @see LivingEntity#modifyAppliedDamage(DamageSource, float) */ private static float resistanceReduction(LivingEntity player, float damage) { - StatusEffectInstance resistance = StatusEffectHelper.getStatusEffect(player, StatusEffects.RESISTANCE); + StatusEffectInstance resistance = player.getStatusEffect(StatusEffects.RESISTANCE); if (resistance != null) { int lvl = resistance.getAmplifier() + 1; damage *= (1 - (lvl * 0.2f)); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityAttributeHelper.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityAttributeHelper.java deleted file mode 100644 index 367ce2dcf4..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityAttributeHelper.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). - * Copyright (c) Meteor Development. - */ - -package meteordevelopment.meteorclient.utils.entity; - -import com.google.common.collect.Multimap; -import meteordevelopment.meteorclient.mixin.ShulkerEntityAccessor; -import meteordevelopment.meteorclient.mixininterface.IAttributeContainer; -import meteordevelopment.meteorclient.mixininterface.IEntityAttributeInstance; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.EquipmentSlot; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.attribute.*; -import net.minecraft.entity.mob.ShulkerEntity; -import net.minecraft.item.ItemStack; -import org.jetbrains.annotations.Nullable; - -import java.util.function.Function; - -public class EntityAttributeHelper { - /** - * @see LivingEntity#getAttributes() - */ - public static AttributeContainer getAttributes(LivingEntity entity) { - AttributeContainer attributes = new AttributeContainer(getDefaultForEntity(entity)); - - // Equipment - for (var equipmentSlot : EquipmentSlot.values()) { - ItemStack stack = entity.getEquippedStack(equipmentSlot); - attributes.addTemporaryModifiers(stack.getAttributeModifiers(equipmentSlot)); - } - - // Status effects - for (var statusEffect : StatusEffectHelper.getStatusEffects(entity)) { - statusEffect.getEffectType().onApplied(attributes, statusEffect.getAmplifier()); - } - - handleSpecialCases(entity, attributes::getCustomInstance); - - // Copy tracked attributes - ((IAttributeContainer) attributes).meteor$copyFrom(entity.getAttributes()); - - return attributes; - } - - /** - * @see LivingEntity#getAttributeInstance(EntityAttribute) - */ - public static EntityAttributeInstance getAttributeInstance(LivingEntity entity, EntityAttribute attribute) { - double baseValue = getDefaultForEntity(entity).getBaseValue(attribute); - EntityAttributeInstance attributeInstance = new EntityAttributeInstance(attribute, o1 -> {}); - attributeInstance.setBaseValue(baseValue); - - // Equipment - for (var equipmentSlot : EquipmentSlot.values()) { - ItemStack stack = entity.getEquippedStack(equipmentSlot); - Multimap modifiers = stack.getAttributeModifiers(equipmentSlot); - for (var modifier : modifiers.get(attribute)) attributeInstance.addTemporaryModifier(modifier); - } - - // Status effects - for (var statusEffect : StatusEffectHelper.getStatusEffects(entity)) { - AttributeModifierCreator factory = statusEffect.getEffectType().getAttributeModifiers().get(attribute); - if (factory != null) attributeInstance.addPersistentModifier(factory.createAttributeModifier(statusEffect.getAmplifier())); - } - - handleSpecialCases(entity, someAttribute -> someAttribute == attribute ? attributeInstance : null); - - // Copy tracked modifiers - EntityAttributeInstance trackedInstance = entity.getAttributeInstance(attribute); - if (trackedInstance != null) ((IEntityAttributeInstance) attributeInstance).meteor$copyFrom(trackedInstance); - - return attributeInstance; - } - - /** - * @see LivingEntity#getAttributeValue(EntityAttribute) - */ - public static double getAttributeValue(LivingEntity entity, EntityAttribute attribute) { - return getAttributeInstance(entity, attribute).getValue(); - } - - private static void handleSpecialCases(LivingEntity entity, Function consumer) { - if (entity instanceof ShulkerEntity shulkerEntity) { - if (shulkerEntity.getDataTracker().get(ShulkerEntityAccessor.meteor$getPeekAmount()) == 0) { - @Nullable EntityAttributeInstance attributeInstance = consumer.apply(EntityAttributes.GENERIC_ARMOR); - if (attributeInstance != null) attributeInstance.addPersistentModifier(ShulkerEntityAccessor.meteor$getCoveredArmorBonus()); - } - } - } - - @SuppressWarnings("unchecked") - private static DefaultAttributeContainer getDefaultForEntity(T entity) { - return DefaultAttributeRegistry.get((EntityType) entity.getType()); - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityUtils.java index 0b5ee0bbf8..6d74ed13f8 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityUtils.java @@ -20,7 +20,6 @@ import net.minecraft.block.entity.BlockEntity; import net.minecraft.client.network.PlayerListEntry; import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityGroup; import net.minecraft.entity.EntityType; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; @@ -44,6 +43,9 @@ public class EntityUtils { private static BlockPos.Mutable testPos = new BlockPos.Mutable(); + private EntityUtils() { + } + public static boolean isAttackable(EntityType type) { return type != EntityType.AREA_EFFECT_CLOUD && type != EntityType.ARROW && type != EntityType.FALLING_BLOCK && type != EntityType.FIREWORK_ROCKET && type != EntityType.ITEM && type != EntityType.LLAMA_SPIT && type != EntityType.SPECTRAL_ARROW && type != EntityType.ENDER_PEARL && type != EntityType.EXPERIENCE_BOTTLE && type != EntityType.POTION && type != EntityType.TRIDENT && type != EntityType.LIGHTNING_BOLT && type != EntityType.FISHING_BOBBER && type != EntityType.EXPERIENCE_ORB && type != EntityType.EGG; } @@ -124,7 +126,7 @@ public static BlockPos getCityBlock(PlayerEntity player) { Block block = mc.world.getBlockState(testPos).getBlock(); if (block != Blocks.OBSIDIAN && block != Blocks.NETHERITE_BLOCK && block != Blocks.CRYING_OBSIDIAN - && block != Blocks.RESPAWN_ANCHOR && block != Blocks.ANCIENT_DEBRIS) continue; + && block != Blocks.RESPAWN_ANCHOR && block != Blocks.ANCIENT_DEBRIS) continue; double testDistanceSquared = PlayerUtils.squaredDistanceTo(testPos); if (testDistanceSquared < bestDistanceSquared) { @@ -159,8 +161,7 @@ public static Color getColorFromDistance(Entity entity) { if (percent < 0.5) { r = 255; g = (int) (255 * percent / 0.5); // Closer to 0.5, closer to yellow (255,255,0) - } - else { + } else { g = 255; r = 255 - (int) (255 * (percent - 0.5) / 0.5); // Closer to 1.0, closer to green (0,255,0) } @@ -220,8 +221,7 @@ public static boolean intersectsWithEntity(Box box, Predicate predicate) return found.get(); } - public static EntityGroup getGroup(Entity entity) { - if (entity instanceof LivingEntity livingEntity) return livingEntity.getGroup(); - else return EntityGroup.DEFAULT; + public static EntityType getGroup(Entity entity) { + return entity.getType(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/ProjectileEntitySimulator.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/ProjectileEntitySimulator.java index b3f84a35a7..1c2b63f2de 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/entity/ProjectileEntitySimulator.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/entity/ProjectileEntitySimulator.java @@ -10,6 +10,7 @@ import meteordevelopment.meteorclient.mixininterface.IVec3d; import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.misc.MissHitResult; +import net.minecraft.component.DataComponentTypes; import net.minecraft.entity.Entity; import net.minecraft.entity.projectile.*; import net.minecraft.entity.projectile.thrown.*; @@ -47,10 +48,10 @@ public boolean set(Entity user, ItemStack itemStack, double simulated, boolean a } else if (item instanceof CrossbowItem) { if (!CrossbowItem.isCharged(itemStack)) return false; - if (CrossbowItem.hasProjectile(itemStack, Items.FIREWORK_ROCKET)) { - set(user, 0, CrossbowItemAccessor.getSpeed(itemStack), simulated, 0, 0.6, accurate, tickDelta); + if (itemStack.get(DataComponentTypes.CHARGED_PROJECTILES).contains(Items.FIREWORK_ROCKET)) { + set(user, 0, CrossbowItemAccessor.getSpeed(itemStack.get(DataComponentTypes.CHARGED_PROJECTILES)), simulated, 0, 0.6, accurate, tickDelta); } - else set(user, 0, CrossbowItemAccessor.getSpeed(itemStack), simulated, 0.05, 0.6, accurate, tickDelta); + else set(user, 0, CrossbowItemAccessor.getSpeed(itemStack.get(DataComponentTypes.CHARGED_PROJECTILES)), simulated, 0.05, 0.6, accurate, tickDelta); } else if (item instanceof FishingRodItem) { setFishingBobber(user, tickDelta); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/StatusEffectHelper.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/StatusEffectHelper.java deleted file mode 100644 index d809b89c87..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/utils/entity/StatusEffectHelper.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.utils.entity; - -import meteordevelopment.meteorclient.utils.entity.effects.EntityEffectCache; -import meteordevelopment.meteorclient.utils.entity.effects.StatusEffectBruteForce; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.effect.StatusEffect; -import net.minecraft.entity.effect.StatusEffectInstance; -import org.jetbrains.annotations.Nullable; - -import java.util.*; - -import static meteordevelopment.meteorclient.MeteorClient.mc; - -public class StatusEffectHelper { - @Nullable - public static StatusEffectInstance getStatusEffect(LivingEntity entity, StatusEffect effect) { - if (entity == mc.player) return entity.getStatusEffect(effect); - EntityEffectCache container = StatusEffectBruteForce.fetch(entity); - return container == null ? null : container.statusEffects.get(effect); - } - - public static boolean hasStatusEffect(LivingEntity entity, StatusEffect effect) { - if (entity == mc.player) return entity.hasStatusEffect(effect); - EntityEffectCache container = StatusEffectBruteForce.fetch(entity); - return container != null && container.statusEffects.containsKey(effect); - } - - public static Collection getStatusEffects(LivingEntity entity) { - if (entity == mc.player) return entity.getStatusEffects(); - EntityEffectCache container = StatusEffectBruteForce.fetch(entity); - return container == null ? List.of() : container.statusEffects.values(); - } - - public static Map getActiveStatusEffects(LivingEntity entity) { - if (entity == mc.player) return entity.getActiveStatusEffects(); - EntityEffectCache container = StatusEffectBruteForce.fetch(entity); - return container == null ? Map.of() : container.statusEffects; - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/TargetUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/TargetUtils.java index 8c479876da..b0426d1fd7 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/entity/TargetUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/entity/TargetUtils.java @@ -24,12 +24,15 @@ public class TargetUtils { private static final List ENTITIES = new ArrayList<>(); + private TargetUtils() { + } + @Nullable public static Entity get(Predicate isGood, SortPriority sortPriority) { ENTITIES.clear(); getList(ENTITIES, isGood, sortPriority, 1); if (!ENTITIES.isEmpty()) { - return ENTITIES.get(0); + return ENTITIES.getFirst(); } return null; diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/effects/EffectAttributeModifier.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/effects/EffectAttributeModifier.java deleted file mode 100644 index 6245228704..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/utils/entity/effects/EffectAttributeModifier.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). - * Copyright (c) Meteor Development. - */ - -package meteordevelopment.meteorclient.utils.entity.effects; - -import net.minecraft.entity.attribute.EntityAttribute; -import net.minecraft.entity.attribute.EntityAttributes; -import net.minecraft.entity.effect.StatusEffect; -import net.minecraft.entity.effect.StatusEffects; - -import java.util.UUID; - -public record EffectAttributeModifier(StatusEffect effect, EntityAttribute attribute, UUID id, double value) { - private static final EffectAttributeModifier SPEED = new EffectAttributeModifier(StatusEffects.SPEED, EntityAttributes.GENERIC_MOVEMENT_SPEED, "91AEAA56-376B-4498-935B-2F7F68070635", 0.20000000298023224d); - private static final EffectAttributeModifier SLOWNESS = new EffectAttributeModifier(StatusEffects.SLOWNESS, EntityAttributes.GENERIC_MOVEMENT_SPEED, "7107DE5E-7CE8-4030-940E-514C1F160890", -0.15000000596046448d); - private static final EffectAttributeModifier HASTE = new EffectAttributeModifier(StatusEffects.HASTE, EntityAttributes.GENERIC_ATTACK_SPEED, "AF8B6E3F-3328-4C0A-AA36-5BA2BB9DBEF3", 0.10000000149011612d); - private static final EffectAttributeModifier MINING_FATIGUE = new EffectAttributeModifier(StatusEffects.MINING_FATIGUE, EntityAttributes.GENERIC_ATTACK_SPEED, "55FCED67-E92A-486E-9800-B47F202C4386", -0.10000000149011612d); - private static final EffectAttributeModifier HEALTH_BOOST = new EffectAttributeModifier(StatusEffects.HEALTH_BOOST, EntityAttributes.GENERIC_MAX_HEALTH, "5D6F0BA2-1186-46AC-B896-C61C5CEE99CC", 4d); - private static final EffectAttributeModifier LUCK = new EffectAttributeModifier(StatusEffects.LUCK, EntityAttributes.GENERIC_LUCK, "03C3C89D-7037-4B42-869F-B146BCB64D2E", 1d); - private static final EffectAttributeModifier UNLUCK = new EffectAttributeModifier(StatusEffects.UNLUCK, EntityAttributes.GENERIC_LUCK, "CC5AF142-2BD2-4215-B636-2605AED11727", -1d); - - public static final EffectAttributeModifier[] ALL = new EffectAttributeModifier[]{SPEED, SLOWNESS, HASTE, MINING_FATIGUE, HEALTH_BOOST, LUCK, UNLUCK}; - public static final EffectAttributeModifier[] BEACON = new EffectAttributeModifier[]{SPEED, HASTE}; - - private EffectAttributeModifier(StatusEffect effect, EntityAttribute attribute, String id, double value) { - this(effect, attribute, UUID.fromString(id), value); - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/effects/EntityEffectCache.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/effects/EntityEffectCache.java deleted file mode 100644 index 77a1993697..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/utils/entity/effects/EntityEffectCache.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). - * Copyright (c) Meteor Development. - */ - -package meteordevelopment.meteorclient.utils.entity.effects; - -import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap; -import net.minecraft.entity.effect.StatusEffect; -import net.minecraft.entity.effect.StatusEffectInstance; - -import java.util.Map; - -public class EntityEffectCache { - public final Map statusEffects = new Reference2ReferenceOpenHashMap<>(); - public int particleColor; - - public void add(StatusEffect effect, int amplifier) { - statusEffects.put(effect, new StatusEffectInstance(effect, amplifier - 1)); - } - - public void add(StatusEffect effect) { - add(effect, 1); - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/effects/MutableParticleColor.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/effects/MutableParticleColor.java deleted file mode 100644 index 779f5910e2..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/utils/entity/effects/MutableParticleColor.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). - * Copyright (c) Meteor Development. - */ - -package meteordevelopment.meteorclient.utils.entity.effects; - -import net.minecraft.entity.effect.StatusEffect; - -import java.util.Objects; - -public class MutableParticleColor { - public static final MutableParticleColor EMPTY = new MutableParticleColor(); - - public float r, g, b; - public int a; - - public void add(StatusEffect effect, int amplifier) { - int color = effect.getColor(); - r += (float)(amplifier * (color >> 16 & 255)) / 255.0F; - g += (float)(amplifier * (color >> 8 & 255)) / 255.0F; - b += (float)(amplifier * (color & 255)) / 255.0F; - a += amplifier; - } - - public void add(StatusEffect effect) { - add(effect, 1); - } - - @Override - public int hashCode() { - return Objects.hash(r, g, b, a); - } - - @Override - public boolean equals(Object obj) { - if (this == obj) return true; - if (obj instanceof MutableParticleColor other) { - return r == other.r && g == other.g && b == other.b && a == other.a; - } - return false; - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/effects/StatusEffectBruteForce.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/effects/StatusEffectBruteForce.java deleted file mode 100644 index 52e5856ce5..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/utils/entity/effects/StatusEffectBruteForce.java +++ /dev/null @@ -1,247 +0,0 @@ -/* - * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). - * Copyright (c) Meteor Development. - */ - -package meteordevelopment.meteorclient.utils.entity.effects; - -import com.google.common.collect.Sets; -import it.unimi.dsi.fastutil.ints.IntObjectImmutablePair; -import it.unimi.dsi.fastutil.ints.IntObjectPair; -import it.unimi.dsi.fastutil.objects.*; -import meteordevelopment.meteorclient.MeteorClient; -import meteordevelopment.meteorclient.events.game.GameLeftEvent; -import meteordevelopment.meteorclient.mixin.LivingEntityAccessor; -import meteordevelopment.meteorclient.systems.config.Config; -import meteordevelopment.meteorclient.utils.PreInit; -import meteordevelopment.meteorclient.utils.entity.StatusEffectHelper; -import meteordevelopment.orbit.EventHandler; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.attribute.AttributeContainer; -import net.minecraft.entity.data.TrackedData; -import net.minecraft.entity.effect.StatusEffect; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.registry.Registries; -import org.jetbrains.annotations.Nullable; - -import java.util.Map; -import java.util.Set; - -/** - * @implNote status effect amplifiers, which are usually zero-indexed, are one-indexed here for ease of maths :thumbs_up: - * @author Crosby - */ -public class StatusEffectBruteForce { - private static final TrackedData POTION_SWIRLS_COLOR = LivingEntityAccessor.meteor$getPotionSwirlsColor(); - private static final TrackedData POTION_SWIRLS_AMBIENT = LivingEntityAccessor.meteor$getPotionSwirlsAmbient(); - private static final int EMPTY_COLOR = 3694022; - public static final Set ALL_ENTRIES = new ReferenceOpenHashSet<>(); - public static final Set BEACON_ENTRIES = new ReferenceOpenHashSet<>(); - private static final Map PLAYER_EFFECT_MAP = new Object2ObjectOpenHashMap<>(); - private static final Object2ObjectMap, Map> EFFECT_CACHE_MAP = new Object2ObjectOpenHashMap<>(); - private static final Set> NULL_COLORS = new ObjectOpenHashSet<>(); - - // status effects - - private static final StatusEffectEntry ABSORPTION = StatusEffectEntry.of(StatusEffects.ABSORPTION, 1); - private static final StatusEffectEntry ABSORPTION_STRONG = StatusEffectEntry.of(StatusEffects.ABSORPTION, 4); - - @PreInit - public static void initEntries() { - MeteorClient.EVENT_BUS.subscribe(StatusEffectHelper.class); - - BEACON_ENTRIES.add(StatusEffectEntry.of(StatusEffects.STRENGTH, 1)); - BEACON_ENTRIES.add(StatusEffectEntry.of(StatusEffects.STRENGTH, 2)); - BEACON_ENTRIES.add(StatusEffectEntry.of(StatusEffects.JUMP_BOOST, 1)); - BEACON_ENTRIES.add(StatusEffectEntry.of(StatusEffects.JUMP_BOOST, 2)); - BEACON_ENTRIES.add(StatusEffectEntry.of(StatusEffects.REGENERATION, 1)); - BEACON_ENTRIES.add(StatusEffectEntry.of(StatusEffects.REGENERATION, 2)); - BEACON_ENTRIES.add(StatusEffectEntry.of(StatusEffects.RESISTANCE, 1)); - BEACON_ENTRIES.add(StatusEffectEntry.of(StatusEffects.RESISTANCE, 2)); - - ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.SPEED, 1)); - ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.SPEED, 2)); - ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.SLOWNESS, 1)); - ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.SLOWNESS, 4)); - ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.SLOWNESS, 6)); - ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.HASTE, 1)); - ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.HASTE, 2)); - ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.MINING_FATIGUE, 1)); - ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.STRENGTH, 1)); - ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.STRENGTH, 2)); - ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.JUMP_BOOST, 1)); - ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.JUMP_BOOST, 2)); - ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.NAUSEA, 1)); - ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.REGENERATION, 1)); - ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.REGENERATION, 2)); - ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.RESISTANCE, 1)); - ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.RESISTANCE, 2)); - ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.FIRE_RESISTANCE, 1)); - ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.WATER_BREATHING, 1)); - ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.INVISIBILITY, 1)); - ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.BLINDNESS, 1)); - ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.NIGHT_VISION, 1)); - ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.HUNGER, 1)); - ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.WEAKNESS, 1)); - ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.POISON, 1)); - ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.POISON, 2)); - ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.WITHER, 1)); - ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.HEALTH_BOOST, 1)); - ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.GLOWING, 1)); - ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.LEVITATION, 1)); - ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.LUCK, 1)); - ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.UNLUCK, 1)); - ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.SLOW_FALLING, 1)); - ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.CONDUIT_POWER, 1)); - ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.DOLPHINS_GRACE, 1)); - ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.BAD_OMEN, 1)); - ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.HERO_OF_THE_VILLAGE, 1)); - ALL_ENTRIES.add(StatusEffectEntry.of(StatusEffects.DARKNESS, 1)); - - for (var statusEffectEntry : Registries.STATUS_EFFECT.getEntrySet()) { - if (statusEffectEntry.getValue().isInstant()) continue; - IntObjectPair cacheKey = new IntObjectImmutablePair<>(statusEffectEntry.getValue().getColor(), MutableParticleColor.EMPTY); - EFFECT_CACHE_MAP.put(cacheKey, Map.of(statusEffectEntry.getValue(), new StatusEffectInstance(statusEffectEntry.getValue()))); - - // Primitive modded compat - if (!statusEffectEntry.getKey().getValue().getNamespace().equals("minecraft")) { - ALL_ENTRIES.add(StatusEffectEntry.of(statusEffectEntry.getValue(), 1)); - } - } - } - - /** - * Creates {@link EntityEffectCache} if missing, updates it if required. - */ - public static EntityEffectCache fetch(LivingEntity entity) { - int particleColor = entity.getDataTracker().get(POTION_SWIRLS_COLOR); - if (isEmpty(particleColor)) return null; - EntityEffectCache container = PLAYER_EFFECT_MAP.computeIfAbsent(entity, o -> new EntityEffectCache()); - if (particleColor != container.particleColor) update(particleColor, entity, container); - return container; - } - - private static void update(int particleColor, LivingEntity entity, EntityEffectCache container) { - container.statusEffects.clear(); - container.particleColor = particleColor; - - MutableParticleColor initialColor = new MutableParticleColor(); - Set possibleEntries; - EffectAttributeModifier[] possibleModifiers; - - if (entity.getDataTracker().get(POTION_SWIRLS_AMBIENT)) { // entity is only affected by effects from beacons - possibleEntries = BEACON_ENTRIES; - possibleModifiers = EffectAttributeModifier.BEACON; - } else { - // find status effects based on entity flags - if (entity.isGlowing()) { - initialColor.add(StatusEffects.GLOWING); - container.add(StatusEffects.GLOWING); - } - if (entity.isInvisible()) { - initialColor.add(StatusEffects.INVISIBILITY); - container.add(StatusEffects.INVISIBILITY); - } - - // find status effects based on tracked data - int absorptionLevel = Math.round(entity.getAbsorptionAmount() / 4f); - if (absorptionLevel <= 4) { - possibleEntries = new ReferenceOpenHashSet<>(ALL_ENTRIES); - possibleEntries.add(ABSORPTION_STRONG); - if (absorptionLevel <= 1) possibleEntries.add(ABSORPTION); - } else { - possibleEntries = ALL_ENTRIES; - } - - possibleModifiers = EffectAttributeModifier.ALL; - } - - // find status effects based on tracked attributes - AttributeContainer attributes = entity.getAttributes(); - for (var modifier : possibleModifiers) { - if (attributes.hasModifierForAttribute(modifier.attribute(), modifier.id())) { - double value = attributes.getModifierValue(modifier.attribute(), modifier.id()); - int amplifier = (int) Math.round(value / modifier.value()); - initialColor.add(modifier.effect(), amplifier); - container.add(modifier.effect(), amplifier); - } - } - - // In order to minimize collisions, we hash both the particle color, and the initial state (attributes, tracked data, etc.) via the initial color - IntObjectPair cacheKey = new IntObjectImmutablePair<>(particleColor, initialColor); - - // Map#computeIfAbsent(Object, Function) cannot cache null return values, so we use a separate cache for those - if (NULL_COLORS.contains(cacheKey)) return; - - @Nullable Map match = EFFECT_CACHE_MAP.get(cacheKey); - if (match == null && Config.get().heuristicCombatUtils.get()) { - match = bruteForce(possibleEntries, initialColor, particleColor); - if (match == null) NULL_COLORS.add(cacheKey); - } - - if (match != null) container.statusEffects.putAll(match); - } - - @Nullable - private static Map bruteForce(Set entries, MutableParticleColor initialColor, int particleColor) { - int maxDepth = Config.get().heuristicDepth.get(); - for (int depth = 2; depth <= maxDepth; depth++) { - for (var combination : Sets.combinations(entries, depth)) { - int color = blend(initialColor, combination); - if (color == particleColor) { - // If the amplifiers of all applied effects match, then it cannot be inferred and should be assumed to be 1 - boolean assumeLowestAmplifier = combination.stream().mapToInt(o -> o.amplifier).reduce((i1, i2) -> i1 == i2 ? i1 : -1).orElse(-1) != -1; - - Map map = new Reference2ObjectOpenHashMap<>(); - - for (var entry : combination) { - map.put(entry.effect, new StatusEffectInstance(entry.effect, 0, assumeLowestAmplifier ? 0 : entry.amplifier - 1)); - } - - return map; - } - } - } - return null; - } - - @EventHandler - private static void onLeave(GameLeftEvent event) { - PLAYER_EFFECT_MAP.clear(); - } - - private static boolean isEmpty(int particleColor) { - return particleColor == 0 || particleColor == EMPTY_COLOR; - } - - private static int blend(MutableParticleColor color, Iterable entries) { - float r = color.r; - float g = color.g; - float b = color.b; - int a = color.a; - - for (var entry : entries) { - r += entry.r; - g += entry.g; - b += entry.b; - a += entry.amplifier; - } - - r = r / (float) a * 255.0F; - g = g / (float) a * 255.0F; - b = b / (float) a * 255.0F; - - return (int) r << 16 | (int) g << 8 | (int) b; - } - - public record StatusEffectEntry(StatusEffect effect, int amplifier, float r, float g, float b) { - public static StatusEffectEntry of(StatusEffect effect, int amplifier) { - int color = effect.getColor(); - float r = (float)(amplifier * (color >> 16 & 255)) / 255.0F; - float g = (float)(amplifier * (color >> 8 & 255)) / 255.0F; - float b = (float)(amplifier * (color & 255)) / 255.0F; - return new StatusEffectEntry(effect, amplifier, r, g, b); - } - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/fakeplayer/FakePlayerEntity.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/fakeplayer/FakePlayerEntity.java index 858e65e862..381968a25a 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/entity/fakeplayer/FakePlayerEntity.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/entity/fakeplayer/FakePlayerEntity.java @@ -6,7 +6,6 @@ package meteordevelopment.meteorclient.utils.entity.fakeplayer; import com.mojang.authlib.GameProfile; -import meteordevelopment.meteorclient.utils.entity.EntityAttributeHelper; import net.minecraft.client.network.OtherClientPlayerEntity; import net.minecraft.client.network.PlayerListEntry; import net.minecraft.entity.player.PlayerEntity; @@ -34,7 +33,7 @@ public FakePlayerEntity(PlayerEntity player, String name, float health, boolean Byte playerModel = player.getDataTracker().get(PlayerEntity.PLAYER_MODEL_PARTS); dataTracker.set(PlayerEntity.PLAYER_MODEL_PARTS, playerModel); - getAttributes().setFrom(EntityAttributeHelper.getAttributes(player)); + getAttributes().setFrom(player.getAttributes()); setPose(player.getPose()); capeX = getX(); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/fakeplayer/FakePlayerManager.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/fakeplayer/FakePlayerManager.java index b05a47c29a..28cb33d22f 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/entity/fakeplayer/FakePlayerManager.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/entity/fakeplayer/FakePlayerManager.java @@ -17,6 +17,9 @@ public class FakePlayerManager { private static final List ENTITIES = new ArrayList<>(); + private FakePlayerManager() { + } + public static List getFakePlayers() { return ENTITIES; } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/files/StreamUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/files/StreamUtils.java index b6b9c7bd0f..725d76616f 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/files/StreamUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/files/StreamUtils.java @@ -8,28 +8,22 @@ import java.io.*; public class StreamUtils { - public static void copy(File from, File to) { - try { - InputStream in = new FileInputStream(from); - OutputStream out = new FileOutputStream(to); + private StreamUtils() { + } + public static void copy(File from, File to) { + try (InputStream in = new FileInputStream(from); + OutputStream out = new FileOutputStream(to)) { copy(in, out); - - in.close(); - out.close(); } catch (IOException e) { e.printStackTrace(); } } public static void copy(InputStream in, File to) { - try { - OutputStream out = new FileOutputStream(to); - + try (OutputStream out = new FileOutputStream(to)) { copy(in, out); - in.close(); - out.close(); } catch (IOException e) { e.printStackTrace(); } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/json/UUIDSerializer.java b/src/main/java/meteordevelopment/meteorclient/utils/json/UUIDSerializer.java deleted file mode 100644 index 1366bf5187..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/utils/json/UUIDSerializer.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.utils.json; - -import com.google.gson.*; - -import java.lang.reflect.Type; -import java.util.UUID; - -public class UUIDSerializer implements JsonSerializer, JsonDeserializer { - @Override - public JsonElement serialize(UUID src, Type typeOfSrc, JsonSerializationContext context) { - return new JsonPrimitive(src.toString()); - } - - @Override - public UUID deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { - return UUID.fromString(json.getAsString()); - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/CPSUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/CPSUtils.java index ecbc4c056c..23b03a105f 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/CPSUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/CPSUtils.java @@ -17,6 +17,9 @@ public class CPSUtils { private static int secondsClicking; private static long lastTime; + private CPSUtils() { + } + @PreInit public static void init() { MeteorClient.EVENT_BUS.subscribe(CPSUtils.class); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/FakeClientPlayer.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/FakeClientPlayer.java index 7f5a9e8ab3..db117d1fab 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/FakeClientPlayer.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/FakeClientPlayer.java @@ -30,6 +30,9 @@ public class FakeClientPlayer { private static UUID lastId; private static boolean needsNewEntry; + private FakeClientPlayer() { + } + @PreInit public static void init() { MeteorClient.EVENT_BUS.subscribe(FakeClientPlayer.class); @@ -41,11 +44,7 @@ public static PlayerEntity getPlayer() { if (player == null || (!id.equals(lastId))) { if (world == null) { world = new ClientWorld( - new ClientPlayNetworkHandler( - mc, - new ClientConnection(NetworkSide.CLIENTBOUND), - new ClientConnectionState(new GameProfile(mc.getSession().getUuidOrNull(), mc.getSession().getUsername()), null, null, null, null, mc.getCurrentServerEntry(), null) - ), // todo test this + new ClientPlayNetworkHandler(mc, new ClientConnection(NetworkSide.CLIENTBOUND), new ClientConnectionState(new GameProfile(mc.getSession().getUuidOrNull(), mc.getSession().getUsername()), null, null, null, null, mc.getCurrentServerEntry(), null, null, null, false)), new ClientWorld.Properties(Difficulty.NORMAL, false, false), world.getRegistryKey(), world.getDimensionEntry(), diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorStarscript.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorStarscript.java index 3d91196a0e..ecb8802c57 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorStarscript.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorStarscript.java @@ -45,6 +45,7 @@ import net.minecraft.network.packet.c2s.play.ClientStatusC2SPacket; import net.minecraft.registry.Registries; import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.stat.Stat; import net.minecraft.stat.Stats; import net.minecraft.util.Identifier; @@ -286,10 +287,10 @@ private static Value hasPotionEffect(Starscript ss, int argCount) { Identifier name = popIdentifier(ss, "First argument to player.has_potion_effect() needs to a string."); - StatusEffect effect = Registries.STATUS_EFFECT.get(name); - if (effect == null) return Value.bool(false); + Optional> effect = Registries.STATUS_EFFECT.getEntry(name); + if (effect.isEmpty()) return Value.bool(false); - StatusEffectInstance effectInstance = mc.player.getStatusEffect(effect); + StatusEffectInstance effectInstance = mc.player.getStatusEffect(effect.get()); return Value.bool(effectInstance != null); } @@ -299,10 +300,10 @@ private static Value getPotionEffect(Starscript ss, int argCount) { Identifier name = popIdentifier(ss, "First argument to player.get_potion_effect() needs to a string."); - StatusEffect effect = Registries.STATUS_EFFECT.get(name); - if (effect == null) return Value.null_(); + Optional> effect = Registries.STATUS_EFFECT.getEntry(name); + if (effect.isEmpty()) return Value.null_(); - StatusEffectInstance effectInstance = mc.player.getStatusEffect(effect); + StatusEffectInstance effectInstance = mc.player.getStatusEffect(effect.get()); if (effectInstance == null) return Value.null_(); return wrap(effectInstance); @@ -366,17 +367,13 @@ private static Value getModuleSetting(Starscript ss, int argCount) { ss.error("Unable to get setting %s for module %s for meteor.get_module_setting()", settingName, moduleName); } var value = setting.get(); - if (value instanceof Double) { - return Value.number((Double) value); - } else if (value instanceof Integer) { - return Value.number((Integer) value); - } else if (value instanceof Boolean) { - return Value.bool((Boolean) value); - } else if (value instanceof List) { - return Value.number(((List) value).size()); - } else { - return Value.string(value.toString()); - } + return switch (value) { + case Double d -> Value.number(d); + case Integer i -> Value.number(i); + case Boolean b -> Value.bool(b); + case List list -> Value.number(list.size()); + case null, default -> Value.string(value.toString()); + }; } private static Value isModuleActive(Starscript ss, int argCount) { diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/MyPotion.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/MyPotion.java index d4b463a1c1..47187497ba 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/MyPotion.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/MyPotion.java @@ -5,12 +5,13 @@ package meteordevelopment.meteorclient.utils.misc; +import net.minecraft.component.type.PotionContentsComponent; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.potion.Potion; -import net.minecraft.potion.PotionUtil; import net.minecraft.potion.Potions; +import net.minecraft.registry.entry.RegistryEntry; public enum MyPotion { Swiftness(Potions.SWIFTNESS, Items.NETHER_WART, Items.SUGAR), @@ -68,8 +69,8 @@ public enum MyPotion { public final ItemStack potion; public final Item[] ingredients; - MyPotion(Potion potion, Item... ingredients) { - this.potion = PotionUtil.setPotion(new ItemStack(Items.POTION), potion); + MyPotion(RegistryEntry potion, Item... ingredients) { + this.potion = PotionContentsComponent.createStack(Items.POTION, potion); this.ingredients = ingredients; } } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/Names.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/Names.java index b8f0d611d8..cd84260b38 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/Names.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/Names.java @@ -18,13 +18,13 @@ import net.minecraft.entity.effect.StatusEffect; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtElement; import net.minecraft.particle.ParticleEffect; import net.minecraft.particle.ParticleType; +import net.minecraft.registry.Registries; import net.minecraft.text.Text; import net.minecraft.util.Identifier; import net.minecraft.util.StringHelper; -import org.apache.commons.lang3.text.WordUtils; +import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.Map; @@ -40,6 +40,9 @@ public class Names { private static final Map, String> particleTypesNames = new Reference2ObjectOpenHashMap<>(64); private static final Map soundNames = new HashMap<>(64); + private Names() { + } + @PreInit public static void init() { MeteorClient.EVENT_BUS.subscribe(Names.class); @@ -78,7 +81,7 @@ public static String get(EntityType entityType) { public static String get(ParticleType type) { if (!(type instanceof ParticleEffect)) return ""; - return particleTypesNames.computeIfAbsent(type, effect1 -> WordUtils.capitalize(((ParticleEffect) effect1).asString().substring(10).replace("_", " "))); + return particleTypesNames.computeIfAbsent(type, effect1 -> StringUtils.capitalize(Registries.PARTICLE_TYPE.getId(type).getPath().replace("_", " "))); } public static String getSoundName(Identifier id) { @@ -94,6 +97,6 @@ public static String getSoundName(Identifier id) { } public static String get(ItemStack stack) { - return stack.hasNbt() && stack.getNbt().contains("display", NbtElement.COMPOUND_TYPE) ? stack.getName().getString() : I18n.translate(stack.getTranslationKey()); + return stack.getName().getString(); // pretty sure this is the same as it was } } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/NbtUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/NbtUtils.java index 1b266d7fee..28335fadf0 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/NbtUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/NbtUtils.java @@ -18,6 +18,9 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; public class NbtUtils { + private NbtUtils() { + } + public static > NbtList listToTag(Iterable list) { NbtList tag = new NbtList(); for (T item : list) tag.add(item.toTag()); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/Pool.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/Pool.java index ec391a072b..a97025b955 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/Pool.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/Pool.java @@ -17,7 +17,7 @@ public Pool(Producer producer) { } public synchronized T get() { - if (items.size() > 0) return items.poll(); + if (!items.isEmpty()) return items.poll(); return producer.create(); } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/input/Input.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/input/Input.java index a2a6bf001e..c556ae32b5 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/input/Input.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/input/Input.java @@ -19,6 +19,9 @@ public class Input { private static CursorStyle lastCursorStyle = CursorStyle.Default; + private Input() { + } + public static void setKeyState(int key, boolean pressed) { if (key >= 0 && key < keys.length) keys[key] = pressed; } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/input/KeyAction.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/input/KeyAction.java index c9e6fda19e..33533f23d5 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/input/KeyAction.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/input/KeyAction.java @@ -13,8 +13,10 @@ public enum KeyAction { Release; public static KeyAction get(int action) { - if (action == GLFW.GLFW_PRESS) return Press; - else if (action == GLFW.GLFW_RELEASE) return Release; - else return Repeat; + return switch (action) { + case GLFW.GLFW_PRESS -> Press; + case GLFW.GLFW_RELEASE -> Release; + default -> Repeat; + }; } } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/input/KeyBinds.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/input/KeyBinds.java index ba3615df2b..50de9a9314 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/input/KeyBinds.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/input/KeyBinds.java @@ -18,6 +18,9 @@ public class KeyBinds { public static KeyBinding OPEN_GUI = new KeyBinding("key.meteor-client.open-gui", InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_RIGHT_SHIFT, CATEGORY); public static KeyBinding OPEN_COMMANDS = new KeyBinding("key.meteor-client.open-commands", InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_PERIOD, CATEGORY); + private KeyBinds() { + } + public static KeyBinding[] apply(KeyBinding[] binds) { // Add category Map categories = KeyBindingAccessor.getCategoryOrderMap(); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/ColoredText.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/ColoredText.java index e7cb34cc20..e85d040a61 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/ColoredText.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/ColoredText.java @@ -7,38 +7,8 @@ import meteordevelopment.meteorclient.utils.render.color.Color; -import java.util.Objects; - /** * Encapsulates a string and the color it should have. See {@link TextUtils} */ -public class ColoredText { - private final String text; - private final Color color; - - public ColoredText(String text, Color color) { - this.text = text; - this.color = color; - } - - public String getText() { - return text; - } - - public Color getColor() { - return color; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - ColoredText that = (ColoredText) o; - return text.equals(that.text) && color.equals(that.color); - } - - @Override - public int hashCode() { - return Objects.hash(text, color); - } +public record ColoredText(String text, Color color) { } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/RunnableClickEvent.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/RunnableClickEvent.java new file mode 100644 index 0000000000..706b8d1592 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/RunnableClickEvent.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.utils.misc.text; + +/** + * Allows arbitrary code execution in a click event + * @see + */ +public class RunnableClickEvent extends MeteorClickEvent { + public final Runnable runnable; + + public RunnableClickEvent(Runnable runnable) { + super(null, null); // Should ensure no vanilla code is triggered, and only we handle it + this.runnable = runnable; + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/StringCharacterVisitor.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/StringCharacterVisitor.java deleted file mode 100644 index a317401189..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/StringCharacterVisitor.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.utils.misc.text; - -import net.minecraft.text.CharacterVisitor; -import net.minecraft.text.Style; - -public class StringCharacterVisitor implements CharacterVisitor { - - public StringBuilder result = new StringBuilder(); - - @Override - public boolean accept(int index, Style style, int j) { - result.append((char)j); - return true; - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/TextUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/TextUtils.java index a89ab36e81..0a102348a8 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/TextUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/TextUtils.java @@ -19,11 +19,14 @@ * Some utilities for {@link Text} */ public class TextUtils { + private TextUtils() { + } + public static List toColoredTextList(Text text) { - Stack stack = new Stack<>(); + Deque stack = new ArrayDeque<>(); List coloredTexts = new ArrayList<>(); preOrderTraverse(text, stack, coloredTexts); - coloredTexts.removeIf(e -> e.getText().isEmpty()); + coloredTexts.removeIf(e -> e.text().isEmpty()); return coloredTexts; } @@ -70,12 +73,12 @@ public static Object2IntMap getColoredCharacterCount(List co Object2IntMap colorCount = new Object2IntOpenHashMap<>(); for (ColoredText coloredText : coloredTexts) { - if (colorCount.containsKey(coloredText.getColor())) { + if (colorCount.containsKey(coloredText.color())) { // Since color was already catalogued, simply update the record by adding the length of the new text segment to the old one - colorCount.put(coloredText.getColor(), colorCount.getInt(coloredText.getColor()) + coloredText.getText().length()); + colorCount.put(coloredText.color(), colorCount.getInt(coloredText.color()) + coloredText.text().length()); } else { // Add new entry to the hashmap - colorCount.put(coloredText.getColor(), coloredText.getText().length()); + colorCount.put(coloredText.color(), coloredText.text().length()); } } @@ -90,7 +93,7 @@ public static Object2IntMap getColoredCharacterCount(List co * @param stack An empty stack. This is used by the recursive algorithm to keep track of the parents of the current iteration * @param coloredTexts The list of colored text to return */ - private static void preOrderTraverse(Text text, Stack stack, List coloredTexts) { + private static void preOrderTraverse(Text text, Deque stack, List coloredTexts) { if (text == null) return; @@ -105,12 +108,12 @@ private static void preOrderTraverse(Text text, Stack stack, List TO_RETRY = new ArrayList<>(); private static final List TO_REMOVE = new ArrayList<>(); + private Capes() { + } + @PreInit(dependencies = MeteorExecutor.class) public static void init() { OWNERS.clear(); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/network/MeteorExecutor.java b/src/main/java/meteordevelopment/meteorclient/utils/network/MeteorExecutor.java index d1ec0d8071..33b14478e9 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/network/MeteorExecutor.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/network/MeteorExecutor.java @@ -14,6 +14,9 @@ public class MeteorExecutor { public static ExecutorService executor; + private MeteorExecutor() { + } + @PreInit public static void init() { AtomicInteger threadNumber = new AtomicInteger(1); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/network/OnlinePlayers.java b/src/main/java/meteordevelopment/meteorclient/utils/network/OnlinePlayers.java index 27e0ddc321..30dc9c8f96 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/network/OnlinePlayers.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/network/OnlinePlayers.java @@ -8,6 +8,9 @@ public class OnlinePlayers { private static long lastPingTime; + private OnlinePlayers() { + } + public static void update() { long time = System.currentTimeMillis(); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtils.java index f20229eda3..37e406956c 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtils.java @@ -18,11 +18,10 @@ import net.minecraft.util.Identifier; import net.minecraft.util.math.random.Random; import org.jetbrains.annotations.NotNull; - import java.util.*; import java.util.stream.Stream; -public abstract class PacketUtils { +public class PacketUtils { public static final Registry>> REGISTRY = new PacketRegistry(); private static final Map>, String> S2C_PACKETS = new HashMap<>(); @@ -54,10 +53,10 @@ public abstract class PacketUtils { C2S_PACKETS_R.put("QueryBlockNbtC2SPacket", net.minecraft.network.packet.c2s.play.QueryBlockNbtC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.PlayerInteractEntityC2SPacket.class, "PlayerInteractEntityC2SPacket"); C2S_PACKETS_R.put("PlayerInteractEntityC2SPacket", net.minecraft.network.packet.c2s.play.PlayerInteractEntityC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdatePlayerAbilitiesC2SPacket.class, "UpdatePlayerAbilitiesC2SPacket"); - C2S_PACKETS_R.put("UpdatePlayerAbilitiesC2SPacket", net.minecraft.network.packet.c2s.play.UpdatePlayerAbilitiesC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.RequestCommandCompletionsC2SPacket.class, "RequestCommandCompletionsC2SPacket"); C2S_PACKETS_R.put("RequestCommandCompletionsC2SPacket", net.minecraft.network.packet.c2s.play.RequestCommandCompletionsC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdatePlayerAbilitiesC2SPacket.class, "UpdatePlayerAbilitiesC2SPacket"); + C2S_PACKETS_R.put("UpdatePlayerAbilitiesC2SPacket", net.minecraft.network.packet.c2s.play.UpdatePlayerAbilitiesC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.AcknowledgeReconfigurationC2SPacket.class, "AcknowledgeReconfigurationC2SPacket"); C2S_PACKETS_R.put("AcknowledgeReconfigurationC2SPacket", net.minecraft.network.packet.c2s.play.AcknowledgeReconfigurationC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.query.QueryRequestC2SPacket.class, "QueryRequestC2SPacket"); @@ -92,24 +91,28 @@ public abstract class PacketUtils { C2S_PACKETS_R.put("PlayerMoveC2SPacket", net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.common.ClientOptionsC2SPacket.class, "ClientOptionsC2SPacket"); C2S_PACKETS_R.put("ClientOptionsC2SPacket", net.minecraft.network.packet.c2s.common.ClientOptionsC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.PickFromInventoryC2SPacket.class, "PickFromInventoryC2SPacket"); - C2S_PACKETS_R.put("PickFromInventoryC2SPacket", net.minecraft.network.packet.c2s.play.PickFromInventoryC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.common.CustomPayloadC2SPacket.class, "CustomPayloadC2SPacket"); C2S_PACKETS_R.put("CustomPayloadC2SPacket", net.minecraft.network.packet.c2s.common.CustomPayloadC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.PickFromInventoryC2SPacket.class, "PickFromInventoryC2SPacket"); + C2S_PACKETS_R.put("PickFromInventoryC2SPacket", net.minecraft.network.packet.c2s.play.PickFromInventoryC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.PlayerSessionC2SPacket.class, "PlayerSessionC2SPacket"); C2S_PACKETS_R.put("PlayerSessionC2SPacket", net.minecraft.network.packet.c2s.play.PlayerSessionC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.CloseHandledScreenC2SPacket.class, "CloseHandledScreenC2SPacket"); C2S_PACKETS_R.put("CloseHandledScreenC2SPacket", net.minecraft.network.packet.c2s.play.CloseHandledScreenC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.SlotChangedStateC2SPacket.class, "SlotChangedStateC2SPacket"); - C2S_PACKETS_R.put("SlotChangedStateC2SPacket", net.minecraft.network.packet.c2s.play.SlotChangedStateC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.ChatCommandSignedC2SPacket.class, "ChatCommandSignedC2SPacket"); + C2S_PACKETS_R.put("ChatCommandSignedC2SPacket", net.minecraft.network.packet.c2s.play.ChatCommandSignedC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.config.ReadyC2SPacket.class, "ReadyC2SPacket"); C2S_PACKETS_R.put("ReadyC2SPacket", net.minecraft.network.packet.c2s.config.ReadyC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.SlotChangedStateC2SPacket.class, "SlotChangedStateC2SPacket"); + C2S_PACKETS_R.put("SlotChangedStateC2SPacket", net.minecraft.network.packet.c2s.play.SlotChangedStateC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.BoatPaddleStateC2SPacket.class, "BoatPaddleStateC2SPacket"); C2S_PACKETS_R.put("BoatPaddleStateC2SPacket", net.minecraft.network.packet.c2s.play.BoatPaddleStateC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.ChatMessageC2SPacket.class, "ChatMessageC2SPacket"); - C2S_PACKETS_R.put("ChatMessageC2SPacket", net.minecraft.network.packet.c2s.play.ChatMessageC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.ButtonClickC2SPacket.class, "ButtonClickC2SPacket"); C2S_PACKETS_R.put("ButtonClickC2SPacket", net.minecraft.network.packet.c2s.play.ButtonClickC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.config.SelectKnownPacksC2SPacket.class, "SelectKnownPacksC2SPacket"); + C2S_PACKETS_R.put("SelectKnownPacksC2SPacket", net.minecraft.network.packet.c2s.config.SelectKnownPacksC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.ChatMessageC2SPacket.class, "ChatMessageC2SPacket"); + C2S_PACKETS_R.put("ChatMessageC2SPacket", net.minecraft.network.packet.c2s.play.ChatMessageC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdateBeaconC2SPacket.class, "UpdateBeaconC2SPacket"); C2S_PACKETS_R.put("UpdateBeaconC2SPacket", net.minecraft.network.packet.c2s.play.UpdateBeaconC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdateSignC2SPacket.class, "UpdateSignC2SPacket"); @@ -130,8 +133,12 @@ public abstract class PacketUtils { C2S_PACKETS_R.put("UpdateJigsawC2SPacket", net.minecraft.network.packet.c2s.play.UpdateJigsawC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.query.QueryPingC2SPacket.class, "QueryPingC2SPacket"); C2S_PACKETS_R.put("QueryPingC2SPacket", net.minecraft.network.packet.c2s.query.QueryPingC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.common.CookieResponseC2SPacket.class, "CookieResponseC2SPacket"); + C2S_PACKETS_R.put("CookieResponseC2SPacket", net.minecraft.network.packet.c2s.common.CookieResponseC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.MessageAcknowledgmentC2SPacket.class, "MessageAcknowledgmentC2SPacket"); C2S_PACKETS_R.put("MessageAcknowledgmentC2SPacket", net.minecraft.network.packet.c2s.play.MessageAcknowledgmentC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.DebugSampleSubscriptionC2SPacket.class, "DebugSampleSubscriptionC2SPacket"); + C2S_PACKETS_R.put("DebugSampleSubscriptionC2SPacket", net.minecraft.network.packet.c2s.play.DebugSampleSubscriptionC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.common.KeepAliveC2SPacket.class, "KeepAliveC2SPacket"); C2S_PACKETS_R.put("KeepAliveC2SPacket", net.minecraft.network.packet.c2s.common.KeepAliveC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.CreativeInventoryActionC2SPacket.class, "CreativeInventoryActionC2SPacket"); @@ -142,10 +149,10 @@ public abstract class PacketUtils { C2S_PACKETS_R.put("BookUpdateC2SPacket", net.minecraft.network.packet.c2s.play.BookUpdateC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.RecipeBookDataC2SPacket.class, "RecipeBookDataC2SPacket"); C2S_PACKETS_R.put("RecipeBookDataC2SPacket", net.minecraft.network.packet.c2s.play.RecipeBookDataC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.login.LoginQueryResponseC2SPacket.class, "LoginQueryResponseC2SPacket"); - C2S_PACKETS_R.put("LoginQueryResponseC2SPacket", net.minecraft.network.packet.c2s.login.LoginQueryResponseC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.handshake.HandshakeC2SPacket.class, "HandshakeC2SPacket"); C2S_PACKETS_R.put("HandshakeC2SPacket", net.minecraft.network.packet.c2s.handshake.HandshakeC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.login.LoginQueryResponseC2SPacket.class, "LoginQueryResponseC2SPacket"); + C2S_PACKETS_R.put("LoginQueryResponseC2SPacket", net.minecraft.network.packet.c2s.login.LoginQueryResponseC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.UpdateDifficultyC2SPacket.class, "UpdateDifficultyC2SPacket"); C2S_PACKETS_R.put("UpdateDifficultyC2SPacket", net.minecraft.network.packet.c2s.play.UpdateDifficultyC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.CraftRequestC2SPacket.class, "CraftRequestC2SPacket"); @@ -154,10 +161,10 @@ public abstract class PacketUtils { C2S_PACKETS_R.put("PlayerMoveC2SPacket.LookAndOnGround", net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket.LookAndOnGround.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket.OnGroundOnly.class, "PlayerMoveC2SPacket.OnGroundOnly"); C2S_PACKETS_R.put("PlayerMoveC2SPacket.OnGroundOnly", net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket.OnGroundOnly.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket.PositionAndOnGround.class, "PlayerMoveC2SPacket.PositionAndOnGround"); - C2S_PACKETS_R.put("PlayerMoveC2SPacket.PositionAndOnGround", net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket.PositionAndOnGround.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket.Full.class, "PlayerMoveC2SPacket.Full"); C2S_PACKETS_R.put("PlayerMoveC2SPacket.Full", net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket.Full.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket.PositionAndOnGround.class, "PlayerMoveC2SPacket.PositionAndOnGround"); + C2S_PACKETS_R.put("PlayerMoveC2SPacket.PositionAndOnGround", net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket.PositionAndOnGround.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.WorldBorderSizeChangedS2CPacket.class, "WorldBorderSizeChangedS2CPacket"); S2C_PACKETS_R.put("WorldBorderSizeChangedS2CPacket", net.minecraft.network.packet.s2c.play.WorldBorderSizeChangedS2CPacket.class); @@ -201,12 +208,16 @@ public abstract class PacketUtils { S2C_PACKETS_R.put("ScoreboardObjectiveUpdateS2CPacket", net.minecraft.network.packet.s2c.play.ScoreboardObjectiveUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.StartChunkSendS2CPacket.class, "StartChunkSendS2CPacket"); S2C_PACKETS_R.put("StartChunkSendS2CPacket", net.minecraft.network.packet.s2c.play.StartChunkSendS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.common.CookieRequestS2CPacket.class, "CookieRequestS2CPacket"); + S2C_PACKETS_R.put("CookieRequestS2CPacket", net.minecraft.network.packet.s2c.common.CookieRequestS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntitySetHeadYawS2CPacket.class, "EntitySetHeadYawS2CPacket"); S2C_PACKETS_R.put("EntitySetHeadYawS2CPacket", net.minecraft.network.packet.s2c.play.EntitySetHeadYawS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.SelectAdvancementTabS2CPacket.class, "SelectAdvancementTabS2CPacket"); S2C_PACKETS_R.put("SelectAdvancementTabS2CPacket", net.minecraft.network.packet.s2c.play.SelectAdvancementTabS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.SetTradeOffersS2CPacket.class, "SetTradeOffersS2CPacket"); S2C_PACKETS_R.put("SetTradeOffersS2CPacket", net.minecraft.network.packet.s2c.play.SetTradeOffersS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.common.StoreCookieS2CPacket.class, "StoreCookieS2CPacket"); + S2C_PACKETS_R.put("StoreCookieS2CPacket", net.minecraft.network.packet.s2c.common.StoreCookieS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlaySoundS2CPacket.class, "PlaySoundS2CPacket"); S2C_PACKETS_R.put("PlaySoundS2CPacket", net.minecraft.network.packet.s2c.play.PlaySoundS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.BlockEventS2CPacket.class, "BlockEventS2CPacket"); @@ -235,12 +246,14 @@ public abstract class PacketUtils { S2C_PACKETS_R.put("CooldownUpdateS2CPacket", net.minecraft.network.packet.s2c.play.CooldownUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.OpenScreenS2CPacket.class, "OpenScreenS2CPacket"); S2C_PACKETS_R.put("OpenScreenS2CPacket", net.minecraft.network.packet.s2c.play.OpenScreenS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ExperienceOrbSpawnS2CPacket.class, "ExperienceOrbSpawnS2CPacket"); - S2C_PACKETS_R.put("ExperienceOrbSpawnS2CPacket", net.minecraft.network.packet.s2c.play.ExperienceOrbSpawnS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityAnimationS2CPacket.class, "EntityAnimationS2CPacket"); S2C_PACKETS_R.put("EntityAnimationS2CPacket", net.minecraft.network.packet.s2c.play.EntityAnimationS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ExperienceOrbSpawnS2CPacket.class, "ExperienceOrbSpawnS2CPacket"); + S2C_PACKETS_R.put("ExperienceOrbSpawnS2CPacket", net.minecraft.network.packet.s2c.play.ExperienceOrbSpawnS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlayerAbilitiesS2CPacket.class, "PlayerAbilitiesS2CPacket"); S2C_PACKETS_R.put("PlayerAbilitiesS2CPacket", net.minecraft.network.packet.s2c.play.PlayerAbilitiesS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.config.ResetChatS2CPacket.class, "ResetChatS2CPacket"); + S2C_PACKETS_R.put("ResetChatS2CPacket", net.minecraft.network.packet.s2c.config.ResetChatS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.WorldBorderWarningBlocksChangedS2CPacket.class, "WorldBorderWarningBlocksChangedS2CPacket"); S2C_PACKETS_R.put("WorldBorderWarningBlocksChangedS2CPacket", net.minecraft.network.packet.s2c.play.WorldBorderWarningBlocksChangedS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntitiesDestroyS2CPacket.class, "EntitiesDestroyS2CPacket"); @@ -283,10 +296,10 @@ public abstract class PacketUtils { S2C_PACKETS_R.put("DeathMessageS2CPacket", net.minecraft.network.packet.s2c.play.DeathMessageS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.MapUpdateS2CPacket.class, "MapUpdateS2CPacket"); S2C_PACKETS_R.put("MapUpdateS2CPacket", net.minecraft.network.packet.s2c.play.MapUpdateS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ScreenHandlerSlotUpdateS2CPacket.class, "ScreenHandlerSlotUpdateS2CPacket"); - S2C_PACKETS_R.put("ScreenHandlerSlotUpdateS2CPacket", net.minecraft.network.packet.s2c.play.ScreenHandlerSlotUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.BlockEntityUpdateS2CPacket.class, "BlockEntityUpdateS2CPacket"); S2C_PACKETS_R.put("BlockEntityUpdateS2CPacket", net.minecraft.network.packet.s2c.play.BlockEntityUpdateS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ScreenHandlerSlotUpdateS2CPacket.class, "ScreenHandlerSlotUpdateS2CPacket"); + S2C_PACKETS_R.put("ScreenHandlerSlotUpdateS2CPacket", net.minecraft.network.packet.s2c.play.ScreenHandlerSlotUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlayerSpawnPositionS2CPacket.class, "PlayerSpawnPositionS2CPacket"); S2C_PACKETS_R.put("PlayerSpawnPositionS2CPacket", net.minecraft.network.packet.s2c.play.PlayerSpawnPositionS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityStatusEffectS2CPacket.class, "EntityStatusEffectS2CPacket"); @@ -311,6 +324,8 @@ public abstract class PacketUtils { S2C_PACKETS_R.put("InventoryS2CPacket", net.minecraft.network.packet.s2c.play.InventoryS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlayerActionResponseS2CPacket.class, "PlayerActionResponseS2CPacket"); S2C_PACKETS_R.put("PlayerActionResponseS2CPacket", net.minecraft.network.packet.s2c.play.PlayerActionResponseS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.DebugSampleS2CPacket.class, "DebugSampleS2CPacket"); + S2C_PACKETS_R.put("DebugSampleS2CPacket", net.minecraft.network.packet.s2c.play.DebugSampleS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ChunkBiomeDataS2CPacket.class, "ChunkBiomeDataS2CPacket"); S2C_PACKETS_R.put("ChunkBiomeDataS2CPacket", net.minecraft.network.packet.s2c.play.ChunkBiomeDataS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.WorldBorderWarningTimeChangedS2CPacket.class, "WorldBorderWarningTimeChangedS2CPacket"); @@ -379,6 +394,8 @@ public abstract class PacketUtils { S2C_PACKETS_R.put("EntityTrackerUpdateS2CPacket", net.minecraft.network.packet.s2c.play.EntityTrackerUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityStatusS2CPacket.class, "EntityStatusS2CPacket"); S2C_PACKETS_R.put("EntityStatusS2CPacket", net.minecraft.network.packet.s2c.play.EntityStatusS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.config.SelectKnownPacksS2CPacket.class, "SelectKnownPacksS2CPacket"); + S2C_PACKETS_R.put("SelectKnownPacksS2CPacket", net.minecraft.network.packet.s2c.config.SelectKnownPacksS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.config.DynamicRegistriesS2CPacket.class, "DynamicRegistriesS2CPacket"); S2C_PACKETS_R.put("DynamicRegistriesS2CPacket", net.minecraft.network.packet.s2c.config.DynamicRegistriesS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.common.CustomPayloadS2CPacket.class, "CustomPayloadS2CPacket"); @@ -399,12 +416,18 @@ public abstract class PacketUtils { S2C_PACKETS_R.put("EntityAttachS2CPacket", net.minecraft.network.packet.s2c.play.EntityAttachS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.BossBarS2CPacket.class, "BossBarS2CPacket"); S2C_PACKETS_R.put("BossBarS2CPacket", net.minecraft.network.packet.s2c.play.BossBarS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.common.ServerTransferS2CPacket.class, "ServerTransferS2CPacket"); + S2C_PACKETS_R.put("ServerTransferS2CPacket", net.minecraft.network.packet.s2c.common.ServerTransferS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityPositionS2CPacket.class, "EntityPositionS2CPacket"); S2C_PACKETS_R.put("EntityPositionS2CPacket", net.minecraft.network.packet.s2c.play.EntityPositionS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ChunkDataS2CPacket.class, "ChunkDataS2CPacket"); S2C_PACKETS_R.put("ChunkDataS2CPacket", net.minecraft.network.packet.s2c.play.ChunkDataS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ProjectilePowerS2CPacket.class, "ProjectilePowerS2CPacket"); + S2C_PACKETS_R.put("ProjectilePowerS2CPacket", net.minecraft.network.packet.s2c.play.ProjectilePowerS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.GameStateChangeS2CPacket.class, "GameStateChangeS2CPacket"); S2C_PACKETS_R.put("GameStateChangeS2CPacket", net.minecraft.network.packet.s2c.play.GameStateChangeS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.BundleDelimiterS2CPacket.class, "BundleDelimiterS2CPacket"); + S2C_PACKETS_R.put("BundleDelimiterS2CPacket", net.minecraft.network.packet.s2c.play.BundleDelimiterS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.BundleS2CPacket.class, "BundleS2CPacket"); S2C_PACKETS_R.put("BundleS2CPacket", net.minecraft.network.packet.s2c.play.BundleS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityS2CPacket.RotateAndMoveRelative.class, "EntityS2CPacket.RotateAndMoveRelative"); @@ -415,6 +438,9 @@ public abstract class PacketUtils { S2C_PACKETS_R.put("EntityS2CPacket.MoveRelative", net.minecraft.network.packet.s2c.play.EntityS2CPacket.MoveRelative.class); } + private PacketUtils() { + } + public static String getName(Class> packetClass) { String name = S2C_PACKETS.get(packetClass); if (name != null) return name; @@ -470,11 +496,6 @@ public Class> get(Identifier id) { return null; } - @Override - public Lifecycle getEntryLifecycle(Class> object) { - return null; - } - @Override public Lifecycle getLifecycle() { return null; @@ -482,7 +503,7 @@ public Lifecycle getLifecycle() { @Override public Set getIds() { - return null; + return Collections.emptySet(); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtilsUtil.java b/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtilsUtil.java index c296a947e4..2c983f232a 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtilsUtil.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtilsUtil.java @@ -16,7 +16,7 @@ import java.io.IOException; import java.util.Set; -public abstract class PacketUtilsUtil { +public class PacketUtilsUtil { private static final String packetRegistryClass = """ private static class PacketRegistry extends SimpleRegistry>> { public PacketRegistry() { @@ -53,11 +53,6 @@ public Class> get(Identifier id) { return null; } - @Override - public Lifecycle getEntryLifecycle(Class> object) { - return null; - } - @Override public Lifecycle getLifecycle() { return null; @@ -65,7 +60,7 @@ public Lifecycle getLifecycle() { @Override public Set getIds() { - return null; + return Collections.emptySet(); } @Override @@ -157,6 +152,9 @@ public Set>>> getKeys() { } """; + private PacketUtilsUtil() { + } + public static void main(String[] args) { try { init(); @@ -201,7 +199,7 @@ public static void init() throws IOException { writer.write("import java.util.stream.Stream;\n"); // Write class - writer.write("\npublic abstract class PacketUtils {\n"); + writer.write("\npublic class PacketUtils {\n"); // Write fields writer.write(" public static final Registry>> REGISTRY = new PacketRegistry();\n\n"); @@ -244,6 +242,9 @@ public static void init() throws IOException { writer.write(" }\n\n"); + writer.write(" private PacketUtils() {\n"); + writer.write(" }\n\n"); + // Write getName method writer.write(" public static String getName(Class> packetClass) {\n"); writer.write(" String name = S2C_PACKETS.get(packetClass);\n"); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/player/ChatUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/player/ChatUtils.java index ba05ab99f3..91107bdb15 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/player/ChatUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/player/ChatUtils.java @@ -30,6 +30,9 @@ public class ChatUtils { private static Text PREFIX; + private ChatUtils() { + } + @PostInit public static void init() { PREFIX = Text.empty() @@ -43,7 +46,9 @@ public static Text getMeteorPrefix() { return PREFIX; } - /** Registers a custom prefix to be used when calling from a class in the specified package. When null is returned from the supplier the default Meteor prefix is used. */ + /** + * Registers a custom prefix to be used when calling from a class in the specified package. When null is returned from the supplier the default Meteor prefix is used. + */ public static void registerCustomPrefix(String packageName, Supplier supplier) { for (Pair> pair : customPrefixes) { if (pair.getLeft().equals(packageName)) { @@ -55,7 +60,9 @@ public static void registerCustomPrefix(String packageName, Supplier suppl customPrefixes.add(new Pair<>(packageName, supplier)); } - /** The package name must match exactly to the one provided through {@link #registerCustomPrefix(String, Supplier)}. */ + /** + * The package name must match exactly to the one provided through {@link #registerCustomPrefix(String, Supplier)}. + */ public static void unregisterCustomPrefix(String packageName) { customPrefixes.removeIf(pair -> pair.getLeft().equals(packageName)); } @@ -66,7 +73,9 @@ public static void forceNextPrefixClass(Class klass) { // Player - /** Sends the message as if the user typed it into chat. */ + /** + * Sends the message as if the user typed it into chat. + */ public static void sendPlayerMsg(String message) { mc.inGameHud.getChatHud().addToMessageHistory(message); @@ -172,8 +181,7 @@ private static Text getPrefix() { if (forcedPrefixClassName != null) { className = forcedPrefixClassName; forcedPrefixClassName = null; - } - else { + } else { for (StackTraceElement element : Thread.currentThread().getStackTrace()) { if (foundChatUtils) { if (!element.getClassName().equals(ChatUtils.class.getName())) { @@ -228,6 +236,10 @@ private static MutableText formatMsg(String message, Formatting defaultColor) { style = style.withFormatting(Formatting.UNDERLINE); result.setLength(0); } + case "(bold)" -> { + style = style.withFormatting(Formatting.BOLD); + result.setLength(0); + } } formatting = false; } @@ -243,19 +255,20 @@ public static MutableText formatCoords(Vec3d pos) { String coordsString = String.format("(highlight)(underline)%.0f, %.0f, %.0f(default)", pos.x, pos.y, pos.z); MutableText coordsText = formatMsg(coordsString, Formatting.GRAY); - Style style = coordsText.getStyle().withFormatting(Formatting.BOLD).withHoverEvent(new HoverEvent( - HoverEvent.Action.SHOW_TEXT, - Text.literal("Set as Baritone goal") - )); - if (BaritoneUtils.IS_AVAILABLE) { - style = style.withClickEvent(new MeteorClickEvent( - ClickEvent.Action.RUN_COMMAND, - String.format("%sgoto %d %d %d", BaritoneUtils.getPrefix(), (int) pos.x, (int) pos.y, (int) pos.z) - )); + Style style = coordsText.getStyle().withFormatting(Formatting.BOLD) + .withHoverEvent(new HoverEvent( + HoverEvent.Action.SHOW_TEXT, + Text.literal("Set as Baritone goal") + )) + .withClickEvent(new MeteorClickEvent( + ClickEvent.Action.RUN_COMMAND, + String.format("%sgoto %d %d %d", BaritoneUtils.getPrefix(), (int) pos.x, (int) pos.y, (int) pos.z) + )); + + coordsText.setStyle(style); } - coordsText.setStyle(style); return coordsText; } } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/player/EChestMemory.java b/src/main/java/meteordevelopment/meteorclient/utils/player/EChestMemory.java index f806c712fb..af84a0e2bb 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/player/EChestMemory.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/player/EChestMemory.java @@ -25,6 +25,9 @@ public class EChestMemory { private static int echestOpenedState; private static boolean isKnown = false; + private EChestMemory() { + } + @PreInit public static void init() { MeteorClient.EVENT_BUS.subscribe(EChestMemory.class); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/player/FindItemResult.java b/src/main/java/meteordevelopment/meteorclient/utils/player/FindItemResult.java index 02b0ab44ae..4e7586d0a7 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/player/FindItemResult.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/player/FindItemResult.java @@ -16,7 +16,7 @@ public boolean found() { public Hand getHand() { if (slot == SlotUtils.OFFHAND) return Hand.OFF_HAND; - else if (slot == mc.player.getInventory().selectedSlot) return Hand.MAIN_HAND; + if (slot == mc.player.getInventory().selectedSlot) return Hand.MAIN_HAND; return null; } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/player/InvUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/player/InvUtils.java index 79b8624913..1b8aa88bbd 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/player/InvUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/player/InvUtils.java @@ -20,6 +20,9 @@ public class InvUtils { private static final Action ACTION = new Action(); public static int previousSlot = -1; + private InvUtils() { + } + // Predicates public static boolean testInMainHand(Predicate predicate) { @@ -212,7 +215,8 @@ public static class Action { private boolean isRecursive = false; - private Action() {} + private Action() { + } // From @@ -306,8 +310,8 @@ private void run() { } if (type != null && from != -1 && to != -1) { - click(from); - if (two) click(to); + click(from); + if (two) click(to); } SlotActionType preType = type; diff --git a/src/main/java/meteordevelopment/meteorclient/utils/player/InventorySorter.java b/src/main/java/meteordevelopment/meteorclient/utils/player/InventorySorter.java index f0796035fd..75fd01b111 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/player/InventorySorter.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/player/InventorySorter.java @@ -207,8 +207,8 @@ private static class SlotMap { private final List>> map = new ArrayList<>(); public List get(ItemStack itemStack) { - for (var entry : map) { - if (areEqual(itemStack, entry.getLeft())) { + for (Pair> entry : map) { + if (ItemStack.areItemsEqual(itemStack, entry.getLeft())) { return entry.getRight(); } } @@ -217,12 +217,6 @@ public List get(ItemStack itemStack) { map.add(new Pair<>(itemStack, list)); return list; } - - private boolean areEqual(ItemStack i1, ItemStack i2) { - if (!i1.isOf(i2.getItem()) || (i1.getNbt() == null && i2.getNbt() != null)) return false; - - return i1.getNbt() == null || i1.getNbt().equals(i2.getNbt()); - } } private record Action(int from, int to) {} diff --git a/src/main/java/meteordevelopment/meteorclient/utils/player/PathFinder.java b/src/main/java/meteordevelopment/meteorclient/utils/player/PathFinder.java index 5ec128dc2e..08fda11305 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/player/PathFinder.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/player/PathFinder.java @@ -21,8 +21,8 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; public class PathFinder { - private final static int PATH_AHEAD = 3; - private final static int QUAD_1 = 1, QUAD_2 = 2, SOUTH = 0, NORTH = 180; + private static final int PATH_AHEAD = 3; + private static final int QUAD_1 = 1, QUAD_2 = 2, SOUTH = 0, NORTH = 180; private final ArrayList path = new ArrayList<>(PATH_AHEAD); private Entity target; private PathBlock currentPathBlock; diff --git a/src/main/java/meteordevelopment/meteorclient/utils/player/PlayerUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/player/PlayerUtils.java index 57a6762229..f05e1a5bfb 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/player/PlayerUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/player/PlayerUtils.java @@ -21,6 +21,7 @@ import net.minecraft.block.entity.BedBlockEntity; import net.minecraft.block.entity.BlockEntity; import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.component.DataComponentTypes; import net.minecraft.entity.Entity; import net.minecraft.entity.decoration.EndCrystalEntity; import net.minecraft.entity.player.PlayerEntity; @@ -43,6 +44,9 @@ public class PlayerUtils { private static final Color color = new Color(); + private PlayerUtils() { + } + public static Color getPlayerColor(PlayerEntity entity, Color defaultColor) { if (Friends.get().isFriend(entity)) { return color.set(Config.get().friendColor.get()).a(defaultColor.a); @@ -135,7 +139,7 @@ public static float[] calculateAngle(Vec3d target) { public static boolean shouldPause(boolean ifBreaking, boolean ifEating, boolean ifDrinking) { if (ifBreaking && mc.interactionManager.isBreakingBlock()) return true; - if (ifEating && (mc.player.isUsingItem() && (mc.player.getMainHandStack().getItem().isFood() || mc.player.getOffHandStack().getItem().isFood()))) return true; + if (ifEating && (mc.player.isUsingItem() && (mc.player.getMainHandStack().getItem().getComponents().contains(DataComponentTypes.FOOD) || mc.player.getOffHandStack().getItem().getComponents().contains(DataComponentTypes.FOOD)))) return true; return ifDrinking && (mc.player.isUsingItem() && (mc.player.getMainHandStack().getItem() instanceof PotionItem || mc.player.getOffHandStack().getItem() instanceof PotionItem)); } @@ -328,7 +332,7 @@ public static boolean isWithinReach(BlockPos blockPos) { } public static boolean isWithinReach(double x, double y, double z) { - return squaredDistance(mc.player.getX(), mc.player.getEyeY(), mc.player.getZ(), x, y, z) <= mc.interactionManager.getReachDistance() * mc.interactionManager.getReachDistance(); + return squaredDistance(mc.player.getX(), mc.player.getEyeY(), mc.player.getZ(), x, y, z) <= mc.player.getBlockInteractionRange() * mc.player.getBlockInteractionRange(); } public static Dimension getDimension() { diff --git a/src/main/java/meteordevelopment/meteorclient/utils/player/Rotations.java b/src/main/java/meteordevelopment/meteorclient/utils/player/Rotations.java index 1990b96c7a..4e7f8e9c15 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/player/Rotations.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/player/Rotations.java @@ -38,6 +38,9 @@ public class Rotations { private static boolean sentLastRotation; public static boolean rotating = false; + private Rotations() { + } + @PreInit public static void init() { MeteorClient.EVENT_BUS.subscribe(Rotations.class); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/player/SlotUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/player/SlotUtils.java index a41583964f..375a657af5 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/player/SlotUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/player/SlotUtils.java @@ -32,6 +32,9 @@ public class SlotUtils { public static final int ARMOR_START = 36; public static final int ARMOR_END = 39; + private SlotUtils() { + } + public static int indexToId(int i) { if (mc.player == null) return -1; ScreenHandler handler = mc.player.currentScreenHandler; @@ -140,12 +143,10 @@ private static int horse(ScreenHandler handler, int i) { int strength = llamaEntity.getStrength(); if (isHotbar(i)) return (2 + 3 * strength) + 28 + i; if (isMain(i)) return (2 + 3 * strength) + 1 + (i - 9); - } - else if (entity instanceof HorseEntity || entity instanceof SkeletonHorseEntity || entity instanceof ZombieHorseEntity) { + } else if (entity instanceof HorseEntity || entity instanceof SkeletonHorseEntity || entity instanceof ZombieHorseEntity) { if (isHotbar(i)) return 29 + i; if (isMain(i)) return 2 + (i - 9); - } - else if (entity instanceof AbstractDonkeyEntity abstractDonkeyEntity) { + } else if (entity instanceof AbstractDonkeyEntity abstractDonkeyEntity) { boolean chest = abstractDonkeyEntity.hasChest(); if (isHotbar(i)) return (chest ? 44 : 29) + i; if (isMain(i)) return (chest ? 17 : 2) + (i - 9); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/player/TitleScreenCredits.java b/src/main/java/meteordevelopment/meteorclient/utils/player/TitleScreenCredits.java index c7dc8ede43..1481b9e137 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/player/TitleScreenCredits.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/player/TitleScreenCredits.java @@ -28,9 +28,12 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; -public abstract class TitleScreenCredits { +public class TitleScreenCredits { private static final List credits = new ArrayList<>(); + private TitleScreenCredits() { + } + private static void init() { // Add addons add(MeteorClient.ADDON); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/FontUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/render/FontUtils.java index 473c266562..6fe61ad6d4 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/FontUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/FontUtils.java @@ -25,6 +25,8 @@ import java.util.Set; public class FontUtils { + private FontUtils() { + } public static FontInfo getSysFontInfo(File file) { return getFontInfo(stream(file)); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/NametagUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/render/NametagUtils.java index 124c124c6f..5c39aa3aa1 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/NametagUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/NametagUtils.java @@ -11,6 +11,7 @@ import net.minecraft.client.util.math.MatrixStack; import net.minecraft.util.math.MathHelper; import org.joml.Matrix4f; +import org.joml.Matrix4fStack; import org.joml.Vector3d; import org.joml.Vector4f; @@ -22,15 +23,18 @@ public class NametagUtils { private static final Vector4f pmMat4 = new Vector4f(); private static final Vector3d camera = new Vector3d(); private static final Vector3d cameraNegated = new Vector3d(); - private static Matrix4f model; - private static Matrix4f projection; + private static final Matrix4f model = new Matrix4f(); + private static final Matrix4f projection = new Matrix4f(); private static double windowScale; public static double scale; - public static void onRender(MatrixStack matrices, Matrix4f projection) { - model = new Matrix4f(matrices.peek().getPositionMatrix()); - NametagUtils.projection = projection; + private NametagUtils() { + } + + public static void onRender(Matrix4f modelView) { + model.set(modelView); + NametagUtils.projection.set(RenderSystem.getProjectionMatrix()); Utils.set(camera, mc.gameRenderer.getCamera().getPos()); cameraNegated.set(camera); @@ -78,23 +82,27 @@ public static boolean to2D(Vector3d pos, double scale, boolean distanceScaling, } public static void begin(Vector3d pos) { - MatrixStack matrices = RenderSystem.getModelViewStack(); + Matrix4fStack matrices = RenderSystem.getModelViewStack(); begin(matrices, pos); } public static void begin(Vector3d pos, DrawContext drawContext) { begin(pos); - begin(drawContext.getMatrices(), pos); - } - private static void begin(MatrixStack matrices, Vector3d pos) { + MatrixStack matrices = drawContext.getMatrices(); matrices.push(); - matrices.translate(pos.x, pos.y, 0); + matrices.translate((float) pos.x, (float) pos.y, 0); + matrices.scale((float) scale, (float) scale, 1); + } + + private static void begin(Matrix4fStack matrices, Vector3d pos) { + matrices.pushMatrix(); + matrices.translate((float) pos.x, (float) pos.y, 0); matrices.scale((float) scale, (float) scale, 1); } public static void end() { - RenderSystem.getModelViewStack().pop(); + RenderSystem.getModelViewStack().popMatrix(); } public static void end(DrawContext drawContext) { diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/PlayerHeadUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/render/PlayerHeadUtils.java index 132cf8f5ff..0a5b69d560 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/PlayerHeadUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/PlayerHeadUtils.java @@ -12,6 +12,9 @@ public class PlayerHeadUtils { public static PlayerHeadTexture STEVE_HEAD; + private PlayerHeadUtils() { + } + @PostInit public static void init() { STEVE_HEAD = new PlayerHeadTexture(); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/RenderUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/render/RenderUtils.java index b46a8975c5..b6896e02f8 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/RenderUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/RenderUtils.java @@ -37,6 +37,9 @@ public class RenderUtils { private static final Pool renderBlockPool = new Pool<>(RenderBlock::new); private static final List renderBlocks = new ArrayList<>(); + private RenderUtils() { + } + @PostInit public static void init() { MeteorClient.EVENT_BUS.subscribe(RenderUtils.class); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/SimpleBlockRenderer.java b/src/main/java/meteordevelopment/meteorclient/utils/render/SimpleBlockRenderer.java index 607203ec84..dcd40f1e96 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/SimpleBlockRenderer.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/SimpleBlockRenderer.java @@ -28,6 +28,9 @@ public class SimpleBlockRenderer { private static final Direction[] DIRECTIONS = Direction.values(); private static final Random RANDOM = Random.create(); + private SimpleBlockRenderer() { + } + public static void renderWithBlockEntity(BlockEntity blockEntity, float tickDelta, IVertexConsumerProvider vertexConsumerProvider) { SimpleBlockRenderer.render(blockEntity.getPos(), blockEntity.getCachedState(), vertexConsumerProvider); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/WireframeEntityRenderer.java b/src/main/java/meteordevelopment/meteorclient/utils/render/WireframeEntityRenderer.java index f808114a21..75e20acc87 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/WireframeEntityRenderer.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/WireframeEntityRenderer.java @@ -42,6 +42,9 @@ public class WireframeEntityRenderer { private static Color sideColor, lineColor; private static ShapeMode shapeMode; + private WireframeEntityRenderer() { + } + public static void render(Render3DEvent event, Entity entity, double scale, Color sideColor, Color lineColor, ShapeMode shapeMode) { WireframeEntityRenderer.sideColor = sideColor; WireframeEntityRenderer.lineColor = lineColor; @@ -120,7 +123,7 @@ public static void render(Render3DEvent event, Entity entity, double scale, Colo model.animateModel(livingEntity, limbAngle, limbDistance, event.tickDelta); model.setAngles(livingEntity, limbAngle, limbDistance, animationProgress, yaw, pitch); - renderer.setupTransforms(livingEntity, matrices, animationProgress, bodyYaw, event.tickDelta); + renderer.setupTransforms(livingEntity, matrices, animationProgress, bodyYaw, event.tickDelta, livingEntity.getScale()); matrices.scale(-1, -1, 1); renderer.scale(livingEntity, matrices, event.tickDelta); matrices.translate(0, -1.5010000467300415, 0); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/color/RainbowColors.java b/src/main/java/meteordevelopment/meteorclient/utils/render/color/RainbowColors.java index 042a0256c7..70ea373156 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/color/RainbowColors.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/color/RainbowColors.java @@ -32,6 +32,9 @@ public class RainbowColors { public static final RainbowColor GLOBAL = new RainbowColor(); + private RainbowColors() { + } + @PostInit public static void init() { MeteorClient.EVENT_BUS.subscribe(RainbowColors.class); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/PostProcessShaders.java b/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/PostProcessShaders.java index afd5f59763..6541ad83ca 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/PostProcessShaders.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/PostProcessShaders.java @@ -12,6 +12,9 @@ public class PostProcessShaders { public static boolean rendering; + private PostProcessShaders() { + } + @PreInit public static void init() { CHAMS = new ChamsShader(); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/tooltip/BannerTooltipComponent.java b/src/main/java/meteordevelopment/meteorclient/utils/tooltip/BannerTooltipComponent.java index 765c4dce0e..bcc844fa4a 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/tooltip/BannerTooltipComponent.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/tooltip/BannerTooltipComponent.java @@ -5,7 +5,6 @@ package meteordevelopment.meteorclient.utils.tooltip; -import net.minecraft.block.entity.BannerBlockEntity; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.tooltip.TooltipComponent; @@ -17,6 +16,7 @@ import net.minecraft.client.render.entity.model.EntityModelLayers; import net.minecraft.client.render.model.ModelLoader; import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.component.DataComponentTypes; import net.minecraft.item.BannerItem; import net.minecraft.item.ItemStack; @@ -71,10 +71,8 @@ public void drawItems(TextRenderer textRenderer, int x, int y, DrawContext conte bannerField, ModelLoader.BANNER_BASE, true, - BannerBlockEntity.getPatternsFromNbt( - ((BannerItem) banner.getItem()).getColor(), - BannerBlockEntity.getPatternListNbt(banner) - ) + ((BannerItem) banner.getItem()).getColor(), + banner.get(DataComponentTypes.BANNER_PATTERNS) ); matrices.pop(); matrices.pop(); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/tooltip/MapTooltipComponent.java b/src/main/java/meteordevelopment/meteorclient/utils/tooltip/MapTooltipComponent.java index 2b1f991f18..ffbfbec6f2 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/tooltip/MapTooltipComponent.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/tooltip/MapTooltipComponent.java @@ -14,6 +14,7 @@ import net.minecraft.client.render.GameRenderer; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.component.type.MapIdComponent; import net.minecraft.item.FilledMapItem; import net.minecraft.item.map.MapState; import net.minecraft.util.Identifier; @@ -61,13 +62,13 @@ public void drawItems(TextRenderer textRenderer, int x, int y, DrawContext conte // Contents VertexConsumerProvider.Immediate consumer = mc.getBufferBuilders().getEntityVertexConsumers(); - MapState mapState = FilledMapItem.getMapState(mapId, mc.world); + MapState mapState = FilledMapItem.getMapState(new MapIdComponent(mapId), mc.world); if (mapState == null) return; matrices.push(); matrices.translate(x, y, 0); matrices.scale((float) scale, (float) scale, 0); matrices.translate(8, 8, 0); - mc.gameRenderer.getMapRenderer().draw(matrices, consumer, mapId, mapState, false, 0xF000F0); + mc.gameRenderer.getMapRenderer().draw(matrices, consumer, new MapIdComponent(mapId), mapState, false, 0xF000F0); consumer.draw(); matrices.pop(); } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/world/BlockEntityIterator.java b/src/main/java/meteordevelopment/meteorclient/utils/world/BlockEntityIterator.java index 07f8c82e6d..42c0353e38 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/world/BlockEntityIterator.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/world/BlockEntityIterator.java @@ -29,7 +29,7 @@ private void nextChunk() { Map blockEntityMap = ((ChunkAccessor) chunks.next()).getBlockEntities(); - if (blockEntityMap.size() > 0) { + if (!blockEntityMap.isEmpty()) { blockEntities = blockEntityMap.values().iterator(); break; } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/world/BlockIterator.java b/src/main/java/meteordevelopment/meteorclient/utils/world/BlockIterator.java index a66fa68655..89d192fda4 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/world/BlockIterator.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/world/BlockIterator.java @@ -33,6 +33,9 @@ public class BlockIterator { private static boolean disableCurrent; + private BlockIterator() { + } + @PreInit public static void init() { MeteorClient.EVENT_BUS.subscribe(BlockIterator.class); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java index 13c1919de6..ef5cc93a1e 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java @@ -41,6 +41,9 @@ public class BlockUtils { public static boolean breaking; private static boolean breakingThisTick; + private BlockUtils() { + } + @PreInit public static void init() { MeteorClient.EVENT_BUS.subscribe(BlockUtils.class); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/world/Dir.java b/src/main/java/meteordevelopment/meteorclient/utils/world/Dir.java index 452b4c7b3f..5ad585067e 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/world/Dir.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/world/Dir.java @@ -15,6 +15,9 @@ public class Dir { public static final byte WEST = 1 << 5; public static final byte EAST = 1 << 6; + private Dir() { + } + public static byte get(Direction dir) { return switch (dir) { case UP -> UP; diff --git a/src/main/java/meteordevelopment/meteorclient/utils/world/TickRate.java b/src/main/java/meteordevelopment/meteorclient/utils/world/TickRate.java index 14a43dbc6c..7acd5637e8 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/world/TickRate.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/world/TickRate.java @@ -34,7 +34,7 @@ private TickRate() { private void onReceivePacket(PacketEvent.Receive event) { if (event.packet instanceof WorldTimeUpdateS2CPacket) { long now = System.currentTimeMillis(); - float timeElapsed = (float) (now - timeLastTimeUpdate) / 1000.0F; + float timeElapsed = (now - timeLastTimeUpdate) / 1000.0F; tickRates[nextIndex] = MathHelper.clamp(20.0f / timeElapsed, 0.0f, 20.0f); nextIndex = (nextIndex + 1) % tickRates.length; timeLastTimeUpdate = now; diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index bb2846244b..2817bcfbad 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -44,8 +44,8 @@ } }, "depends": { - "java": ">=17", - "minecraft": "${minecraft_version}", + "java": ">=21", + "minecraft": ["1.20.5", "${minecraft_version}"], "fabricloader": ">=${loader_version}" }, "breaks": { @@ -53,7 +53,7 @@ "feather": "*", "origins": "*", "wurst": "*", - "sodium": "<0.5.6", + "sodium": "<0.5.8", "morechathistory": "*" } } diff --git a/src/main/resources/meteor-client-baritone.mixins.json b/src/main/resources/meteor-client-baritone.mixins.json index 7f20eb9675..8242f6d2c3 100644 --- a/src/main/resources/meteor-client-baritone.mixins.json +++ b/src/main/resources/meteor-client-baritone.mixins.json @@ -1,7 +1,7 @@ { "required": true, "package": "meteordevelopment.meteorclient.mixin.baritone", - "compatibilityLevel": "JAVA_17", + "compatibilityLevel": "JAVA_21", "plugin": "meteordevelopment.meteorclient.MixinPlugin", "client": [ "ComeCommandMixin" diff --git a/src/main/resources/meteor-client-canvas.mixins.json b/src/main/resources/meteor-client-canvas.mixins.json index 9926bc6d9e..66b34ff386 100644 --- a/src/main/resources/meteor-client-canvas.mixins.json +++ b/src/main/resources/meteor-client-canvas.mixins.json @@ -1,7 +1,7 @@ { "required": false, "package": "meteordevelopment.meteorclient.mixin.canvas", - "compatibilityLevel": "JAVA_17", + "compatibilityLevel": "JAVA_21", "plugin": "meteordevelopment.meteorclient.MixinPlugin", "client": [ ], diff --git a/src/main/resources/meteor-client-indigo.mixins.json b/src/main/resources/meteor-client-indigo.mixins.json index 5bce3e25ad..45ebec59a0 100644 --- a/src/main/resources/meteor-client-indigo.mixins.json +++ b/src/main/resources/meteor-client-indigo.mixins.json @@ -1,7 +1,7 @@ { "required": false, "package": "meteordevelopment.meteorclient.mixin.indigo", - "compatibilityLevel": "JAVA_17", + "compatibilityLevel": "JAVA_21", "plugin": "meteordevelopment.meteorclient.MixinPlugin", "client": [ "AbstractBlockRenderContextMixin", diff --git a/src/main/resources/meteor-client-indium.mixins.json b/src/main/resources/meteor-client-indium.mixins.json index 536550283b..6e2db25f32 100644 --- a/src/main/resources/meteor-client-indium.mixins.json +++ b/src/main/resources/meteor-client-indium.mixins.json @@ -1,7 +1,7 @@ { "required": true, "package": "meteordevelopment.meteorclient.mixin.indium", - "compatibilityLevel": "JAVA_17", + "compatibilityLevel": "JAVA_21", "plugin": "meteordevelopment.meteorclient.MixinPlugin", "client": [ "AbstractBlockRenderContextMixin" diff --git a/src/main/resources/meteor-client-lithium.mixins.json b/src/main/resources/meteor-client-lithium.mixins.json index 53450f38f3..fcad6bd961 100644 --- a/src/main/resources/meteor-client-lithium.mixins.json +++ b/src/main/resources/meteor-client-lithium.mixins.json @@ -1,7 +1,7 @@ { "required": false, "package": "meteordevelopment.meteorclient.mixin.lithium", - "compatibilityLevel": "JAVA_17", + "compatibilityLevel": "JAVA_21", "plugin": "meteordevelopment.meteorclient.MixinPlugin", "client": [ "ChunkAwareBlockCollisionSweeperMixin" diff --git a/src/main/resources/meteor-client-sodium.mixins.json b/src/main/resources/meteor-client-sodium.mixins.json index 6e78228a3d..c41ff42c6d 100644 --- a/src/main/resources/meteor-client-sodium.mixins.json +++ b/src/main/resources/meteor-client-sodium.mixins.json @@ -1,7 +1,7 @@ { "required": false, "package": "meteordevelopment.meteorclient.mixin.sodium", - "compatibilityLevel": "JAVA_17", + "compatibilityLevel": "JAVA_21", "plugin": "meteordevelopment.meteorclient.MixinPlugin", "client": [ "SodiumLightDataAccessMixin", diff --git a/src/main/resources/meteor-client.accesswidener b/src/main/resources/meteor-client.accesswidener index 121a2c6331..15a8b56f6c 100644 --- a/src/main/resources/meteor-client.accesswidener +++ b/src/main/resources/meteor-client.accesswidener @@ -16,7 +16,7 @@ accessible class net/minecraft/client/model/ModelPart$Quad accessible class net/minecraft/client/model/ModelPart$Vertex accessible field net/minecraft/client/model/ModelPart$Cuboid sides [Lnet/minecraft/client/model/ModelPart$Quad; accessible method net/minecraft/client/render/entity/PlayerEntityRenderer getArmPose (Lnet/minecraft/client/network/AbstractClientPlayerEntity;Lnet/minecraft/util/Hand;)Lnet/minecraft/client/render/entity/model/BipedEntityModel$ArmPose; -accessible method net/minecraft/client/render/entity/LivingEntityRenderer setupTransforms (Lnet/minecraft/entity/LivingEntity;Lnet/minecraft/client/util/math/MatrixStack;FFF)V +accessible method net/minecraft/client/render/entity/LivingEntityRenderer setupTransforms (Lnet/minecraft/entity/LivingEntity;Lnet/minecraft/client/util/math/MatrixStack;FFFF)V accessible method net/minecraft/client/render/entity/LivingEntityRenderer scale (Lnet/minecraft/entity/LivingEntity;Lnet/minecraft/client/util/math/MatrixStack;F)V accessible method net/minecraft/client/render/entity/LivingEntityRenderer getAnimationProgress (Lnet/minecraft/entity/LivingEntity;F)F @@ -75,3 +75,5 @@ accessible field net/minecraft/item/ItemGroups INVENTORY Lnet/minecraft/regi accessible field net/minecraft/client/render/item/ItemRenderer TRIDENT Lnet/minecraft/client/util/ModelIdentifier; accessible field net/minecraft/client/render/item/ItemRenderer SPYGLASS Lnet/minecraft/client/util/ModelIdentifier; + +accessible class net/minecraft/entity/effect/StatusEffect$EffectAttributeModifierCreator diff --git a/src/main/resources/meteor-client.mixins.json b/src/main/resources/meteor-client.mixins.json index adbbb7747b..6efba6314b 100644 --- a/src/main/resources/meteor-client.mixins.json +++ b/src/main/resources/meteor-client.mixins.json @@ -1,7 +1,7 @@ { "required": true, "package": "meteordevelopment.meteorclient.mixin", - "compatibilityLevel": "JAVA_17", + "compatibilityLevel": "JAVA_21", "plugin": "meteordevelopment.meteorclient.MixinPlugin", "client": [ "AbstractBlockAccessor", @@ -13,7 +13,6 @@ "AbstractSignEditScreenAccessor", "AbstractSignEditScreenMixin", "ArmorFeatureRendererMixin", - "AttributeContainerMixin", "BackgroundRendererMixin", "BakedQuadMixin", "BannerBlockEntityRendererMixin", @@ -69,7 +68,6 @@ "CreativeInventoryScreenAccessor", "CreativeSlotMixin", "CrossbowItemAccessor", - "CustomPayloadS2CPacketMixin", "DefaultSkinHelperMixin", "DisconnectedScreenMixin", "DrawContextMixin", @@ -77,8 +75,8 @@ "EnchantingTableBlockEntityRendererMixin", "EndCrystalEntityRendererMixin", "EntityAccessor", - "EntityAttributeInstanceMixin", "EntityBucketItemAccessor", + "EntityEffectParticleEffectAccessor", "EntityMixin", "EntityRenderDispatcherMixin", "EntityRendererMixin", @@ -152,7 +150,6 @@ "SectionedEntityCacheAccessor", "ShapeIndexBufferAccessor", "ShulkerBoxBlockMixin", - "ShulkerEntityAccessor", "SignBlockEntityRendererMixin", "SimpleEntityLookupAccessor", "SimpleOptionMixin", @@ -160,6 +157,7 @@ "SlotMixin", "SoundSystemMixin", "SplashTextResourceSupplierMixin", + "StatusEffectAccessor", "StatusEffectInstanceAccessor", "StatusEffectInstanceMixin", "StringHelperMixin", From ea2e026786573807536ec6812585c13e1f51cbad Mon Sep 17 00:00:00 2001 From: Wide-Cat <74723656+Wide-Cat@users.noreply.github.com> Date: Sat, 4 May 2024 00:29:01 +0100 Subject: [PATCH 269/357] fix server spoof resource pack message --- .../meteorclient/systems/modules/misc/ServerSpoof.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/ServerSpoof.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/ServerSpoof.java index 1f20b8aaa8..d279b2ae1f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/ServerSpoof.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/ServerSpoof.java @@ -109,7 +109,7 @@ private void onPacketReceive(PacketEvent.Receive event) { ); MutableText acceptance = Text.literal("[Spoof Acceptance]"); - link.setStyle(link.getStyle() + acceptance.setStyle(acceptance.getStyle() .withColor(Formatting.DARK_GREEN) .withUnderline(true) .withClickEvent(new RunnableClickEvent(() -> { From cc675ed9b2ec25977c8b0e836457f803c8cbd676 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Sat, 4 May 2024 19:01:50 +0100 Subject: [PATCH 270/357] large fixes and improvements to better tooltips - fix hide flags - fix container previews - peek screens can be closed with your inventory key - fix book previews crashing - add middle click open for books --- .../events/game/SectionVisibleEvent.java | 22 ------ .../meteorclient/mixin/ArmorTrimMixin.java | 22 ++++++ .../meteorclient/mixin/BundleItemMixin.java | 28 +++++++ .../mixin/ContainerComponentAccessor.java | 18 +++++ .../mixin/DyedColorComponentMixin.java | 22 ++++++ .../mixin/HandledScreenMixin.java | 10 +++ .../mixin/ItemEnchantmentsComponentMixin.java | 22 ++++++ .../meteorclient/mixin/ItemStackMixin.java | 33 +++++++++ .../mixin/UnbreakableComponentMixin.java | 22 ++++++ .../modules/render/BetterTooltips.java | 74 ++++++++----------- .../meteorclient/utils/Utils.java | 23 +++++- .../meteorclient/utils/render/PeekScreen.java | 16 +++- .../tooltip/ContainerTooltipComponent.java | 5 +- src/main/resources/meteor-client.mixins.json | 6 ++ 14 files changed, 250 insertions(+), 73 deletions(-) delete mode 100644 src/main/java/meteordevelopment/meteorclient/events/game/SectionVisibleEvent.java create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/ArmorTrimMixin.java create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/BundleItemMixin.java create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/ContainerComponentAccessor.java create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/DyedColorComponentMixin.java create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/ItemEnchantmentsComponentMixin.java create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/UnbreakableComponentMixin.java diff --git a/src/main/java/meteordevelopment/meteorclient/events/game/SectionVisibleEvent.java b/src/main/java/meteordevelopment/meteorclient/events/game/SectionVisibleEvent.java deleted file mode 100644 index 726faf7966..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/events/game/SectionVisibleEvent.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.events.game; - -import net.minecraft.component.DataComponentType; - - -public class SectionVisibleEvent { - private static final SectionVisibleEvent INSTANCE = new SectionVisibleEvent(); - - public DataComponentType section; - public boolean visible; - - public static SectionVisibleEvent get(DataComponentType section, boolean visible) { - INSTANCE.section = section; - INSTANCE.visible = visible; - return INSTANCE; - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ArmorTrimMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ArmorTrimMixin.java new file mode 100644 index 0000000000..582a918398 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ArmorTrimMixin.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 com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.render.BetterTooltips; +import net.minecraft.item.trim.ArmorTrim; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(ArmorTrim.class) +public class ArmorTrimMixin { + @ModifyExpressionValue(method = "appendTooltip", at = @At(value = "FIELD", target = "Lnet/minecraft/item/trim/ArmorTrim;showInTooltip:Z")) + private boolean modifyShowInTooltip(boolean original) { + BetterTooltips bt = Modules.get().get(BetterTooltips.class); + return (bt.isActive() && bt.upgrades.get()) || original; + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BundleItemMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BundleItemMixin.java new file mode 100644 index 0000000000..09599251b9 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BundleItemMixin.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.llamalad7.mixinextras.injector.ModifyExpressionValue; +import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.render.BetterTooltips; +import net.minecraft.item.BundleItem; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(BundleItem.class) +public class BundleItemMixin { + @ModifyExpressionValue(method = "getTooltipData", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;contains(Lnet/minecraft/component/DataComponentType;)Z", ordinal = 0)) + private boolean modifyContains1(boolean original) { + BetterTooltips bt = Modules.get().get(BetterTooltips.class); + return (bt.isActive() && bt.tooltip.get()) || original; + } + + @ModifyExpressionValue(method = "getTooltipData", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;contains(Lnet/minecraft/component/DataComponentType;)Z", ordinal = 1)) + private boolean modifyContains2(boolean original) { + BetterTooltips bt = Modules.get().get(BetterTooltips.class); + return (bt.isActive() && bt.additional.get()) || original; + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ContainerComponentAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/ContainerComponentAccessor.java new file mode 100644 index 0000000000..87a763cbd9 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ContainerComponentAccessor.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.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 + DefaultedList getStacks(); +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/DyedColorComponentMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/DyedColorComponentMixin.java new file mode 100644 index 0000000000..7d7a80da8d --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/DyedColorComponentMixin.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 com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.render.BetterTooltips; +import net.minecraft.component.type.DyedColorComponent; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(DyedColorComponent.class) +public class DyedColorComponentMixin { + @ModifyExpressionValue(method = "appendTooltip", at = @At(value = "FIELD", target = "Lnet/minecraft/component/type/DyedColorComponent;showInTooltip:Z")) + private boolean modifyShowInTooltip(boolean original) { + BetterTooltips bt = Modules.get().get(BetterTooltips.class); + return (bt.isActive() && bt.dye.get()) || original; + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/HandledScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/HandledScreenMixin.java index 66072bc939..7813d648b0 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/HandledScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/HandledScreenMixin.java @@ -12,9 +12,11 @@ import meteordevelopment.meteorclient.utils.Utils; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.screen.ingame.BookScreen; import net.minecraft.client.gui.screen.ingame.HandledScreen; import net.minecraft.client.gui.screen.ingame.ScreenHandlerProvider; import net.minecraft.client.gui.widget.ButtonWidget; +import net.minecraft.component.DataComponentTypes; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.screen.ScreenHandler; @@ -57,6 +59,9 @@ public abstract class HandledScreenMixin extends Screen @Shadow protected abstract void onMouseClick(Slot slot, int invSlot, int clickData, SlotActionType actionType); + @Shadow + public abstract void close(); + @Unique private static final ItemStack[] ITEMS = new ItemStack[27]; @@ -104,6 +109,11 @@ private void mouseClicked(double mouseX, double mouseY, int button, CallbackInfo if (Utils.hasItems(itemStack) || itemStack.getItem() == Items.ENDER_CHEST) { cir.setReturnValue(Utils.openContainer(focusedSlot.getStack(), ITEMS, false)); } + else if (itemStack.get(DataComponentTypes.WRITTEN_BOOK_CONTENT) != null || itemStack.get(DataComponentTypes.WRITABLE_BOOK_CONTENT) != null) { + close(); + mc.setScreen(new BookScreen(BookScreen.Contents.create(itemStack))); + cir.setReturnValue(true); + } } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ItemEnchantmentsComponentMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ItemEnchantmentsComponentMixin.java new file mode 100644 index 0000000000..1744328465 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ItemEnchantmentsComponentMixin.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 com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.render.BetterTooltips; +import net.minecraft.component.type.ItemEnchantmentsComponent; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(ItemEnchantmentsComponent.class) +public class ItemEnchantmentsComponentMixin { + @ModifyExpressionValue(method = "appendTooltip", at = @At(value = "FIELD", target = "Lnet/minecraft/component/type/ItemEnchantmentsComponent;showInTooltip:Z")) + private boolean modifyShowInTooltip(boolean original) { + BetterTooltips bt = Modules.get().get(BetterTooltips.class); + return (bt.isActive() && bt.enchantments.get()) || original; + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ItemStackMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ItemStackMixin.java index 370aca9ebf..db1ff0a02a 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ItemStackMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ItemStackMixin.java @@ -5,11 +5,14 @@ package meteordevelopment.meteorclient.mixin; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.injector.ModifyReturnValue; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.entity.player.FinishUsingItemEvent; import meteordevelopment.meteorclient.events.entity.player.StoppedUsingItemEvent; import meteordevelopment.meteorclient.events.game.ItemStackTooltipEvent; +import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.render.BetterTooltips; import meteordevelopment.meteorclient.utils.Utils; import net.minecraft.entity.LivingEntity; import net.minecraft.item.ItemStack; @@ -37,6 +40,30 @@ private List onGetTooltip(List original) { return original; } + @ModifyExpressionValue(method = "getTooltip", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/BlockPredicatesChecker;showInTooltip()Z", ordinal = 0)) + private boolean modifyCanBreakText(boolean original) { + BetterTooltips bt = Modules.get().get(BetterTooltips.class); + return (bt.isActive() && bt.canDestroy.get()) || original; + } + + @ModifyExpressionValue(method = "getTooltip", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/BlockPredicatesChecker;showInTooltip()Z", ordinal = 1)) + private boolean modifyCanPlaceText(boolean original) { + BetterTooltips bt = Modules.get().get(BetterTooltips.class); + return (bt.isActive() && bt.canPlaceOn.get()) || original; + } + + @ModifyExpressionValue(method = "getTooltip", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;contains(Lnet/minecraft/component/DataComponentType;)Z", ordinal = 0)) + private boolean modifyContainsTooltip(boolean original) { + BetterTooltips bt = Modules.get().get(BetterTooltips.class); + return (bt.isActive() && bt.tooltip.get()) || original; + } + + @ModifyExpressionValue(method = "getTooltip", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;contains(Lnet/minecraft/component/DataComponentType;)Z", ordinal = 3)) + private boolean modifyContainsAdditional(boolean original) { + BetterTooltips bt = Modules.get().get(BetterTooltips.class); + return (bt.isActive() && bt.additional.get()) || original; + } + @Inject(method = "finishUsing", at = @At("HEAD")) private void onFinishUsing(World world, LivingEntity user, CallbackInfoReturnable info) { if (user == mc.player) { @@ -50,4 +77,10 @@ private void onStoppedUsing(World world, LivingEntity user, int remainingUseTick MeteorClient.EVENT_BUS.post(StoppedUsingItemEvent.get((ItemStack) (Object) this)); } } + + @ModifyExpressionValue(method = "appendAttributeModifiersTooltip", at = @At(value = "INVOKE", target = "Lnet/minecraft/component/type/AttributeModifiersComponent;showInTooltip()Z")) + private boolean modifyShowInTooltip(boolean original) { + BetterTooltips bt = Modules.get().get(BetterTooltips.class); + return (bt.isActive() && bt.modifiers.get()) || original; + } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/UnbreakableComponentMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/UnbreakableComponentMixin.java new file mode 100644 index 0000000000..307f2e6216 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/UnbreakableComponentMixin.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 com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.render.BetterTooltips; +import net.minecraft.component.type.UnbreakableComponent; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(UnbreakableComponent.class) +public class UnbreakableComponentMixin { + @ModifyExpressionValue(method = "appendTooltip", at = @At(value = "FIELD", target = "Lnet/minecraft/component/type/UnbreakableComponent;showInTooltip:Z")) + private boolean modifyShowInTooltip(boolean original) { + BetterTooltips bt = Modules.get().get(BetterTooltips.class); + return (bt.isActive() && bt.unbreakable.get()) || original; + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java index 48fca09f5e..70bb6e3938 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java @@ -5,11 +5,9 @@ package meteordevelopment.meteorclient.systems.modules.render; -import com.google.gson.JsonParseException; import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import meteordevelopment.meteorclient.events.game.ItemStackTooltipEvent; -import meteordevelopment.meteorclient.events.game.SectionVisibleEvent; import meteordevelopment.meteorclient.events.render.TooltipDataEvent; import meteordevelopment.meteorclient.mixin.EntityAccessor; import meteordevelopment.meteorclient.mixin.EntityBucketItemAccessor; @@ -75,7 +73,7 @@ public class BetterTooltips extends Module { private final Setting middleClickOpen = sgGeneral.add(new BoolSetting.Builder() .name("middle-click-open") - .description("Opens a GUI window with the inventory of the storage block when you middle click the item.") + .description("Opens a GUI window with the inventory of the storage block or book when you middle click the item.") .defaultValue(true) .build() ); @@ -167,56 +165,63 @@ public class BetterTooltips extends Module { //Hide flags - private final Setting enchantments = sgHideFlags.add(new BoolSetting.Builder() + public final Setting tooltip = sgHideFlags.add(new BoolSetting.Builder() + .name("tooltip") + .description("Show the tooltip when it's hidden.") + .defaultValue(false) + .build() + ); + + public final Setting enchantments = sgHideFlags.add(new BoolSetting.Builder() .name("enchantments") .description("Show enchantments when it's hidden.") .defaultValue(false) .build() ); - private final Setting modifiers = sgHideFlags.add(new BoolSetting.Builder() + public final Setting modifiers = sgHideFlags.add(new BoolSetting.Builder() .name("modifiers") .description("Show item modifiers when it's hidden.") .defaultValue(false) .build() ); - private final Setting unbreakable = sgHideFlags.add(new BoolSetting.Builder() + public final Setting unbreakable = sgHideFlags.add(new BoolSetting.Builder() .name("unbreakable") .description("Show \"Unbreakable\" tag when it's hidden.") .defaultValue(false) .build() ); - private final Setting canDestroy = sgHideFlags.add(new BoolSetting.Builder() + public final Setting canDestroy = sgHideFlags.add(new BoolSetting.Builder() .name("can-destroy") .description("Show \"CanDestroy\" tag when it's hidden.") .defaultValue(false) .build() ); - private final Setting canPlaceOn = sgHideFlags.add(new BoolSetting.Builder() + public final Setting canPlaceOn = sgHideFlags.add(new BoolSetting.Builder() .name("can-place-on") .description("Show \"CanPlaceOn\" tag when it's hidden.") .defaultValue(false) .build() ); - private final Setting additional = sgHideFlags.add(new BoolSetting.Builder() + public final Setting additional = sgHideFlags.add(new BoolSetting.Builder() .name("additional") .description("Show potion effects, firework status, book author, etc when it's hidden.") .defaultValue(false) .build() ); - private final Setting dye = sgHideFlags.add(new BoolSetting.Builder() + public final Setting dye = sgHideFlags.add(new BoolSetting.Builder() .name("dye") .description("Show dyed item tags when it's hidden.") .defaultValue(false) .build() ); - private final Setting upgrades = sgHideFlags.add(new BoolSetting.Builder() + public final Setting upgrades = sgHideFlags.add(new BoolSetting.Builder() .name("armor-trim") .description("Show armor trims when it's hidden.") .defaultValue(false) @@ -303,18 +308,15 @@ private void appendTooltip(ItemStackTooltipEvent event) { private void getTooltipData(TooltipDataEvent event) { // Container preview if (previewShulkers() && Utils.hasItems(event.itemStack)) { - NbtComponent nbtComponent = event.itemStack.get(DataComponentTypes.BLOCK_ENTITY_DATA); - if (nbtComponent != null) { - DefaultedList itemStacks = DefaultedList.ofSize(27, ItemStack.EMPTY); - Inventories.readNbt(nbtComponent.copyNbt(), itemStacks, DynamicRegistryManager.EMPTY); - event.tooltipData = new ContainerTooltipComponent(itemStacks, Utils.getShulkerColor(event.itemStack)); - } + ItemStack[] itemStacks = new ItemStack[27]; + Utils.getItemsInContainerItem(event.itemStack, itemStacks); + event.tooltipData = new ContainerTooltipComponent(itemStacks, Utils.getShulkerColor(event.itemStack)); } // EChest preview else if (event.itemStack.getItem() == Items.ENDER_CHEST && previewEChest()) { event.tooltipData = EChestMemory.isKnown() - ? new ContainerTooltipComponent(EChestMemory.ITEMS, ECHEST_COLOR) + ? new ContainerTooltipComponent(EChestMemory.ITEMS.toArray(new ItemStack[27]), ECHEST_COLOR) : new TextTooltipComponent(Text.literal("Unknown ender chest inventory.").formatted(Formatting.DARK_RED)); } @@ -333,7 +335,7 @@ else if ((event.itemStack.getItem() == Items.WRITABLE_BOOK || event.itemStack.ge // Banner preview else if (event.itemStack.getItem() instanceof BannerItem && previewBanners()) { event.tooltipData = new BannerTooltipComponent(event.itemStack); - } else if (event.itemStack.getItem() instanceof BannerPatternItem patternItem && previewBanners()) { + } else if (event.itemStack.getItem() instanceof BannerPatternItem && previewBanners()) { BannerPatternsComponent bannerPatternsComponent = event.itemStack.get(DataComponentTypes.BANNER_PATTERNS); if (bannerPatternsComponent != null) { event.tooltipData = new BannerTooltipComponent(createBannerFromLayers(bannerPatternsComponent.layers())); @@ -355,20 +357,6 @@ else if (event.itemStack.getItem() instanceof EntityBucketItem bucketItem && pre } } - @EventHandler - private void onSectionVisible(SectionVisibleEvent event) { - // todo investigate how section visibility works now - if (enchantments.get() && event.section == DataComponentTypes.STORED_ENCHANTMENTS || - modifiers.get() && event.section == DataComponentTypes.ATTRIBUTE_MODIFIERS || - unbreakable.get() && event.section == DataComponentTypes.UNBREAKABLE || - canDestroy.get() && event.section == DataComponentTypes.CAN_BREAK || - canPlaceOn.get() && event.section == DataComponentTypes.CAN_PLACE_ON || - //additional.get() && event.section == ItemStack.TooltipSection.ADDITIONAL || - dye.get() && event.section == DataComponentTypes.DYED_COLOR || - upgrades.get() && event.section == DataComponentTypes.TRIM) - event.visible = true; - } - public void applyCompactShulkerTooltip(ItemStack shulkerItem, List tooltip) { NbtComponent nbtComponent = shulkerItem.get(DataComponentTypes.BLOCK_ENTITY_DATA); @@ -416,18 +404,20 @@ private MutableText getStatusText(StatusEffectInstance effect) { } private Text getFirstPage(ItemStack bookItem) { - ComponentMap components = bookItem.getComponents(); - if (components == ComponentMap.EMPTY) return null; + if (bookItem.get(DataComponentTypes.WRITABLE_BOOK_CONTENT) != null) { + List> pages = bookItem.get(DataComponentTypes.WRITABLE_BOOK_CONTENT).pages(); - List> pages = components.get(DataComponentTypes.WRITABLE_BOOK_CONTENT).pages(); - if (pages.isEmpty()) return null; - if (bookItem.getItem() == Items.WRITABLE_BOOK) return Text.literal(pages.getFirst().get(false)); + if (pages.isEmpty()) return null; + return Text.literal(pages.getFirst().get(false)); + } + else if (bookItem.get(DataComponentTypes.WRITTEN_BOOK_CONTENT) != null) { + List> pages = bookItem.get(DataComponentTypes.WRITTEN_BOOK_CONTENT).pages(); + if (pages.isEmpty()) return null; - try { - return Text.Serialization.fromLenientJson(pages.getFirst().get(false), DynamicRegistryManager.EMPTY); - } catch (JsonParseException e) { - return Text.literal("Invalid book data"); + return pages.getFirst().get(false); } + + return null; } private ItemStack createBannerFromLayers(List pattern) { diff --git a/src/main/java/meteordevelopment/meteorclient/utils/Utils.java b/src/main/java/meteordevelopment/meteorclient/utils/Utils.java index 2cb5525606..ab0eb874c2 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/Utils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/Utils.java @@ -38,6 +38,7 @@ import net.minecraft.client.resource.language.I18n; import net.minecraft.component.ComponentMap; import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.ContainerComponent; import net.minecraft.component.type.ItemEnchantmentsComponent; import net.minecraft.component.type.NbtComponent; import net.minecraft.enchantment.Enchantment; @@ -49,6 +50,7 @@ import net.minecraft.nbt.NbtList; import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.util.DyeColor; +import net.minecraft.util.collection.DefaultedList; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; @@ -63,7 +65,10 @@ import java.io.IOException; import java.io.InputStream; import java.net.InetSocketAddress; -import java.util.*; +import java.util.Arrays; +import java.util.Locale; +import java.util.Random; +import java.util.Set; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -215,7 +220,15 @@ public static void getItemsInContainerItem(ItemStack itemStack, ItemStack[] item Arrays.fill(items, ItemStack.EMPTY); ComponentMap components = itemStack.getComponents(); - if (components != null && components.contains(DataComponentTypes.BLOCK_ENTITY_DATA)) { + if (components.contains(DataComponentTypes.CONTAINER)) { + ContainerComponentAccessor container = ((ContainerComponentAccessor) (Object) components.get(DataComponentTypes.CONTAINER)); + DefaultedList stacks = container.getStacks(); + + for (int i = 0; i < stacks.size(); i++) { + if (i >= 0 && i < items.length) items[i] = stacks.get(i); + } + } + else if (components.contains(DataComponentTypes.BLOCK_ENTITY_DATA)) { NbtComponent nbt2 = components.get(DataComponentTypes.BLOCK_ENTITY_DATA); if (nbt2.contains("Items")) { @@ -245,8 +258,10 @@ public static Color getShulkerColor(ItemStack shulkerItem) { } public static boolean hasItems(ItemStack itemStack) { - NbtCompound compoundTag = itemStack.getComponents().getOrDefault(DataComponentTypes.BLOCK_ENTITY_DATA, NbtComponent.DEFAULT).getNbt(); -// itemStack.getComponents().get(DataComponentTypes.CONTAINER).??? + ContainerComponent container = itemStack.get(DataComponentTypes.CONTAINER); + if (container != null && container.copyFirstStack() != ItemStack.EMPTY) return true; + + NbtCompound compoundTag = itemStack.getOrDefault(DataComponentTypes.BLOCK_ENTITY_DATA, NbtComponent.DEFAULT).getNbt(); return compoundTag != null && compoundTag.contains("Items", 9); } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/PeekScreen.java b/src/main/java/meteordevelopment/meteorclient/utils/render/PeekScreen.java index 60a439bf66..59de0030a1 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/PeekScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/PeekScreen.java @@ -11,10 +11,13 @@ import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.render.color.Color; import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.screen.ingame.BookScreen; import net.minecraft.client.gui.screen.ingame.ShulkerBoxScreen; import net.minecraft.client.render.GameRenderer; +import net.minecraft.component.DataComponentTypes; import net.minecraft.inventory.SimpleInventory; import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; import net.minecraft.screen.ShulkerBoxScreenHandler; import net.minecraft.util.Identifier; import org.lwjgl.glfw.GLFW; @@ -37,8 +40,17 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) { BetterTooltips tooltips = Modules.get().get(BetterTooltips.class); if (button == GLFW.GLFW_MOUSE_BUTTON_MIDDLE && focusedSlot != null && !focusedSlot.getStack().isEmpty() && mc.player.currentScreenHandler.getCursorStack().isEmpty() && tooltips.middleClickOpen()) { - return Utils.openContainer(focusedSlot.getStack(), contents, false); + ItemStack itemStack = focusedSlot.getStack(); + if (Utils.hasItems(itemStack) || itemStack.getItem() == Items.ENDER_CHEST) { + return Utils.openContainer(focusedSlot.getStack(), contents, false); + } + else if (itemStack.get(DataComponentTypes.WRITTEN_BOOK_CONTENT) != null || itemStack.get(DataComponentTypes.WRITABLE_BOOK_CONTENT) != null) { + close(); + mc.setScreen(new BookScreen(BookScreen.Contents.create(itemStack))); + return true; + } } + return false; } @@ -49,7 +61,7 @@ public boolean mouseReleased(double mouseX, double mouseY, int button) { @Override public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - if (keyCode == GLFW.GLFW_KEY_ESCAPE) { + if (keyCode == GLFW.GLFW_KEY_ESCAPE || mc.options.inventoryKey.matchesKey(keyCode, scanCode)) { close(); return true; } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/tooltip/ContainerTooltipComponent.java b/src/main/java/meteordevelopment/meteorclient/utils/tooltip/ContainerTooltipComponent.java index 50f2ed65f3..21dd00aafc 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/tooltip/ContainerTooltipComponent.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/tooltip/ContainerTooltipComponent.java @@ -15,15 +15,14 @@ import net.minecraft.client.render.GameRenderer; import net.minecraft.item.ItemStack; import net.minecraft.util.Identifier; -import net.minecraft.util.collection.DefaultedList; public class ContainerTooltipComponent implements TooltipComponent, MeteorTooltipData { private static final Identifier TEXTURE_CONTAINER_BACKGROUND = new MeteorIdentifier("textures/container.png"); - private final DefaultedList items; + private final ItemStack[] items; private final Color color; - public ContainerTooltipComponent(DefaultedList items, Color color) { + public ContainerTooltipComponent(ItemStack[] items, Color color) { this.items = items; this.color = color; } diff --git a/src/main/resources/meteor-client.mixins.json b/src/main/resources/meteor-client.mixins.json index 6efba6314b..bd79e725fd 100644 --- a/src/main/resources/meteor-client.mixins.json +++ b/src/main/resources/meteor-client.mixins.json @@ -13,6 +13,7 @@ "AbstractSignEditScreenAccessor", "AbstractSignEditScreenMixin", "ArmorFeatureRendererMixin", + "ArmorTrimMixin", "BackgroundRendererMixin", "BakedQuadMixin", "BannerBlockEntityRendererMixin", @@ -36,6 +37,7 @@ "BrewingStandScreenMixin", "BufferBuilderAccessor", "BufferRendererAccessor", + "BundleItemMixin", "CameraMixin", "CapabilityTrackerMixin", "CapeFeatureRendererMixin", @@ -64,6 +66,7 @@ "CobwebBlockMixin", "CompassAnglePredicateProviderMixin", "ConnectScreenMixin", + "ContainerComponentAccessor", "CrashReportMixin", "CreativeInventoryScreenAccessor", "CreativeSlotMixin", @@ -71,6 +74,7 @@ "DefaultSkinHelperMixin", "DisconnectedScreenMixin", "DrawContextMixin", + "DyedColorComponentMixin", "ElytraFeatureRendererMixin", "EnchantingTableBlockEntityRendererMixin", "EndCrystalEntityRendererMixin", @@ -101,6 +105,7 @@ "IdentifierAccessor", "InGameHudMixin", "InGameOverlayRendererMixin", + "ItemEnchantmentsComponentMixin", "ItemEntityMixin", "ItemEntityRendererMixin", "ItemMixin", @@ -169,6 +174,7 @@ "TitleScreenMixin", "TransformationMixin", "TridentItemMixin", + "UnbreakableComponentMixin", "Vec3dMixin", "VertexBufferMixin", "WorldAccessor", From e8f7ef061759121681fcb775c9539b341dbf0b62 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Sat, 4 May 2024 22:06:27 +0100 Subject: [PATCH 271/357] fix boolean logic --- .../meteordevelopment/meteorclient/mixin/BundleItemMixin.java | 4 ++-- .../meteordevelopment/meteorclient/mixin/ItemStackMixin.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BundleItemMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BundleItemMixin.java index 09599251b9..52978a3062 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BundleItemMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BundleItemMixin.java @@ -17,12 +17,12 @@ public class BundleItemMixin { @ModifyExpressionValue(method = "getTooltipData", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;contains(Lnet/minecraft/component/DataComponentType;)Z", ordinal = 0)) private boolean modifyContains1(boolean original) { BetterTooltips bt = Modules.get().get(BetterTooltips.class); - return (bt.isActive() && bt.tooltip.get()) || original; + return !(bt.isActive() && bt.tooltip.get()) && original; } @ModifyExpressionValue(method = "getTooltipData", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;contains(Lnet/minecraft/component/DataComponentType;)Z", ordinal = 1)) private boolean modifyContains2(boolean original) { BetterTooltips bt = Modules.get().get(BetterTooltips.class); - return (bt.isActive() && bt.additional.get()) || original; + return !(bt.isActive() && bt.additional.get()) && original; } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ItemStackMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ItemStackMixin.java index db1ff0a02a..63fd0863ed 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ItemStackMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ItemStackMixin.java @@ -55,13 +55,13 @@ private boolean modifyCanPlaceText(boolean original) { @ModifyExpressionValue(method = "getTooltip", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;contains(Lnet/minecraft/component/DataComponentType;)Z", ordinal = 0)) private boolean modifyContainsTooltip(boolean original) { BetterTooltips bt = Modules.get().get(BetterTooltips.class); - return (bt.isActive() && bt.tooltip.get()) || original; + return !(bt.isActive() && bt.tooltip.get()) && original; } @ModifyExpressionValue(method = "getTooltip", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;contains(Lnet/minecraft/component/DataComponentType;)Z", ordinal = 3)) private boolean modifyContainsAdditional(boolean original) { BetterTooltips bt = Modules.get().get(BetterTooltips.class); - return (bt.isActive() && bt.additional.get()) || original; + return !(bt.isActive() && bt.additional.get()) && original; } @Inject(method = "finishUsing", at = @At("HEAD")) From bbe89fef922796ae76ca520c4c056c77df608eef Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Wed, 8 May 2024 01:16:13 +0100 Subject: [PATCH 272/357] small better tooltips fix --- .../java/meteordevelopment/meteorclient/utils/Utils.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/utils/Utils.java b/src/main/java/meteordevelopment/meteorclient/utils/Utils.java index ab0eb874c2..7a32b27a27 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/Utils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/Utils.java @@ -38,7 +38,6 @@ import net.minecraft.client.resource.language.I18n; import net.minecraft.component.ComponentMap; import net.minecraft.component.DataComponentTypes; -import net.minecraft.component.type.ContainerComponent; import net.minecraft.component.type.ItemEnchantmentsComponent; import net.minecraft.component.type.NbtComponent; import net.minecraft.enchantment.Enchantment; @@ -258,8 +257,8 @@ public static Color getShulkerColor(ItemStack shulkerItem) { } public static boolean hasItems(ItemStack itemStack) { - ContainerComponent container = itemStack.get(DataComponentTypes.CONTAINER); - if (container != null && container.copyFirstStack() != ItemStack.EMPTY) return true; + ContainerComponentAccessor container = ((ContainerComponentAccessor) (Object) itemStack.get(DataComponentTypes.CONTAINER)); + if (container != null && !container.getStacks().isEmpty()) return true; NbtCompound compoundTag = itemStack.getOrDefault(DataComponentTypes.BLOCK_ENTITY_DATA, NbtComponent.DEFAULT).getNbt(); return compoundTag != null && compoundTag.contains("Items", 9); From 142cf9a60f49d89f8428da400d9187b6ddfc5383 Mon Sep 17 00:00:00 2001 From: FurnyGo <68079109+FurnyGo@users.noreply.github.com> Date: Wed, 8 May 2024 04:26:33 +0400 Subject: [PATCH 273/357] sendChatMessage event fix (#4489) --- .../meteorclient/mixin/ClientPlayNetworkHandlerMixin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerMixin.java index cf9b5d7bb2..edb3c29d22 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerMixin.java @@ -140,7 +140,7 @@ private void onItemPickupAnimation(ItemPickupAnimationS2CPacket packet, Callback private void onSendChatMessage(String message, CallbackInfo ci) { if (ignoreChatMessage) return; - if (!message.startsWith(Config.get().prefix.get()) && (BaritoneUtils.IS_AVAILABLE || !message.startsWith(BaritoneUtils.getPrefix()))) { + 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()) { From 25d1135478b6946c15a0dc7fad9fea995c4cb20e Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Tue, 7 May 2024 20:56:36 -0400 Subject: [PATCH 274/357] Code improvements for commands (#4575) --- .../meteorclient/commands/Command.java | 10 ++++++---- .../meteorclient/commands/Commands.java | 4 +--- .../meteorclient/mixin/ChatInputSuggestorMixin.java | 4 +++- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/Command.java b/src/main/java/meteordevelopment/meteorclient/commands/Command.java index 72b7e4b971..10c63e133a 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/Command.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/Command.java @@ -9,32 +9,34 @@ import com.mojang.brigadier.arguments.ArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.builder.RequiredArgumentBuilder; +import meteordevelopment.meteorclient.MeteorClient; 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 java.util.ArrayList; -import java.util.Collections; import java.util.List; public abstract class Command { protected static final CommandRegistryAccess REGISTRY_ACCESS = CommandManager.createRegistryAccess(BuiltinRegistries.createWrapperLookup()); + protected static final int SINGLE_SUCCESS = com.mojang.brigadier.Command.SINGLE_SUCCESS; + protected static final MinecraftClient mc = MeteorClient.mc; private final String name; private final String title; private final String description; - private final List aliases = new ArrayList<>(); + private final List aliases; public Command(String name, String description, String... aliases) { this.name = name; this.title = Utils.nameToTitle(name); this.description = description; - Collections.addAll(this.aliases, aliases); + this.aliases = List.of(aliases); } // Helper methods to painlessly infer the CommandSource generic type argument diff --git a/src/main/java/meteordevelopment/meteorclient/commands/Commands.java b/src/main/java/meteordevelopment/meteorclient/commands/Commands.java index c01a2cfe43..65325783f3 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/Commands.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/Commands.java @@ -10,7 +10,6 @@ import meteordevelopment.meteorclient.commands.commands.*; import meteordevelopment.meteorclient.pathing.PathManagers; import meteordevelopment.meteorclient.utils.PostInit; -import net.minecraft.client.network.ClientCommandSource; import net.minecraft.command.CommandSource; import java.util.ArrayList; @@ -21,7 +20,6 @@ public class Commands { public static final CommandDispatcher DISPATCHER = new CommandDispatcher<>(); - public static final CommandSource COMMAND_SOURCE = new ClientCommandSource(null, mc); public static final List COMMANDS = new ArrayList<>(); @PostInit(dependencies = PathManagers.class) @@ -74,7 +72,7 @@ public static void add(Command command) { } public static void dispatch(String message) throws CommandSyntaxException { - DISPATCHER.execute(message, COMMAND_SOURCE); + DISPATCHER.execute(message, mc.getNetworkHandler().getCommandSource()); } public static Command get(String name) { diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChatInputSuggestorMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChatInputSuggestorMixin.java index a6e75f91f9..e610790137 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChatInputSuggestorMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChatInputSuggestorMixin.java @@ -23,6 +23,8 @@ import java.util.concurrent.CompletableFuture; +import static meteordevelopment.meteorclient.MeteorClient.mc; + @Mixin(ChatInputSuggestor.class) public abstract class ChatInputSuggestorMixin { @Shadow private ParseResults parse; @@ -46,7 +48,7 @@ public void onRefresh(CallbackInfo ci, String string, StringReader reader) { reader.setCursor(reader.getCursor() + length); if (this.parse == null) { - this.parse = Commands.DISPATCHER.parse(reader, Commands.COMMAND_SOURCE); + this.parse = Commands.DISPATCHER.parse(reader, mc.getNetworkHandler().getCommandSource()); } int cursor = textField.getCursor(); From fd1d98b84627509d4a91fe365a281638865dd85a Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Thu, 9 May 2024 22:16:48 +0100 Subject: [PATCH 275/357] Fix better tooltips crash with banners closes #4578 --- .../meteorclient/systems/modules/render/BetterTooltips.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java index 70bb6e3938..4487d23b09 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java @@ -41,7 +41,6 @@ import net.minecraft.util.Formatting; import net.minecraft.util.collection.DefaultedList; -import java.io.IOException; import java.util.Comparator; import java.util.List; @@ -284,8 +283,8 @@ private void appendTooltip(ItemStackTooltipEvent event) { else count = String.format("%d bytes", byteCount); event.list.add(Text.literal(count).formatted(Formatting.GRAY)); - } catch (IOException e) { - e.printStackTrace(); + } catch (Exception e) { + event.list.add(Text.literal("Error getting bytes.").formatted(Formatting.RED)); } } From 1b2144b5650c848f06cd5dfb58edad6917c001e0 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Wed, 22 May 2024 12:08:19 +0100 Subject: [PATCH 276/357] Fix crash on startup with liquidbounce PSA: Gui rendering is still extremely broken but that's a separate issue. Disable custom font to mostly fix it. --- .../mixin/ClientPlayerEntityMixin.java | 6 ++-- .../meteorclient/mixin/EntityMixin.java | 30 +++++++++++++++++ .../meteorclient/mixin/MouseMixin.java | 32 ------------------- 3 files changed, 34 insertions(+), 34 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityMixin.java index cedf6b361c..7b73e5a9dd 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityMixin.java @@ -22,7 +22,9 @@ import net.minecraft.client.world.ClientWorld; import net.minecraft.entity.damage.DamageSource; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.*; +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; @@ -75,7 +77,7 @@ private void onDamage(DamageSource source, float amount, CallbackInfoReturnable< if (Utils.canUpdate() && getWorld().isClient && canTakeDamage()) MeteorClient.EVENT_BUS.post(DamageEvent.get(this, source)); } - @ModifyConstant(method = "canSprint", constant = @Constant(floatValue = 6.0f)) + @ModifyExpressionValue(method = "canSprint", 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/EntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/EntityMixin.java index e62c6f6395..4c36a1192b 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/EntityMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/EntityMixin.java @@ -11,12 +11,16 @@ import meteordevelopment.meteorclient.events.entity.LivingEntityMoveEvent; import meteordevelopment.meteorclient.events.entity.player.JumpVelocityMultiplierEvent; import meteordevelopment.meteorclient.events.entity.player.PlayerMoveEvent; +import meteordevelopment.meteorclient.mixininterface.ICamera; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.combat.Hitboxes; import meteordevelopment.meteorclient.systems.modules.movement.*; import meteordevelopment.meteorclient.systems.modules.movement.elytrafly.ElytraFly; import meteordevelopment.meteorclient.systems.modules.render.ESP; +import meteordevelopment.meteorclient.systems.modules.render.FreeLook; +import meteordevelopment.meteorclient.systems.modules.render.Freecam; import meteordevelopment.meteorclient.systems.modules.render.NoRender; +import meteordevelopment.meteorclient.systems.modules.world.HighwayBuilder; import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.entity.fakeplayer.FakePlayerEntity; import meteordevelopment.meteorclient.utils.render.color.Color; @@ -24,6 +28,7 @@ import net.minecraft.block.Block; import net.minecraft.block.BlockState; 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.LivingEntity; @@ -177,4 +182,29 @@ private void getPoseHook(CallbackInfoReturnable info) { 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) { + 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); + ci.cancel(); + } + else if (Modules.get().isActive(HighwayBuilder.class)) { + Camera camera = mc.gameRenderer.getCamera(); + ((ICamera) camera).setRot(camera.getYaw() + cursorDeltaX * 0.15, camera.getPitch() + cursorDeltaY * 0.15); + ci.cancel(); + } + else if (freeLook.cameraMode()) { + freeLook.cameraYaw += cursorDeltaX / freeLook.sensitivity.get().floatValue(); + freeLook.cameraPitch += cursorDeltaY / freeLook.sensitivity.get().floatValue(); + + 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/MouseMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/MouseMixin.java index d9b5fcf5de..3e2b20d565 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/MouseMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/MouseMixin.java @@ -8,31 +8,18 @@ import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.meteor.MouseButtonEvent; import meteordevelopment.meteorclient.events.meteor.MouseScrollEvent; -import meteordevelopment.meteorclient.mixininterface.ICamera; -import meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.systems.modules.render.FreeLook; -import meteordevelopment.meteorclient.systems.modules.render.Freecam; -import meteordevelopment.meteorclient.systems.modules.world.HighwayBuilder; 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.network.ClientPlayerEntity; -import net.minecraft.client.render.Camera; -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.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import static org.lwjgl.glfw.GLFW.GLFW_RELEASE; @Mixin(Mouse.class) public abstract class MouseMixin { - @Shadow @Final private MinecraftClient client; - @Inject(method = "onMouseButton", at = @At("HEAD"), cancellable = true) private void onMouseButton(long window, int button, int action, int mods, CallbackInfo info) { Input.setButtonState(button, action != GLFW_RELEASE); @@ -44,23 +31,4 @@ private void onMouseButton(long window, int button, int action, int mods, Callba private void onMouseScroll(long window, double horizontal, double vertical, CallbackInfo info) { if (MeteorClient.EVENT_BUS.post(MouseScrollEvent.get(vertical)).isCancelled()) info.cancel(); } - - @Redirect(method = "updateMouse", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;changeLookDirection(DD)V")) - private void updateMouseChangeLookDirection(ClientPlayerEntity player, double cursorDeltaX, double cursorDeltaY) { - 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); - else if (Modules.get().isActive(HighwayBuilder.class)) { - Camera camera = client.gameRenderer.getCamera(); - ((ICamera) camera).setRot(camera.getYaw() + cursorDeltaX * 0.15, camera.getPitch() + cursorDeltaY * 0.15); - } - else if (freeLook.cameraMode()) { - freeLook.cameraYaw += cursorDeltaX / freeLook.sensitivity.get().floatValue(); - freeLook.cameraPitch += cursorDeltaY / freeLook.sensitivity.get().floatValue(); - - if (Math.abs(freeLook.cameraPitch) > 90.0F) freeLook.cameraPitch = freeLook.cameraPitch > 0.0F ? 90.0F : -90.0F; - } - else player.changeLookDirection(cursorDeltaX, cursorDeltaY); - } } From fa00a6da7847e1e644d6d15d2326738d1a9135a0 Mon Sep 17 00:00:00 2001 From: misterx Date: Wed, 22 May 2024 00:17:39 +0200 Subject: [PATCH 277/357] fixed fabric packets not being detected by the event system --- .../meteorclient/mixin/ClientConnectionMixin.java | 8 +++++--- .../systems/modules/misc/PacketCanceller.java | 1 + 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java index b959abbe97..9c6bb603fb 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java @@ -22,6 +22,7 @@ import meteordevelopment.meteorclient.systems.proxies.Proxy; import net.minecraft.network.ClientConnection; import net.minecraft.network.NetworkSide; +import net.minecraft.network.PacketCallbacks; import net.minecraft.network.handler.PacketEncoderException; import net.minecraft.network.handler.PacketSizeLogger; import net.minecraft.network.listener.ClientPlayPacketListener; @@ -30,6 +31,7 @@ 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; @@ -66,7 +68,7 @@ private static void onConnect(InetSocketAddress address, boolean useEpoll, Clien MeteorClient.EVENT_BUS.post(ServerConnectEndEvent.get(address)); } - @Inject(at = @At("HEAD"), method = "send(Lnet/minecraft/network/packet/Packet;)V", cancellable = true) + @Inject(at = @At("HEAD"), method = "send(Lnet/minecraft/network/packet/Packet;Lnet/minecraft/network/PacketCallbacks;)V", cancellable = true) private void onSendPacketHead(CallbackInfo info, @Local LocalRef> packet) { PacketEvent.Send processedPacket = MeteorClient.EVENT_BUS.post(PacketEvent.Send.get(packet.get())); if (processedPacket.isCancelled()) { @@ -76,8 +78,8 @@ private void onSendPacketHead(CallbackInfo info, @Local LocalRef> pack } } - @Inject(method = "send(Lnet/minecraft/network/packet/Packet;)V", at = @At("TAIL")) - private void onSendPacketTail(Packet packet, CallbackInfo info) { + @Inject(method = "send(Lnet/minecraft/network/packet/Packet;Lnet/minecraft/network/PacketCallbacks;)V", at = @At("TAIL")) + private void onSendPacketTail(Packet packet, @Nullable PacketCallbacks callbacks, CallbackInfo ci) { MeteorClient.EVENT_BUS.post(PacketEvent.Sent.get(packet)); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/PacketCanceller.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/PacketCanceller.java index 219b9395c6..ba7a2c1f15 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/PacketCanceller.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/PacketCanceller.java @@ -37,6 +37,7 @@ public class PacketCanceller extends Module { public PacketCanceller() { super(Categories.Misc, "packet-canceller", "Allows you to cancel certain packets."); + runInMainMenu = true; } @EventHandler(priority = EventPriority.HIGHEST + 1) From f9b1c75913ac946376bbfbae28c2b844755e76f9 Mon Sep 17 00:00:00 2001 From: tyrannus00 Date: Thu, 23 May 2024 00:39:58 +0200 Subject: [PATCH 278/357] Fixed Criticals not working Possibly also fixed other weird packet behavior after 1.20.6 update --- .../meteorclient/mixin/ClientConnectionMixin.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java index 9c6bb603fb..d0e1ad5571 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java @@ -69,12 +69,9 @@ private static void onConnect(InetSocketAddress address, boolean useEpoll, Clien } @Inject(at = @At("HEAD"), method = "send(Lnet/minecraft/network/packet/Packet;Lnet/minecraft/network/PacketCallbacks;)V", cancellable = true) - private void onSendPacketHead(CallbackInfo info, @Local LocalRef> packet) { - PacketEvent.Send processedPacket = MeteorClient.EVENT_BUS.post(PacketEvent.Send.get(packet.get())); - if (processedPacket.isCancelled()) { + private void onSendPacketHead(CallbackInfo info, @Local(argsOnly = true) Packet packet) { + if (MeteorClient.EVENT_BUS.post(PacketEvent.Send.get(packet)).isCancelled()) { info.cancel(); - } else { - packet.set(processedPacket.packet); } } From 56fbe959c16705f338ad08f708037251f9172ee7 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Fri, 24 May 2024 13:41:40 +0100 Subject: [PATCH 279/357] revert more thoroughly --- .../meteorclient/events/packets/PacketEvent.java | 1 - .../meteorclient/mixin/ClientConnectionMixin.java | 6 ++---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/events/packets/PacketEvent.java b/src/main/java/meteordevelopment/meteorclient/events/packets/PacketEvent.java index d525056c51..2603e5dc5a 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/packets/PacketEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/packets/PacketEvent.java @@ -27,7 +27,6 @@ public static Receive get(Packet packet, ClientConnection connection) { public static class Send extends Cancellable { private static final Send INSTANCE = new Send(); - // overwriting this will overwrite the packet being sent public Packet packet; public static Send get(Packet packet) { diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java index d0e1ad5571..7275fbb4af 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java @@ -5,8 +5,6 @@ package meteordevelopment.meteorclient.mixin; -import com.llamalad7.mixinextras.sugar.Local; -import com.llamalad7.mixinextras.sugar.ref.LocalRef; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelPipeline; import io.netty.handler.proxy.Socks4ProxyHandler; @@ -69,9 +67,9 @@ private static void onConnect(InetSocketAddress address, boolean useEpoll, Clien } @Inject(at = @At("HEAD"), method = "send(Lnet/minecraft/network/packet/Packet;Lnet/minecraft/network/PacketCallbacks;)V", cancellable = true) - private void onSendPacketHead(CallbackInfo info, @Local(argsOnly = true) Packet packet) { + private void onSendPacketHead(Packet packet, PacketCallbacks callbacks, CallbackInfo ci) { if (MeteorClient.EVENT_BUS.post(PacketEvent.Send.get(packet)).isCancelled()) { - info.cancel(); + ci.cancel(); } } From dded574e91f851150ada983171913f93e9d1593e Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Fri, 24 May 2024 19:17:56 +0200 Subject: [PATCH 280/357] Fix crash on servers that send "fake players" that don't have an entry in the player list --- .../meteorclient/mixin/PlayerEntityRendererMixin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityRendererMixin.java index 44e999799c..4932ab2a91 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityRendererMixin.java @@ -30,7 +30,7 @@ private void modifyRenderLayer(Args args, MatrixStack matrices, VertexConsumerPr Chams chams = Modules.get().get(Chams.class); if (chams.isActive() && chams.hand.get()) { - Identifier texture = chams.handTexture.get() ? player.playerListEntry.getSkinTextures().texture() : Chams.BLANK; + Identifier texture = chams.handTexture.get() ? player.getSkinTextures().texture() : Chams.BLANK; args.set(1, vertexConsumers.getBuffer(RenderLayer.getEntityTranslucent(texture))); } } From 2b68dd40ee969eff79125e2170686e2cc881c204 Mon Sep 17 00:00:00 2001 From: 19MisterX98 <41451155+19MisterX98@users.noreply.github.com> Date: Fri, 24 May 2024 21:26:22 +0200 Subject: [PATCH 281/357] Fixed ServerSpoof (#4599) --- .../meteorclient/events/packets/PacketEvent.java | 8 ++++++-- .../meteorclient/mixin/ClientConnectionMixin.java | 4 ++-- .../systems/modules/misc/ServerSpoof.java | 11 ++++++++--- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/events/packets/PacketEvent.java b/src/main/java/meteordevelopment/meteorclient/events/packets/PacketEvent.java index 2603e5dc5a..44274b9648 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/packets/PacketEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/packets/PacketEvent.java @@ -28,10 +28,12 @@ public static class Send extends Cancellable { private static final Send INSTANCE = new Send(); public Packet packet; + public ClientConnection connection; - public static Send get(Packet packet) { + public static Send get(Packet packet, ClientConnection connection) { INSTANCE.setCancelled(false); INSTANCE.packet = packet; + INSTANCE.connection = connection; return INSTANCE; } } @@ -40,9 +42,11 @@ public static class Sent { private static final Sent INSTANCE = new Sent(); public Packet packet; + public ClientConnection connection; - public static Sent get(Packet packet) { + public static Sent get(Packet packet, ClientConnection connection) { INSTANCE.packet = packet; + INSTANCE.connection = connection; return INSTANCE; } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java index 7275fbb4af..444a120550 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java @@ -68,14 +68,14 @@ private static void onConnect(InetSocketAddress address, boolean useEpoll, Clien @Inject(at = @At("HEAD"), method = "send(Lnet/minecraft/network/packet/Packet;Lnet/minecraft/network/PacketCallbacks;)V", cancellable = true) private void onSendPacketHead(Packet packet, PacketCallbacks callbacks, CallbackInfo ci) { - if (MeteorClient.EVENT_BUS.post(PacketEvent.Send.get(packet)).isCancelled()) { + if (MeteorClient.EVENT_BUS.post(PacketEvent.Send.get(packet, (ClientConnection) (Object) this)).isCancelled()) { ci.cancel(); } } @Inject(method = "send(Lnet/minecraft/network/packet/Packet;Lnet/minecraft/network/PacketCallbacks;)V", at = @At("TAIL")) private void onSendPacketTail(Packet packet, @Nullable PacketCallbacks callbacks, CallbackInfo ci) { - MeteorClient.EVENT_BUS.post(PacketEvent.Sent.get(packet)); + MeteorClient.EVENT_BUS.post(PacketEvent.Sent.get(packet, (ClientConnection) (Object) this)); } @Inject(method = "exceptionCaught", at = @At("HEAD"), cancellable = true) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/ServerSpoof.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/ServerSpoof.java index d279b2ae1f..a81d9bd882 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/ServerSpoof.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/ServerSpoof.java @@ -76,9 +76,6 @@ private void onPacketSend(PacketEvent.Send event) { if (!isActive() || !(event.packet instanceof CustomPayloadC2SPacket)) return; Identifier id = ((CustomPayloadC2SPacket) event.packet).payload().getId().id(); - if (spoofBrand.get() && id.equals(BrandCustomPayload.ID.id())) - event.packet = new CustomPayloadC2SPacket(new BrandCustomPayload(brand.get())); - if (blockChannels.get()) { for (String channel : channels.get()) { if (StringUtils.containsIgnoreCase(id.toString(), channel)) { @@ -87,6 +84,14 @@ private void onPacketSend(PacketEvent.Send event) { } } } + + if (spoofBrand.get() && id.equals(BrandCustomPayload.ID.id())) { + CustomPayloadC2SPacket spoofedPacket = new CustomPayloadC2SPacket(new BrandCustomPayload(brand.get())); + + // PacketEvent.Send doesn't trigger if we send the packet like this + event.connection.send(spoofedPacket, null, true); + event.cancel(); + } } @EventHandler From 2ee726af581d95df9838818b92cc739bc8526f5a Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Sat, 25 May 2024 20:28:30 +0100 Subject: [PATCH 282/357] Prevent the ViaFabricPlus settings button overlapping with ours in the multiplayer menu. --- build.gradle | 5 +++++ gradle.properties | 3 +++ .../meteorclient/MixinPlugin.java | 5 +++++ .../viafabricplus/GeneralSettingsMixin.java | 21 +++++++++++++++++++ src/main/resources/fabric.mod.json | 3 ++- .../meteor-client-viafabricplus.mixins.json | 12 +++++++++++ 6 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/viafabricplus/GeneralSettingsMixin.java create mode 100644 src/main/resources/meteor-client-viafabricplus.mixins.json diff --git a/build.gradle b/build.gradle index 97453581de..b46ec23a52 100644 --- a/build.gradle +++ b/build.gradle @@ -31,6 +31,10 @@ repositories { name = "vram" url = "https://maven.vram.io//" } + maven { + name = "ViaVersion" + url = "https://repo.viaversion.com" + } mavenCentral() } @@ -58,6 +62,7 @@ dependencies { modCompileOnly("maven.modrinth:iris:${project.iris_version}") { transitive = false } //modCompileOnly("io.vram:canvas-fabric-mc119:1.0.+") { transitive = false } // TODO: 1.19.3 modCompileOnly("maven.modrinth:indium:${project.indium_version}") { transitive = false } + modCompileOnly("de.florianmichael:ViaFabricPlus:${project.viafabricplus_version}") { transitive = false } // Baritone (https://github.com/MeteorDevelopment/baritone) modCompileOnly "meteordevelopment:baritone:${project.baritone_version}-SNAPSHOT" diff --git a/gradle.properties b/gradle.properties index cad87af402..8e046fac85 100644 --- a/gradle.properties +++ b/gradle.properties @@ -42,3 +42,6 @@ reflections_version=0.10.2 # Netty (https://github.com/netty/netty) netty_version=4.1.90.Final + +# ViaFabricPlus (https://github.com/ViaVersion/ViaFabricPlus) +viafabricplus_version=3.2.1 diff --git a/src/main/java/meteordevelopment/meteorclient/MixinPlugin.java b/src/main/java/meteordevelopment/meteorclient/MixinPlugin.java index c4d672e2f9..ab7d7bb59d 100644 --- a/src/main/java/meteordevelopment/meteorclient/MixinPlugin.java +++ b/src/main/java/meteordevelopment/meteorclient/MixinPlugin.java @@ -29,6 +29,7 @@ public class MixinPlugin implements IMixinConfigPlugin { private static boolean isLithiumPresent; public static boolean isIrisPresent; private static boolean isIndiumPresent; + private static boolean isVFPPresent; @Override public void onLoad(String mixinPackage) { @@ -74,6 +75,7 @@ public void onLoad(String mixinPackage) { isLithiumPresent = FabricLoader.getInstance().isModLoaded("lithium"); isIrisPresent = FabricLoader.getInstance().isModLoaded("iris"); isIndiumPresent = FabricLoader.getInstance().isModLoaded("indium"); + isVFPPresent = FabricLoader.getInstance().isModLoaded("viafabricplus"); loaded = true; } @@ -106,6 +108,9 @@ else if (mixinClassName.startsWith(mixinPackage + ".lithium")) { else if (mixinClassName.startsWith(mixinPackage + ".indium")) { return isIndiumPresent; } + else if (mixinClassName.startsWith(mixinPackage + ".viafabricplus")) { + return isVFPPresent; + } return true; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/viafabricplus/GeneralSettingsMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/viafabricplus/GeneralSettingsMixin.java new file mode 100644 index 0000000000..2bab3594bb --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/viafabricplus/GeneralSettingsMixin.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.viafabricplus; + +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import de.florianmichael.viafabricplus.settings.impl.GeneralSettings; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(GeneralSettings.class) +public class GeneralSettingsMixin { + // specifies the '2' value on this line: + // public final ModeSetting multiplayerScreenButtonOrientation = new ModeSetting(this, Text.translatable("general_settings.viafabricplus.multiplayer_screen_button_orientation"), 2, ORIENTATION_OPTIONS); + @ModifyExpressionValue(method = "", at = @At(value = "CONSTANT", args = "intValue=2", ordinal = 1)) + private int modifyDefaultPosition(int original) { + return 4; + } +} diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 2817bcfbad..482ee94175 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -30,7 +30,8 @@ "meteor-client-sodium.mixins.json", "meteor-client-canvas.mixins.json", "meteor-client-lithium.mixins.json", - "meteor-client-indium.mixins.json" + "meteor-client-indium.mixins.json", + "meteor-client-viafabricplus.mixins.json" ], "accessWidener": "meteor-client.accesswidener", "custom": { diff --git a/src/main/resources/meteor-client-viafabricplus.mixins.json b/src/main/resources/meteor-client-viafabricplus.mixins.json new file mode 100644 index 0000000000..38868b7bcd --- /dev/null +++ b/src/main/resources/meteor-client-viafabricplus.mixins.json @@ -0,0 +1,12 @@ +{ + "required": false, + "package": "meteordevelopment.meteorclient.mixin.viafabricplus", + "compatibilityLevel": "JAVA_21", + "plugin": "meteordevelopment.meteorclient.MixinPlugin", + "client": [ + "GeneralSettingsMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} From c320c13ca117f858b2d0e09c8e088cb76f1de1f4 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Sat, 25 May 2024 20:47:58 +0100 Subject: [PATCH 283/357] fix warning --- .../meteorclient/mixin/viafabricplus/GeneralSettingsMixin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/viafabricplus/GeneralSettingsMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/viafabricplus/GeneralSettingsMixin.java index 2bab3594bb..b85ee55887 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/viafabricplus/GeneralSettingsMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/viafabricplus/GeneralSettingsMixin.java @@ -14,7 +14,7 @@ public class GeneralSettingsMixin { // specifies the '2' value on this line: // public final ModeSetting multiplayerScreenButtonOrientation = new ModeSetting(this, Text.translatable("general_settings.viafabricplus.multiplayer_screen_button_orientation"), 2, ORIENTATION_OPTIONS); - @ModifyExpressionValue(method = "", at = @At(value = "CONSTANT", args = "intValue=2", ordinal = 1)) + @ModifyExpressionValue(method = "", at = @At(value = "CONSTANT", args = "intValue=2", ordinal = 1), remap = false) private int modifyDefaultPosition(int original) { return 4; } From f647d06bc89b11cda5357bfb3a3003a962aeee71 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Sun, 26 May 2024 16:03:52 +0100 Subject: [PATCH 284/357] Made rage sprint omnidirectional --- .../mixin/ClientPlayerEntityMixin.java | 35 +++++++++++++++---- .../meteorclient/mixin/LivingEntityMixin.java | 19 ++++++++++ .../systems/modules/movement/Sprint.java | 18 ++++++---- 3 files changed, 59 insertions(+), 13 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityMixin.java index 7b73e5a9dd..72e6d169cb 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityMixin.java @@ -17,11 +17,13 @@ import meteordevelopment.meteorclient.utils.Utils; import net.minecraft.client.MinecraftClient; 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.damage.DamageSource; 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; @@ -30,6 +32,9 @@ @Mixin(ClientPlayerEntity.class) public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity { + @Shadow + public Input input; + public ClientPlayerEntityMixin(ClientWorld world, GameProfile profile) { super(world, profile); } @@ -83,6 +88,30 @@ private float onHunger(float constant) { return constant; } + @ModifyExpressionValue(method = "sendMovementPackets", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;isSneaking()Z")) + private boolean isSneaking(boolean sneaking) { + return Modules.get().get(Sneak.class).doPacket() || Modules.get().get(NoSlow.class).airStrict() || sneaking; + } + + @ModifyExpressionValue(method = "canStartSprinting", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;isWalking()Z")) + private boolean modifyIsWalking(boolean original) { + boolean rage = Modules.get().isActive(Sprint.class) && Modules.get().get(Sprint.class).mode.get() == Sprint.Mode.Rage; + if (!rage) return original; + + float forwards = Math.abs(input.movementSideways); + float sideways = Math.abs(input.movementForward); + + 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) { + boolean rage = Modules.get().isActive(Sprint.class) && Modules.get().get(Sprint.class).mode.get() == Sprint.Mode.Rage; + if (!rage) return original; + + return Math.abs(input.movementSideways) > 1.0E-5F || Math.abs(input.movementForward) > 1.0E-5F; + } + // Rotations @Inject(method = "sendMovementPackets", at = @At("HEAD")) @@ -104,10 +133,4 @@ private void onSendMovementPacketsTail(CallbackInfo info) { private void onTickHasVehicleAfterSendPackets(CallbackInfo info) { MeteorClient.EVENT_BUS.post(SendMovementPacketsEvent.Post.get()); } - - // Sneak - @ModifyExpressionValue(method = "sendMovementPackets", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;isSneaking()Z")) - private boolean isSneaking(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/LivingEntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java index e11f9e9b0c..f27d36d9b8 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java @@ -5,11 +5,13 @@ package meteordevelopment.meteorclient.mixin; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.injector.ModifyReturnValue; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.entity.DamageEvent; import meteordevelopment.meteorclient.events.entity.player.CanWalkOnFluidEvent; import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.movement.Sprint; import meteordevelopment.meteorclient.systems.modules.movement.elytrafly.ElytraFlightModes; import meteordevelopment.meteorclient.systems.modules.movement.elytrafly.ElytraFly; import meteordevelopment.meteorclient.systems.modules.movement.elytrafly.modes.Bounce; @@ -124,4 +126,21 @@ private boolean hasStatusEffect(boolean original, RegistryEntry ef return original; } + + @ModifyExpressionValue(method = "jump", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;getYaw()F")) + private float modifyGetYaw(float original) { + if ((Object) this != mc.player) return original; + + Sprint s = Modules.get().get(Sprint.class); + if (!s.isActive() || s.mode.get() != Sprint.Mode.Rage || !s.jumpFix.get()) return original; + + float forward = Math.signum(mc.player.input.movementForward); + float strafe = 90 * Math.signum(mc.player.input.movementSideways); + if (forward != 0) strafe *= (forward * 0.5f); + + original -= strafe; + if (forward < 0) original -= 180; + + return original; + } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Sprint.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Sprint.java index f499316beb..316e24bcb2 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Sprint.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Sprint.java @@ -6,6 +6,7 @@ package meteordevelopment.meteorclient.systems.modules.movement; import meteordevelopment.meteorclient.events.world.TickEvent; +import meteordevelopment.meteorclient.settings.BoolSetting; import meteordevelopment.meteorclient.settings.EnumSetting; import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.settings.SettingGroup; @@ -21,15 +22,20 @@ public enum Mode { Rage } - private final Setting mode = sgGeneral.add(new EnumSetting.Builder() + public final Setting mode = sgGeneral.add(new EnumSetting.Builder() .name("speed-mode") .description("What mode of sprinting.") .defaultValue(Mode.Strict) .build() ); - // Removed whenStationary as it was just Rage sprint - + public final Setting jumpFix = sgGeneral.add(new BoolSetting.Builder() + .name("jump-fix") + .description("Whether to correct jumping directions.") + .defaultValue(true) + .visible(() -> mode.get() == Mode.Rage) + .build() + ); public Sprint() { super(Categories.Movement, "sprint", "Automatically sprints."); @@ -49,11 +55,9 @@ private void sprint() { private void onTick(TickEvent.Post event) { switch (mode.get()) { case Strict -> { - if (mc.player.forwardSpeed > 0) { - sprint(); - } + if (mc.player.forwardSpeed > 0) sprint(); } case Rage -> sprint(); - } } + } } From 339cf2b801084dec188d505c4add4e86c2e463b1 Mon Sep 17 00:00:00 2001 From: FurnyGo <68079109+FurnyGo@users.noreply.github.com> Date: Mon, 27 May 2024 17:23:56 +0400 Subject: [PATCH 285/357] Add titles to No Render (#4607) --- .../meteorclient/mixin/InGameHudMixin.java | 5 +++++ .../meteorclient/systems/modules/render/NoRender.java | 9 +++++++++ 2 files changed, 14 insertions(+) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/InGameHudMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/InGameHudMixin.java index ec05796a14..768ba8c8e2 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/InGameHudMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/InGameHudMixin.java @@ -98,6 +98,11 @@ private void onRenderCrosshair(DrawContext context, float tickDelta, CallbackInf if (Modules.get().get(NoRender.class).noCrosshair()) ci.cancel(); } + @Inject(method = "renderTitleAndSubtitle", at = @At("HEAD"), cancellable = true) + private void onRenderTitle(DrawContext context, float tickDelta, 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(); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/NoRender.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/NoRender.java index 8692934f8a..da62e0aae6 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/NoRender.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/NoRender.java @@ -140,6 +140,12 @@ public class NoRender extends Module { .defaultValue(false) .build() ); + private final Setting noTitle = sgHUD.add(new BoolSetting.Builder() + .name("title") + .description("Disables rendering of the title.") + .defaultValue(false) + .build() + ); private final Setting noHeldItemName = sgHUD.add(new BoolSetting.Builder() .name("held-item-name") @@ -436,6 +442,9 @@ public boolean noScoreboard() { public boolean noCrosshair() { return isActive() && noCrosshair.get(); } + public boolean noTitle() { + return isActive() && noTitle.get(); + } public boolean noHeldItemName() { return isActive() && noHeldItemName.get(); From 66549bacaf37812d4e3db93ad294f9f48ff0ba37 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Wed, 29 May 2024 16:46:38 +0100 Subject: [PATCH 286/357] Fix bind command --- .../meteorclient/commands/commands/BindCommand.java | 3 +-- .../meteorclient/systems/modules/Modules.java | 10 ++++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/BindCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/BindCommand.java index 9811963067..3ef50aa80d 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/BindCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/BindCommand.java @@ -12,8 +12,6 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import net.minecraft.command.CommandSource; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; - public class BindCommand extends Command { public BindCommand() { super("bind", "Binds a specified module to the next pressed key."); @@ -24,6 +22,7 @@ public void build(LiteralArgumentBuilder builder) { builder.then(argument("module", ModuleArgumentType.create()).executes(context -> { Module module = context.getArgument("module", Module.class); Modules.get().setModuleToBind(module); + Modules.get().awaitKeyRelease(); module.info("Press a key to bind the module to."); return SINGLE_SUCCESS; })); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java index 695a28548b..3da4a9aa89 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java @@ -74,6 +74,7 @@ public class Modules extends System { private final List active = new ArrayList<>(); private Module moduleToBind; + private boolean awaitingKeyRelease = false; public Modules() { super("modules"); @@ -220,6 +221,10 @@ public void setModuleToBind(Module moduleToBind) { this.moduleToBind = moduleToBind; } + public void awaitKeyRelease() { + this.awaitingKeyRelease = true; + } + public boolean isBinding() { return moduleToBind != null; } @@ -237,6 +242,11 @@ private void onButtonBinding(MouseButtonEvent event) { private boolean onBinding(boolean isKey, int value, int modifiers) { if (!isBinding()) return false; + if (awaitingKeyRelease) { + awaitingKeyRelease = false; + return false; + } + if (moduleToBind.keybind.canBindTo(isKey, value, modifiers)) { moduleToBind.keybind.set(isKey, value, modifiers); moduleToBind.info("Bound to (highlight)%s(default).", moduleToBind.keybind); From 3494a75c87262740838b2c24618395c36bd42563 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Wed, 29 May 2024 17:07:42 +0100 Subject: [PATCH 287/357] ensure correct key --- .../meteorclient/systems/modules/Modules.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java index 3da4a9aa89..a82ef7f875 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java @@ -221,6 +221,10 @@ public void setModuleToBind(Module moduleToBind) { this.moduleToBind = moduleToBind; } + /*** + * @see meteordevelopment.meteorclient.commands.commands.BindCommand + * For ensuring we don't instantly bind the module to the enter key. + */ public void awaitKeyRelease() { this.awaitingKeyRelease = true; } @@ -243,6 +247,8 @@ private boolean onBinding(boolean isKey, int value, int modifiers) { if (!isBinding()) return false; if (awaitingKeyRelease) { + if (!isKey || value != GLFW.GLFW_KEY_ENTER) return false; + awaitingKeyRelease = false; return false; } From 49f330575973cc2e146efc96ecdf4ec434fe217b Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Fri, 31 May 2024 19:51:23 +0100 Subject: [PATCH 288/357] Add keep sprint setting to the Sprint module closes #4084 --- .../meteorclient/mixin/PlayerEntityMixin.java | 16 ++++++++++++---- .../systems/modules/movement/Sprint.java | 11 +++++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityMixin.java index a135ee99e0..8beed23b56 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityMixin.java @@ -6,14 +6,12 @@ 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.Anchor; -import meteordevelopment.meteorclient.systems.modules.movement.Flight; -import meteordevelopment.meteorclient.systems.modules.movement.NoSlow; -import meteordevelopment.meteorclient.systems.modules.movement.Scaffold; +import meteordevelopment.meteorclient.systems.modules.movement.*; import meteordevelopment.meteorclient.systems.modules.player.Reach; import meteordevelopment.meteorclient.systems.modules.player.SpeedMine; import meteordevelopment.meteorclient.utils.world.BlockUtils; @@ -26,6 +24,7 @@ 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; @@ -113,6 +112,15 @@ private void onGetOffGroundSpeed(CallbackInfoReturnable info) { if (speed != -1) info.setReturnValue(speed); } + @WrapWithCondition(method = "attack", 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 = "attack", 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) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Sprint.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Sprint.java index 316e24bcb2..5b8e15e915 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Sprint.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Sprint.java @@ -37,6 +37,13 @@ public enum Mode { .build() ); + private final Setting keepSprint = sgGeneral.add(new BoolSetting.Builder() + .name("keep-sprint") + .description("Whether to keep sprinting after attacking an entity.") + .defaultValue(false) + .build() + ); + public Sprint() { super(Categories.Movement, "sprint", "Automatically sprints."); } @@ -60,4 +67,8 @@ private void onTick(TickEvent.Post event) { case Rage -> sprint(); } } + + public boolean stopSprinting() { + return !isActive() || !keepSprint.get(); + } } From 3e49a94fea765f246dd6ace819ad4b2a93e022f8 Mon Sep 17 00:00:00 2001 From: misterx Date: Mon, 3 Jun 2024 16:44:48 +0200 Subject: [PATCH 289/357] fixed lithium border collisions #4618 --- .../lithium/LithiumEntityCollisionsMixin.java | 26 +++++++++++++++++++ .../systems/modules/world/Collisions.java | 2 +- .../meteor-client-lithium.mixins.json | 3 ++- 3 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/lithium/LithiumEntityCollisionsMixin.java diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/lithium/LithiumEntityCollisionsMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/lithium/LithiumEntityCollisionsMixin.java new file mode 100644 index 0000000000..e04058c0ab --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/lithium/LithiumEntityCollisionsMixin.java @@ -0,0 +1,26 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixin.lithium; + +import me.jellysquid.mods.lithium.common.entity.LithiumEntityCollisions; +import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.world.Collisions; +import net.minecraft.util.math.Box; +import net.minecraft.world.border.WorldBorder; +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(value = LithiumEntityCollisions.class) +public class LithiumEntityCollisionsMixin { + @Inject(method = "isWithinWorldBorder", at = @At("HEAD"), cancellable = true) + private static void onIsWithinWorldBorder(WorldBorder border, Box box, CallbackInfoReturnable cir) { + if (Modules.get().get(Collisions.class).ignoreBorder()) { + cir.setReturnValue(true); + } + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Collisions.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Collisions.java index 0c441ba7c5..49ae4a1f6b 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Collisions.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Collisions.java @@ -113,6 +113,6 @@ private boolean blockFilter(Block block) { } public boolean ignoreBorder() { - return isActive() && ignoreBorder.get(); + return isActive() && ignoreBorder.get(); } } diff --git a/src/main/resources/meteor-client-lithium.mixins.json b/src/main/resources/meteor-client-lithium.mixins.json index fcad6bd961..58e8d53b0a 100644 --- a/src/main/resources/meteor-client-lithium.mixins.json +++ b/src/main/resources/meteor-client-lithium.mixins.json @@ -4,7 +4,8 @@ "compatibilityLevel": "JAVA_21", "plugin": "meteordevelopment.meteorclient.MixinPlugin", "client": [ - "ChunkAwareBlockCollisionSweeperMixin" + "ChunkAwareBlockCollisionSweeperMixin", + "LithiumEntityCollisionsMixin" ], "injectors": { "defaultRequire": 1 From 580ad3f3e517d048a90a535631e3dc6d9f3c7283 Mon Sep 17 00:00:00 2001 From: tyrannus00 Date: Wed, 5 Jun 2024 18:07:31 +0200 Subject: [PATCH 290/357] Fixed incompatibility with Bleachhack420 --- .../mixin/BlockCollisionSpliteratorMixin.java | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BlockCollisionSpliteratorMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BlockCollisionSpliteratorMixin.java index e40b859046..69856efc23 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BlockCollisionSpliteratorMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BlockCollisionSpliteratorMixin.java @@ -5,6 +5,8 @@ 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; @@ -17,16 +19,22 @@ import net.minecraft.world.BlockView; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(BlockCollisionSpliterator.class) public abstract class BlockCollisionSpliteratorMixin { - @Redirect(method = "computeNext", at = @At(value = "INVOKE", target = "Lnet/minecraft/block/BlockState;getCollisionShape(Lnet/minecraft/world/BlockView;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/ShapeContext;)Lnet/minecraft/util/shape/VoxelShape;")) - private VoxelShape onComputeNextCollisionBox(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { - VoxelShape shape = state.getCollisionShape(world, pos, context); - if (world != MinecraftClient.getInstance().world) + @WrapOperation(method = "computeNext", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/block/BlockState;getCollisionShape(Lnet/minecraft/world/BlockView;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/ShapeContext;)Lnet/minecraft/util/shape/VoxelShape;" + ) + ) + private VoxelShape onComputeNextCollisionBox(BlockState state, BlockView world, BlockPos pos, ShapeContext context, Operation original) { + VoxelShape shape = original.call(state, world, pos, context); + + if (world != MinecraftClient.getInstance().world) { return shape; + } CollisionShapeEvent event = MeteorClient.EVENT_BUS.post(CollisionShapeEvent.get(state, pos, shape)); return event.isCancelled() ? VoxelShapes.empty() : event.shape; From 94ee5c6173592479b48b8dd0e6a26a97bda3d0b6 Mon Sep 17 00:00:00 2001 From: Big Iron <52252627+Big-Iron-Cheems@users.noreply.github.com> Date: Thu, 6 Jun 2024 17:54:27 +0200 Subject: [PATCH 291/357] NoRender: map content (#4624) --- .../meteorclient/mixin/MapRendererMixin.java | 9 +++++++++ .../meteorclient/systems/modules/render/NoRender.java | 11 +++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MapRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/MapRendererMixin.java index 0394134d7e..9df35f2209 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/MapRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/MapRendererMixin.java @@ -10,9 +10,13 @@ import meteordevelopment.meteorclient.systems.modules.render.NoRender; import meteordevelopment.meteorclient.utils.misc.EmptyIterator; import net.minecraft.client.render.MapRenderer; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.util.math.MatrixStack; import net.minecraft.item.map.MapDecoration; 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(MapRenderer.MapTexture.class) public abstract class MapRendererMixin { @@ -20,4 +24,9 @@ public abstract class MapRendererMixin { private Iterable getIconsProxy(Iterable original) { return (Modules.get().get(NoRender.class).noMapMarkers()) ? EmptyIterator::new : original; } + + @Inject(method = "draw(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;ZI)V", at = @At("HEAD"), cancellable = true) + private void onDraw(MatrixStack matrices, VertexConsumerProvider vertexConsumers, boolean hidePlayerIcons, int light, CallbackInfo ci) { + if (Modules.get().get(NoRender.class).noMapContents()) ci.cancel(); + } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/NoRender.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/NoRender.java index da62e0aae6..5ab56f9d10 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/NoRender.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/NoRender.java @@ -269,6 +269,13 @@ public class NoRender extends Module { .build() ); + private final Setting noMapContents = sgWorld.add(new BoolSetting.Builder() + .name("map-contents") + .description("Disable rendering of maps.") + .defaultValue(false) + .build() + ); + private final Setting bannerRender = sgWorld.add(new EnumSetting.Builder() .name("banners") .description("Changes rendering of banners.") @@ -517,6 +524,10 @@ public boolean noMapMarkers() { return isActive() && noMapMarkers.get(); } + public boolean noMapContents() { + return isActive() && noMapContents.get(); + } + public BannerRenderMode getBannerRenderMode() { if (!isActive()) return BannerRenderMode.Everything; else return bannerRender.get(); From f08df5c9898f7c94f9db8570f4bee89a4ed77fcd Mon Sep 17 00:00:00 2001 From: 19MisterX98 <41451155+19MisterX98@users.noreply.github.com> Date: Wed, 12 Jun 2024 02:25:05 +0200 Subject: [PATCH 292/357] fixed hud default elements not working (#4634) --- .../java/meteordevelopment/meteorclient/systems/hud/Hud.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/Hud.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/Hud.java index b5d898e329..d04a1b3b71 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/Hud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/Hud.java @@ -208,13 +208,14 @@ private void resetToDefaultElementsImpl() { @EventHandler private void onTick(TickEvent.Post event) { if (Utils.isLoading()) return; - if (!(active || HudEditorScreen.isOpen())) return; if (resetToDefaultElements) { resetToDefaultElementsImpl(); resetToDefaultElements = false; } + if (!(active || HudEditorScreen.isOpen())) return; + for (HudElement element : elements) { if (element.isActive()) element.tick(HudRenderer.INSTANCE); } From c82f0c03b683c93173a52aaabaeee115bd5e73c1 Mon Sep 17 00:00:00 2001 From: RealMuffinTime Date: Fri, 24 May 2024 21:33:29 +0200 Subject: [PATCH 293/357] add anti chat clear option to BetterChat --- .../systems/modules/misc/BetterChat.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java index 5c9944b0aa..d5e4d62ba5 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java @@ -112,6 +112,13 @@ public class BetterChat extends Module { .build() ); + private final Setting antiClear = sgFilter.add(new BoolSetting.Builder() + .name("anti-clear") + .description("Prevents servers from clearing chat.") + .defaultValue(true) + .build() + ); + private final Setting filterRegex = sgFilter.add(new BoolSetting.Builder() .name("filter-regex") .description("Filter out chat messages that match the regex filter.") @@ -219,6 +226,7 @@ public class BetterChat extends Module { ); private static final Pattern antiSpamRegex = Pattern.compile(" \\(([0-9]+)\\)$"); + private static final Pattern antiClearRegex = Pattern.compile("\\\\n(\\\\n|\\s)*\\\\n"); private static final Pattern timestampRegex = Pattern.compile("^(<[0-9]{2}:[0-9]{2}>\\s)"); private static final Pattern usernameRegex = Pattern.compile("^(?:<[0-9]{2}:[0-9]{2}>\\s)?<(.*?)>.*"); @@ -249,6 +257,16 @@ private void onMessageReceive(ReceiveMessageEvent event) { } } + if (antiClear.get()) { + // more than two \n behind each other will be reduced to only two \n + String jsonString = Text.Serialization.toJsonString(message, mc.player.getRegistryManager()); + + Matcher antiClearMatcher = antiClearRegex.matcher(jsonString); + String replacedString = antiClearMatcher.replaceAll("\n\n"); + + message = (Text) Text.Serialization.fromJson(replacedString, mc.player.getRegistryManager()); + } + if (antiSpam.get()) { Text antiSpammed = appendAntiSpam(message); From 1a859f05cb40300b065a397575514e0be0025cd0 Mon Sep 17 00:00:00 2001 From: triskj0 Date: Wed, 12 Jun 2024 19:04:07 +0200 Subject: [PATCH 294/357] fix chest swapping after getting an error with pitch40 --- .../systems/modules/movement/elytrafly/ElytraFly.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFly.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFly.java index 0fccaba54e..58c4348446 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFly.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFly.java @@ -341,11 +341,11 @@ public ElytraFly() { @Override public void onActivate() { - currentMode.onActivate(); if ((chestSwap.get() == ChestSwapMode.Always || chestSwap.get() == ChestSwapMode.WaitForGround) && mc.player.getEquippedStack(EquipmentSlot.CHEST).getItem() != Items.ELYTRA) { Modules.get().get(ChestSwap.class).swap(); } + currentMode.onActivate(); } @Override From 1c15b021cd7b582afe01e65ad5d4e3ed19186354 Mon Sep 17 00:00:00 2001 From: triskj0 Date: Wed, 12 Jun 2024 21:05:44 +0200 Subject: [PATCH 295/357] suggested change --- .../systems/modules/movement/elytrafly/ElytraFly.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFly.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFly.java index 58c4348446..d3ad217585 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFly.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFly.java @@ -341,11 +341,11 @@ public ElytraFly() { @Override public void onActivate() { + currentMode.onActivate(); if ((chestSwap.get() == ChestSwapMode.Always || chestSwap.get() == ChestSwapMode.WaitForGround) - && mc.player.getEquippedStack(EquipmentSlot.CHEST).getItem() != Items.ELYTRA) { + && mc.player.getEquippedStack(EquipmentSlot.CHEST).getItem() != Items.ELYTRA && isActive()) { Modules.get().get(ChestSwap.class).swap(); } - currentMode.onActivate(); } @Override From e2e92dfbcb0922676a2e3673b386f33ff30c3913 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Thu, 13 Jun 2024 12:48:08 +0100 Subject: [PATCH 296/357] Add waypoint fade distance setting --- .../systems/modules/render/WaypointsModule.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WaypointsModule.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WaypointsModule.java index 4c28321b0f..569c4ba515 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WaypointsModule.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WaypointsModule.java @@ -57,6 +57,15 @@ public class WaypointsModule extends Module { .build() ); + private final Setting waypointFadeDistance = sgGeneral.add(new IntSetting.Builder() + .name("waypoint-fade-distance") + .description("The distance to a waypoint at which it begins to start fading.") + .defaultValue(20) + .sliderRange(0, 100) + .min(0) + .build() + ); + private final Setting maxDeathPositions = sgDeathPosition.add(new IntSetting.Builder() .name("max-death-positions") .description("The amount of death positions to save, 0 to disable") @@ -103,8 +112,8 @@ private void onRender2D(Render2DEvent event) { double distToCenter = pos.distance(center); double a = 1; - if (dist < 20) { - a = (dist - 10) / 10; + if (dist < waypointFadeDistance.get()) { + a = (dist - (waypointFadeDistance.get() / 2d)) / (waypointFadeDistance.get() / 2d); if (a < 0.01) continue; } From 6704302aa7332c3be2823ec00bba28929a65b461 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Thu, 13 Jun 2024 14:46:06 +0100 Subject: [PATCH 297/357] Rename the 'Instamine' module to 'Instant Rebreak' Should hopefully avoid confusion with how the module works. Closes #4631 --- .../meteorclient/systems/modules/Modules.java | 2 +- .../{InstaMine.java => InstantRebreak.java} | 6 ++-- .../systems/modules/world/HighwayBuilder.java | 28 +++++++++---------- .../meteorclient/utils/world/BlockUtils.java | 13 +++++---- 4 files changed, 26 insertions(+), 23 deletions(-) rename src/main/java/meteordevelopment/meteorclient/systems/modules/player/{InstaMine.java => InstantRebreak.java} (96%) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java index a82ef7f875..e50ec6e586 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java @@ -441,7 +441,7 @@ private void initPlayer() { add(new FakePlayer()); add(new FastUse()); add(new GhostHand()); - add(new InstaMine()); + add(new InstantRebreak()); add(new LiquidInteract()); add(new MiddleClickExtra()); add(new BreakDelay()); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/InstaMine.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/InstantRebreak.java similarity index 96% rename from src/main/java/meteordevelopment/meteorclient/systems/modules/player/InstaMine.java rename to src/main/java/meteordevelopment/meteorclient/systems/modules/player/InstantRebreak.java index 71efa7ea0f..7994ed980f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/InstaMine.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/InstantRebreak.java @@ -23,7 +23,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; -public class InstaMine extends Module { +public class InstantRebreak extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); private final SettingGroup sgRender = settings.createGroup("Render"); @@ -84,8 +84,8 @@ public class InstaMine extends Module { private int ticks; private Direction direction; - public InstaMine() { - super(Categories.Player, "insta-mine", "Instantly re-breaks blocks in the same position."); + public InstantRebreak() { + super(Categories.Player, "instant-rebreak", "Instantly re-breaks blocks in the same position."); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java index fb1acf7d63..657525a1dd 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java @@ -16,7 +16,7 @@ import meteordevelopment.meteorclient.systems.modules.player.AutoEat; import meteordevelopment.meteorclient.systems.modules.player.AutoGap; import meteordevelopment.meteorclient.systems.modules.player.AutoTool; -import meteordevelopment.meteorclient.systems.modules.player.InstaMine; +import meteordevelopment.meteorclient.systems.modules.player.InstantRebreak; import meteordevelopment.meteorclient.utils.misc.HorizontalDirection; import meteordevelopment.meteorclient.utils.misc.MBlockPos; import meteordevelopment.meteorclient.utils.player.CustomPlayerInput; @@ -239,20 +239,20 @@ public enum Rotation { .build() ); - private final Setting instamineEchests = sgInventory.add(new BoolSetting.Builder() - .name("instamine-echests") - .description("Whether or not to use the instamine exploit to break echests.") + private final Setting rebreakEchests = sgInventory.add(new BoolSetting.Builder() + .name("instantly-rebreak-echests") + .description("Whether or not to use the instant rebreak exploit to break echests.") .defaultValue(false) .visible(mineEnderChests::get) .build() ); - private final Setting instamineDelay = sgInventory.add(new IntSetting.Builder() - .name("instamine-delay") - .description("Delay between instamine attempts.") + private final Setting rebreakTimer = sgInventory.add(new IntSetting.Builder() + .name("rebreak-delay") + .description("Delay between rebreak attempts.") .defaultValue(0) .sliderMax(20) - .visible(() -> mineEnderChests.get() && instamineEchests.get()) + .visible(() -> mineEnderChests.get() && rebreakEchests.get()) .build() ); @@ -371,7 +371,7 @@ public void onActivate() { if (blocksPerTick.get() > 1 && rotation.get().mine) warning("With rotations enabled, you can break at most 1 block per tick."); if (placementsPerTick.get() > 1 && rotation.get().place) warning("With rotations enabled, you can place at most 1 block per tick."); - if (Modules.get().get(InstaMine.class).isActive()) warning("It's recommended to disable the InstaMine module and instead use 'instamine-echests' to avoid errors."); + if (Modules.get().get(InstantRebreak.class).isActive()) warning("It's recommended to disable the Instant Rebreak module and instead use the 'instantly-rebreak-echests' setting to avoid errors."); } @Override @@ -758,7 +758,7 @@ protected void tick(HighwayBuilder b) { private int minimumObsidian; private boolean first, primed; private boolean stopTimerEnabled; - private int stopTimer, moveTimer, instamineTimer; + private int stopTimer, moveTimer, rebreakTimer; @Override protected void start(HighwayBuilder b) { @@ -856,14 +856,14 @@ protected void tick(HighwayBuilder b) { InvUtils.swap(slot, false); - if (b.instamineEchests.get() && primed) { - if (instamineTimer > 0) { - instamineTimer--; + if (b.rebreakEchests.get() && primed) { + if (rebreakTimer > 0) { + rebreakTimer--; return; } PlayerActionC2SPacket p = new PlayerActionC2SPacket(PlayerActionC2SPacket.Action.STOP_DESTROY_BLOCK, bp, BlockUtils.getDirection(bp)); - instamineTimer = b.instamineDelay.get(); + rebreakTimer = b.rebreakTimer.get(); if (b.rotation.get().mine) Rotations.rotate(Rotations.getYaw(bp), Rotations.getPitch(bp), () -> b.mc.getNetworkHandler().sendPacket(p)); else b.mc.getNetworkHandler().sendPacket(p); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java index ef5cc93a1e..e260159c57 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java @@ -8,9 +8,12 @@ import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.systems.modules.player.InstaMine; +import meteordevelopment.meteorclient.systems.modules.player.InstantRebreak; import meteordevelopment.meteorclient.utils.PreInit; -import meteordevelopment.meteorclient.utils.player.*; +import meteordevelopment.meteorclient.utils.player.FindItemResult; +import meteordevelopment.meteorclient.utils.player.InvUtils; +import meteordevelopment.meteorclient.utils.player.Rotations; +import meteordevelopment.meteorclient.utils.player.SlotUtils; import meteordevelopment.orbit.EventHandler; import meteordevelopment.orbit.EventPriority; import net.minecraft.block.*; @@ -235,9 +238,9 @@ public static boolean breakBlock(BlockPos blockPos, boolean swing) { // Creating new instance of block pos because minecraft assigns the parameter to a field, and we don't want it to change when it has been stored in a field somewhere BlockPos pos = blockPos instanceof BlockPos.Mutable ? new BlockPos(blockPos) : blockPos; - InstaMine im = Modules.get().get(InstaMine.class); - if (im != null && im.isActive() && im.blockPos.equals(pos) && im.shouldMine()) { - im.sendPacket(); + InstantRebreak ir = Modules.get().get(InstantRebreak.class); + if (ir != null && ir.isActive() && ir.blockPos.equals(pos) && ir.shouldMine()) { + ir.sendPacket(); return true; } From b3e260d341642850ba1f8cb63b2bfc9a542d69b5 Mon Sep 17 00:00:00 2001 From: misterx Date: Thu, 13 Jun 2024 18:16:23 +0200 Subject: [PATCH 298/357] hostnames can have minus hyphens --- src/main/java/meteordevelopment/meteorclient/utils/Utils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/utils/Utils.java b/src/main/java/meteordevelopment/meteorclient/utils/Utils.java index 7a32b27a27..182b33176e 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/Utils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/Utils.java @@ -595,6 +595,6 @@ public static boolean nameFilter(String text, char character) { public static boolean ipFilter(String text, char character) { if (text.contains(":") && character == ':') return false; - return (character >= 'a' && character <= 'z') || (character >= 'A' && character <= 'Z') || (character >= '0' && character <= '9') || character == '.'; + return (character >= 'a' && character <= 'z') || (character >= 'A' && character <= 'Z') || (character >= '0' && character <= '9') || character == '.' || character == '-'; } } From 546d0b945a98c61cafd4cd9330db3936eee286d1 Mon Sep 17 00:00:00 2001 From: Wide-Cat <74723656+Wide-Cat@users.noreply.github.com> Date: Fri, 14 Jun 2024 21:21:09 +0100 Subject: [PATCH 299/357] Abstract shared code in prompts (#4641) --- .../utils/render/prompts/OkPrompt.java | 101 ++------------- .../utils/render/prompts/Prompt.java | 98 +++++++++++++++ .../utils/render/prompts/YesNoPrompt.java | 116 +++--------------- 3 files changed, 127 insertions(+), 188 deletions(-) create mode 100644 src/main/java/meteordevelopment/meteorclient/utils/render/prompts/Prompt.java diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/prompts/OkPrompt.java b/src/main/java/meteordevelopment/meteorclient/utils/render/prompts/OkPrompt.java index 6ec2986500..9f909773e2 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/prompts/OkPrompt.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/prompts/OkPrompt.java @@ -5,120 +5,41 @@ package meteordevelopment.meteorclient.utils.render.prompts; -import com.mojang.blaze3d.systems.RenderSystem; import meteordevelopment.meteorclient.gui.GuiTheme; import meteordevelopment.meteorclient.gui.GuiThemes; -import meteordevelopment.meteorclient.gui.WindowScreen; -import meteordevelopment.meteorclient.gui.widgets.containers.WHorizontalList; import meteordevelopment.meteorclient.gui.widgets.pressable.WButton; -import meteordevelopment.meteorclient.gui.widgets.pressable.WCheckbox; import meteordevelopment.meteorclient.systems.config.Config; import net.minecraft.client.gui.screen.Screen; -import java.util.ArrayList; -import java.util.List; - import static meteordevelopment.meteorclient.MeteorClient.mc; -public class OkPrompt { - private final GuiTheme theme; - private final Screen parent; - - private String title = ""; - private final List messages = new ArrayList<>(); - private boolean dontShowAgainCheckboxVisible = true; - private String id = null; - +public class OkPrompt extends Prompt { private Runnable onOk = () -> {}; - private OkPrompt() { - this(GuiThemes.get(), mc.currentScreen); - } - private OkPrompt(GuiTheme theme, Screen parent) { - this.theme = theme; - this.parent = parent; + super(theme, parent); } public static OkPrompt create() { - return new OkPrompt(); + return new OkPrompt(GuiThemes.get(), mc.currentScreen); } public static OkPrompt create(GuiTheme theme, Screen parent) { return new OkPrompt(theme, parent); } - public OkPrompt title(String title) { - this.title = title; - return this; - } - - public OkPrompt message(String message) { - this.messages.add(message); - return this; - } - - public OkPrompt message(String message, Object... args) { - this.messages.add(String.format(message, args)); - return this; - } - - public OkPrompt dontShowAgainCheckboxVisible(boolean visible) { - this.dontShowAgainCheckboxVisible = visible; - return this; - } - - public OkPrompt id(String from) { - this.id = from; - return this; - } - public OkPrompt onOk(Runnable action) { this.onOk = action; return this; } - public boolean show() { - if (id == null) this.id(this.title); - if (Config.get().dontShowAgainPrompts.contains(id)) return false; - - if (!RenderSystem.isOnRenderThread()) { - RenderSystem.recordRenderCall(() -> mc.setScreen(new PromptScreen(theme))); - } - else { - mc.setScreen(new PromptScreen(theme)); - } - - return true; - } - - private class PromptScreen extends WindowScreen { - public PromptScreen(GuiTheme theme) { - super(theme, OkPrompt.this.title); - - this.parent = OkPrompt.this.parent; - } - - @Override - public void initWidgets() { - for (String line : messages) add(theme.label(line)).expandX(); - add(theme.horizontalSeparator()).expandX(); - - WCheckbox dontShowAgainCheckbox; - - if (dontShowAgainCheckboxVisible) { - WHorizontalList checkboxContainer = add(theme.horizontalList()).expandX().widget(); - dontShowAgainCheckbox = checkboxContainer.add(theme.checkbox(false)).widget(); - checkboxContainer.add(theme.label("Don't show this again.")).expandX(); - } else dontShowAgainCheckbox = null; - - WHorizontalList list = add(theme.horizontalList()).expandX().widget(); - WButton okButton = list.add(theme.button("Ok")).expandX().widget(); - okButton.action = () -> { - if (dontShowAgainCheckbox != null && dontShowAgainCheckbox.checked) Config.get().dontShowAgainPrompts.add(id); - onOk.run(); - close(); - }; - } + @Override + protected void initialiseWidgets(PromptScreen screen) { + WButton okButton = screen.list.add(theme.button("Ok")).expandX().widget(); + okButton.action = () -> { + if (screen.dontShowAgainCheckbox != null && screen.dontShowAgainCheckbox.checked) Config.get().dontShowAgainPrompts.add(id); + onOk.run(); + screen.close(); + }; } } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/prompts/Prompt.java b/src/main/java/meteordevelopment/meteorclient/utils/render/prompts/Prompt.java new file mode 100644 index 0000000000..da8372968b --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/prompts/Prompt.java @@ -0,0 +1,98 @@ +package meteordevelopment.meteorclient.utils.render.prompts; + +import com.mojang.blaze3d.systems.RenderSystem; +import meteordevelopment.meteorclient.gui.GuiTheme; +import meteordevelopment.meteorclient.gui.WindowScreen; +import meteordevelopment.meteorclient.gui.widgets.containers.WHorizontalList; +import meteordevelopment.meteorclient.gui.widgets.pressable.WCheckbox; +import meteordevelopment.meteorclient.systems.config.Config; +import net.minecraft.client.gui.screen.Screen; + +import java.util.ArrayList; +import java.util.List; + +import static meteordevelopment.meteorclient.MeteorClient.mc; + +@SuppressWarnings("unchecked") // cant instantiate a Prompt directly so this is fine +public abstract class Prompt { + final GuiTheme theme; + final Screen parent; + + String title = ""; + final List messages = new ArrayList<>(); + boolean dontShowAgainCheckboxVisible = true; + String id = null; + + protected Prompt(GuiTheme theme, Screen parent) { + this.theme = theme; + this.parent = parent; + } + + public T title(String title) { + this.title = title; + return (T) this; + } + + public T message(String message) { + this.messages.add(message); + return (T) this; + } + + public T message(String message, Object... args) { + this.messages.add(String.format(message, args)); + return (T) this; + } + + public T dontShowAgainCheckboxVisible(boolean visible) { + this.dontShowAgainCheckboxVisible = visible; + return (T) this; + } + + public T id(String from) { + this.id = from; + return (T) this; + } + + public boolean show() { + if (id == null) this.id(this.title); + if (Config.get().dontShowAgainPrompts.contains(id)) return false; + + if (!RenderSystem.isOnRenderThread()) { + RenderSystem.recordRenderCall(() -> mc.setScreen(new PromptScreen(theme))); + } + else { + mc.setScreen(new PromptScreen(theme)); + } + + return true; + } + + abstract void initialiseWidgets(PromptScreen screen); + + protected class PromptScreen extends WindowScreen { + WCheckbox dontShowAgainCheckbox; + WHorizontalList list; + + public PromptScreen(GuiTheme theme) { + super(theme, Prompt.this.title); + + this.parent = Prompt.this.parent; + } + + @Override + public void initWidgets() { + for (String line : messages) add(theme.label(line)).expandX(); + add(theme.horizontalSeparator()).expandX(); + + if (dontShowAgainCheckboxVisible) { + WHorizontalList checkboxContainer = add(theme.horizontalList()).expandX().widget(); + dontShowAgainCheckbox = checkboxContainer.add(theme.checkbox(false)).widget(); + checkboxContainer.add(theme.label("Don't show this again.")).expandX(); + } else dontShowAgainCheckbox = null; + + list = add(theme.horizontalList()).expandX().widget(); + + initialiseWidgets(this); + } + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/prompts/YesNoPrompt.java b/src/main/java/meteordevelopment/meteorclient/utils/render/prompts/YesNoPrompt.java index edf8d4e9fb..ccb1a4d250 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/prompts/YesNoPrompt.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/prompts/YesNoPrompt.java @@ -5,75 +5,30 @@ package meteordevelopment.meteorclient.utils.render.prompts; -import com.mojang.blaze3d.systems.RenderSystem; import meteordevelopment.meteorclient.gui.GuiTheme; import meteordevelopment.meteorclient.gui.GuiThemes; -import meteordevelopment.meteorclient.gui.WindowScreen; -import meteordevelopment.meteorclient.gui.widgets.containers.WHorizontalList; import meteordevelopment.meteorclient.gui.widgets.pressable.WButton; -import meteordevelopment.meteorclient.gui.widgets.pressable.WCheckbox; import meteordevelopment.meteorclient.systems.config.Config; import net.minecraft.client.gui.screen.Screen; -import java.util.ArrayList; -import java.util.List; - import static meteordevelopment.meteorclient.MeteorClient.mc; -public class YesNoPrompt { - private final GuiTheme theme; - private final Screen parent; - - private String title = ""; - private final List messages = new ArrayList<>(); - private boolean dontShowAgainCheckboxVisible = true; - private String id = null; - +public class YesNoPrompt extends Prompt { private Runnable onYes = () -> {}; private Runnable onNo = () -> {}; - private YesNoPrompt() { - this(GuiThemes.get(), mc.currentScreen); - } - private YesNoPrompt(GuiTheme theme, Screen parent) { - this.theme = theme; - this.parent = parent; + super(theme, parent); } public static YesNoPrompt create() { - return new YesNoPrompt(); + return new YesNoPrompt(GuiThemes.get(), mc.currentScreen); } public static YesNoPrompt create(GuiTheme theme, Screen parent) { return new YesNoPrompt(theme, parent); } - public YesNoPrompt title(String title) { - this.title = title; - return this; - } - - public YesNoPrompt message(String message) { - this.messages.add(message); - return this; - } - - public YesNoPrompt message(String message, Object... args) { - this.messages.add(String.format(message, args)); - return this; - } - - public YesNoPrompt dontShowAgainCheckboxVisible(boolean visible) { - this.dontShowAgainCheckboxVisible = visible; - return this; - } - - public YesNoPrompt id(String from) { - this.id = from; - return this; - } - public YesNoPrompt onYes(Runnable action) { this.onYes = action; return this; @@ -84,55 +39,20 @@ public YesNoPrompt onNo(Runnable action) { return this; } - public boolean show() { - if (id == null) this.id(this.title); - if (Config.get().dontShowAgainPrompts.contains(id)) return false; - - if (!RenderSystem.isOnRenderThread()) { - RenderSystem.recordRenderCall(() -> mc.setScreen(new PromptScreen(theme))); - } - else { - mc.setScreen(new PromptScreen(theme)); - } - - return true; - } - - private class PromptScreen extends WindowScreen { - public PromptScreen(GuiTheme theme) { - super(theme, YesNoPrompt.this.title); - - this.parent = YesNoPrompt.this.parent; - } - - @Override - public void initWidgets() { - for (String line : messages) add(theme.label(line)).expandX(); - add(theme.horizontalSeparator()).expandX(); - - WCheckbox dontShowAgainCheckbox; - - if (dontShowAgainCheckboxVisible) { - WHorizontalList checkboxContainer = add(theme.horizontalList()).expandX().widget(); - dontShowAgainCheckbox = checkboxContainer.add(theme.checkbox(false)).widget(); - checkboxContainer.add(theme.label("Don't show this again.")).expandX(); - } else dontShowAgainCheckbox = null; - - WHorizontalList list = add(theme.horizontalList()).expandX().widget(); - - WButton yesButton = list.add(theme.button("Yes")).expandX().widget(); - yesButton.action = () -> { - if (dontShowAgainCheckbox != null && dontShowAgainCheckbox.checked) Config.get().dontShowAgainPrompts.add(id); - onYes.run(); - close(); - }; - - WButton noButton = list.add(theme.button("No")).expandX().widget(); - noButton.action = () -> { - if (dontShowAgainCheckbox != null && dontShowAgainCheckbox.checked) Config.get().dontShowAgainPrompts.add(id); - onNo.run(); - close(); - }; - } + @Override + protected void initialiseWidgets(PromptScreen screen) { + WButton yesButton = screen.list.add(theme.button("Yes")).expandX().widget(); + yesButton.action = () -> { + if (screen.dontShowAgainCheckbox != null && screen.dontShowAgainCheckbox.checked) Config.get().dontShowAgainPrompts.add(id); + onYes.run(); + screen.close(); + }; + + WButton noButton = screen.list.add(theme.button("No")).expandX().widget(); + noButton.action = () -> { + if (screen.dontShowAgainCheckbox != null && screen.dontShowAgainCheckbox.checked) Config.get().dontShowAgainPrompts.add(id); + onNo.run(); + screen.close(); + }; } } From c47000887f1d7cd2fa5518087925239fa8bd8c0a Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Tue, 18 Jun 2024 13:37:16 +0100 Subject: [PATCH 300/357] Fix issue with better chat and clientside messages Co-authored-by: RacoonDog <32882447+racoondog@users.noreply.github.com> --- .../systems/modules/misc/BetterChat.java | 32 ++++++++----- .../utils/misc/text/TextVisitor.java | 46 +++++++++++++++++++ 2 files changed, 66 insertions(+), 12 deletions(-) create mode 100644 src/main/java/meteordevelopment/meteorclient/utils/misc/text/TextVisitor.java diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java index d5e4d62ba5..be32f76f40 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java @@ -23,16 +23,14 @@ import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.misc.MeteorIdentifier; import meteordevelopment.meteorclient.utils.misc.text.MeteorClickEvent; +import meteordevelopment.meteorclient.utils.misc.text.TextVisitor; import meteordevelopment.meteorclient.utils.player.ChatUtils; import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.orbit.EventHandler; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.hud.ChatHudLine; import net.minecraft.client.network.PlayerListEntry; -import net.minecraft.text.ClickEvent; -import net.minecraft.text.HoverEvent; -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; +import net.minecraft.text.*; import net.minecraft.util.Formatting; import net.minecraft.util.Identifier; @@ -40,6 +38,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.Optional; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; @@ -226,7 +225,7 @@ public class BetterChat extends Module { ); private static final Pattern antiSpamRegex = Pattern.compile(" \\(([0-9]+)\\)$"); - private static final Pattern antiClearRegex = Pattern.compile("\\\\n(\\\\n|\\s)*\\\\n"); + private static final Pattern antiClearRegex = Pattern.compile("\\\\n(\\\\n|\\s)+\\\\n"); private static final Pattern timestampRegex = Pattern.compile("^(<[0-9]{2}:[0-9]{2}>\\s)"); private static final Pattern usernameRegex = Pattern.compile("^(?:<[0-9]{2}:[0-9]{2}>\\s)?<(.*?)>.*"); @@ -258,13 +257,22 @@ private void onMessageReceive(ReceiveMessageEvent event) { } if (antiClear.get()) { - // more than two \n behind each other will be reduced to only two \n - String jsonString = Text.Serialization.toJsonString(message, mc.player.getRegistryManager()); - - Matcher antiClearMatcher = antiClearRegex.matcher(jsonString); - String replacedString = antiClearMatcher.replaceAll("\n\n"); - - message = (Text) Text.Serialization.fromJson(replacedString, mc.player.getRegistryManager()); + String messageString = message.getString(); + if (antiClearRegex.matcher(messageString).matches()) { + MutableText newMessage = Text.empty(); + TextVisitor.visit(message, (text, style, string) -> { + Matcher antiClearMatcher = antiClearRegex.matcher(string); + if (antiClearMatcher.matches()) { + // assume literal text content + newMessage.append(Text.literal(antiClearMatcher.replaceAll("\n\n")).setStyle(style)); + } else { + newMessage.append(text.copyContentOnly().setStyle(style)); + } + + return Optional.empty(); + }, Style.EMPTY); + message = newMessage; + } } if (antiSpam.get()) { diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/TextVisitor.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/TextVisitor.java new file mode 100644 index 0000000000..9fc1f5ae0e --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/TextVisitor.java @@ -0,0 +1,46 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.utils.misc.text; + +import net.minecraft.text.Style; +import net.minecraft.text.Text; + +import java.util.ArrayDeque; +import java.util.Optional; +import java.util.Queue; + +/** + * An extension of {@link net.minecraft.text.StringVisitable.StyledVisitor} with access to the underlying {@link Text} objects. + * @param the optional short circuit return type, to match the semantics of {@link net.minecraft.text.StringVisitable.Visitor} and {@link net.minecraft.text.StringVisitable.StyledVisitor}. + * @author Crosby + */ +@FunctionalInterface +public interface TextVisitor { + Optional accept(Text text, Style style, String string); + + static Optional visit(Text text, TextVisitor visitor, Style baseStyle) { + Queue queue = collectSiblings(text); + return text.visit((style, string) -> visitor.accept(queue.remove(), style, string), baseStyle); + } + + /** + * Collapses the tree of {@link Text} siblings into a one dimensional LIFO {@link Queue} + * @param text the text + * @return the text and its siblings in the order they appear when rendered. + */ + static Queue collectSiblings(Text text) { + Queue queue = new ArrayDeque<>(); + collectSiblings(text, queue); + return queue; + } + + private static void collectSiblings(Text text, Queue queue) { + queue.add(text); + for (Text sibling : text.getSiblings()) { + collectSiblings(sibling, queue); + } + } +} From 0ddeab2af38d08e0403a83b692edfb0ad71aa647 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Wed, 19 Jun 2024 15:53:40 +0100 Subject: [PATCH 301/357] Fix anti-clear in better chat. smh crosby. Closes #4660 --- .../meteorclient/systems/modules/misc/BetterChat.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java index be32f76f40..e621d06d35 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java @@ -225,7 +225,7 @@ public class BetterChat extends Module { ); private static final Pattern antiSpamRegex = Pattern.compile(" \\(([0-9]+)\\)$"); - private static final Pattern antiClearRegex = Pattern.compile("\\\\n(\\\\n|\\s)+\\\\n"); + private static final Pattern antiClearRegex = Pattern.compile("\\n(\\n|\\s)+\\n"); private static final Pattern timestampRegex = Pattern.compile("^(<[0-9]{2}:[0-9]{2}>\\s)"); private static final Pattern usernameRegex = Pattern.compile("^(?:<[0-9]{2}:[0-9]{2}>\\s)?<(.*?)>.*"); @@ -258,7 +258,7 @@ private void onMessageReceive(ReceiveMessageEvent event) { if (antiClear.get()) { String messageString = message.getString(); - if (antiClearRegex.matcher(messageString).matches()) { + if (antiClearRegex.matcher(messageString).find()) { MutableText newMessage = Text.empty(); TextVisitor.visit(message, (text, style, string) -> { Matcher antiClearMatcher = antiClearRegex.matcher(string); From 309bbc8f3d31f6defe30a11d4ddedad413085d61 Mon Sep 17 00:00:00 2001 From: Moxvallix Mox Date: Wed, 19 Jun 2024 02:25:22 +0930 Subject: [PATCH 302/357] Add a GUI positioning reset button to GUI tab screen --- .../meteorclient/gui/tabs/builtin/GuiTab.java | 4 ++++ 1 file changed, 4 insertions(+) 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 4dcb480255..b4d4135aa6 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/GuiTab.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/GuiTab.java @@ -11,6 +11,7 @@ import meteordevelopment.meteorclient.gui.tabs.TabScreen; import meteordevelopment.meteorclient.gui.tabs.WindowTabScreen; import meteordevelopment.meteorclient.gui.widgets.containers.WTable; +import meteordevelopment.meteorclient.gui.widgets.pressable.WButton; import meteordevelopment.meteorclient.gui.widgets.input.WDropdown; import meteordevelopment.meteorclient.utils.misc.NbtUtils; import net.minecraft.client.gui.screen.Screen; @@ -53,6 +54,9 @@ public void initWidgets() { tab.openScreen(GuiThemes.get()); }; + WButton reset = add(theme.button("Reset GUI Layout")).widget(); + reset.action = () -> theme.clearWindowConfigs(); + add(theme.settings(theme.settings)).expandX(); } From 73726168df3e4501dee6a93d1eaaa886c3421f17 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Wed, 19 Jun 2024 18:40:47 -0400 Subject: [PATCH 303/357] Correct better chat anti-clear behaviour --- .../systems/modules/misc/BetterChat.java | 2 +- .../meteorclient/utils/misc/text/TextVisitor.java | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java index e621d06d35..297e6bfbb1 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java @@ -262,7 +262,7 @@ private void onMessageReceive(ReceiveMessageEvent event) { MutableText newMessage = Text.empty(); TextVisitor.visit(message, (text, style, string) -> { Matcher antiClearMatcher = antiClearRegex.matcher(string); - if (antiClearMatcher.matches()) { + if (antiClearMatcher.find()) { // assume literal text content newMessage.append(Text.literal(antiClearMatcher.replaceAll("\n\n")).setStyle(style)); } else { diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/TextVisitor.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/TextVisitor.java index 9fc1f5ae0e..c1bf774d7f 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/TextVisitor.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/TextVisitor.java @@ -5,6 +5,8 @@ package meteordevelopment.meteorclient.utils.misc.text; +import net.minecraft.text.PlainTextContent; +import net.minecraft.text.StringVisitable; import net.minecraft.text.Style; import net.minecraft.text.Text; @@ -27,18 +29,21 @@ static Optional visit(Text text, TextVisitor visitor, Style baseStyle) } /** - * Collapses the tree of {@link Text} siblings into a one dimensional LIFO {@link Queue} + * Collapses the tree of {@link Text} siblings into a one dimensional FIFO {@link Queue}. To match the behaviours of + * the {@link Text#visit(StringVisitable.Visitor)} and {@link Text#visit(StringVisitable.StyledVisitor, Style)} + * methods, texts with empty contents (created from {@link Text#empty()}) are ignored but their siblings are still + * processed. * @param text the text * @return the text and its siblings in the order they appear when rendered. */ - static Queue collectSiblings(Text text) { - Queue queue = new ArrayDeque<>(); + static ArrayDeque collectSiblings(Text text) { + ArrayDeque queue = new ArrayDeque<>(); collectSiblings(text, queue); return queue; } private static void collectSiblings(Text text, Queue queue) { - queue.add(text); + if (!(text.getContent() instanceof PlainTextContent ptc) || !ptc.string().isEmpty()) queue.add(text); for (Text sibling : text.getSiblings()) { collectSiblings(sibling, queue); } From 0d5fbae7291613b550e5dda8562282a614c4390b Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Wed, 19 Jun 2024 23:50:09 +0100 Subject: [PATCH 304/357] Entity owner no longer works with horses and projectiles --- .../systems/modules/render/EntityOwner.java | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/EntityOwner.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/EntityOwner.java index 5b2f672650..a365727ad9 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/EntityOwner.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/EntityOwner.java @@ -6,10 +6,8 @@ package meteordevelopment.meteorclient.systems.modules.render; import meteordevelopment.meteorclient.events.render.Render2DEvent; -import meteordevelopment.meteorclient.mixin.ProjectileEntityAccessor; import meteordevelopment.meteorclient.renderer.Renderer2D; import meteordevelopment.meteorclient.renderer.text.TextRenderer; -import meteordevelopment.meteorclient.settings.BoolSetting; import meteordevelopment.meteorclient.settings.DoubleSetting; import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.settings.SettingGroup; @@ -22,10 +20,8 @@ import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.orbit.EventHandler; import net.minecraft.entity.Entity; -import net.minecraft.entity.passive.AbstractHorseEntity; import net.minecraft.entity.passive.TameableEntity; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.projectile.ProjectileEntity; import org.joml.Vector3d; import java.util.HashMap; @@ -46,13 +42,6 @@ public class EntityOwner extends Module { .build() ); - private final Setting projectiles = sgGeneral.add(new BoolSetting.Builder() - .name("projectiles") - .description("Display owner names of projectiles.") - .defaultValue(false) - .build() - ); - private final Vector3d pos = new Vector3d(); private final Map uuidToName = new HashMap<>(); @@ -71,8 +60,6 @@ private void onRender2D(Render2DEvent event) { UUID ownerUuid; if (entity instanceof TameableEntity tameable) ownerUuid = tameable.getOwnerUuid(); - else if (entity instanceof AbstractHorseEntity horse) ownerUuid = horse.getOwnerUuid(); - else if (entity instanceof ProjectileEntity && projectiles.get()) ownerUuid = ((ProjectileEntityAccessor) entity).getOwnerUuid(); else continue; if (ownerUuid != null) { @@ -116,7 +103,7 @@ private String getOwnerName(UUID uuid) { String name = uuidToName.get(uuid); if (name != null) return name; - // Makes a HTTP request to Mojang API + // Makes an HTTP request to Mojang API MeteorExecutor.execute(() -> { if (isActive()) { ProfileResponse res = Http.get("https://sessionserver.mojang.com/session/minecraft/profile/" + uuid.toString().replace("-", "")).sendJson(ProfileResponse.class); From cedabd41d49790bb6e8f8e60ab737e25ead824c6 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Wed, 19 Jun 2024 23:57:35 +0100 Subject: [PATCH 305/357] Fix notebot reach --- .../meteorclient/systems/modules/misc/Notebot.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notebot.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notebot.java index 0bc2c6009c..44363f7421 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notebot.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notebot.java @@ -36,7 +36,6 @@ import net.minecraft.block.Blocks; import net.minecraft.block.NoteBlock; import net.minecraft.block.enums.Instrument; -import net.minecraft.entity.attribute.EntityAttributes; import net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket; import net.minecraft.network.packet.c2s.play.PlayerInteractBlockC2SPacket; import net.minecraft.sound.SoundEvents; @@ -780,9 +779,7 @@ private void scanForNoteblocks() { if (blockState.getBlock() != Blocks.NOTE_BLOCK) continue; // Copied from ServerPlayNetworkHandler#onPlayerInteractBlock - Vec3d vec3d2 = Vec3d.ofCenter(pos); - double sqDist = mc.player.getEyePos().squaredDistanceTo(vec3d2); - if (sqDist > mc.player.getAttributeValue(EntityAttributes.PLAYER_BLOCK_INTERACTION_RANGE)) continue; + if (!mc.player.canInteractWithBlockAt(pos, 1)) continue; if (!isValidScanSpot(pos)) continue; @@ -790,7 +787,6 @@ private void scanForNoteblocks() { scannedNoteblocks.put(note, pos); } } - } } From 1392c8becdc0c9b9c54a544366c976ce77d45c25 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Mon, 6 May 2024 23:35:21 -0400 Subject: [PATCH 306/357] port .nbt to 1.20.5+ --- .../arguments/ComponentMapArgumentType.java | 53 +++++ .../commands/commands/NbtCommand.java | 198 ++++++++++-------- .../utils/misc/ComponentMapReader.java | 189 +++++++++++++++++ 3 files changed, 354 insertions(+), 86 deletions(-) create mode 100644 src/main/java/meteordevelopment/meteorclient/commands/arguments/ComponentMapArgumentType.java create mode 100644 src/main/java/meteordevelopment/meteorclient/utils/misc/ComponentMapReader.java diff --git a/src/main/java/meteordevelopment/meteorclient/commands/arguments/ComponentMapArgumentType.java b/src/main/java/meteordevelopment/meteorclient/commands/arguments/ComponentMapArgumentType.java new file mode 100644 index 0000000000..4ec8c2648a --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/commands/arguments/ComponentMapArgumentType.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.commands.arguments; + +import com.mojang.brigadier.StringReader; +import com.mojang.brigadier.arguments.ArgumentType; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +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 java.util.Collection; +import java.util.List; +import java.util.concurrent.CompletableFuture; + +public class ComponentMapArgumentType implements ArgumentType { + private static final Collection EXAMPLES = List.of("{foo=bar}"); + private final ComponentMapReader reader; + + public ComponentMapArgumentType(CommandRegistryAccess commandRegistryAccess) { + this.reader = new ComponentMapReader(commandRegistryAccess); + } + + public static ComponentMapArgumentType componentMap(CommandRegistryAccess commandRegistryAccess) { + return new ComponentMapArgumentType(commandRegistryAccess); + } + + public static ComponentMap getComponentMap(CommandContext context, String name) { + return context.getArgument(name, ComponentMap.class); + } + + @Override + public ComponentMap parse(StringReader reader) throws CommandSyntaxException { + return this.reader.consume(reader); + } + + @Override + public CompletableFuture listSuggestions(CommandContext context, SuggestionsBuilder builder) { + return this.reader.getSuggestions(builder); + } + + @Override + public Collection getExamples() { + return EXAMPLES; + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/NbtCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/NbtCommand.java index 9bbb3b39fd..3acda1c180 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/NbtCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/NbtCommand.java @@ -5,150 +5,176 @@ package meteordevelopment.meteorclient.commands.commands; -import com.mojang.brigadier.StringReader; import com.mojang.brigadier.arguments.IntegerArgumentType; 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.CompoundNbtTagArgumentType; -import meteordevelopment.meteorclient.systems.config.Config; +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.component.ComponentMap; +import net.minecraft.command.argument.RegistryKeyArgumentType; +import net.minecraft.component.*; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.NbtElement; +import net.minecraft.nbt.NbtHelper; import net.minecraft.network.packet.c2s.play.CreativeInventoryActionC2SPacket; -import net.minecraft.text.ClickEvent; -import net.minecraft.text.HoverEvent; -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; +import net.minecraft.registry.Registries; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.text.*; import net.minecraft.util.Formatting; +import net.minecraft.util.Unit; + +import java.util.List; +import java.util.Set; import static com.mojang.brigadier.Command.SINGLE_SUCCESS; import static meteordevelopment.meteorclient.MeteorClient.mc; public class NbtCommand extends Command { + private static final DynamicCommandExceptionType MALFORMED_ITEM_EXCEPTION = new DynamicCommandExceptionType( + error -> Text.stringifiedTranslatable("arguments.item.malformed", error) + ); + private final Text copyButton = Text.literal("NBT").setStyle(Style.EMPTY + .withFormatting(Formatting.UNDERLINE) + .withClickEvent(new MeteorClickEvent( + ClickEvent.Action.RUN_COMMAND, + this.toString("copy") + )) + .withHoverEvent(new HoverEvent( + HoverEvent.Action.SHOW_TEXT, + Text.literal("Copy the NBT data to your clipboard.") + ))); + public NbtCommand() { super("nbt", "Modifies NBT data for an item, example: .nbt add {display:{Name:'{\"text\":\"$cRed Name\"}'}}"); } @Override public void build(LiteralArgumentBuilder builder) { - builder.executes(context -> { - error("This command is not yet updated for 1.20.5 and above!"); - return SINGLE_SUCCESS; - }); - - // TODO: Update using Components over NBT - /*builder.then(literal("add").then(argument("nbt", CompoundNbtTagArgumentType.create()).executes(s -> { + builder.then(literal("add").then(argument("component", ComponentMapArgumentType.componentMap(REGISTRY_ACCESS)).executes(ctx -> { ItemStack stack = mc.player.getInventory().getMainHandStack(); if (validBasic(stack)) { - NbtCompound tag = CompoundNbtTagArgumentType.get(s); + ComponentMap itemComponents = stack.getComponents(); + ComponentMap newComponents = ComponentMapArgumentType.getComponentMap(ctx, "component"); - if (tag != null) { - ItemStack newStack = ItemStack.fromNbtOrEmpty(mc.world.getRegistryManager(), tag); - newStack.applyComponentsFrom(stack.getComponents()); + ComponentMap testComponents = ComponentMap.of(itemComponents, newComponents); + DataResult dataResult = ItemStack.validateComponents(testComponents); + dataResult.getOrThrow(MALFORMED_ITEM_EXCEPTION::create); - setStack(newStack); - } else { - error("Some of the NBT data could not be found, try using: " + Config.get().prefix.get() + "nbt set {nbt}"); - } + stack.applyComponentsFrom(testComponents); + + setStack(stack); } return SINGLE_SUCCESS; }))); - builder.then(literal("set").then(argument("nbt", CompoundNbtTagArgumentType.create()).executes(context -> { + builder.then(literal("set").then(argument("component", ComponentMapArgumentType.componentMap(REGISTRY_ACCESS)).executes(ctx -> { ItemStack stack = mc.player.getInventory().getMainHandStack(); if (validBasic(stack)) { - stack = ItemStack.fromNbtOrEmpty(mc.world.getRegistryManager(), CompoundNbtTagArgumentType.get(context)); + ComponentMap components = ComponentMapArgumentType.getComponentMap(ctx, "component"); + ComponentMapImpl stackComponents = (ComponentMapImpl) stack.getComponents(); + + DataResult dataResult = ItemStack.validateComponents(components); + dataResult.getOrThrow(MALFORMED_ITEM_EXCEPTION::create); + + ComponentChanges.Builder changesBuilder = ComponentChanges.builder(); + Set> types = stackComponents.getTypes(); + + //set changes + for (Component entry : components) { + changesBuilder.add(entry); + types.remove(entry.type()); + } + + //remove the rest + for (DataComponentType type : types) { + changesBuilder.remove(type); + } + + stackComponents.applyChanges(changesBuilder.build()); + setStack(stack); } return SINGLE_SUCCESS; }))); - builder.then(literal("remove").then(argument("nbt_path", NbtPathArgumentType.nbtPath()).executes(context -> { + builder.then(literal("remove").then(argument("component", RegistryKeyArgumentType.registryKey(RegistryKeys.DATA_COMPONENT_TYPE)).executes(ctx -> { ItemStack stack = mc.player.getInventory().getMainHandStack(); if (validBasic(stack)) { - NbtPathArgumentType.NbtPath path = context.getArgument("nbt_path", NbtPathArgumentType.NbtPath.class); - path.remove(stack.encode(mc.world.getRegistryManager())); + @SuppressWarnings("unchecked") + RegistryKey> componentTypeKey = (RegistryKey>) ctx.getArgument("component", RegistryKey.class); + + DataComponentType componentType = Registries.DATA_COMPONENT_TYPE.get(componentTypeKey); + + ComponentMapImpl components = (ComponentMapImpl) stack.getComponents(); + components.applyChanges(ComponentChanges.builder().remove(componentType).build()); + + setStack(stack); } return SINGLE_SUCCESS; + }).suggests((ctx, suggestionsBuilder) -> { + ItemStack stack = mc.player.getInventory().getMainHandStack(); + if (stack != ItemStack.EMPTY) { + ComponentMap components = stack.getComponents(); + return CommandSource.suggestMatching(components.getTypes().stream().map(Registries.DATA_COMPONENT_TYPE::getEntry).map(RegistryEntry::getIdAsString), suggestionsBuilder); + } + return suggestionsBuilder.buildFuture(); }))); builder.then(literal("get").executes(context -> { - ItemStack stack = mc.player.getInventory().getMainHandStack(); + DataCommandObject dataCommandObject = new EntityDataObject(mc.player); + NbtPathArgumentType.NbtPath handPath = NbtPathArgumentType.NbtPath.parse("SelectedItem"); - if (stack == null) { - error("You must hold an item in your main hand."); - } else { - ComponentMap components = stack.getComponents(); + MutableText text = Text.empty().append(copyButton); - MutableText copyButton = Text.literal("NBT"); - copyButton.setStyle(copyButton.getStyle() - .withFormatting(Formatting.UNDERLINE) - .withClickEvent(new MeteorClickEvent( - ClickEvent.Action.RUN_COMMAND, - this.toString("copy") - )) - .withHoverEvent(new HoverEvent( - HoverEvent.Action.SHOW_TEXT, - Text.literal("Copy the NBT data to your clipboard.") - ))); - - MutableText text = Text.literal(""); - text.append(copyButton); - - if (components == null) text.append("{}"); - else text.append(" ").append(Text.of(components.toString())); - - info(text); + try { + List nbtElement = handPath.get(dataCommandObject.getNbt()); + if (!nbtElement.isEmpty()) { + text.append(" ").append(NbtHelper.toPrettyPrintedText(nbtElement.getFirst())); + } + } catch (CommandSyntaxException e) { + text.append("{}"); } + info(text); + return SINGLE_SUCCESS; })); builder.then(literal("copy").executes(context -> { - ItemStack stack = mc.player.getInventory().getMainHandStack(); - - if (stack == null) { - error("You must hold an item in your main hand."); - } else { - ComponentMap components = stack.getComponents(); - mc.keyboard.setClipboard(components.toString()); - MutableText nbt = Text.literal("NBT"); - nbt.setStyle(nbt.getStyle() - .withFormatting(Formatting.UNDERLINE) - .withHoverEvent(new HoverEvent( - HoverEvent.Action.SHOW_TEXT, - Text.of(components.toString()) - ))); - - MutableText text = Text.literal(""); - text.append(nbt); - text.append(Text.literal(" data copied!")); - - info(text); - } + DataCommandObject dataCommandObject = new EntityDataObject(mc.player); + NbtPathArgumentType.NbtPath handPath = NbtPathArgumentType.NbtPath.parse("SelectedItem"); - return SINGLE_SUCCESS; - })); + MutableText text = Text.empty().append(copyButton); + String nbt = "{}"; - builder.then(literal("paste").executes(context -> { - ItemStack stack = mc.player.getInventory().getMainHandStack(); - - if (validBasic(stack)) { - NbtCompound nbt = CompoundNbtTagArgumentType.create().parse(new StringReader(mc.keyboard.getClipboard())); + try { + List nbtElement = handPath.get(dataCommandObject.getNbt()); + if (!nbtElement.isEmpty()) { + text.append(" ").append(NbtHelper.toPrettyPrintedText(nbtElement.getFirst())); + nbt = nbtElement.getFirst().toString(); + } + } catch (CommandSyntaxException e) { + text.append("{}"); + } - stack = ItemStack.fromNbtOrEmpty(mc.world.getRegistryManager(), nbt); + mc.keyboard.setClipboard(nbt); - setStack(stack); - } + text.append(" data copied!"); + info(text); return SINGLE_SUCCESS; })); @@ -164,7 +190,7 @@ public void build(LiteralArgumentBuilder builder) { } return SINGLE_SUCCESS; - })));*/ + }))); } private void setStack(ItemStack stack) { @@ -177,7 +203,7 @@ private boolean validBasic(ItemStack stack) { return false; } - if (stack == null) { + if (stack == ItemStack.EMPTY) { error("You must hold an item in your main hand."); return false; } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/ComponentMapReader.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/ComponentMapReader.java new file mode 100644 index 0000000000..2ed916302c --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/ComponentMapReader.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.utils.misc; + +import com.mojang.brigadier.StringReader; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.brigadier.exceptions.Dynamic2CommandExceptionType; +import com.mojang.brigadier.exceptions.DynamicCommandExceptionType; +import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; +import com.mojang.brigadier.suggestion.Suggestions; +import com.mojang.brigadier.suggestion.SuggestionsBuilder; +import com.mojang.serialization.DataResult; +import com.mojang.serialization.DynamicOps; +import it.unimi.dsi.fastutil.objects.ReferenceArraySet; +import net.minecraft.command.CommandRegistryAccess; +import net.minecraft.command.CommandSource; +import net.minecraft.component.ComponentMap; +import net.minecraft.component.DataComponentType; +import net.minecraft.nbt.NbtElement; +import net.minecraft.nbt.NbtOps; +import net.minecraft.nbt.StringNbtReader; +import net.minecraft.registry.Registries; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; + +import java.util.Locale; +import java.util.Set; +import java.util.concurrent.CompletableFuture; +import java.util.function.Function; + +public class ComponentMapReader { + private static final DynamicCommandExceptionType UNKNOWN_COMPONENT_EXCEPTION = new DynamicCommandExceptionType( + id -> Text.stringifiedTranslatable("arguments.item.component.unknown", id) + ); + private static final SimpleCommandExceptionType COMPONENT_EXPECTED_EXCEPTION = new SimpleCommandExceptionType(Text.translatable("arguments.item.component.expected")); + private static final DynamicCommandExceptionType REPEATED_COMPONENT_EXCEPTION = new DynamicCommandExceptionType( + type -> Text.stringifiedTranslatable("arguments.item.component.repeated", type) + ); + private static final Dynamic2CommandExceptionType MALFORMED_COMPONENT_EXCEPTION = new Dynamic2CommandExceptionType( + (type, error) -> Text.stringifiedTranslatable("arguments.item.component.malformed", type, error) + ); + private final DynamicOps nbtOps; + + public ComponentMapReader(CommandRegistryAccess commandRegistryAccess) { + this.nbtOps = commandRegistryAccess.getOps(NbtOps.INSTANCE); + } + + public ComponentMap consume(StringReader reader) throws CommandSyntaxException { + int cursor = reader.getCursor(); + + try { + return new Reader(reader, nbtOps).read(); + } catch (CommandSyntaxException e) { + reader.setCursor(cursor); + throw e; + } + } + + public CompletableFuture getSuggestions(SuggestionsBuilder builder) { + StringReader stringReader = new StringReader(builder.getInput()); + stringReader.setCursor(builder.getStart()); + Reader reader = new Reader(stringReader, nbtOps); + + try { + reader.read(); + } catch (CommandSyntaxException ignored) { + } + + return reader.suggestor.apply(builder.createOffset(stringReader.getCursor())); + } + + private static class Reader { + private static final Function> SUGGEST_DEFAULT = SuggestionsBuilder::buildFuture; + private final StringReader reader; + private final DynamicOps nbtOps; + public Function> suggestor = this::suggestBracket; + + public Reader(StringReader reader, DynamicOps nbtOps) { + this.reader = reader; + this.nbtOps = nbtOps; + } + + public ComponentMap read() throws CommandSyntaxException { + ComponentMap.Builder builder = ComponentMap.builder(); + + reader.expect('['); + suggestor = this::suggestComponentType; + Set> set = new ReferenceArraySet<>(); + + while(reader.canRead() && reader.peek() != ']') { + reader.skipWhitespace(); + DataComponentType dataComponentType = readComponentType(reader); + if (!set.add(dataComponentType)) { + throw REPEATED_COMPONENT_EXCEPTION.create(dataComponentType); + } + + suggestor = this::suggestEqual; + reader.skipWhitespace(); + reader.expect('='); + suggestor = SUGGEST_DEFAULT; + reader.skipWhitespace(); + this.readComponentValue(reader, builder, dataComponentType); + reader.skipWhitespace(); + suggestor = this::suggestEndOfComponent; + if (!reader.canRead() || reader.peek() != ',') { + break; + } + + reader.skip(); + reader.skipWhitespace(); + suggestor = this::suggestComponentType; + if (!reader.canRead()) { + throw COMPONENT_EXPECTED_EXCEPTION.createWithContext(reader); + } + } + + reader.expect(']'); + suggestor = SUGGEST_DEFAULT; + + return builder.build(); + } + + public static DataComponentType readComponentType(StringReader reader) throws CommandSyntaxException { + if (!reader.canRead()) { + throw COMPONENT_EXPECTED_EXCEPTION.createWithContext(reader); + } else { + int i = reader.getCursor(); + Identifier identifier = Identifier.fromCommandInput(reader); + DataComponentType dataComponentType = Registries.DATA_COMPONENT_TYPE.get(identifier); + if (dataComponentType != null && !dataComponentType.shouldSkipSerialization()) { + return dataComponentType; + } else { + reader.setCursor(i); + throw UNKNOWN_COMPONENT_EXCEPTION.createWithContext(reader, identifier); + } + } + } + + private CompletableFuture suggestComponentType(SuggestionsBuilder builder) { + String string = builder.getRemaining().toLowerCase(Locale.ROOT); + CommandSource.forEachMatching(Registries.DATA_COMPONENT_TYPE.getEntrySet(), string, entry -> entry.getKey().getValue(), entry -> { + DataComponentType dataComponentType = entry.getValue(); + if (dataComponentType.getCodec() != null) { + Identifier identifier = entry.getKey().getValue(); + builder.suggest(identifier.toString() + "="); + } + }); + return builder.buildFuture(); + } + + private void readComponentValue(StringReader reader, ComponentMap.Builder builder, DataComponentType type) throws CommandSyntaxException { + int i = reader.getCursor(); + NbtElement nbtElement = new StringNbtReader(reader).parseElement(); + DataResult dataResult = type.getCodecOrThrow().parse(this.nbtOps, nbtElement); + builder.add(type, dataResult.getOrThrow(error -> { + reader.setCursor(i); + return MALFORMED_COMPONENT_EXCEPTION.createWithContext(reader, type.toString(), error); + })); + } + + private CompletableFuture suggestBracket(SuggestionsBuilder builder) { + if (builder.getRemaining().isEmpty()) { + builder.suggest(String.valueOf('[')); + } + + return builder.buildFuture(); + } + + private CompletableFuture suggestEndOfComponent(SuggestionsBuilder builder) { + if (builder.getRemaining().isEmpty()) { + builder.suggest(String.valueOf(',')); + builder.suggest(String.valueOf(']')); + } + + return builder.buildFuture(); + } + + private CompletableFuture suggestEqual(SuggestionsBuilder builder) { + if (builder.getRemaining().isEmpty()) { + builder.suggest(String.valueOf('=')); + } + + return builder.buildFuture(); + } + } +} From bb6428535aba894afc27e2024302dc1c3b94228b Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Thu, 20 Jun 2024 21:35:28 +0100 Subject: [PATCH 307/357] Fix suggestions for remove argument --- .../commands/commands/NbtCommand.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/NbtCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/NbtCommand.java index 3acda1c180..6fd7280ba6 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/NbtCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/NbtCommand.java @@ -26,12 +26,12 @@ import net.minecraft.registry.Registries; import net.minecraft.registry.RegistryKey; import net.minecraft.registry.RegistryKeys; -import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.text.*; import net.minecraft.util.Formatting; import net.minecraft.util.Unit; import java.util.List; +import java.util.Locale; import java.util.Set; import static com.mojang.brigadier.Command.SINGLE_SUCCESS; @@ -129,8 +129,21 @@ public void build(LiteralArgumentBuilder builder) { ItemStack stack = mc.player.getInventory().getMainHandStack(); if (stack != ItemStack.EMPTY) { ComponentMap components = stack.getComponents(); - return CommandSource.suggestMatching(components.getTypes().stream().map(Registries.DATA_COMPONENT_TYPE::getEntry).map(RegistryEntry::getIdAsString), suggestionsBuilder); + 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(); + return null; + }, entry -> { + DataComponentType dataComponentType = entry.value(); + if (dataComponentType.getCodec() != null) { + if (entry.getKey().isPresent()) { + suggestionsBuilder.suggest(entry.getKey().get().getValue().toString()); + } + } + }); } + return suggestionsBuilder.buildFuture(); }))); From 5debbd3423882392a64f79fa1c49edf047e92a17 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Thu, 20 Jun 2024 21:52:06 +0100 Subject: [PATCH 308/357] Remove unused imports in commands --- .../meteorclient/commands/commands/BindsCommand.java | 2 -- .../meteorclient/commands/commands/CommandsCommand.java | 2 -- .../meteorclient/commands/commands/DamageCommand.java | 3 --- .../meteorclient/commands/commands/DisconnectCommand.java | 3 --- .../meteorclient/commands/commands/DismountCommand.java | 3 --- .../meteorclient/commands/commands/DropCommand.java | 3 --- .../meteorclient/commands/commands/EnchantCommand.java | 3 --- .../meteorclient/commands/commands/EnderChestCommand.java | 2 -- .../meteorclient/commands/commands/FakePlayerCommand.java | 2 -- .../meteorclient/commands/commands/FovCommand.java | 3 --- .../meteorclient/commands/commands/FriendsCommand.java | 2 -- .../meteorclient/commands/commands/GamemodeCommand.java | 3 --- .../meteorclient/commands/commands/GiveCommand.java | 3 --- .../meteorclient/commands/commands/HClipCommand.java | 3 --- .../meteorclient/commands/commands/InputCommand.java | 3 --- .../meteorclient/commands/commands/InventoryCommand.java | 2 -- .../meteorclient/commands/commands/LocateCommand.java | 3 --- .../meteorclient/commands/commands/MacroCommand.java | 2 -- .../meteorclient/commands/commands/ModulesCommand.java | 2 -- .../meteorclient/commands/commands/NameHistoryCommand.java | 3 --- .../meteorclient/commands/commands/NbtCommand.java | 3 --- .../meteorclient/commands/commands/NotebotCommand.java | 2 -- .../meteorclient/commands/commands/PeekCommand.java | 3 --- .../meteorclient/commands/commands/ProfilesCommand.java | 2 -- .../meteorclient/commands/commands/ReloadCommand.java | 2 -- .../meteorclient/commands/commands/ResetCommand.java | 2 -- .../meteorclient/commands/commands/RotationCommand.java | 3 --- .../meteorclient/commands/commands/SaveMapCommand.java | 3 --- .../meteorclient/commands/commands/SayCommand.java | 3 --- .../meteorclient/commands/commands/ServerCommand.java | 3 --- .../meteorclient/commands/commands/SettingCommand.java | 2 -- .../meteorclient/commands/commands/SpectateCommand.java | 3 --- .../meteorclient/commands/commands/SwarmCommand.java | 3 --- .../meteorclient/commands/commands/ToggleCommand.java | 2 -- .../meteorclient/commands/commands/VClipCommand.java | 3 --- .../meteorclient/commands/commands/WaypointCommand.java | 3 --- 36 files changed, 94 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/BindsCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/BindsCommand.java index fa4ee582b5..ee2fb642c5 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/BindsCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/BindsCommand.java @@ -19,8 +19,6 @@ import java.util.List; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; - public class BindsCommand extends Command { public BindsCommand() { super("binds", "List of all bound modules."); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java index d58aed7a2f..63d6fb3ac2 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java @@ -18,8 +18,6 @@ import net.minecraft.text.Text; import net.minecraft.util.Formatting; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; - public class CommandsCommand extends Command { public CommandsCommand() { super("commands", "List of all commands.", "help"); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/DamageCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/DamageCommand.java index a334d17d67..1da52c8ca9 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/DamageCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/DamageCommand.java @@ -17,9 +17,6 @@ import net.minecraft.text.Text; import net.minecraft.util.math.Vec3d; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; -import static meteordevelopment.meteorclient.MeteorClient.mc; - public class DamageCommand extends Command { private final static SimpleCommandExceptionType INVULNERABLE = new SimpleCommandExceptionType(Text.literal("You are invulnerable.")); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/DisconnectCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/DisconnectCommand.java index f87c0ff178..f43585276a 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/DisconnectCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/DisconnectCommand.java @@ -13,9 +13,6 @@ import net.minecraft.text.Text; import net.minecraft.util.Formatting; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; -import static meteordevelopment.meteorclient.MeteorClient.mc; - public class DisconnectCommand extends Command { public DisconnectCommand() { super("disconnect", "Disconnect from the server", "dc"); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/DismountCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/DismountCommand.java index d399f619ba..ece93ae0ec 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/DismountCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/DismountCommand.java @@ -10,9 +10,6 @@ import net.minecraft.command.CommandSource; import net.minecraft.network.packet.c2s.play.PlayerInputC2SPacket; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; -import static meteordevelopment.meteorclient.MeteorClient.mc; - public class DismountCommand extends Command { public DismountCommand() { super("dismount", "Dismounts you from entity you are riding."); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/DropCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/DropCommand.java index 976a47496f..b0eed195f6 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/DropCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/DropCommand.java @@ -17,9 +17,6 @@ import net.minecraft.item.Items; import net.minecraft.text.Text; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; -import static meteordevelopment.meteorclient.MeteorClient.mc; - 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!")); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/EnchantCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/EnchantCommand.java index f8b981b22a..cc2160d3ac 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/EnchantCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/EnchantCommand.java @@ -24,9 +24,6 @@ import java.util.function.ToIntFunction; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; -import static meteordevelopment.meteorclient.MeteorClient.mc; - 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.")); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/EnderChestCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/EnderChestCommand.java index f411ab5214..818bf8bb27 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/EnderChestCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/EnderChestCommand.java @@ -12,8 +12,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.item.Items; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; - public class EnderChestCommand extends Command { public EnderChestCommand() { super("ender-chest", "Allows you to preview memory of your ender chest.", "ec", "echest"); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/FakePlayerCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/FakePlayerCommand.java index 4a05f24d14..5374e1f503 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/FakePlayerCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/FakePlayerCommand.java @@ -16,8 +16,6 @@ import meteordevelopment.meteorclient.utils.player.ChatUtils; import net.minecraft.command.CommandSource; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; - public class FakePlayerCommand extends Command { public FakePlayerCommand() { super("fake-player", "Manages fake players that you can use for testing."); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/FovCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/FovCommand.java index 1a1fce9bd9..225e015075 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/FovCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/FovCommand.java @@ -11,9 +11,6 @@ import meteordevelopment.meteorclient.mixininterface.ISimpleOption; import net.minecraft.command.CommandSource; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; -import static meteordevelopment.meteorclient.MeteorClient.mc; - public class FovCommand extends Command { public FovCommand() { super("fov", "Changes your fov."); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/FriendsCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/FriendsCommand.java index 66a1228f06..20c2996fbc 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/FriendsCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/FriendsCommand.java @@ -16,8 +16,6 @@ import net.minecraft.command.CommandSource; import net.minecraft.util.Formatting; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; - public class FriendsCommand extends Command { public FriendsCommand() { super("friends", "Manages friends."); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/GamemodeCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/GamemodeCommand.java index f2ec5840ec..9069a4859b 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/GamemodeCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/GamemodeCommand.java @@ -10,9 +10,6 @@ import net.minecraft.command.CommandSource; import net.minecraft.world.GameMode; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; -import static meteordevelopment.meteorclient.MeteorClient.mc; - public class GamemodeCommand extends Command { public GamemodeCommand() { super("gamemode", "Changes your gamemode client-side.", "gm"); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/GiveCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/GiveCommand.java index 83ad311c21..ee25126aca 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/GiveCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/GiveCommand.java @@ -17,9 +17,6 @@ import net.minecraft.network.packet.c2s.play.CreativeInventoryActionC2SPacket; import net.minecraft.text.Text; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; -import static meteordevelopment.meteorclient.MeteorClient.mc; - 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.")); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/HClipCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/HClipCommand.java index 2898560650..2af1daa8f3 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/HClipCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/HClipCommand.java @@ -12,9 +12,6 @@ import net.minecraft.entity.Entity; import net.minecraft.util.math.Vec3d; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; -import static meteordevelopment.meteorclient.MeteorClient.mc; - public class HClipCommand extends Command { public HClipCommand() { super("hclip", "Lets you clip through blocks horizontally."); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/InputCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/InputCommand.java index bb6f281619..6d1041047b 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/InputCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/InputCommand.java @@ -18,9 +18,6 @@ import java.util.List; import java.util.Map; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; -import static meteordevelopment.meteorclient.MeteorClient.mc; - public class InputCommand extends Command { private static final List activeHandlers = new ArrayList<>(); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/InventoryCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/InventoryCommand.java index 63c488a41b..8ef230967c 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/InventoryCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/InventoryCommand.java @@ -12,8 +12,6 @@ import net.minecraft.client.gui.screen.ingame.InventoryScreen; import net.minecraft.command.CommandSource; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; - public class InventoryCommand extends Command { public InventoryCommand() { super("inventory", "Allows you to see parts of another player's inventory.", "inv", "invsee"); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/LocateCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/LocateCommand.java index 82892f461f..a4c5325e3c 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/LocateCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/LocateCommand.java @@ -38,9 +38,6 @@ import java.util.List; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; -import static meteordevelopment.meteorclient.MeteorClient.mc; - public class LocateCommand extends Command { private Vec3d firstStart; private Vec3d firstEnd; diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/MacroCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/MacroCommand.java index b7feaa6d0c..564656c747 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/MacroCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/MacroCommand.java @@ -11,8 +11,6 @@ import meteordevelopment.meteorclient.systems.macros.Macro; import net.minecraft.command.CommandSource; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; - public class MacroCommand extends Command { public MacroCommand() { super("macro", "Allows you to execute macros."); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ModulesCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ModulesCommand.java index da7b3ad220..3be1156fd1 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ModulesCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ModulesCommand.java @@ -16,8 +16,6 @@ import net.minecraft.text.Text; import net.minecraft.util.Formatting; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; - public class ModulesCommand extends Command { public ModulesCommand() { super("modules", "Displays a list of all modules.", "features"); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/NameHistoryCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/NameHistoryCommand.java index 144110182b..10ca1a99df 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/NameHistoryCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/NameHistoryCommand.java @@ -24,9 +24,6 @@ import java.util.Date; import java.util.UUID; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; -import static meteordevelopment.meteorclient.MeteorClient.mc; - public class NameHistoryCommand extends Command { public NameHistoryCommand() { super("name-history", "Provides a list of a players previous names from the laby.net api.", "history", "names"); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/NbtCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/NbtCommand.java index 6fd7280ba6..33e0f5356e 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/NbtCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/NbtCommand.java @@ -34,9 +34,6 @@ import java.util.Locale; import java.util.Set; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; -import static meteordevelopment.meteorclient.MeteorClient.mc; - public class NbtCommand extends Command { private static final DynamicCommandExceptionType MALFORMED_ITEM_EXCEPTION = new DynamicCommandExceptionType( error -> Text.stringifiedTranslatable("arguments.item.malformed", error) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/NotebotCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/NotebotCommand.java index f506ec017b..a0d5c8740b 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/NotebotCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/NotebotCommand.java @@ -33,8 +33,6 @@ import java.util.List; import java.util.Map; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; - public class NotebotCommand extends Command { private final static SimpleCommandExceptionType INVALID_SONG = new SimpleCommandExceptionType(Text.literal("Invalid song.")); private final static DynamicCommandExceptionType INVALID_PATH = new DynamicCommandExceptionType(object -> Text.literal("'%s' is not a valid path.".formatted(object))); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/PeekCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/PeekCommand.java index efffa35bd7..28d589165d 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/PeekCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/PeekCommand.java @@ -13,9 +13,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.text.Text; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; -import static meteordevelopment.meteorclient.MeteorClient.mc; - public class PeekCommand extends Command { private static final ItemStack[] ITEMS = new ItemStack[27]; private static final SimpleCommandExceptionType NOT_HOLDING_SHULKER_BOX = new SimpleCommandExceptionType(Text.literal("You must be holding a storage block with items in it.")); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ProfilesCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ProfilesCommand.java index baea74d22d..43c816f1c1 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ProfilesCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ProfilesCommand.java @@ -12,8 +12,6 @@ import meteordevelopment.meteorclient.systems.profiles.Profiles; import net.minecraft.command.CommandSource; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; - public class ProfilesCommand extends Command { public ProfilesCommand() { diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ReloadCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ReloadCommand.java index 2f2a56d417..f299819854 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ReloadCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ReloadCommand.java @@ -15,8 +15,6 @@ import meteordevelopment.meteorclient.utils.network.MeteorExecutor; import net.minecraft.command.CommandSource; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; - public class ReloadCommand extends Command { public ReloadCommand() { super("reload", "Reloads many systems."); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ResetCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ResetCommand.java index 4b080c4c2e..65ec6e21d6 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ResetCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ResetCommand.java @@ -17,8 +17,6 @@ import meteordevelopment.meteorclient.utils.player.ChatUtils; import net.minecraft.command.CommandSource; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; - public class ResetCommand extends Command { public ResetCommand() { diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/RotationCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/RotationCommand.java index a0c513391d..0910a87379 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/RotationCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/RotationCommand.java @@ -13,9 +13,6 @@ import net.minecraft.util.math.Direction; import net.minecraft.util.math.MathHelper; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; -import static meteordevelopment.meteorclient.MeteorClient.mc; - public class RotationCommand extends Command { public RotationCommand() { super("rotation", "Modifies your rotation."); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/SaveMapCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/SaveMapCommand.java index 75d71a301c..573cd90d23 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/SaveMapCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/SaveMapCommand.java @@ -32,9 +32,6 @@ import java.io.IOException; import java.nio.ByteBuffer; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; -import static meteordevelopment.meteorclient.MeteorClient.mc; - 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.")); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/SayCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/SayCommand.java index 0c09971bbd..f9e868490a 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/SayCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/SayCommand.java @@ -21,9 +21,6 @@ import java.time.Instant; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; -import static meteordevelopment.meteorclient.MeteorClient.mc; - public class SayCommand extends Command { public SayCommand() { super("say", "Sends messages in chat."); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java index 0bb768307f..eeb22e5ffb 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java @@ -38,9 +38,6 @@ import java.util.Random; import java.util.Set; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; -import static meteordevelopment.meteorclient.MeteorClient.mc; - public class ServerCommand extends Command { private static final Set ANTICHEAT_LIST = Set.of("nocheatplus", "negativity", "warden", "horizon", "illegalstack", "coreprotect", "exploitsx", "vulcan", "abc", "spartan", "kauri", "anticheatreloaded", "witherac", "godseye", "matrix", "wraith", "antixrayheuristics", "grimac"); private static final Set VERSION_ALIASES = Set.of("version", "ver", "about", "bukkit:version", "bukkit:ver", "bukkit:about"); // aliases for bukkit:version diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/SettingCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/SettingCommand.java index 87b43478c8..ec95761519 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/SettingCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/SettingCommand.java @@ -19,8 +19,6 @@ import meteordevelopment.meteorclient.utils.Utils; import net.minecraft.command.CommandSource; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; - public class SettingCommand extends Command { public SettingCommand() { super("settings", "Allows you to view and change module settings.", "s"); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/SpectateCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/SpectateCommand.java index 9b8d70ce16..a3e21115a0 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/SpectateCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/SpectateCommand.java @@ -14,9 +14,6 @@ import net.minecraft.command.CommandSource; import net.minecraft.text.Text; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; -import static meteordevelopment.meteorclient.MeteorClient.mc; - public class SpectateCommand extends Command { private final StaticListener shiftListener = new StaticListener(); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java index 748fb2d0a5..1a174501b5 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java @@ -38,9 +38,6 @@ import java.util.List; import java.util.Random; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; -import static meteordevelopment.meteorclient.MeteorClient.mc; - 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.")); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ToggleCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ToggleCommand.java index 96ae914310..0f58000c0d 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ToggleCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ToggleCommand.java @@ -15,8 +15,6 @@ import java.util.ArrayList; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; - public class ToggleCommand extends Command { public ToggleCommand() { super("toggle", "Toggles a module.", "t"); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/VClipCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/VClipCommand.java index 19da05bab3..e4a04d056f 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/VClipCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/VClipCommand.java @@ -12,9 +12,6 @@ import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket; import net.minecraft.network.packet.c2s.play.VehicleMoveC2SPacket; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; -import static meteordevelopment.meteorclient.MeteorClient.mc; - public class VClipCommand extends Command { public VClipCommand() { super("vclip", "Lets you clip through blocks vertically."); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/WaypointCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/WaypointCommand.java index 598c4fd308..ac776f63c6 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/WaypointCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/WaypointCommand.java @@ -19,9 +19,6 @@ import net.minecraft.util.Formatting; import net.minecraft.util.math.BlockPos; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; -import static meteordevelopment.meteorclient.MeteorClient.mc; - public class WaypointCommand extends Command { public WaypointCommand() { super("waypoint", "Manages waypoints.", "wp"); From f68e3f3b219309325b0701ef9a147157d56d652a Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Thu, 20 Jun 2024 19:25:54 +0100 Subject: [PATCH 309/357] Add auto wasp module --- .../meteorclient/commands/Commands.java | 1 + .../commands/commands/WaspCommand.java | 40 ++++ .../meteorclient/systems/modules/Modules.java | 1 + .../systems/modules/movement/AutoWasp.java | 222 ++++++++++++++++++ 4 files changed, 264 insertions(+) create mode 100644 src/main/java/meteordevelopment/meteorclient/commands/commands/WaspCommand.java create mode 100644 src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AutoWasp.java diff --git a/src/main/java/meteordevelopment/meteorclient/commands/Commands.java b/src/main/java/meteordevelopment/meteorclient/commands/Commands.java index 65325783f3..de498a625c 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/Commands.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/Commands.java @@ -60,6 +60,7 @@ public static void init() { add(new RotationCommand()); add(new WaypointCommand()); add(new InputCommand()); + add(new WaspCommand()); add(new LocateCommand()); COMMANDS.sort(Comparator.comparing(Command::getName)); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/WaspCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/WaspCommand.java new file mode 100644 index 0000000000..a4c16ae511 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/WaspCommand.java @@ -0,0 +1,40 @@ +package meteordevelopment.meteorclient.commands.commands; + +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; +import meteordevelopment.meteorclient.commands.Command; +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; + +public class WaspCommand extends Command { + private static final SimpleCommandExceptionType CANT_WASP_SELF = new SimpleCommandExceptionType(Text.literal("You cannot target yourself!")); + + public WaspCommand() { + super("wasp", "Sets the auto wasp target."); + } + + @Override + public void build(LiteralArgumentBuilder builder) { + AutoWasp wasp = Modules.get().get(AutoWasp.class); + + builder.then(literal("reset").executes(context -> { + if (wasp.isActive()) wasp.toggle(); + return SINGLE_SUCCESS; + })); + + builder.then(argument("player", PlayerArgumentType.create()).executes(context -> { + PlayerEntity player = PlayerArgumentType.get(context); + + if (player == mc.player) throw CANT_WASP_SELF.create(); + + wasp.target = player; + if (!wasp.isActive()) wasp.toggle(); + info(player.getName().getString() + " set as target."); + return SINGLE_SUCCESS; + })); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java index e50ec6e586..602bd1ae6a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java @@ -465,6 +465,7 @@ private void initMovement() { add(new AntiVoid()); add(new AutoJump()); add(new AutoWalk()); + add(new AutoWasp()); add(new Blink()); add(new BoatFly()); add(new ClickTP()); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AutoWasp.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AutoWasp.java new file mode 100644 index 0000000000..0e081d9f44 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AutoWasp.java @@ -0,0 +1,222 @@ +package meteordevelopment.meteorclient.systems.modules.movement; + +import meteordevelopment.meteorclient.events.entity.player.PlayerMoveEvent; +import meteordevelopment.meteorclient.events.world.TickEvent; +import meteordevelopment.meteorclient.mixininterface.IVec3d; +import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.systems.friends.Friends; +import meteordevelopment.meteorclient.systems.modules.Categories; +import meteordevelopment.meteorclient.systems.modules.Module; +import meteordevelopment.meteorclient.utils.entity.SortPriority; +import meteordevelopment.meteorclient.utils.entity.TargetUtils; +import meteordevelopment.orbit.EventHandler; +import net.minecraft.entity.EquipmentSlot; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ElytraItem; +import net.minecraft.network.packet.c2s.play.ClientCommandC2SPacket; +import net.minecraft.network.packet.s2c.common.DisconnectS2CPacket; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.util.math.Vec3d; +import org.joml.Vector3d; + +public class AutoWasp extends Module { + private final SettingGroup sgGeneral = settings.getDefaultGroup(); + + private final Setting horizontalSpeed = sgGeneral.add(new DoubleSetting.Builder() + .name("horizontal-speed") + .description("Horizontal elytra speed.") + .defaultValue(2.0) + .build() + ); + + private final Setting verticalSpeed = sgGeneral.add(new DoubleSetting.Builder() + .name("vertical-speed") + .description("Vertical elytra speed.") + .defaultValue(3.0) + .build() + ); + + private final Setting avoidLanding = sgGeneral.add(new BoolSetting.Builder() + .name("avoid-landing") + .description("Will try to avoid landing if your target is on the ground.") + .defaultValue(true) + .build() + ); + + private final Setting predictMovement = sgGeneral.add(new BoolSetting.Builder() + .name("predict-movement") + .description("Tries to predict the targets position according to their movement.") + .defaultValue(true) + .build() + ); + + private final Setting onlyFriends = sgGeneral.add(new BoolSetting.Builder() + .name("only-friends") + .description("Will only follow friends.") + .defaultValue(false) + .build() + ); + + private final Setting action = sgGeneral.add(new EnumSetting.Builder() + .name("action-on-target-loss") + .description("What to do if you lose the target.") + .defaultValue(Action.TOGGLE) + .build() + ); + + private final Setting offset = sgGeneral.add(new Vector3dSetting.Builder() + .name("offset") + .description("How many blocks offset to wasp at from the target.") + .defaultValue(0, 0, 0) + .build() + ); + + public PlayerEntity target; + private int jumpTimer = 0; + private boolean incrementJumpTimer = false; + + public AutoWasp() { + super(Categories.Movement, "auto-wasp", "Wasps for you. Unable to traverse around blocks, assumes a clear straight line to the target."); + } + + @Override + public void onActivate() { + if (target == null || target.isRemoved()) { + target = (PlayerEntity) TargetUtils.get(entity -> { + if (!(entity instanceof PlayerEntity) || entity == mc.player) return false; + if (((PlayerEntity) entity).isDead() || ((PlayerEntity) entity).getHealth() <= 0) return false; + return !onlyFriends.get() || Friends.get().get((PlayerEntity) entity) != null; + }, SortPriority.LowestDistance); + + if (target == null) { + error("No valid targets."); + toggle(); + return; + } else info(target.getName().getString() + " set as target."); + } + + jumpTimer = 0; + incrementJumpTimer = false; + } + + @Override + public void onDeactivate() { + target = null; + } + + @EventHandler + private void onTick(TickEvent.Pre event) { + if (target.isRemoved()) { + warning("Lost target!"); + + switch (action.get()) { + case CHOOSE_NEW_TARGET -> onActivate(); + case TOGGLE -> toggle(); + case DISCONNECT -> + mc.player.networkHandler.onDisconnect(new DisconnectS2CPacket(Text.literal("%s[%sAuto Wasp%s] Lost target.".formatted(Formatting.GRAY, Formatting.BLUE, Formatting.GRAY)))); + } + + if (!isActive()) return; + } + + if (!(mc.player.getEquippedStack(EquipmentSlot.CHEST).getItem() instanceof ElytraItem)) return; + + if (incrementJumpTimer) { + jumpTimer++; + } + + if (!mc.player.isFallFlying()) { + if (!incrementJumpTimer) incrementJumpTimer = true; + + if (mc.player.isOnGround() && incrementJumpTimer) { + mc.player.jump(); + return; + } + + if (jumpTimer >= 4) { + jumpTimer = 0; + mc.player.setJumping(false); + mc.player.setSprinting(true); + mc.getNetworkHandler().sendPacket(new ClientCommandC2SPacket(mc.player, ClientCommandC2SPacket.Mode.START_FALL_FLYING)); + } + } else { + incrementJumpTimer = false; + jumpTimer = 0; + } + } + + @EventHandler + private void onMove(PlayerMoveEvent event) { + if (!(mc.player.getEquippedStack(EquipmentSlot.CHEST).getItem() instanceof ElytraItem)) return; + if (!mc.player.isFallFlying()) return; + + double xVel = 0, yVel = 0, zVel = 0; + + Vec3d targetPos = target.getPos().add(offset.get().x, offset.get().y, offset.get().z); + + if (predictMovement.get()) targetPos.add(PlayerEntity.adjustMovementForCollisions(target, target.getVelocity(), + target.getBoundingBox(), mc.world, mc.world.getEntityCollisions(target, target.getBoundingBox().stretch(target.getVelocity())))); + + if (avoidLanding.get()) { + double d = target.getBoundingBox().getLengthX() / 2; // x length = z length for players + + //get the block pos of the block underneath the corner of the targets bounding box + for (Direction dir : Direction.HORIZONTAL) { + BlockPos pos = BlockPos.ofFloored(targetPos.offset(dir, d).offset(dir.rotateYClockwise(), d)).down(); + if (mc.world.getBlockState(pos).getBlock().collidable && Math.abs(targetPos.getY() - (pos.getY() + 1)) <= 0.25) { + targetPos = new Vec3d(targetPos.x, pos.getY() + 1.25, targetPos.z); + break; + } + } + } + + double xDist = targetPos.getX() - mc.player.getX(); + double zDist = targetPos.getZ() - mc.player.getZ(); + + double absX = Math.abs(xDist); + double absZ = Math.abs(zDist); + + double diag = 0; + if (absX > 1.0E-5F && absZ > 1.0E-5F) diag = 1 / Math.sqrt(absX * absX + absZ * absZ); + + if (absX > 1.0E-5F) { + if (absX < horizontalSpeed.get()) xVel = xDist; + else xVel = horizontalSpeed.get() * Math.signum(xDist); + + if (diag != 0) xVel *= (absX * diag); + } + + if (absZ > 1.0E-5F) { + if (absZ < horizontalSpeed.get()) zVel = zDist; + else zVel = horizontalSpeed.get() * Math.signum(zDist); + + if (diag != 0) zVel *= (absZ * diag); + } + + double yDist = targetPos.getY() - mc.player.getY(); + if (Math.abs(yDist) > 1.0E-5F) { + if (Math.abs(yDist) < verticalSpeed.get()) yVel = yDist; + else yVel = verticalSpeed.get() * Math.signum(yDist); + } + + ((IVec3d) event.movement).set(xVel, yVel, zVel); + } + + public enum Action { + TOGGLE, + CHOOSE_NEW_TARGET, + DISCONNECT; + + @Override + public String toString() { + return switch (this) { + case TOGGLE -> "Toggle module"; + case CHOOSE_NEW_TARGET -> "Choose new target"; + case DISCONNECT -> "Disconnect"; + }; + } + } +} From 5b155609464d862888982deabb697133d83fd468 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Thu, 20 Jun 2024 19:33:04 +0100 Subject: [PATCH 310/357] Copyright notice --- .../meteorclient/commands/commands/WaspCommand.java | 5 +++++ .../meteorclient/systems/modules/movement/AutoWasp.java | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/WaspCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/WaspCommand.java index a4c16ae511..1b3fb81e6a 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/WaspCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/WaspCommand.java @@ -1,3 +1,8 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + package meteordevelopment.meteorclient.commands.commands; import com.mojang.brigadier.builder.LiteralArgumentBuilder; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AutoWasp.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AutoWasp.java index 0e081d9f44..851375e2ac 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AutoWasp.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AutoWasp.java @@ -1,3 +1,8 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + package meteordevelopment.meteorclient.systems.modules.movement; import meteordevelopment.meteorclient.events.entity.player.PlayerMoveEvent; From 74b80cfc555620773f2090702baa749906e2393f Mon Sep 17 00:00:00 2001 From: 19MisterX98 <41451155+19MisterX98@users.noreply.github.com> Date: Fri, 21 Jun 2024 18:05:17 +0200 Subject: [PATCH 311/357] fixed keybind issue with linux/x11 #4581 (#4600) --- .../meteorclient/mixin/KeyboardMixin.java | 8 ++++++++ .../meteorclient/utils/misc/input/Input.java | 10 ++++++++++ 2 files changed, 18 insertions(+) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/KeyboardMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/KeyboardMixin.java index 47a64b8ce8..a174506f36 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/KeyboardMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/KeyboardMixin.java @@ -30,6 +30,14 @@ public abstract class KeyboardMixin { @Inject(method = "onKey", at = @At("HEAD"), cancellable = true) public void onKey(long window, int key, int scancode, int action, int modifiers, CallbackInfo info) { if (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(key); + } else if (action == GLFW.GLFW_RELEASE) { + modifiers &= ~Input.getModifier(key); + } + if (client.currentScreen instanceof WidgetScreen && action == GLFW.GLFW_REPEAT) { ((WidgetScreen) client.currentScreen).keyRepeated(key, modifiers); } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/input/Input.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/input/Input.java index c556ae32b5..b723cc70ee 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/input/Input.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/input/Input.java @@ -60,4 +60,14 @@ public static void setCursorStyle(CursorStyle style) { lastCursorStyle = style; } } + + public static int getModifier(int key) { + return switch (key) { + case GLFW.GLFW_KEY_LEFT_SHIFT, GLFW.GLFW_KEY_RIGHT_SHIFT -> GLFW.GLFW_MOD_SHIFT; + case GLFW.GLFW_KEY_LEFT_CONTROL, GLFW.GLFW_KEY_RIGHT_CONTROL -> GLFW.GLFW_MOD_CONTROL; + case GLFW.GLFW_KEY_LEFT_ALT, GLFW.GLFW_KEY_RIGHT_ALT -> GLFW.GLFW_MOD_ALT; + case GLFW.GLFW_KEY_LEFT_SUPER, GLFW.GLFW_KEY_RIGHT_SUPER -> GLFW.GLFW_MOD_SUPER; + default -> 0; + }; + } } From 57f36cadbe2c680e3136b955fc245d8ed14b787c Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Sun, 23 Jun 2024 22:09:48 +0200 Subject: [PATCH 312/357] Future version 0.5.8 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 8e046fac85..7a142ecaa8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,7 +7,7 @@ loader_version=0.15.10 fapi_version=0.97.8+1.20.6 # Mod Properties -mod_version=0.5.7 +mod_version=0.5.8 maven_group=meteordevelopment archives_base_name=meteor-client From 0ce909cc676a5b73961aafb8bfddf89985353dea Mon Sep 17 00:00:00 2001 From: Big Iron <52252627+Big-Iron-Cheems@users.noreply.github.com> Date: Sun, 23 Jun 2024 22:26:38 +0200 Subject: [PATCH 313/357] 1.21 update (#4640) --- build.gradle | 4 +- gradle.properties | 24 ++- gradle/wrapper/gradle-wrapper.properties | 2 +- .../meteorclient/MeteorClient.java | 5 + .../commands/commands/EnchantCommand.java | 13 +- .../commands/commands/NbtCommand.java | 10 +- .../commands/commands/NotebotCommand.java | 40 ++-- .../events/render/TooltipDataEvent.java | 2 +- .../gui/renderer/GuiRenderer.java | 14 +- .../settings/BlockListSettingScreen.java | 6 +- .../DynamicRegistryListSettingScreen.java | 182 ++++++++++++++++++ .../EnchantmentListSettingScreen.java | 15 +- .../settings/ItemListSettingScreen.java | 2 +- .../settings/ModuleListSettingScreen.java | 2 +- .../settings/PacketBoolSettingScreen.java | 2 +- .../ParticleTypeListSettingScreen.java | 2 +- ...en.java => RegistryListSettingScreen.java} | 4 +- .../settings/ScreenHandlerSettingScreen.java | 2 +- .../settings/SoundEventListSettingScreen.java | 2 +- .../StatusEffectListSettingScreen.java | 2 +- .../StorageBlockListSettingScreen.java | 60 +++--- .../meteorclient/mixin/ArmorTrimMixin.java | 2 +- .../mixin/BlockModelRendererMixin.java | 25 ++- .../mixin/BufferBuilderAccessor.java | 8 +- .../meteorclient/mixin/BundleItemMixin.java | 4 +- .../meteorclient/mixin/CameraMixin.java | 8 +- .../mixin/ChunkBorderDebugRendererMixin.java | 2 +- .../mixin/ClientPlayerEntityMixin.java | 2 +- .../ClientPlayerInteractionManagerMixin.java | 11 -- .../meteorclient/mixin/CrashReportMixin.java | 4 +- .../meteorclient/mixin/DrawContextMixin.java | 2 +- ...chantingTableBlockEntityRendererMixin.java | 4 +- .../mixin/EndCrystalEntityRendererMixin.java | 6 +- .../mixin/EntityRenderDispatcherMixin.java | 2 +- .../mixin/FluidRendererMixin.java | 6 +- .../mixin/FoliageColorsMixin.java | 20 +- .../meteorclient/mixin/GameRendererMixin.java | 5 +- .../mixin/HeldItemRendererMixin.java | 3 +- .../meteorclient/mixin/InGameHudMixin.java | 13 +- .../meteorclient/mixin/ItemMixin.java | 3 +- .../meteorclient/mixin/ItemStackMixin.java | 4 +- .../mixin/LightningEntityRendererMixin.java | 8 +- .../mixin/LivingEntityAccessor.java | 4 - .../mixin/LivingEntityRendererMixin.java | 2 +- .../mixin/PlayerArmorSlotMixin.java | 28 +-- .../mixin/PlayerEntityRendererMixin.java | 4 +- ...ava => RenderTickCounterDynamicMixin.java} | 11 +- .../mixin/ShulkerBoxBlockMixin.java | 3 +- .../meteorclient/mixin/VertexBufferMixin.java | 10 +- .../mixin/WorldRendererAccessor.java | 3 +- .../mixin/WorldRendererMixin.java | 18 +- .../mixin/baritone/ComeCommandMixin.java | 2 +- .../mixin/sodium/MeshVertexConsumerMixin.java | 1 - .../meteorclient/renderer/Shader.java | 3 +- .../renderer/text/VanillaTextRenderer.java | 4 +- .../settings/BlockDataSetting.java | 2 +- .../settings/BlockListSetting.java | 2 +- .../meteorclient/settings/BlockSetting.java | 2 +- .../settings/EnchantmentListSetting.java | 86 ++++++--- .../settings/EntityTypeListSetting.java | 2 +- .../settings/ItemListSetting.java | 2 +- .../meteorclient/settings/ItemSetting.java | 2 +- .../settings/ParticleTypeListSetting.java | 2 +- .../settings/ScreenHandlerListSetting.java | 2 +- .../meteorclient/settings/Setting.java | 6 +- .../settings/SoundEventListSetting.java | 2 +- .../StatusEffectAmplifierMapSetting.java | 2 +- .../settings/StatusEffectListSetting.java | 2 +- .../settings/StorageBlockListSetting.java | 25 ++- .../systems/hud/elements/CombatHud.java | 43 ++--- .../systems/hud/elements/InventoryHud.java | 6 +- .../systems/hud/elements/PlayerModelHud.java | 2 +- .../meteorclient/systems/modules/Modules.java | 3 +- .../systems/modules/combat/AutoArmor.java | 36 ++-- .../systems/modules/combat/AutoEXP.java | 4 +- .../systems/modules/combat/AutoWeapon.java | 5 +- .../systems/modules/combat/Surround.java | 2 +- .../systems/modules/misc/BetterChat.java | 6 +- .../systems/modules/misc/Notebot.java | 12 +- .../systems/modules/movement/Jesus.java | 7 +- .../modules/movement/speed/modes/Strafe.java | 2 +- .../systems/modules/player/AutoMend.java | 6 +- .../systems/modules/player/AutoTool.java | 16 +- .../systems/modules/player/GhostHand.java | 4 +- .../modules/render/BreakIndicators.java | 2 +- .../systems/modules/render/Chams.java | 4 +- .../systems/modules/render/Nametags.java | 23 ++- .../systems/modules/render/StorageESP.java | 2 +- .../systems/modules/render/Trajectories.java | 3 +- .../systems/modules/world/AutoSmelter.java | 4 +- .../systems/modules/world/EChestFarmer.java | 4 +- .../systems/modules/world/HighwayBuilder.java | 4 +- .../systems/modules/world/InfinityMiner.java | 4 +- .../meteorclient/utils/Utils.java | 68 +++++-- .../utils/entity/DamageUtils.java | 19 +- .../utils/misc/ComponentMapReader.java | 14 +- .../utils/misc/FakeClientPlayer.java | 2 +- .../utils/misc/MeteorIdentifier.java | 15 -- .../utils/misc/MeteorStarscript.java | 2 +- .../meteorclient/utils/misc/Names.java | 34 +++- .../meteorclient/utils/network/Capes.java | 15 +- .../utils/network/PacketUtils.java | 34 ++-- .../utils/network/PacketUtilsUtil.java | 17 +- .../utils/notebot/NotebotUtils.java | 46 ++--- .../utils/notebot/decoder/NBSSongDecoder.java | 38 ++-- .../utils/notebot/decoder/SongDecoders.java | 4 +- .../notebot/decoder/TextSongDecoder.java | 4 +- .../InstrumentDetectFunction.java | 4 +- .../meteorclient/utils/notebot/song/Note.java | 10 +- .../utils/render/IVertexConsumerProvider.java | 2 +- .../render/MeshVertexConsumerProvider.java | 43 ++--- .../utils/render/MeteorToast.java | 2 +- .../meteorclient/utils/render/PeekScreen.java | 2 +- .../utils/render/PlayerHeadTexture.java | 4 +- .../utils/render/RenderUtils.java | 2 +- .../utils/render/SimpleBlockRenderer.java | 10 +- .../utils/render/postprocess/ChamsShader.java | 3 +- .../utils/tooltip/BookTooltipComponent.java | 2 +- .../tooltip/ContainerTooltipComponent.java | 4 +- .../utils/tooltip/MapTooltipComponent.java | 2 +- .../utils/tooltip/MeteorTooltipData.java | 2 +- .../meteorclient/utils/world/BlockUtils.java | 6 +- src/main/resources/fabric.mod.json | 2 +- src/main/resources/meteor-client.mixins.json | 2 +- 124 files changed, 828 insertions(+), 559 deletions(-) create mode 100644 src/main/java/meteordevelopment/meteorclient/gui/screens/settings/DynamicRegistryListSettingScreen.java rename src/main/java/meteordevelopment/meteorclient/gui/screens/settings/{LeftRightListSettingScreen.java => RegistryListSettingScreen.java} (95%) rename src/main/java/meteordevelopment/meteorclient/mixin/{RenderTickCounterMixin.java => RenderTickCounterDynamicMixin.java} (65%) delete mode 100644 src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorIdentifier.java diff --git a/build.gradle b/build.gradle index b46ec23a52..d20cd70c33 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id "fabric-loom" version "1.6-SNAPSHOT" + id "fabric-loom" version "1.7-SNAPSHOT" id "maven-publish" id "com.github.johnrengelman.shadow" version "8.1.1" } @@ -74,7 +74,7 @@ dependencies { library "org.reflections:reflections:${project.reflections_version}" library("io.netty:netty-handler-proxy:${project.netty_version}") { transitive = false } library("io.netty:netty-codec-socks:${project.netty_version}") { transitive = false } - library "de.florianmichael:WaybackAuthLib:1.0.0" + library "de.florianmichael:WaybackAuthLib:${project.waybackauthlib_version}" // Launch sub project shadow project(":launch") diff --git a/gradle.properties b/gradle.properties index 7a142ecaa8..4ae76d382c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,10 +1,10 @@ org.gradle.jvmargs=-Xmx2G # Fabric (https://fabricmc.net/develop) -minecraft_version=1.20.6 -yarn_mappings=1.20.6+build.1 -loader_version=0.15.10 -fapi_version=0.97.8+1.20.6 +minecraft_version=1.21 +yarn_mappings=1.21+build.2 +loader_version=0.15.11 +fapi_version=0.100.3+1.21 # Mod Properties mod_version=0.5.8 @@ -14,19 +14,20 @@ archives_base_name=meteor-client # Dependency Versions # Baritone (https://github.com/MeteorDevelopment/baritone) -baritone_version=1.20.4 +baritone_version=1.20.6 # Sodium (https://github.com/CaffeineMC/sodium-fabric) -sodium_version=mc1.20.6-0.5.8 +sodium_version=mc1.21-0.5.9 # Lithium (https://github.com/CaffeineMC/lithium-fabric) -lithium_version=mc1.20.6-0.12.3 +lithium_version=mc1.21-0.12.7 # Iris (https://github.com/IrisShaders/Iris) -iris_version=1.7.0+1.20.6 +iris_version=1.7.1+1.20.6 +# 1.7.1+1.21 seems to cause loom remapping issues atm # Indium (https://github.com/comp500/Indium) -indium_version=1.0.30+mc1.20.4 +indium_version=1.0.33+mc1.21 # Orbit (https://github.com/MeteorDevelopment/orbit) orbit_version=0.2.4 @@ -44,4 +45,7 @@ reflections_version=0.10.2 netty_version=4.1.90.Final # ViaFabricPlus (https://github.com/ViaVersion/ViaFabricPlus) -viafabricplus_version=3.2.1 +viafabricplus_version=3.4.1 + +# WaybackAuthLib (https://github.com/FlorianMichael/WaybackAuthLib) +waybackauthlib_version=1.0.1 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 48c0a02ca4..0d1842103b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/main/java/meteordevelopment/meteorclient/MeteorClient.java b/src/main/java/meteordevelopment/meteorclient/MeteorClient.java index 27507f9e0f..46f64dd540 100644 --- a/src/main/java/meteordevelopment/meteorclient/MeteorClient.java +++ b/src/main/java/meteordevelopment/meteorclient/MeteorClient.java @@ -36,6 +36,7 @@ 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 org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -183,4 +184,8 @@ private void onOpenScreen(OpenScreenEvent event) { wasWidgetScreen = event.screen instanceof WidgetScreen; } + + public static Identifier identifier(String path) { + return Identifier.of(MeteorClient.MOD_ID, path); + } } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/EnchantCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/EnchantCommand.java index cc2160d3ac..aaa3fc2962 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/EnchantCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/EnchantCommand.java @@ -17,7 +17,6 @@ import net.minecraft.command.argument.RegistryEntryReferenceArgumentType; import net.minecraft.enchantment.Enchantment; import net.minecraft.item.ItemStack; -import net.minecraft.registry.Registries; import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.text.Text; @@ -89,7 +88,7 @@ private void one(CommandContext context, ToIntFunction enchantment = context.getArgument("enchantment", RegistryEntry.Reference.class); - Utils.addEnchantment(itemStack, enchantment.value(), level.applyAsInt(enchantment.value())); + Utils.addEnchantment(itemStack, enchantment, level.applyAsInt(enchantment.value())); syncItem(); } @@ -97,11 +96,11 @@ private void one(CommandContext context, ToIntFunction level) throws CommandSyntaxException { ItemStack itemStack = tryGetItemStack(); - for (Enchantment enchantment : Registries.ENCHANTMENT) { - if (!onlyPossible || enchantment.isAcceptableItem(itemStack)) { - Utils.addEnchantment(itemStack, enchantment, level.applyAsInt(enchantment)); - } - } + REGISTRY_ACCESS.getOptionalWrapper(RegistryKeys.ENCHANTMENT).ifPresent(registry -> { + registry.streamEntries().forEach(enchantment -> { + Utils.addEnchantment(itemStack, enchantment, level.applyAsInt(enchantment.value())); + }); + }); syncItem(); } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/NbtCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/NbtCommand.java index 33e0f5356e..c4f716aa07 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/NbtCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/NbtCommand.java @@ -85,7 +85,7 @@ public void build(LiteralArgumentBuilder builder) { dataResult.getOrThrow(MALFORMED_ITEM_EXCEPTION::create); ComponentChanges.Builder changesBuilder = ComponentChanges.builder(); - Set> types = stackComponents.getTypes(); + Set> types = stackComponents.getTypes(); //set changes for (Component entry : components) { @@ -94,7 +94,7 @@ public void build(LiteralArgumentBuilder builder) { } //remove the rest - for (DataComponentType type : types) { + for (ComponentType type : types) { changesBuilder.remove(type); } @@ -111,9 +111,9 @@ public void build(LiteralArgumentBuilder builder) { if (validBasic(stack)) { @SuppressWarnings("unchecked") - RegistryKey> componentTypeKey = (RegistryKey>) ctx.getArgument("component", RegistryKey.class); + RegistryKey> componentTypeKey = (RegistryKey>) ctx.getArgument("component", RegistryKey.class); - DataComponentType componentType = Registries.DATA_COMPONENT_TYPE.get(componentTypeKey); + ComponentType componentType = Registries.DATA_COMPONENT_TYPE.get(componentTypeKey); ComponentMapImpl components = (ComponentMapImpl) stack.getComponents(); components.applyChanges(ComponentChanges.builder().remove(componentType).build()); @@ -132,7 +132,7 @@ public void build(LiteralArgumentBuilder builder) { if (entry.getKey().isPresent()) return entry.getKey().get().getValue(); return null; }, entry -> { - DataComponentType dataComponentType = entry.value(); + ComponentType dataComponentType = entry.value(); if (dataComponentType.getCodec() != null) { if (entry.getKey().isPresent()) { suggestionsBuilder.suggest(entry.getKey().get().getValue().toString()); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/NotebotCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/NotebotCommand.java index a0d5c8740b..f826c7db38 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/NotebotCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/NotebotCommand.java @@ -18,7 +18,7 @@ import meteordevelopment.meteorclient.systems.modules.misc.Notebot; import meteordevelopment.meteorclient.utils.notebot.song.Note; import meteordevelopment.orbit.EventHandler; -import net.minecraft.block.enums.Instrument; +import net.minecraft.block.enums.NoteBlockInstrument; import net.minecraft.command.CommandSource; import net.minecraft.network.packet.s2c.play.PlaySoundS2CPacket; import net.minecraft.sound.SoundEvent; @@ -168,7 +168,7 @@ private void saveRecording(Path path) { List notes = entry.getValue(); for (var note : notes) { - Instrument instrument = note.getInstrument(); + NoteBlockInstrument instrument = note.getInstrument(); int noteLevel = note.getNoteLevel(); file.write(String.format("%d:%d:%d\n", tick, noteLevel, instrument.ordinal())); @@ -202,7 +202,7 @@ private Note getNote(PlaySoundS2CPacket soundPacket) { return null; } - Instrument instrument = getInstrumentFromSound(soundPacket.getSound().value()); + NoteBlockInstrument instrument = getInstrumentFromSound(soundPacket.getSound().value()); if (instrument == null) { error("Can't find the instrument from sound! Sound: " + soundPacket.getSound().value()); return null; @@ -211,40 +211,40 @@ private Note getNote(PlaySoundS2CPacket soundPacket) { return new Note(instrument, noteLevel); } - private Instrument getInstrumentFromSound(SoundEvent sound) { + private NoteBlockInstrument getInstrumentFromSound(SoundEvent sound) { String path = sound.getId().getPath(); if (path.contains("harp")) - return Instrument.HARP; + return NoteBlockInstrument.HARP; else if (path.contains("basedrum")) - return Instrument.BASEDRUM; + return NoteBlockInstrument.BASEDRUM; else if (path.contains("snare")) - return Instrument.SNARE; + return NoteBlockInstrument.SNARE; else if (path.contains("hat")) - return Instrument.HAT; + return NoteBlockInstrument.HAT; else if (path.contains("bass")) - return Instrument.BASS; + return NoteBlockInstrument.BASS; else if (path.contains("flute")) - return Instrument.FLUTE; + return NoteBlockInstrument.FLUTE; else if (path.contains("bell")) - return Instrument.BELL; + return NoteBlockInstrument.BELL; else if (path.contains("guitar")) - return Instrument.GUITAR; + return NoteBlockInstrument.GUITAR; else if (path.contains("chime")) - return Instrument.CHIME; + return NoteBlockInstrument.CHIME; else if (path.contains("xylophone")) - return Instrument.XYLOPHONE; + return NoteBlockInstrument.XYLOPHONE; else if (path.contains("iron_xylophone")) - return Instrument.IRON_XYLOPHONE; + return NoteBlockInstrument.IRON_XYLOPHONE; else if (path.contains("cow_bell")) - return Instrument.COW_BELL; + return NoteBlockInstrument.COW_BELL; else if (path.contains("didgeridoo")) - return Instrument.DIDGERIDOO; + return NoteBlockInstrument.DIDGERIDOO; else if (path.contains("bit")) - return Instrument.BIT; + return NoteBlockInstrument.BIT; else if (path.contains("banjo")) - return Instrument.BANJO; + return NoteBlockInstrument.BANJO; else if (path.contains("pling")) - return Instrument.PLING; + return NoteBlockInstrument.PLING; return null; } } diff --git a/src/main/java/meteordevelopment/meteorclient/events/render/TooltipDataEvent.java b/src/main/java/meteordevelopment/meteorclient/events/render/TooltipDataEvent.java index c44b5667cc..f632f4fb88 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/render/TooltipDataEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/render/TooltipDataEvent.java @@ -5,7 +5,7 @@ package meteordevelopment.meteorclient.events.render; -import net.minecraft.client.item.TooltipData; +import net.minecraft.item.tooltip.TooltipData; import net.minecraft.item.ItemStack; diff --git a/src/main/java/meteordevelopment/meteorclient/gui/renderer/GuiRenderer.java b/src/main/java/meteordevelopment/meteorclient/gui/renderer/GuiRenderer.java index 08c9ff0527..915564e14f 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/renderer/GuiRenderer.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/renderer/GuiRenderer.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.gui.renderer; +import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.gui.GuiTheme; import meteordevelopment.meteorclient.gui.renderer.operations.TextOperation; import meteordevelopment.meteorclient.gui.renderer.packer.GuiTexture; @@ -14,7 +15,6 @@ import meteordevelopment.meteorclient.renderer.Renderer2D; import meteordevelopment.meteorclient.renderer.Texture; import meteordevelopment.meteorclient.utils.PostInit; -import meteordevelopment.meteorclient.utils.misc.MeteorIdentifier; import meteordevelopment.meteorclient.utils.misc.Pool; import meteordevelopment.meteorclient.utils.render.ByteTexture; import meteordevelopment.meteorclient.utils.render.RenderUtils; @@ -68,12 +68,12 @@ public static GuiTexture addTexture(Identifier id) { @PostInit public static void init() { - CIRCLE = addTexture(new MeteorIdentifier("textures/icons/gui/circle.png")); - TRIANGLE = addTexture(new MeteorIdentifier("textures/icons/gui/triangle.png")); - EDIT = addTexture(new MeteorIdentifier("textures/icons/gui/edit.png")); - RESET = addTexture(new MeteorIdentifier("textures/icons/gui/reset.png")); - FAVORITE_NO = addTexture(new MeteorIdentifier("textures/icons/gui/favorite_no.png")); - FAVORITE_YES = addTexture(new MeteorIdentifier("textures/icons/gui/favorite_yes.png")); + CIRCLE = addTexture(MeteorClient.identifier("textures/icons/gui/circle.png")); + TRIANGLE = addTexture(MeteorClient.identifier("textures/icons/gui/triangle.png")); + EDIT = addTexture(MeteorClient.identifier("textures/icons/gui/edit.png")); + RESET = addTexture(MeteorClient.identifier("textures/icons/gui/reset.png")); + FAVORITE_NO = addTexture(MeteorClient.identifier("textures/icons/gui/favorite_no.png")); + FAVORITE_YES = addTexture(MeteorClient.identifier("textures/icons/gui/favorite_yes.png")); TEXTURE = TEXTURE_PACKER.pack(); } 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 3409c87fd2..b0b5fa5173 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockListSettingScreen.java @@ -19,8 +19,8 @@ import java.util.List; import java.util.function.Predicate; -public class BlockListSettingScreen extends LeftRightListSettingScreen { - private static final Identifier ID = new Identifier("minecraft", ""); +public class BlockListSettingScreen extends RegistryListSettingScreen { + private static final Identifier ID = Identifier.of("minecraft", ""); public BlockListSettingScreen(GuiTheme theme, Setting> setting) { super(theme, "Select Blocks", setting, setting.get(), Registries.BLOCK); @@ -54,7 +54,7 @@ protected Block getAdditionalValue(Block value) { String path = Registries.BLOCK.getId(value).getPath(); if (!path.endsWith("_banner")) return null; - ((IdentifierAccessor) ID).setPath(path.substring(0, path.length() - 6) + "wall_banner"); + ((IdentifierAccessor) (Object) ID).setPath(path.substring(0, path.length() - 6) + "wall_banner"); return Registries.BLOCK.get(ID); } } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/DynamicRegistryListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/DynamicRegistryListSettingScreen.java new file mode 100644 index 0000000000..65f40c4636 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/DynamicRegistryListSettingScreen.java @@ -0,0 +1,182 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.gui.screens.settings; + +import meteordevelopment.meteorclient.gui.GuiTheme; +import meteordevelopment.meteorclient.gui.WindowScreen; +import meteordevelopment.meteorclient.gui.utils.Cell; +import meteordevelopment.meteorclient.gui.widgets.WWidget; +import meteordevelopment.meteorclient.gui.widgets.containers.WHorizontalList; +import meteordevelopment.meteorclient.gui.widgets.containers.WTable; +import meteordevelopment.meteorclient.gui.widgets.input.WTextBox; +import meteordevelopment.meteorclient.gui.widgets.pressable.WPressable; +import meteordevelopment.meteorclient.settings.Setting; +import meteordevelopment.meteorclient.utils.Utils; +import net.minecraft.client.MinecraftClient; +import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.util.Identifier; +import net.minecraft.util.InvalidIdentifierException; +import net.minecraft.util.Pair; + +import java.util.*; +import java.util.function.Consumer; + +public abstract class DynamicRegistryListSettingScreen extends WindowScreen { + protected final Setting setting; + protected final Collection> collection; + private final RegistryKey> registryKey; + private final Optional> registry; + + private WTextBox filter; + private String filterText = ""; + + private WTable table; + + public DynamicRegistryListSettingScreen(GuiTheme theme, String title, Setting setting, Collection> collection, RegistryKey> registryKey) { + super(theme, title); + + this.registryKey = registryKey; + this.registry = Optional.ofNullable(MinecraftClient.getInstance().getNetworkHandler()) + .flatMap(networkHandler -> networkHandler.getRegistryManager().getOptional(registryKey)); + this.setting = setting; + this.collection = collection; + } + + @Override + public void initWidgets() { + // Filter + filter = add(theme.textBox("")).minWidth(400).expandX().widget(); + filter.setFocused(true); + filter.action = () -> { + filterText = filter.get().trim(); + + table.clear(); + generateWidgets(); + }; + + table = add(theme.table()).expandX().widget(); + + generateWidgets(); + } + + private void generateWidgets() { + // Left (all) + WTable left = abc(pairs -> registry.ifPresent(registry -> { + registry.streamEntries() + .map(RegistryEntry.Reference::getKey) + .filter(Optional::isPresent) + .map(Optional::get).forEach(t -> { + if (skipValue(t) || collection.contains(t)) return; + + int words = Utils.searchInWords(getValueName(t), filterText); + int diff = Utils.searchLevenshteinDefault(getValueName(t), filterText, false); + if (words > 0 || diff <= getValueName(t).length() / 2) pairs.add(new Pair<>(t, -diff)); + }); + }), true, t -> { + addValue(t); + + RegistryKey v = getAdditionalValue(t); + if (v != null) addValue(v); + } + ); + + if (!left.cells.isEmpty()) { + left.add(theme.horizontalSeparator()).expandX(); + left.row(); + } + + WHorizontalList manualEntry = left.add(theme.horizontalList()).expandX().widget(); + WTextBox textBox = manualEntry.add(theme.textBox("minecraft:")).expandX().minWidth(120d).widget(); + 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 e) {} + }; + + table.add(theme.verticalSeparator()).expandWidgetY(); + + // Right (selected) + abc(pairs -> { + for (RegistryKey value : collection) { + if (skipValue(value)) continue; + + int words = Utils.searchInWords(getValueName(value), filterText); + int diff = Utils.searchLevenshteinDefault(getValueName(value), filterText, false); + if (words > 0 || diff <= getValueName(value).length() / 2) pairs.add(new Pair<>(value, -diff)); + } + }, false, t -> { + removeValue(t); + + RegistryKey v = getAdditionalValue(t); + if (v != null) removeValue(v); + }); + } + + private void addValue(RegistryKey value) { + if (!collection.contains(value)) { + collection.add(value); + + setting.onChanged(); + table.clear(); + generateWidgets(); + } + } + + private void removeValue(RegistryKey value) { + if (collection.remove(value)) { + setting.onChanged(); + table.clear(); + generateWidgets(); + } + } + + private WTable abc(Consumer, Integer>>> addValues, boolean isLeft, Consumer> buttonAction) { + // Create + Cell cell = this.table.add(theme.table()).top(); + WTable table = cell.widget(); + + Consumer> forEach = t -> { + if (!includeValue(t)) return; + + table.add(getValueWidget(t)); + + WPressable button = table.add(isLeft ? theme.plus() : theme.minus()).expandCellX().right().widget(); + button.action = () -> buttonAction.accept(t); + + table.row(); + }; + + // Sort + List, Integer>> values = new ArrayList<>(); + addValues.accept(values); + if (!filterText.isEmpty()) values.sort(Comparator.comparingInt(value -> -value.getRight())); + for (Pair, Integer> pair : values) forEach.accept(pair.getLeft()); + + if (!table.cells.isEmpty()) cell.expandX(); + + return table; + } + + protected boolean includeValue(RegistryKey value) { + return true; + } + + protected abstract WWidget getValueWidget(RegistryKey value); + + protected abstract String getValueName(RegistryKey value); + + protected boolean skipValue(RegistryKey value) { + return false; + } + + protected RegistryKey getAdditionalValue(RegistryKey value) { + return null; + } +} 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 7763433c32..7ffdddd6bc 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EnchantmentListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EnchantmentListSettingScreen.java @@ -10,22 +10,23 @@ import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.utils.misc.Names; import net.minecraft.enchantment.Enchantment; -import net.minecraft.registry.Registries; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.RegistryKeys; -import java.util.List; +import java.util.Set; -public class EnchantmentListSettingScreen extends LeftRightListSettingScreen { - public EnchantmentListSettingScreen(GuiTheme theme, Setting> setting) { - super(theme, "Select Enchantments", setting, setting.get(), Registries.ENCHANTMENT); +public class EnchantmentListSettingScreen extends DynamicRegistryListSettingScreen { + public EnchantmentListSettingScreen(GuiTheme theme, Setting>> setting) { + super(theme, "Select Enchantments", setting, setting.get(), RegistryKeys.ENCHANTMENT); } @Override - protected WWidget getValueWidget(Enchantment value) { + protected WWidget getValueWidget(RegistryKey value) { return theme.label(getValueName(value)); } @Override - protected String getValueName(Enchantment value) { + protected String getValueName(RegistryKey value) { return Names.get(value); } } 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 a630022d65..abad11b822 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ItemListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ItemListSettingScreen.java @@ -15,7 +15,7 @@ import java.util.function.Predicate; -public class ItemListSettingScreen extends LeftRightListSettingScreen { +public class ItemListSettingScreen extends RegistryListSettingScreen { public ItemListSettingScreen(GuiTheme theme, ItemListSetting setting) { super(theme, "Select Items", setting, setting.get(), Registries.ITEM); } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ModuleListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ModuleListSettingScreen.java index c4cbb1790e..29b8cce271 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ModuleListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ModuleListSettingScreen.java @@ -13,7 +13,7 @@ import java.util.List; -public class ModuleListSettingScreen extends LeftRightListSettingScreen { +public class ModuleListSettingScreen extends RegistryListSettingScreen { public ModuleListSettingScreen(GuiTheme theme, Setting> setting) { super(theme, "Select Modules", setting, setting.get(), Modules.REGISTRY); } 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 c88d59137f..0956b50a6a 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/PacketBoolSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/PacketBoolSettingScreen.java @@ -15,7 +15,7 @@ import java.util.Set; import java.util.function.Predicate; -public class PacketBoolSettingScreen extends LeftRightListSettingScreen>> { +public class PacketBoolSettingScreen extends RegistryListSettingScreen>> { public PacketBoolSettingScreen(GuiTheme theme, Setting>>> setting) { super(theme, "Select Packets", setting, setting.get(), PacketUtils.REGISTRY); } 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 9ec1b4ef92..15ffd0c6a9 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ParticleTypeListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ParticleTypeListSettingScreen.java @@ -15,7 +15,7 @@ import java.util.List; -public class ParticleTypeListSettingScreen extends LeftRightListSettingScreen> { +public class ParticleTypeListSettingScreen extends RegistryListSettingScreen> { public ParticleTypeListSettingScreen(GuiTheme theme, Setting>> setting) { super(theme, "Select Particles", setting, setting.get(), Registries.PARTICLE_TYPE); } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/LeftRightListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/RegistryListSettingScreen.java similarity index 95% rename from src/main/java/meteordevelopment/meteorclient/gui/screens/settings/LeftRightListSettingScreen.java rename to src/main/java/meteordevelopment/meteorclient/gui/screens/settings/RegistryListSettingScreen.java index 407bb72a74..1655839ce4 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/LeftRightListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/RegistryListSettingScreen.java @@ -23,7 +23,7 @@ import java.util.List; import java.util.function.Consumer; -public abstract class LeftRightListSettingScreen extends WindowScreen { +public abstract class RegistryListSettingScreen extends WindowScreen { protected final Setting setting; protected final Collection collection; private final Registry registry; @@ -33,7 +33,7 @@ public abstract class LeftRightListSettingScreen extends WindowScreen { private WTable table; - public LeftRightListSettingScreen(GuiTheme theme, String title, Setting setting, Collection collection, Registry registry) { + public RegistryListSettingScreen(GuiTheme theme, String title, Setting setting, Collection collection, Registry registry) { super(theme, title); this.registry = registry; 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 8e6443b8b4..597ec2306e 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ScreenHandlerSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ScreenHandlerSettingScreen.java @@ -13,7 +13,7 @@ import java.util.List; -public class ScreenHandlerSettingScreen extends LeftRightListSettingScreen> { +public class ScreenHandlerSettingScreen extends RegistryListSettingScreen> { public ScreenHandlerSettingScreen(GuiTheme theme, Setting>> setting) { super(theme, "Select Screen Handlers", setting, setting.get(), Registries.SCREEN_HANDLER); } 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 19dd04cbd0..992aab1d8d 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/SoundEventListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/SoundEventListSettingScreen.java @@ -14,7 +14,7 @@ import java.util.List; -public class SoundEventListSettingScreen extends LeftRightListSettingScreen { +public class SoundEventListSettingScreen extends RegistryListSettingScreen { public SoundEventListSettingScreen(GuiTheme theme, Setting> setting) { super(theme, "Select Sounds", setting, setting.get(), Registries.SOUND_EVENT); } 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 b2172ed11c..83862b286e 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/StatusEffectListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/StatusEffectListSettingScreen.java @@ -19,7 +19,7 @@ import java.util.List; import java.util.Optional; -public class StatusEffectListSettingScreen extends LeftRightListSettingScreen { +public class StatusEffectListSettingScreen extends RegistryListSettingScreen { public StatusEffectListSettingScreen(GuiTheme theme, Setting> setting) { super(theme, "Select Effects", setting, setting.get(), Registries.STATUS_EFFECT); } 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 38975e8f4d..34a3bde091 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/StorageBlockListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/StorageBlockListSettingScreen.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.gui.screens.settings; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import meteordevelopment.meteorclient.gui.GuiTheme; import meteordevelopment.meteorclient.gui.widgets.WWidget; import meteordevelopment.meteorclient.settings.Setting; @@ -14,47 +15,46 @@ import net.minecraft.item.Items; import java.util.List; +import java.util.Map; + +public class StorageBlockListSettingScreen extends RegistryListSettingScreen> { + private static final Map, BlockEntityTypeInfo> BLOCK_ENTITY_TYPE_INFO_MAP = new Object2ObjectOpenHashMap<>(); + private static final BlockEntityTypeInfo UNKNOWN = new BlockEntityTypeInfo(Items.BARRIER, "Unknown"); + + static { + // Map of storage blocks + BLOCK_ENTITY_TYPE_INFO_MAP.put(BlockEntityType.BARREL, new BlockEntityTypeInfo(Items.BARREL, "Barrel")); + BLOCK_ENTITY_TYPE_INFO_MAP.put(BlockEntityType.BLAST_FURNACE, new BlockEntityTypeInfo(Items.BLAST_FURNACE, "Blast Furnace")); + BLOCK_ENTITY_TYPE_INFO_MAP.put(BlockEntityType.BREWING_STAND, new BlockEntityTypeInfo(Items.BREWING_STAND, "Brewing Stand")); + BLOCK_ENTITY_TYPE_INFO_MAP.put(BlockEntityType.CAMPFIRE, new BlockEntityTypeInfo(Items.CAMPFIRE, "Campfire")); + BLOCK_ENTITY_TYPE_INFO_MAP.put(BlockEntityType.CHEST, new BlockEntityTypeInfo(Items.CHEST, "Chest")); + BLOCK_ENTITY_TYPE_INFO_MAP.put(BlockEntityType.CHISELED_BOOKSHELF, new BlockEntityTypeInfo(Items.CHISELED_BOOKSHELF, "Chiseled Bookshelf")); + BLOCK_ENTITY_TYPE_INFO_MAP.put(BlockEntityType.CRAFTER, new BlockEntityTypeInfo(Items.CRAFTER, "Crafter")); + BLOCK_ENTITY_TYPE_INFO_MAP.put(BlockEntityType.DISPENSER, new BlockEntityTypeInfo(Items.DISPENSER, "Dispenser")); + BLOCK_ENTITY_TYPE_INFO_MAP.put(BlockEntityType.DECORATED_POT, new BlockEntityTypeInfo(Items.DECORATED_POT, "Decorated Pot")); + BLOCK_ENTITY_TYPE_INFO_MAP.put(BlockEntityType.DROPPER, new BlockEntityTypeInfo(Items.DROPPER, "Dropper")); + BLOCK_ENTITY_TYPE_INFO_MAP.put(BlockEntityType.ENDER_CHEST, new BlockEntityTypeInfo(Items.ENDER_CHEST, "Ender Chest")); + BLOCK_ENTITY_TYPE_INFO_MAP.put(BlockEntityType.FURNACE, new BlockEntityTypeInfo(Items.FURNACE, "Furnace")); + BLOCK_ENTITY_TYPE_INFO_MAP.put(BlockEntityType.HOPPER, new BlockEntityTypeInfo(Items.HOPPER, "Hopper")); + BLOCK_ENTITY_TYPE_INFO_MAP.put(BlockEntityType.SHULKER_BOX, new BlockEntityTypeInfo(Items.SHULKER_BOX, "Shulker Box")); + BLOCK_ENTITY_TYPE_INFO_MAP.put(BlockEntityType.SMOKER, new BlockEntityTypeInfo(Items.SMOKER, "Smoker")); + BLOCK_ENTITY_TYPE_INFO_MAP.put(BlockEntityType.TRAPPED_CHEST, new BlockEntityTypeInfo(Items.TRAPPED_CHEST, "Trapped Chest")); + } -public class StorageBlockListSettingScreen extends LeftRightListSettingScreen> { public StorageBlockListSettingScreen(GuiTheme theme, Setting>> setting) { super(theme, "Select Storage Blocks", setting, setting.get(), StorageBlockListSetting.REGISTRY); } @Override protected WWidget getValueWidget(BlockEntityType value) { - Item item = Items.BARRIER; - - if (value == BlockEntityType.FURNACE) item = Items.FURNACE; - else if (value == BlockEntityType.CHEST) item = Items.CHEST; - else if (value == BlockEntityType.TRAPPED_CHEST) item = Items.TRAPPED_CHEST; - else if (value == BlockEntityType.ENDER_CHEST) item = Items.ENDER_CHEST; - else if (value == BlockEntityType.DISPENSER) item = Items.DISPENSER; - else if (value == BlockEntityType.DROPPER) item = Items.DROPPER; - else if (value == BlockEntityType.HOPPER) item = Items.HOPPER; - else if (value == BlockEntityType.SHULKER_BOX) item = Items.SHULKER_BOX; - else if (value == BlockEntityType.BARREL) item = Items.BARREL; - else if (value == BlockEntityType.SMOKER) item = Items.SMOKER; - else if (value == BlockEntityType.BLAST_FURNACE) item = Items.BLAST_FURNACE; - + Item item = BLOCK_ENTITY_TYPE_INFO_MAP.getOrDefault(value, UNKNOWN).item(); return theme.itemWithLabel(item.getDefaultStack(), getValueName(value)); } @Override protected String getValueName(BlockEntityType value) { - String name = "Unknown"; - - if (value == BlockEntityType.FURNACE) name = "Furnace"; - else if (value == BlockEntityType.CHEST) name = "Chest"; - else if (value == BlockEntityType.TRAPPED_CHEST) name = "Trapped Chest"; - else if (value == BlockEntityType.ENDER_CHEST) name = "Ender Chest"; - else if (value == BlockEntityType.DISPENSER) name = "Dispenser"; - else if (value == BlockEntityType.DROPPER) name = "Dropper"; - else if (value == BlockEntityType.HOPPER) name = "Hopper"; - else if (value == BlockEntityType.SHULKER_BOX) name = "Shulker Box"; - else if (value == BlockEntityType.BARREL) name = "Barrel"; - else if (value == BlockEntityType.SMOKER) name = "Smoker"; - else if (value == BlockEntityType.BLAST_FURNACE) name = "Blast Furnace"; - - return name; + return BLOCK_ENTITY_TYPE_INFO_MAP.getOrDefault(value, UNKNOWN).name(); } + + private record BlockEntityTypeInfo(Item item, String name) {} } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ArmorTrimMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ArmorTrimMixin.java index 582a918398..ee32aa90ac 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ArmorTrimMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ArmorTrimMixin.java @@ -13,7 +13,7 @@ import org.spongepowered.asm.mixin.injection.At; @Mixin(ArmorTrim.class) -public class ArmorTrimMixin { +public abstract class ArmorTrimMixin { @ModifyExpressionValue(method = "appendTooltip", at = @At(value = "FIELD", target = "Lnet/minecraft/item/trim/ArmorTrim;showInTooltip:Z")) private boolean modifyShowInTooltip(boolean original) { BetterTooltips bt = Modules.get().get(BetterTooltips.class); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BlockModelRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BlockModelRendererMixin.java index cb90791d7d..af1fb3d3e4 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BlockModelRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BlockModelRendererMixin.java @@ -7,11 +7,11 @@ import meteordevelopment.meteorclient.systems.modules.render.Xray; import net.minecraft.block.BlockState; -import net.minecraft.client.render.BufferBuilder; import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.render.block.BlockModelRenderer; import net.minecraft.client.render.model.BakedModel; import net.minecraft.client.render.model.BakedQuad; +import net.minecraft.client.util.BufferAllocator; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.random.Random; @@ -22,6 +22,8 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import java.nio.ByteBuffer; + @Mixin(BlockModelRenderer.class) public abstract class BlockModelRendererMixin { @Unique private final ThreadLocal alphas = new ThreadLocal<>(); @@ -42,20 +44,15 @@ private void onRenderQuad(BlockRenderView world, BlockState state, BlockPos pos, @Unique private void rewriteBuffer(VertexConsumer vertexConsumer, int alpha) { - if (vertexConsumer instanceof BufferBuilder bufferBuilder) { - BufferBuilderAccessor bufferBuilderAccessor = ((BufferBuilderAccessor) bufferBuilder); - - int prevOffset = bufferBuilderAccessor.getElementOffset(); - - if (prevOffset > 0) { - int i = bufferBuilderAccessor.getVertexFormat().getVertexSizeByte(); - - for (int l = 1; l <= 4; l++) { - bufferBuilderAccessor.setElementOffset(prevOffset - i * l); - bufferBuilder.putByte(15, (byte) (alpha)); + if (vertexConsumer instanceof BufferBuilderAccessor bufferBuilder) { + int i = bufferBuilder.getVertexFormat().getVertexSizeByte(); + try (BufferAllocator.CloseableBuffer allocatedBuffer = bufferBuilder.meteor$getAllocator().getAllocated()) { + if (allocatedBuffer != null) { + ByteBuffer buffer = allocatedBuffer.getBuffer(); + for (int l = 1; l <= 4; l++) { + buffer.put(buffer.capacity() - i * l + 15, (byte) (alpha)); + } } - - bufferBuilderAccessor.setElementOffset(prevOffset); } } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BufferBuilderAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/BufferBuilderAccessor.java index f1b9172238..ccd4fed141 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BufferBuilderAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BufferBuilderAccessor.java @@ -7,16 +7,14 @@ import net.minecraft.client.render.BufferBuilder; import net.minecraft.client.render.VertexFormat; +import net.minecraft.client.util.BufferAllocator; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; @Mixin(BufferBuilder.class) public interface BufferBuilderAccessor { - @Accessor("elementOffset") - int getElementOffset(); - - @Accessor("elementOffset") - void setElementOffset(int elementOffset); + @Accessor("allocator") + BufferAllocator meteor$getAllocator(); @Accessor("format") VertexFormat getVertexFormat(); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BundleItemMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BundleItemMixin.java index 52978a3062..30237e0225 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BundleItemMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BundleItemMixin.java @@ -14,13 +14,13 @@ @Mixin(BundleItem.class) public class BundleItemMixin { - @ModifyExpressionValue(method = "getTooltipData", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;contains(Lnet/minecraft/component/DataComponentType;)Z", ordinal = 0)) + @ModifyExpressionValue(method = "getTooltipData", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;contains(Lnet/minecraft/component/ComponentType;)Z", ordinal = 0)) private boolean modifyContains1(boolean original) { BetterTooltips bt = Modules.get().get(BetterTooltips.class); return !(bt.isActive() && bt.tooltip.get()) && original; } - @ModifyExpressionValue(method = "getTooltipData", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;contains(Lnet/minecraft/component/DataComponentType;)Z", ordinal = 1)) + @ModifyExpressionValue(method = "getTooltipData", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;contains(Lnet/minecraft/component/ComponentType;)Z", ordinal = 1)) private boolean modifyContains2(boolean original) { BetterTooltips bt = Modules.get().get(BetterTooltips.class); return !(bt.isActive() && bt.additional.get()) && original; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/CameraMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/CameraMixin.java index c883d82570..08d8f03bc1 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/CameraMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/CameraMixin.java @@ -12,8 +12,8 @@ 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.client.render.CameraSubmersionType; import net.minecraft.entity.Entity; import net.minecraft.util.math.MathHelper; import net.minecraft.world.BlockView; @@ -46,12 +46,12 @@ private void getSubmergedFluidState(CallbackInfoReturnable } @ModifyVariable(method = "clipToSpace", at = @At("HEAD"), ordinal = 0, argsOnly = true) - private double modifyClipToSpace(double d) { - return (Modules.get().get(Freecam.class).isActive() ? 0 : Modules.get().get(CameraTweaks.class).getDistance()); + private float modifyClipToSpace(float d) { + return (Modules.get().get(Freecam.class).isActive() ? 0 : (float) Modules.get().get(CameraTweaks.class).getDistance()); } @Inject(method = "clipToSpace", at = @At("HEAD"), cancellable = true) - private void onClipToSpace(double desiredCameraDistance, CallbackInfoReturnable info) { + private void onClipToSpace(float desiredCameraDistance, CallbackInfoReturnable info) { if (Modules.get().get(CameraTweaks.class).clip()) { info.setReturnValue(desiredCameraDistance); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChunkBorderDebugRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChunkBorderDebugRendererMixin.java index 3481e15180..404a697e90 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChunkBorderDebugRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChunkBorderDebugRendererMixin.java @@ -29,7 +29,7 @@ public abstract class ChunkBorderDebugRendererMixin { Freecam freecam = Modules.get().get(Freecam.class); if (!freecam.isActive()) return chunkPos; - float delta = client.getTickDelta(); + float delta = client.getRenderTickCounter().getTickDelta(true); return new ChunkPos( ChunkSectionPos.getSectionCoord(MathHelper.floor(freecam.getX(delta))), diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityMixin.java index 72e6d169cb..a05a576944 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityMixin.java @@ -44,7 +44,7 @@ private void onDropSelectedItem(boolean dropEntireStack, CallbackInfoReturnable< if (MeteorClient.EVENT_BUS.post(DropItemsEvent.get(getMainHandStack())).isCancelled()) info.setReturnValue(false); } - @Redirect(method = "updateNausea", at = @At(value = "FIELD", target = "Lnet/minecraft/client/MinecraftClient;currentScreen:Lnet/minecraft/client/gui/screen/Screen;")) + @Redirect(method = "tickNausea", at = @At(value = "FIELD", target = "Lnet/minecraft/client/MinecraftClient;currentScreen:Lnet/minecraft/client/gui/screen/Screen;")) private Screen updateNauseaGetCurrentScreenProxy(MinecraftClient client) { if (Modules.get().isActive(Portals.class)) return null; return client.currentScreen; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerInteractionManagerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerInteractionManagerMixin.java index feb31e918e..95535507e2 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerInteractionManagerMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerInteractionManagerMixin.java @@ -13,7 +13,6 @@ import meteordevelopment.meteorclient.systems.modules.misc.InventoryTweaks; import meteordevelopment.meteorclient.systems.modules.player.BreakDelay; import meteordevelopment.meteorclient.systems.modules.player.SpeedMine; -import meteordevelopment.meteorclient.utils.player.Rotations; import meteordevelopment.meteorclient.utils.world.BlockUtils; import net.minecraft.block.BlockState; import net.minecraft.client.network.ClientPlayNetworkHandler; @@ -38,11 +37,9 @@ 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.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import org.spongepowered.asm.mixin.injection.invoke.arg.Args; import static meteordevelopment.meteorclient.MeteorClient.mc; @@ -183,14 +180,6 @@ private void onCancelBlockBreaking(CallbackInfo info) { if (BlockUtils.breaking) info.cancel(); } - @ModifyArgs(method = "interactItem", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/packet/c2s/play/PlayerMoveC2SPacket$Full;(DDDFFZ)V")) - private void onInteractItem(Args args) { - if (Rotations.rotating) { - args.set(3, Rotations.serverYaw); - args.set(4, Rotations.serverPitch); - } - } - @Override public void meteor$syncSelected() { syncSelectedSlot(); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/CrashReportMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/CrashReportMixin.java index 33f82ea3d9..ea78ac2c8a 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/CrashReportMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/CrashReportMixin.java @@ -22,8 +22,8 @@ @Mixin(CrashReport.class) public abstract class CrashReportMixin { - @Inject(method = "addStackTrace", at = @At("TAIL")) - private void onAddStackTrace(StringBuilder sb, CallbackInfo info) { + @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"); if (!MeteorClient.DEV_BUILD.isEmpty()) { diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/DrawContextMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/DrawContextMixin.java index 904d377e5c..12fdaccb62 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/DrawContextMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/DrawContextMixin.java @@ -10,7 +10,7 @@ import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.tooltip.TooltipComponent; -import net.minecraft.client.item.TooltipData; +import net.minecraft.item.tooltip.TooltipData; import net.minecraft.text.Text; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/EnchantingTableBlockEntityRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/EnchantingTableBlockEntityRendererMixin.java index d17f55bb69..04165de046 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/EnchantingTableBlockEntityRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/EnchantingTableBlockEntityRendererMixin.java @@ -17,8 +17,8 @@ @Mixin(EnchantingTableBlockEntityRenderer.class) public abstract class EnchantingTableBlockEntityRendererMixin { - @WrapWithCondition(method = "render(Lnet/minecraft/block/entity/EnchantingTableBlockEntity;FLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;II)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/entity/model/BookModel;renderBook(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumer;IIFFFF)V")) - private boolean onRenderBookModelRenderProxy(BookModel model, MatrixStack matrixStack, VertexConsumer vertexConsumer, int i, int j, float f, float g, float h, float k) { + @WrapWithCondition(method = "render(Lnet/minecraft/block/entity/EnchantingTableBlockEntity;FLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;II)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/entity/model/BookModel;renderBook(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumer;III)V")) + private boolean onRenderBookModelRenderProxy(BookModel instance, MatrixStack matrices, VertexConsumer vertices, int light, int overlay, int i) { 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 index 4ff0ecba05..953d569ef9 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/EndCrystalEntityRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/EndCrystalEntityRendererMixin.java @@ -95,7 +95,7 @@ private void modifyCore(ModelPart modelPart, MatrixStack matrices, VertexConsume if (module.renderCore.get()) { Color color = module.crystalsCoreColor.get(); - core.render(matrices, vertices, light, overlay, color.r/255f, color.g/255f, color.b/255f, color.a/255f); + core.render(matrices, vertices, light, overlay, color.getPacked()); } } @@ -110,7 +110,7 @@ private void modifyFrame1(ModelPart modelPart, MatrixStack matrices, VertexConsu if (module.renderFrame1.get()) { Color color = module.crystalsFrame1Color.get(); - frame.render(matrices, vertices, light, overlay, color.r/255f, color.g/255f, color.b/255f, color.a/255f); + frame.render(matrices, vertices, light, overlay, color.getPacked()); } } @@ -124,7 +124,7 @@ private void modifyFrame2(ModelPart modelPart, MatrixStack matrices, VertexConsu if (module.renderFrame2.get()) { Color color = module.crystalsFrame2Color.get(); - frame.render(matrices, vertices, light, overlay, color.r/255f, color.g/255f, color.b/255f, color.a/255f); + frame.render(matrices, vertices, light, overlay, color.getPacked()); } } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/EntityRenderDispatcherMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/EntityRenderDispatcherMixin.java index 6b0e3c4085..2f4aa08ac3 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/EntityRenderDispatcherMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/EntityRenderDispatcherMixin.java @@ -45,7 +45,7 @@ private void render(E entity, double x, double y, double z, f } @Inject(method = "renderHitbox", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/WorldRenderer;drawBox(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumer;Lnet/minecraft/util/math/Box;FFFF)V", ordinal = 0), locals = LocalCapture.CAPTURE_FAILSOFT) - private static void onRenderHitbox(MatrixStack matrices, VertexConsumer vertices, Entity entity, float tickDelta, CallbackInfo info, Box box) { + private static void onRenderHitbox(MatrixStack matrices, VertexConsumer vertices, Entity entity, float tickDelta, float red, float green, float blue, CallbackInfo ci, Box box) { double v = Modules.get().get(Hitboxes.class).getEntityValue(entity); if (v != 0) ((IBox) box).expand(v); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/FluidRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/FluidRendererMixin.java index 53dab9cadd..561c44e981 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/FluidRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/FluidRendererMixin.java @@ -43,7 +43,7 @@ private void onRender(BlockRenderView world, BlockPos pos, VertexConsumer vertex } @Inject(method = "vertex", at = @At("HEAD"), cancellable = true) - private void onVertex(VertexConsumer vertexConsumer, double x, double y, double z, float red, float green, float blue, float u, float v, int light, CallbackInfo info) { + 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(); if (alpha == -2) { @@ -58,7 +58,7 @@ else if (alpha != -1) { } @Unique - private void vertex(VertexConsumer vertexConsumer, double x, double y, double 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).next(); + 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); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/FoliageColorsMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/FoliageColorsMixin.java index bc1e7e2282..8985c560b9 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/FoliageColorsMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/FoliageColorsMixin.java @@ -8,8 +8,9 @@ import com.llamalad7.mixinextras.injector.ModifyReturnValue; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.world.Ambience; -import net.minecraft.client.color.world.FoliageColors; +import net.minecraft.world.biome.FoliageColors; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; @Mixin(FoliageColors.class) @@ -17,16 +18,21 @@ public abstract class FoliageColorsMixin { @ModifyReturnValue(method = "getBirchColor", at = @At("RETURN")) private static int onGetBirchColor(int original) { - Ambience ambience = Modules.get().get(Ambience.class); - if (ambience.isActive() && ambience.customFoliageColor.get()) { - return ambience.foliageColor.get().getPacked(); - } - - return original; + return getModifiedColor(original); } @ModifyReturnValue(method = "getSpruceColor", at = @At("RETURN")) private static int onGetSpruceColor(int original) { + return getModifiedColor(original); + } + + @ModifyReturnValue(method = "getMangroveColor", at = @At("RETURN")) + private static int onGetMangroveColor(int original) { + return getModifiedColor(original); + } + + @Unique + private static int getModifiedColor(int original) { Ambience ambience = Modules.get().get(Ambience.class); if (ambience.isActive() && ambience.customFoliageColor.get()) { return ambience.foliageColor.get().getPacked(); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java index 5eeb4c42ad..f84d80e9b5 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java @@ -6,6 +6,7 @@ package meteordevelopment.meteorclient.mixin; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import com.llamalad7.mixinextras.sugar.Local; import com.mojang.blaze3d.systems.RenderSystem; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.render.Render3DEvent; @@ -25,6 +26,7 @@ import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.Camera; import net.minecraft.client.render.GameRenderer; +import net.minecraft.client.render.RenderTickCounter; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.Entity; import net.minecraft.item.ItemStack; @@ -69,9 +71,8 @@ public abstract class GameRendererMixin { @Unique private final MatrixStack matrices = new MatrixStack(); - // FIXME: unsure @Inject(method = "renderWorld", at = @At(value = "INVOKE_STRING", target = "Lnet/minecraft/util/profiler/Profiler;swap(Ljava/lang/String;)V", args = {"ldc=hand"}), locals = LocalCapture.CAPTURE_FAILEXCEPTION) - private void onRenderWorld(float tickDelta, long limitTime, CallbackInfo ci, boolean bl, Camera camera, Entity entity, double d, Matrix4f matrix4f, MatrixStack matrixStack, float f, float g, Matrix4f matrix4f2) { + private void onRenderWorld(RenderTickCounter tickCounter, CallbackInfo ci, @Local(ordinal = 1) Matrix4f matrix4f2, @Local(ordinal = 1) float tickDelta, @Local MatrixStack matrixStack) { if (!Utils.canUpdate()) return; client.getProfiler().push(MeteorClient.MOD_ID + "_render"); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/HeldItemRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/HeldItemRendererMixin.java index 72748fa436..3708700b23 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/HeldItemRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/HeldItemRendererMixin.java @@ -15,6 +15,7 @@ import net.minecraft.client.render.VertexConsumerProvider; 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; @@ -86,7 +87,7 @@ private void onRenderArm(AbstractClientPlayerEntity player, float tickDelta, flo } @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, CallbackInfo ci) { + 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/InGameHudMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/InGameHudMixin.java index 768ba8c8e2..cff9d8363d 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/InGameHudMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/InGameHudMixin.java @@ -17,6 +17,7 @@ import net.minecraft.client.MinecraftClient; 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 org.spongepowered.asm.mixin.Final; @@ -35,12 +36,12 @@ public abstract class InGameHudMixin { @Shadow public abstract void clear(); @Inject(method = "render", at = @At("TAIL")) - private void onRender(DrawContext context, float tickDelta, CallbackInfo ci) { + private void onRender(DrawContext context, RenderTickCounter tickCounter, CallbackInfo ci) { client.getProfiler().push(MeteorClient.MOD_ID + "_render_2d"); Utils.unscaledProjection(); - MeteorClient.EVENT_BUS.post(Render2DEvent.get(context, context.getScaledWindowWidth(), context.getScaledWindowWidth(), tickDelta)); + MeteorClient.EVENT_BUS.post(Render2DEvent.get(context, context.getScaledWindowWidth(), context.getScaledWindowWidth(), tickCounter.getTickDelta(true))); Utils.scaledProjection(); RenderSystem.applyModelViewMatrix(); @@ -78,8 +79,8 @@ private void onRenderScoreboardSidebar(DrawContext context, ScoreboardObjective if (Modules.get().get(NoRender.class).noScoreboard()) ci.cancel(); } - @Inject(method = "renderScoreboardSidebar(Lnet/minecraft/client/gui/DrawContext;F)V", at = @At("HEAD"), cancellable = true) - private void onRenderScoreboardSidebar(DrawContext context, float tickDelta, CallbackInfo ci) { + @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(); } @@ -94,12 +95,12 @@ private boolean alwaysRenderCrosshairInFreecam(boolean firstPerson) { } @Inject(method = "renderCrosshair", at = @At("HEAD"), cancellable = true) - private void onRenderCrosshair(DrawContext context, float tickDelta, CallbackInfo ci) { + 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, float tickDelta, CallbackInfo ci) { + private void onRenderTitle(DrawContext context, RenderTickCounter tickCounter, CallbackInfo ci) { if (Modules.get().get(NoRender.class).noTitle()) ci.cancel(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ItemMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ItemMixin.java index 9a0971069a..cfd2422820 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ItemMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ItemMixin.java @@ -7,9 +7,10 @@ import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.render.TooltipDataEvent; -import net.minecraft.client.item.TooltipData; + import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +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; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ItemStackMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ItemStackMixin.java index 63fd0863ed..cc139b4f24 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ItemStackMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ItemStackMixin.java @@ -52,13 +52,13 @@ private boolean modifyCanPlaceText(boolean original) { return (bt.isActive() && bt.canPlaceOn.get()) || original; } - @ModifyExpressionValue(method = "getTooltip", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;contains(Lnet/minecraft/component/DataComponentType;)Z", ordinal = 0)) + @ModifyExpressionValue(method = "getTooltip", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;contains(Lnet/minecraft/component/ComponentType;)Z", ordinal = 0)) private boolean modifyContainsTooltip(boolean original) { BetterTooltips bt = Modules.get().get(BetterTooltips.class); return !(bt.isActive() && bt.tooltip.get()) && original; } - @ModifyExpressionValue(method = "getTooltip", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;contains(Lnet/minecraft/component/DataComponentType;)Z", ordinal = 3)) + @ModifyExpressionValue(method = "getTooltip", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;contains(Lnet/minecraft/component/ComponentType;)Z", ordinal = 3)) private boolean modifyContainsAdditional(boolean original) { BetterTooltips bt = Modules.get().get(BetterTooltips.class); return !(bt.isActive() && bt.additional.get()) && original; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LightningEntityRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LightningEntityRendererMixin.java index a8bbb09df0..6db8399a10 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/LightningEntityRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LightningEntityRendererMixin.java @@ -28,10 +28,10 @@ private static void onSetLightningVertex(Matrix4f matrix4f, VertexConsumer verte 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).next(); - 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).next(); - 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).next(); - 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).next(); + 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 2b8e2046d6..c7d4630c92 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityAccessor.java @@ -6,16 +6,12 @@ package meteordevelopment.meteorclient.mixin; import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.data.TrackedData; import net.minecraft.fluid.Fluid; -import net.minecraft.particle.ParticleEffect; import net.minecraft.registry.tag.TagKey; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.gen.Invoker; -import java.util.List; - @Mixin(LivingEntity.class) public interface LivingEntityAccessor { @Invoker("swimUpward") diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityRendererMixin.java index 8d86e3a5cf..1722122854 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityRendererMixin.java @@ -108,7 +108,7 @@ private void modifyScale(Args args, T livingEntity, float f, float g, MatrixStac args.set(2, module.playersScale.get().floatValue()); } - @ModifyArgs(method = "render(Lnet/minecraft/entity/LivingEntity;FFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/entity/model/EntityModel;render(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumer;IIFFFF)V")) + @ModifyArgs(method = "render(Lnet/minecraft/entity/LivingEntity;FFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/entity/model/EntityModel;render(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumer;III)V")) private void modifyColor(Args args, T livingEntity, float f, float g, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i) { Chams module = Modules.get().get(Chams.class); if (!module.isActive() || !module.players.get() || !(livingEntity instanceof PlayerEntity)) return; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerArmorSlotMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerArmorSlotMixin.java index d4f3bac608..bfa36adcae 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerArmorSlotMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerArmorSlotMixin.java @@ -5,31 +5,35 @@ package meteordevelopment.meteorclient.mixin; -import com.llamalad7.mixinextras.injector.ModifyReturnValue; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.misc.InventoryTweaks; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.inventory.Inventory; import net.minecraft.item.ItemStack; +import net.minecraft.screen.slot.Slot; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; @Mixin(targets = "net/minecraft/screen/PlayerScreenHandler$1") -public abstract class PlayerArmorSlotMixin { - @ModifyReturnValue(method = "getMaxItemCount", at = @At("RETURN")) - private int onGetMaxItemCount(int original) { +public abstract class PlayerArmorSlotMixin extends Slot { + public PlayerArmorSlotMixin(Inventory inventory, int index, int x, int y) { + super(inventory, index, x, y); + } + + @Override + public int getMaxItemCount() { if (Modules.get().get(InventoryTweaks.class).armorStorage()) return 64; - return original; + return super.getMaxItemCount(); } - @ModifyReturnValue(method = "canInsert", at = @At("RETURN")) - private boolean onCanInsert(boolean original, ItemStack stack) { + @Override + public boolean canInsert(ItemStack stack) { if (Modules.get().get(InventoryTweaks.class).armorStorage()) return true; - return original; + return super.canInsert(stack); } - @ModifyReturnValue(method = "canTakeItems", at = @At("RETURN")) - private boolean onCanTakeItems(boolean original, PlayerEntity playerEntity) { + @Override + public boolean canTakeItems(PlayerEntity playerEntity) { if (Modules.get().get(InventoryTweaks.class).armorStorage()) return true; - return original; + return super.canTakeItems(playerEntity); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityRendererMixin.java index 4932ab2a91..42f87312f0 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityRendererMixin.java @@ -41,7 +41,7 @@ private void redirectRenderMain(ModelPart modelPart, MatrixStack matrices, Verte if (chams.isActive() && chams.hand.get()) { Color color = chams.handColor.get(); - modelPart.render(matrices, vertices, light, overlay, color.r/255f, color.g/255f, color.b/255f, color.a/255f); + modelPart.render(matrices, vertices, light, overlay, color.getPacked()); } else { modelPart.render(matrices, vertices, light, overlay); } @@ -55,7 +55,7 @@ private void redirectRenderSleeve(ModelPart modelPart, MatrixStack matrices, Ver if (chams.isActive() && chams.hand.get()) { Color color = chams.handColor.get(); - modelPart.render(matrices, vertices, light, overlay, color.r/255f, color.g/255f, color.b/255f, color.a/255f); + modelPart.render(matrices, vertices, light, overlay, color.getPacked()); } else { modelPart.render(matrices, vertices, light, overlay); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/RenderTickCounterMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/RenderTickCounterDynamicMixin.java similarity index 65% rename from src/main/java/meteordevelopment/meteorclient/mixin/RenderTickCounterMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/RenderTickCounterDynamicMixin.java index 97bd3f4dde..78161d34f5 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/RenderTickCounterMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/RenderTickCounterDynamicMixin.java @@ -15,12 +15,13 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -@Mixin(RenderTickCounter.class) -public abstract class RenderTickCounterMixin { - @Shadow public float lastFrameDuration; +@Mixin(RenderTickCounter.Dynamic.class) +public abstract class RenderTickCounterDynamicMixin { + @Shadow + private float lastFrameDuration; - @Inject(method = "beginRenderTick", at = @At(value = "FIELD", target = "Lnet/minecraft/client/render/RenderTickCounter;prevTimeMillis:J", opcode = Opcodes.PUTFIELD)) + @Inject(method = "beginRenderTick(J)I", at = @At(value = "FIELD", target = "Lnet/minecraft/client/render/RenderTickCounter$Dynamic;prevTimeMillis:J", opcode = Opcodes.PUTFIELD)) private void onBeingRenderTick(long a, CallbackInfoReturnable info) { - lastFrameDuration *= Modules.get().get(Timer.class).getMultiplier(); + lastFrameDuration *= (float) Modules.get().get(Timer.class).getMultiplier(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ShulkerBoxBlockMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ShulkerBoxBlockMixin.java index 0d5c17c436..5fc370ce06 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ShulkerBoxBlockMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ShulkerBoxBlockMixin.java @@ -8,9 +8,10 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.BetterTooltips; import net.minecraft.block.ShulkerBoxBlock; -import net.minecraft.client.item.TooltipType; + import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.item.tooltip.TooltipType; import net.minecraft.text.Text; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/VertexBufferMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/VertexBufferMixin.java index c0f052beaa..1f02d3cd4e 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/VertexBufferMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/VertexBufferMixin.java @@ -5,10 +5,10 @@ package meteordevelopment.meteorclient.mixin; +import com.mojang.blaze3d.systems.RenderSystem; import meteordevelopment.meteorclient.renderer.GL; import net.minecraft.client.gl.VertexBuffer; -import net.minecraft.client.render.BufferBuilder; -import net.minecraft.client.render.VertexFormat; +import net.minecraft.client.render.BuiltBuffer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -21,9 +21,9 @@ public abstract class VertexBufferMixin { @Shadow private int indexBufferId; - @Inject(method = "uploadIndexBuffer", at = @At("RETURN")) - private void onConfigureIndexBuffer(BufferBuilder.DrawParameters parameters, ByteBuffer vertexBuffer, CallbackInfoReturnable info) { + @Inject(method = "uploadIndexBuffer(Lnet/minecraft/client/render/BuiltBuffer$DrawParameters;Ljava/nio/ByteBuffer;)Lcom/mojang/blaze3d/systems/RenderSystem$ShapeIndexBuffer;", at = @At("RETURN")) + private void onConfigureIndexBuffer(BuiltBuffer.DrawParameters parameters, ByteBuffer indexBuffer, CallbackInfoReturnable info) { if (info.getReturnValue() == null) GL.CURRENT_IBO = this.indexBufferId; - else GL.CURRENT_IBO = ((ShapeIndexBufferAccessor) info.getReturnValue()).getId(); + else GL.CURRENT_IBO = ((ShapeIndexBufferAccessor) (Object) info.getReturnValue()).getId(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererAccessor.java index e072224aa1..ed353303d3 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererAccessor.java @@ -7,8 +7,9 @@ import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import net.minecraft.client.gl.Framebuffer; -import net.minecraft.client.render.BlockBreakingInfo; + import net.minecraft.client.render.WorldRenderer; +import net.minecraft.entity.player.BlockBreakingInfo; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererMixin.java index bba18185e9..a8f4f543cf 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererMixin.java @@ -75,7 +75,7 @@ private void hasBlindnessOrDarkness(Camera camera, CallbackInfoReturnable load(NbtCompound tag) { NbtCompound valueTag = tag.getCompound("value"); for (String key : valueTag.getKeys()) { - get().put(Registries.BLOCK.get(new Identifier(key)), defaultData.get().copy().fromTag(valueTag.getCompound(key))); + get().put(Registries.BLOCK.get(Identifier.of(key)), defaultData.get().copy().fromTag(valueTag.getCompound(key))); } return get(); diff --git a/src/main/java/meteordevelopment/meteorclient/settings/BlockListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/BlockListSetting.java index 569730c3c2..8bd8419bc8 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/BlockListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/BlockListSetting.java @@ -75,7 +75,7 @@ protected List load(NbtCompound tag) { NbtList valueTag = tag.getList("value", 8); for (NbtElement tagI : valueTag) { - Block block = Registries.BLOCK.get(new Identifier(tagI.asString())); + Block block = Registries.BLOCK.get(Identifier.of(tagI.asString())); if (filter == null || filter.test(block)) get().add(block); } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/BlockSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/BlockSetting.java index 2a4b0b55c7..9500e14260 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/BlockSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/BlockSetting.java @@ -46,7 +46,7 @@ protected NbtCompound save(NbtCompound tag) { @Override protected Block load(NbtCompound tag) { - value = Registries.BLOCK.get(new Identifier(tag.getString("value"))); + value = Registries.BLOCK.get(Identifier.of(tag.getString("value"))); if (filter != null && !filter.test(value)) { for (Block block : Registries.BLOCK) { diff --git a/src/main/java/meteordevelopment/meteorclient/settings/EnchantmentListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/EnchantmentListSetting.java index 97615417ee..295d39fb77 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/EnchantmentListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/EnchantmentListSetting.java @@ -5,60 +5,69 @@ 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.Registries; +import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.RegistryKeys; import net.minecraft.util.Identifier; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +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, List 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); } @Override public void resetImpl() { - value = new ArrayList<>(defaultValue); + value = new ObjectOpenHashSet<>(defaultValue); } @Override - protected List parseImpl(String str) { + protected Set> parseImpl(String str) { String[] values = str.split(","); - List enchs = new ArrayList<>(values.length); + Set> enchs = new ObjectOpenHashSet<>(values.length); - try { - for (String value : values) { - Enchantment ench = parseId(Registries.ENCHANTMENT, value); - if (ench != null) enchs.add(ench); - } - } catch (Exception ignored) {} + for (String value : values) { + String name = value.trim(); + + Identifier id; + if (name.contains(":")) id = Identifier.of(name); + else id = Identifier.ofVanilla(name); + + enchs.add(RegistryKey.of(RegistryKeys.ENCHANTMENT, id)); + } return enchs; } @Override - protected boolean isValueValid(List value) { + protected boolean isValueValid(Set> value) { return true; } @Override public Iterable getIdentifierSuggestions() { - return Registries.ENCHANTMENT.getIds(); + return Optional.ofNullable(MinecraftClient.getInstance().getNetworkHandler()) + .flatMap(networkHandler -> networkHandler.getRegistryManager().getOptional(RegistryKeys.ENCHANTMENT)) + .map(Registry::getIds).orElse(Set.of()); } @Override public NbtCompound save(NbtCompound tag) { NbtList valueTag = new NbtList(); - for (Enchantment ench : get()) { - Identifier id = Registries.ENCHANTMENT.getId(ench); - if (id != null) valueTag.add(NbtString.of(id.toString())); + for (RegistryKey ench : get()) { + valueTag.add(NbtString.of(ench.getValue().toString())); } tag.put("value", valueTag); @@ -66,30 +75,53 @@ public NbtCompound save(NbtCompound tag) { } @Override - public List load(NbtCompound tag) { + public Set> load(NbtCompound tag) { get().clear(); NbtList valueTag = tag.getList("value", 8); for (NbtElement tagI : valueTag) { - Enchantment enchantment = Registries.ENCHANTMENT.get(new Identifier(tagI.asString())); - if (enchantment != null) get().add(enchantment); + get().add(RegistryKey.of(RegistryKeys.ENCHANTMENT, Identifier.of(tagI.asString()))); } return get(); } - public static class Builder extends SettingBuilder, EnchantmentListSetting> { + public static class Builder extends SettingBuilder>, EnchantmentListSetting> { + private static final Set> VANILLA_DEFAULTS; + public Builder() { - super(new ArrayList<>(0)); + super(new ObjectOpenHashSet<>()); } - public Builder defaultValue(Enchantment... defaults) { - return defaultValue(defaults != null ? Arrays.asList(defaults) : new ArrayList<>()); + public Builder vanillaDefaults() { + return defaultValue(VANILLA_DEFAULTS); + } + + @SafeVarargs + public final Builder defaultValue(RegistryKey... defaults) { + return defaultValue(defaults != null ? new ObjectOpenHashSet<>(defaults) : new ObjectOpenHashSet<>()); } @Override public EnchantmentListSetting build() { return new EnchantmentListSetting(name, description, defaultValue, onChanged, onModuleActivated, visible); } + + static { + //noinspection unchecked,rawtypes + 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) + .map(field -> { + try { + return field.get(null); + } catch (IllegalAccessException e) { + return null; + } + }).filter(Objects::nonNull) + .map(RegistryKey.class::cast) + .filter(registryKey -> registryKey.getRegistryRef() == RegistryKeys.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 9fface86c9..1b867478d5 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/EntityTypeListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/EntityTypeListSetting.java @@ -112,7 +112,7 @@ public Set> load(NbtCompound tag) { NbtList valueTag = tag.getList("value", 8); for (NbtElement tagI : valueTag) { - EntityType type = Registries.ENTITY_TYPE.get(new Identifier(tagI.asString())); + EntityType type = Registries.ENTITY_TYPE.get(Identifier.of(tagI.asString())); if (filter == null || filter.test(type)) get().add(type); } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/ItemListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/ItemListSetting.java index 17e4de9d5c..e9f0c4b4a3 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/ItemListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/ItemListSetting.java @@ -77,7 +77,7 @@ public List load(NbtCompound tag) { NbtList valueTag = tag.getList("value", 8); for (NbtElement tagI : valueTag) { - Item item = Registries.ITEM.get(new Identifier(tagI.asString())); + Item item = Registries.ITEM.get(Identifier.of(tagI.asString())); 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 37e8d4721e..10db4d513c 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/ItemSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/ItemSetting.java @@ -46,7 +46,7 @@ public NbtCompound save(NbtCompound tag) { @Override public Item load(NbtCompound tag) { - value = Registries.ITEM.get(new Identifier(tag.getString("value"))); + value = Registries.ITEM.get(Identifier.of(tag.getString("value"))); if (filter != null && !filter.test(value)) { for (Item item : Registries.ITEM) { diff --git a/src/main/java/meteordevelopment/meteorclient/settings/ParticleTypeListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/ParticleTypeListSetting.java index cd73f6de15..8fe6fc8097 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/ParticleTypeListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/ParticleTypeListSetting.java @@ -72,7 +72,7 @@ public List> load(NbtCompound tag) { NbtList valueTag = tag.getList("value", 8); for (NbtElement tagI : valueTag) { - ParticleType particleType = Registries.PARTICLE_TYPE.get(new Identifier(tagI.asString())); + ParticleType particleType = Registries.PARTICLE_TYPE.get(Identifier.of(tagI.asString())); 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 30f624c9c0..c4e55d3134 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/ScreenHandlerListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/ScreenHandlerListSetting.java @@ -72,7 +72,7 @@ public List> load(NbtCompound tag) { NbtList valueTag = tag.getList("value", 8); for (NbtElement tagI : valueTag) { - ScreenHandlerType type = Registries.SCREEN_HANDLER.get(new Identifier(tagI.asString())); + ScreenHandlerType type = Registries.SCREEN_HANDLER.get(Identifier.of(tagI.asString())); if (type != null) get().add(type); } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/Setting.java b/src/main/java/meteordevelopment/meteorclient/settings/Setting.java index 6c95cca30d..cbe2437111 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/Setting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/Setting.java @@ -12,6 +12,7 @@ import net.minecraft.nbt.NbtCompound; import net.minecraft.registry.Registry; import net.minecraft.util.Identifier; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -151,12 +152,13 @@ public int hashCode() { return Objects.hash(name); } + @Nullable public static T parseId(Registry registry, String name) { name = name.trim(); Identifier id; - if (name.contains(":")) id = new Identifier(name); - else id = new Identifier("minecraft", name); + if (name.contains(":")) id = Identifier.of(name); + else id = Identifier.of("minecraft", name); if (registry.containsId(id)) return registry.get(id); return null; diff --git a/src/main/java/meteordevelopment/meteorclient/settings/SoundEventListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/SoundEventListSetting.java index b656b6ffef..7b79c9acf9 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/SoundEventListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/SoundEventListSetting.java @@ -71,7 +71,7 @@ public List load(NbtCompound tag) { NbtList valueTag = tag.getList("value", 8); for (NbtElement tagI : valueTag) { - SoundEvent soundEvent = Registries.SOUND_EVENT.get(new Identifier(tagI.asString())); + SoundEvent soundEvent = Registries.SOUND_EVENT.get(Identifier.of(tagI.asString())); 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 cd2f90c5fe..682a55f822 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/StatusEffectAmplifierMapSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/StatusEffectAmplifierMapSetting.java @@ -77,7 +77,7 @@ public Reference2IntMap load(NbtCompound tag) { NbtCompound valueTag = tag.getCompound("value"); for (String key : valueTag.getKeys()) { - StatusEffect statusEffect = Registries.STATUS_EFFECT.get(new Identifier(key)); + StatusEffect statusEffect = Registries.STATUS_EFFECT.get(Identifier.of(key)); if (statusEffect != null) get().put(statusEffect, valueTag.getInt(key)); } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/StatusEffectListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/StatusEffectListSetting.java index c2434785ba..268f7325ab 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/StatusEffectListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/StatusEffectListSetting.java @@ -72,7 +72,7 @@ public List load(NbtCompound tag) { NbtList valueTag = tag.getList("value", 8); for (NbtElement tagI : valueTag) { - StatusEffect effect = Registries.STATUS_EFFECT.get(new Identifier(tagI.asString())); + StatusEffect effect = Registries.STATUS_EFFECT.get(Identifier.of(tagI.asString())); if (effect != null) get().add(effect); } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/StorageBlockListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/StorageBlockListSetting.java index 7b364efde6..36d9b39feb 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/StorageBlockListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/StorageBlockListSetting.java @@ -8,7 +8,7 @@ import com.mojang.datafixers.util.Pair; import com.mojang.serialization.Lifecycle; import it.unimi.dsi.fastutil.objects.ObjectIterators; -import meteordevelopment.meteorclient.utils.misc.MeteorIdentifier; +import meteordevelopment.meteorclient.MeteorClient; import net.minecraft.block.entity.BlockEntityType; import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtElement; @@ -30,7 +30,24 @@ import java.util.stream.Stream; public class StorageBlockListSetting extends Setting>> { - public static final BlockEntityType[] STORAGE_BLOCKS = { BlockEntityType.FURNACE, BlockEntityType.CHEST, BlockEntityType.TRAPPED_CHEST, BlockEntityType.ENDER_CHEST, BlockEntityType.DISPENSER, BlockEntityType.DROPPER, BlockEntityType.HOPPER, BlockEntityType.SHULKER_BOX, BlockEntityType.BARREL, BlockEntityType.SMOKER, BlockEntityType.BLAST_FURNACE, BlockEntityType.CAMPFIRE }; + public static final BlockEntityType[] STORAGE_BLOCKS = new BlockEntityType[]{ + BlockEntityType.BARREL, + BlockEntityType.BLAST_FURNACE, + BlockEntityType.BREWING_STAND, + BlockEntityType.CAMPFIRE, + BlockEntityType.CHEST, + BlockEntityType.CHISELED_BOOKSHELF, + BlockEntityType.CRAFTER, + BlockEntityType.DISPENSER, + BlockEntityType.DECORATED_POT, + BlockEntityType.DROPPER, + BlockEntityType.ENDER_CHEST, + BlockEntityType.FURNACE, + BlockEntityType.HOPPER, + BlockEntityType.SHULKER_BOX, + BlockEntityType.SMOKER, + BlockEntityType.TRAPPED_CHEST, + }; public static final Registry> REGISTRY = new SRegistry(); @@ -86,7 +103,7 @@ public List> load(NbtCompound tag) { NbtList valueTag = tag.getList("value", 8); for (NbtElement tagI : valueTag) { - BlockEntityType type = Registries.BLOCK_ENTITY_TYPE.get(new Identifier(tagI.asString())); + BlockEntityType type = Registries.BLOCK_ENTITY_TYPE.get(Identifier.of(tagI.asString())); if (type != null) get().add(type); } @@ -110,7 +127,7 @@ public StorageBlockListSetting build() { private static class SRegistry extends SimpleRegistry> { public SRegistry() { - super(RegistryKey.ofRegistry(new MeteorIdentifier("storage-blocks")), Lifecycle.stable()); + super(RegistryKey.ofRegistry(MeteorClient.identifier("storage-blocks")), Lifecycle.stable()); } @Override 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 77d66f3206..f2b4d7be41 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/CombatHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/CombatHud.java @@ -6,6 +6,9 @@ package meteordevelopment.meteorclient.systems.hud.elements; import com.mojang.blaze3d.systems.RenderSystem; +import it.unimi.dsi.fastutil.objects.Object2IntMap; +import it.unimi.dsi.fastutil.objects.ObjectIntImmutablePair; +import it.unimi.dsi.fastutil.objects.ObjectIntPair; import meteordevelopment.meteorclient.renderer.Renderer2D; import meteordevelopment.meteorclient.renderer.text.TextRenderer; import meteordevelopment.meteorclient.settings.*; @@ -31,14 +34,13 @@ import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.item.SwordItem; -import net.minecraft.registry.Registries; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.registry.tag.EnchantmentTags; import net.minecraft.util.math.MathHelper; import org.joml.Matrix4fStack; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import static meteordevelopment.meteorclient.MeteorClient.mc; @@ -85,10 +87,10 @@ public class CombatHud extends HudElement { .build() ); - private final Setting> displayedEnchantments = sgGeneral.add(new EnchantmentListSetting.Builder() + private final Setting>> displayedEnchantments = sgGeneral.add(new EnchantmentListSetting.Builder() .name("displayed-enchantments") .description("The enchantments that are shown on nametags.") - .defaultValue(getDefaultEnchantments()) + .vanillaDefaults() .build() ); @@ -225,7 +227,7 @@ public void render(HudRenderer renderer) { (int) (y + (66 * scale.get())), (int) (30 * scale.get()), 0, - -MathHelper.wrapDegrees(playerEntity.prevYaw + (playerEntity.getYaw() - playerEntity.prevYaw) * mc.getTickDelta()), + -MathHelper.wrapDegrees(playerEntity.prevYaw + (playerEntity.getYaw() - playerEntity.prevYaw) * mc.getRenderTickCounter().getTickDelta(true)), -playerEntity.getPitch(), playerEntity ); @@ -355,20 +357,19 @@ public void render(HudRenderer renderer) { armorY += 18; ItemEnchantmentsComponent enchantments = EnchantmentHelper.getEnchantments(itemStack); - Map enchantmentsToShow = new HashMap<>(); + List>> enchantmentsToShow = new ArrayList<>(); - for (Enchantment enchantment : displayedEnchantments.get()) { - if (enchantments.getEnchantments().contains(Registries.ENCHANTMENT.getEntry(enchantment))) { - enchantmentsToShow.put(enchantment, enchantments.getLevel(enchantment)); + for (Object2IntMap.Entry> entry : enchantments.getEnchantmentEntries()) { + if (entry.getKey().matches(displayedEnchantments.get()::contains)) { + enchantmentsToShow.add(new ObjectIntImmutablePair<>(entry.getKey(), entry.getIntValue())); } } - for (Enchantment enchantment : enchantmentsToShow.keySet()) { - String enchantName = Utils.getEnchantSimpleName(enchantment, 3) + " " + enchantmentsToShow.get(enchantment); + for (ObjectIntPair> entry : enchantmentsToShow) { + String enchantName = Utils.getEnchantSimpleName(entry.left(), 3) + " " + entry.rightInt(); double enchX = (armorX + 8) - (TextRenderer.get().getWidth(enchantName) / 2); - - TextRenderer.get().render(enchantName, enchX, armorY, enchantment.isCursed() ? RED : enchantmentTextColor.get()); + TextRenderer.get().render(enchantName, enchX, armorY, entry.left().isIn(EnchantmentTags.CURSE) ? RED : enchantmentTextColor.get()); armorY += TextRenderer.get().getHeight(); } slot--; @@ -440,14 +441,4 @@ private ItemStack getItem(int i) { default -> playerEntity.getInventory().getArmorStack(i); }; } - - public static List getDefaultEnchantments() { - List enchantments = new ArrayList<>(); - - for (Enchantment enchantment : Registries.ENCHANTMENT) { - enchantments.add(enchantment); - } - - return enchantments; - } } 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 d4ae09dffa..2509cb271f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/InventoryHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/InventoryHud.java @@ -5,13 +5,13 @@ package meteordevelopment.meteorclient.systems.hud.elements; +import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.hud.Hud; import meteordevelopment.meteorclient.systems.hud.HudElement; import meteordevelopment.meteorclient.systems.hud.HudElementInfo; import meteordevelopment.meteorclient.systems.hud.HudRenderer; import meteordevelopment.meteorclient.utils.Utils; -import meteordevelopment.meteorclient.utils.misc.MeteorIdentifier; import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.render.color.SettingColor; import net.minecraft.item.ItemStack; @@ -23,8 +23,8 @@ public class InventoryHud extends HudElement { public static final HudElementInfo INFO = new HudElementInfo<>(Hud.GROUP, "inventory", "Displays your inventory.", InventoryHud::new); - private static final Identifier TEXTURE = new MeteorIdentifier("textures/container.png"); - private static final Identifier TEXTURE_TRANSPARENT = new MeteorIdentifier("textures/container-transparent.png"); + private static final Identifier TEXTURE = MeteorClient.identifier("textures/container.png"); + private static final Identifier TEXTURE_TRANSPARENT = MeteorClient.identifier("textures/container-transparent.png"); private final SettingGroup sgGeneral = settings.getDefaultGroup(); 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 a311bb135f..69ed1a9595 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PlayerModelHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PlayerModelHud.java @@ -111,7 +111,7 @@ public void render(HudRenderer renderer) { float offset = centerOrientation.get() == CenterOrientation.North ? 180 : 0; - float yaw = copyYaw.get() ? MathHelper.wrapDegrees(player.prevYaw + (player.getYaw() - player.prevYaw) * mc.getTickDelta() + offset) : (float) customYaw.get(); + float yaw = copyYaw.get() ? MathHelper.wrapDegrees(player.prevYaw + (player.getYaw() - player.prevYaw) * mc.getRenderTickCounter().getTickDelta(true) + offset) : (float) customYaw.get(); float pitch = copyPitch.get() ? player.getPitch() : (float) customPitch.get(); drawEntity(renderer.drawContext, x, y, (int) (30 * scale.get()), -yaw, -pitch, player); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java index 602bd1ae6a..c5583011a5 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java @@ -35,7 +35,6 @@ import meteordevelopment.meteorclient.systems.modules.world.*; import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.misc.Keybind; -import meteordevelopment.meteorclient.utils.misc.MeteorIdentifier; import meteordevelopment.meteorclient.utils.misc.ValueComparableMap; import meteordevelopment.meteorclient.utils.misc.input.Input; import meteordevelopment.meteorclient.utils.misc.input.KeyAction; @@ -591,7 +590,7 @@ private void initMisc() { public static class ModuleRegistry extends SimpleRegistry { public ModuleRegistry() { - super(RegistryKey.ofRegistry(new MeteorIdentifier("modules")), Lifecycle.stable()); + super(RegistryKey.ofRegistry(MeteorClient.identifier("modules")), Lifecycle.stable()); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoArmor.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoArmor.java index 40906739c9..7e30c169f6 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoArmor.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoArmor.java @@ -22,10 +22,12 @@ import net.minecraft.item.ElytraItem; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.entry.RegistryEntry; import java.util.Arrays; import java.util.Comparator; -import java.util.List; +import java.util.Set; public class AutoArmor extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); @@ -46,7 +48,7 @@ public class AutoArmor extends Module { .build() ); - private final Setting> avoidedEnchantments = sgGeneral.add(new EnchantmentListSetting.Builder() + private final Setting>> avoidedEnchantments = sgGeneral.add(new EnchantmentListSetting.Builder() .name("avoided-enchantments") .description("Enchantments that should be avoided.") .defaultValue(Enchantments.BINDING_CURSE, Enchantments.FROST_WALKER) @@ -74,7 +76,7 @@ public class AutoArmor extends Module { .build() ); - private final Object2IntMap enchantments = new Object2IntOpenHashMap<>(); + private final Object2IntMap> enchantments = new Object2IntOpenHashMap<>(); private final ArmorPiece[] armorPieces = new ArmorPiece[4]; private final ArmorPiece helmet = new ArmorPiece(3); private final ArmorPiece chestplate = new ArmorPiece(2); @@ -139,8 +141,10 @@ private void onPreTick(TickEvent.Pre event) { } private boolean hasAvoidedEnchantment() { - for (Enchantment enchantment : avoidedEnchantments.get()) { - if (enchantments.containsKey(enchantment)) return true; + for (RegistryEntry enchantment : enchantments.keySet()) { + if (enchantment.matches(avoidedEnchantments.get()::contains)) { + return true; + } } return false; @@ -158,18 +162,18 @@ private int getScore(ItemStack itemStack) { int score = 0; // Prefer blast protection on leggings if enabled - Enchantment protection = preferredProtection.get().enchantment; + RegistryKey protection = preferredProtection.get().enchantment; if (itemStack.getItem() instanceof ArmorItem && blastLeggings.get() && getItemSlotId(itemStack) == 1) { protection = Enchantments.BLAST_PROTECTION; } - score += 3 * enchantments.getInt(protection); - score += enchantments.getInt(Enchantments.PROTECTION); - score += enchantments.getInt(Enchantments.BLAST_PROTECTION); - score += enchantments.getInt(Enchantments.FIRE_PROTECTION); - score += enchantments.getInt(Enchantments.PROJECTILE_PROTECTION); - score += enchantments.getInt(Enchantments.UNBREAKING); - score += 2 * enchantments.getInt(Enchantments.MENDING); + score += 3 * Utils.getEnchantmentLevel(enchantments, protection); + score += Utils.getEnchantmentLevel(enchantments, Enchantments.PROTECTION); + score += Utils.getEnchantmentLevel(enchantments, Enchantments.BLAST_PROTECTION); + score += Utils.getEnchantmentLevel(enchantments, Enchantments.FIRE_PROTECTION); + score += Utils.getEnchantmentLevel(enchantments, Enchantments.PROJECTILE_PROTECTION); + score += Utils.getEnchantmentLevel(enchantments, Enchantments.UNBREAKING); + score += 2 * Utils.getEnchantmentLevel(enchantments, Enchantments.MENDING); score += itemStack.getItem() instanceof ArmorItem armorItem ? armorItem.getProtection() : 0; score += itemStack.getItem() instanceof ArmorItem armorItem ? (int) armorItem.getToughness() : 0; @@ -206,9 +210,9 @@ public enum Protection { FireProtection(Enchantments.FIRE_PROTECTION), ProjectileProtection(Enchantments.PROJECTILE_PROTECTION); - private final Enchantment enchantment; + private final RegistryKey enchantment; - Protection(Enchantment enchantment) { + Protection(RegistryKey enchantment) { this.enchantment = enchantment; } } @@ -291,7 +295,7 @@ else if (antiBreak.get() && durability <= 10) { } private int decreaseScoreByAvoidedEnchantments(int score) { - for (Enchantment enchantment : avoidedEnchantments.get()) { + for (RegistryKey enchantment : avoidedEnchantments.get()) { score -= 2 * enchantments.getInt(enchantment); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoEXP.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoEXP.java index 09eecd9c2a..2cc325afeb 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoEXP.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoEXP.java @@ -9,12 +9,12 @@ import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; +import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.player.FindItemResult; import meteordevelopment.meteorclient.utils.player.InvUtils; import meteordevelopment.meteorclient.utils.player.Rotations; import meteordevelopment.meteorclient.utils.player.SlotUtils; import meteordevelopment.orbit.EventHandler; -import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.enchantment.Enchantments; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; @@ -127,7 +127,7 @@ private void onTick(TickEvent.Pre event) { } private boolean needsRepair(ItemStack itemStack, double threshold) { - if (itemStack.isEmpty() || EnchantmentHelper.getLevel(Enchantments.MENDING, itemStack) < 1) return false; + if (itemStack.isEmpty() || !Utils.hasEnchantments(itemStack, Enchantments.MENDING)) return false; return (itemStack.getMaxDamage() - itemStack.getDamage()) / (double) itemStack.getMaxDamage() * 100 <= threshold; } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoWeapon.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoWeapon.java index c8341f6e25..e1326e99b2 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoWeapon.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoWeapon.java @@ -12,7 +12,6 @@ import meteordevelopment.meteorclient.utils.entity.EntityUtils; import meteordevelopment.meteorclient.utils.player.InvUtils; import meteordevelopment.orbit.EventHandler; -import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.EntityType; import net.minecraft.item.AxeItem; import net.minecraft.item.ItemStack; @@ -62,14 +61,14 @@ private int getBestWeapon(EntityType group) { ItemStack stack = mc.player.getInventory().getStack(i); if (stack.getItem() instanceof SwordItem swordItem && (!antiBreak.get() || (stack.getMaxDamage() - stack.getDamage()) > 10)) { - currentDamageS = swordItem.getMaterial().getAttackDamage() + EnchantmentHelper.getAttackDamage(stack, group) + 2; + currentDamageS = swordItem.getMaterial().getAttackDamage() /*fixme + EnchantmentHelper.getAttackDamage(stack, group)*/ + 2; if (currentDamageS > damageS) { damageS = currentDamageS; slotS = i; } } else if (stack.getItem() instanceof AxeItem axeItem && (!antiBreak.get() || (stack.getMaxDamage() - stack.getDamage()) > 10)) { - currentDamageA = axeItem.getMaterial().getAttackDamage() + EnchantmentHelper.getAttackDamage(stack, group) + 2; + currentDamageA = axeItem.getMaterial().getAttackDamage() /*fixme + EnchantmentHelper.getAttackDamage(stack, group)*/ + 2; if (currentDamageA > damageA) { damageA = currentDamageA; slotA = i; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java index 6e41fcdd76..84e8310273 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java @@ -24,7 +24,7 @@ import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; -import net.minecraft.client.render.BlockBreakingInfo; +import net.minecraft.entity.player.BlockBreakingInfo; import net.minecraft.entity.Entity; import net.minecraft.entity.decoration.EndCrystalEntity; import net.minecraft.network.packet.c2s.play.HandSwingC2SPacket; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java index 297e6bfbb1..0400733503 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java @@ -11,6 +11,7 @@ import it.unimi.dsi.fastutil.chars.Char2CharOpenHashMap; import it.unimi.dsi.fastutil.ints.IntArrayList; import it.unimi.dsi.fastutil.ints.IntList; +import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.commands.Commands; import meteordevelopment.meteorclient.events.game.ReceiveMessageEvent; import meteordevelopment.meteorclient.events.game.SendMessageEvent; @@ -21,7 +22,6 @@ import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.Utils; -import meteordevelopment.meteorclient.utils.misc.MeteorIdentifier; import meteordevelopment.meteorclient.utils.misc.text.MeteorClickEvent; import meteordevelopment.meteorclient.utils.misc.text.TextVisitor; import meteordevelopment.meteorclient.utils.player.ChatUtils; @@ -388,8 +388,8 @@ public static void registerCustomHead(String prefix, Identifier texture) { } static { - registerCustomHead("[Meteor]", new MeteorIdentifier("textures/icons/chat/meteor.png")); - registerCustomHead("[Baritone]", new MeteorIdentifier("textures/icons/chat/baritone.png")); + registerCustomHead("[Meteor]", MeteorClient.identifier("textures/icons/chat/meteor.png")); + registerCustomHead("[Baritone]", MeteorClient.identifier("textures/icons/chat/baritone.png")); } public int modifyChatWidth(int width) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notebot.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notebot.java index 44363f7421..0544a13ed3 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notebot.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notebot.java @@ -35,7 +35,7 @@ import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.NoteBlock; -import net.minecraft.block.enums.Instrument; +import net.minecraft.block.enums.NoteBlockInstrument; import net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket; import net.minecraft.network.packet.c2s.play.PlayerInteractBlockC2SPacket; import net.minecraft.sound.SoundEvents; @@ -254,7 +254,7 @@ public class Notebot extends Module { public Notebot() { super(Categories.Misc, "notebot", "Plays noteblock nicely"); - for (Instrument inst : Instrument.values()) { + for (NoteBlockInstrument inst : NoteBlockInstrument.values()) { NotebotUtils.OptionalInstrument optionalInstrument = NotebotUtils.OptionalInstrument.fromMinecraftInstrument(inst); if (optionalInstrument != null) { sgNoteMap.add(new EnumSetting.Builder() @@ -473,7 +473,7 @@ private void setupNoteblocksMap() { // Modifiable list of unique notes List uniqueNotesToUse = new ArrayList<>(song.getRequirements()); // A map with noteblocks that have incorrect note level - Map> incorrectNoteBlocks = new HashMap<>(); + Map> incorrectNoteBlocks = new HashMap<>(); // Check if there are already tuned noteblocks for (var entry : scannedNoteblocks.asMap().entrySet()) { @@ -502,7 +502,7 @@ private void setupNoteblocksMap() { List positions = entry.getValue(); if (mode.get() == NotebotUtils.NotebotMode.ExactInstruments) { - Instrument inst = entry.getKey(); + NoteBlockInstrument inst = entry.getKey(); List foundNotes = uniqueNotesToUse.stream() .filter(note -> note.getInstrument() == inst) @@ -936,13 +936,13 @@ private boolean isValidScanSpot(BlockPos pos) { } /** - * Gets an Instrument from Note Map + * Gets an NoteBlockInstrument from Note Map * * @param inst An instrument * @return A new instrument mapped by instrument given in parameters */ @Nullable - public Instrument getMappedInstrument(@NotNull Instrument inst) { + public NoteBlockInstrument getMappedInstrument(@NotNull NoteBlockInstrument inst) { if (mode.get() == NotebotUtils.NotebotMode.ExactInstruments) { NotebotUtils.OptionalInstrument optionalInstrument = (NotebotUtils.OptionalInstrument) sgNoteMap.getByIndex(inst.ordinal()).get(); return optionalInstrument.toMinecraftInstrument(); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Jesus.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Jesus.java index a3d6a73ba2..a78ecda49c 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Jesus.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Jesus.java @@ -21,8 +21,8 @@ import meteordevelopment.orbit.EventHandler; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; -import net.minecraft.enchantment.ProtectionEnchantment; import net.minecraft.entity.EntityType; +import net.minecraft.entity.attribute.EntityAttributes; import net.minecraft.entity.effect.StatusEffects; import net.minecraft.fluid.Fluids; import net.minecraft.network.packet.Packet; @@ -323,15 +323,14 @@ private boolean lavaShouldBeSolid() { private boolean lavaIsSafe() { if (!dipIfFireResistant.get()) return false; - return mc.player.hasStatusEffect(StatusEffects.FIRE_RESISTANCE) && (mc.player.getStatusEffect(StatusEffects.FIRE_RESISTANCE).getDuration() > ProtectionEnchantment.transformFireDuration(mc.player, 15 * 20)); + return mc.player.hasStatusEffect(StatusEffects.FIRE_RESISTANCE) && (mc.player.getStatusEffect(StatusEffects.FIRE_RESISTANCE).getDuration() > (15 * 20 * mc.player.getAttributeValue(EntityAttributes.GENERIC_BURNING_TIME))); + // todo verify } private boolean isOverLiquid() { boolean foundLiquid = false; boolean foundSolid = false; - - List blockCollisions = Streams.stream(mc.world.getBlockCollisions(mc.player, mc.player.getBoundingBox().offset(0, -0.5, 0))) .map(VoxelShape::getBoundingBox) .collect(Collectors.toCollection(ArrayList::new)); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/speed/modes/Strafe.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/speed/modes/Strafe.java index e3630a9fc2..194e23811d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/speed/modes/Strafe.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/speed/modes/Strafe.java @@ -73,7 +73,7 @@ public void onMove(PlayerMoveEvent event) { private Vector2d transformStrafe(double speed) { float forward = mc.player.input.movementForward; float side = mc.player.input.movementSideways; - float yaw = mc.player.prevYaw + (mc.player.getYaw() - mc.player.prevYaw) * mc.getTickDelta(); + float yaw = mc.player.prevYaw + (mc.player.getYaw() - mc.player.prevYaw) * mc.getRenderTickCounter().getTickDelta(true); double velX, velZ; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoMend.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoMend.java index 243e67a35a..209838989a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoMend.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoMend.java @@ -12,10 +12,10 @@ import meteordevelopment.meteorclient.settings.SettingGroup; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; +import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.player.InvUtils; import meteordevelopment.orbit.EventHandler; import net.minecraft.component.DataComponentTypes; -import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.enchantment.Enchantments; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -85,7 +85,7 @@ private boolean shouldWait() { if (itemStack.isEmpty()) return false; - if (EnchantmentHelper.getLevel(Enchantments.MENDING, itemStack) > 0) { + if (Utils.hasEnchantments(itemStack, Enchantments.MENDING)) { return itemStack.getDamage() != 0; } @@ -97,7 +97,7 @@ private int getSlot() { ItemStack itemStack = mc.player.getInventory().getStack(i); if (blacklist.get().contains(itemStack.getItem())) continue; - if (EnchantmentHelper.getLevel(Enchantments.MENDING, itemStack) > 0 && itemStack.getDamage() > 0) { + if (Utils.hasEnchantments(itemStack, Enchantments.MENDING) && itemStack.getDamage() > 0) { return i; } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java index c8cd0e1287..8c9ff700fb 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java @@ -14,13 +14,13 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.Xray; import meteordevelopment.meteorclient.systems.modules.world.InfinityMiner; +import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.player.InvUtils; import meteordevelopment.meteorclient.utils.world.BlockUtils; import meteordevelopment.orbit.EventHandler; import meteordevelopment.orbit.EventPriority; import net.minecraft.block.*; import net.minecraft.component.DataComponentTypes; -import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.enchantment.Enchantments; import net.minecraft.item.*; import net.minecraft.registry.tag.BlockTags; @@ -195,25 +195,25 @@ public static double getScore(ItemStack itemStack, BlockState state, boolean sil if (silkTouchEnderChest && state.getBlock() == Blocks.ENDER_CHEST - && EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, itemStack) == 0) { + && !Utils.hasEnchantments(itemStack, Enchantments.SILK_TOUCH)) { return -1; } if (fortuneOre && isFortunable(state.getBlock()) - && EnchantmentHelper.getLevel(Enchantments.FORTUNE, itemStack) == 0) { + && !Utils.hasEnchantments(itemStack, Enchantments.FORTUNE)) { return -1; } double score = 0; score += itemStack.getMiningSpeedMultiplier(state) * 1000; - score += EnchantmentHelper.getLevel(Enchantments.UNBREAKING, itemStack); - score += EnchantmentHelper.getLevel(Enchantments.EFFICIENCY, itemStack); - score += EnchantmentHelper.getLevel(Enchantments.MENDING, itemStack); + score += Utils.getEnchantmentLevel(itemStack, Enchantments.UNBREAKING); + score += Utils.getEnchantmentLevel(itemStack, Enchantments.EFFICIENCY); + score += Utils.getEnchantmentLevel(itemStack, Enchantments.MENDING); - if (enchantPreference == EnchantPreference.Fortune) score += EnchantmentHelper.getLevel(Enchantments.FORTUNE, itemStack); - if (enchantPreference == EnchantPreference.SilkTouch) score += EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, itemStack); + if (enchantPreference == EnchantPreference.Fortune) score += Utils.getEnchantmentLevel(itemStack, Enchantments.FORTUNE); + if (enchantPreference == EnchantPreference.SilkTouch) score += Utils.getEnchantmentLevel(itemStack, Enchantments.SILK_TOUCH); if (itemStack.getItem() instanceof SwordItem item && (state.getBlock() instanceof BambooBlock || state.getBlock() instanceof BambooShootBlock)) score += 9000 + (item.getComponents().get(DataComponentTypes.TOOL).getSpeed(state) * 1000); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/GhostHand.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/GhostHand.java index 1e9f5a7a42..010e6c2c30 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/GhostHand.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/GhostHand.java @@ -29,7 +29,7 @@ public GhostHand() { private void onTick(TickEvent.Pre event) { if (!mc.options.useKey.isPressed() || mc.player.isSneaking()) return; - if (mc.world.getBlockState(BlockPos.ofFloored(mc.player.raycast(mc.player.getBlockInteractionRange(), mc.getTickDelta(), false).getPos())).hasBlockEntity()) return; + if (mc.world.getBlockState(BlockPos.ofFloored(mc.player.raycast(mc.player.getBlockInteractionRange(), mc.getRenderTickCounter().getTickDelta(true), false).getPos())).hasBlockEntity()) return; Vec3d direction = new Vec3d(0, 0, 0.1) .rotateX(-(float) Math.toRadians(mc.player.getPitch())) @@ -38,7 +38,7 @@ private void onTick(TickEvent.Pre event) { posList.clear(); for (int i = 1; i < mc.player.getBlockInteractionRange() * 10; i++) { - BlockPos pos = BlockPos.ofFloored(mc.player.getCameraPosVec(mc.getTickDelta()).add(direction.multiply(i))); + BlockPos pos = BlockPos.ofFloored(mc.player.getCameraPosVec(mc.getRenderTickCounter().getTickDelta(true)).add(direction.multiply(i))); if (posList.contains(pos)) continue; posList.add(pos); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BreakIndicators.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BreakIndicators.java index ebf448ca16..8ba041839c 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BreakIndicators.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BreakIndicators.java @@ -18,7 +18,7 @@ import meteordevelopment.meteorclient.utils.render.color.SettingColor; import meteordevelopment.orbit.EventHandler; import net.minecraft.block.BlockState; -import net.minecraft.client.render.BlockBreakingInfo; +import net.minecraft.entity.player.BlockBreakingInfo; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Box; import net.minecraft.util.shape.VoxelShape; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Chams.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Chams.java index c015780748..1d2bcbef5a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Chams.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Chams.java @@ -5,11 +5,11 @@ package meteordevelopment.meteorclient.systems.modules.render; +import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.Utils; -import meteordevelopment.meteorclient.utils.misc.MeteorIdentifier; import meteordevelopment.meteorclient.utils.render.color.SettingColor; import meteordevelopment.meteorclient.utils.render.postprocess.PostProcessShaders; import net.minecraft.entity.Entity; @@ -215,7 +215,7 @@ public class Chams extends Module { .build() ); - public static final Identifier BLANK = new MeteorIdentifier("textures/blank.png"); + public static final Identifier BLANK = MeteorClient.identifier("textures/blank.png"); public Chams() { super(Categories.Render, "chams", "Tweaks rendering of entities."); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java index 77bf49b9aa..2057f9009a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java @@ -5,6 +5,9 @@ package meteordevelopment.meteorclient.systems.modules.render; +import it.unimi.dsi.fastutil.objects.Object2IntMap; +import it.unimi.dsi.fastutil.objects.Object2IntMaps; +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import meteordevelopment.meteorclient.events.render.Render2DEvent; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.renderer.Renderer2D; @@ -33,7 +36,9 @@ import net.minecraft.entity.decoration.ItemFrameEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; +import net.minecraft.registry.RegistryKey; import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.registry.tag.EnchantmentTags; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; import net.minecraft.world.GameMode; @@ -182,7 +187,7 @@ public class Nametags extends Module { .build() ); - private final Setting> shownEnchantments = sgPlayers.add(new EnchantmentListSetting.Builder() + private final Setting>> shownEnchantments = sgPlayers.add(new EnchantmentListSetting.Builder() .name("shown-enchantments") .description("The enchantments that are shown on nametags.") .visible(() -> displayItems.get() && displayEnchants.get()) @@ -485,8 +490,8 @@ private void renderNametagPlayer(Render2DEvent event, PlayerEntity player, boole int size = 0; for (RegistryEntry enchantment : enchantments.getEnchantments()) { - if (!shownEnchantments.get().contains(enchantment.value())) continue; - String enchantName = Utils.getEnchantSimpleName(enchantment.value(), enchantLength.get()) + " " + enchantments.getLevel(enchantment.value()); + if (enchantment.getKey().isPresent() && !shownEnchantments.get().contains(enchantment.getKey().get())) continue; + String enchantName = Utils.getEnchantSimpleName(enchantment, enchantLength.get()) + " " + enchantments.getLevel(enchantment); itemWidths[i] = Math.max(itemWidths[i], (text.getWidth(enchantName, shadow) / 2)); size++; } @@ -527,11 +532,11 @@ private void renderNametagPlayer(Render2DEvent event, PlayerEntity player, boole text.begin(0.5 * enchantTextScale.get(), false, true); ItemEnchantmentsComponent enchantments = EnchantmentHelper.getEnchantments(stack); - Map enchantmentsToShow = new HashMap<>(); + Object2IntMap> enchantmentsToShow = new Object2IntOpenHashMap<>(); for (RegistryEntry enchantment : enchantments.getEnchantments()) { - if (shownEnchantments.get().contains(enchantment.value())) { - enchantmentsToShow.put(enchantment.value(), enchantments.getLevel(enchantment.value())); + if (enchantment.matches(shownEnchantments.get()::contains)) { + enchantmentsToShow.put(enchantment, enchantments.getLevel(enchantment)); } } @@ -545,11 +550,11 @@ private void renderNametagPlayer(Render2DEvent event, PlayerEntity player, boole double enchantX; - for (Enchantment enchantment : enchantmentsToShow.keySet()) { - String enchantName = Utils.getEnchantSimpleName(enchantment, enchantLength.get()) + " " + enchantmentsToShow.get(enchantment); + for (Object2IntMap.Entry> entry : Object2IntMaps.fastIterable(enchantmentsToShow)) { + String enchantName = Utils.getEnchantSimpleName(entry.getKey(), enchantLength.get()) + " " + entry.getIntValue(); Color enchantColor = WHITE; - if (enchantment.isCursed()) enchantColor = RED; + if (entry.getKey().isIn(EnchantmentTags.CURSE)) enchantColor = RED; enchantX = switch (enchantPos.get()) { case Above -> x + (aW / 2) - (text.getWidth(enchantName, shadow) / 2); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/StorageESP.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/StorageESP.java index 9655ef5215..667942491e 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/StorageESP.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/StorageESP.java @@ -192,7 +192,7 @@ private void getBlockEntityColor(BlockEntity blockEntity) { else if (blockEntity instanceof BarrelBlockEntity) lineColor.set(barrel.get()); else if (blockEntity instanceof ShulkerBoxBlockEntity) lineColor.set(shulker.get()); else if (blockEntity instanceof EnderChestBlockEntity) lineColor.set(enderChest.get()); - else if (blockEntity instanceof AbstractFurnaceBlockEntity || blockEntity instanceof DispenserBlockEntity || blockEntity instanceof HopperBlockEntity) lineColor.set(other.get()); + else if (blockEntity instanceof AbstractFurnaceBlockEntity || blockEntity instanceof BrewingStandBlockEntity || blockEntity instanceof ChiseledBookshelfBlockEntity || blockEntity instanceof CrafterBlockEntity || blockEntity instanceof DispenserBlockEntity || blockEntity instanceof DecoratedPotBlockEntity || blockEntity instanceof HopperBlockEntity) lineColor.set(other.get()); else return; render = true; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java index c20c13dba3..b5f4aba8f2 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java @@ -15,7 +15,6 @@ import meteordevelopment.meteorclient.utils.misc.Pool; import meteordevelopment.meteorclient.utils.render.color.SettingColor; import meteordevelopment.orbit.EventHandler; -import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.enchantment.Enchantments; import net.minecraft.entity.Entity; import net.minecraft.entity.player.PlayerEntity; @@ -149,7 +148,7 @@ private void calculatePath(PlayerEntity player, double tickDelta) { if (!simulator.set(player, itemStack, 0, accurate.get(), tickDelta)) return; getEmptyPath().calculate(); - if (itemStack.getItem() instanceof CrossbowItem && EnchantmentHelper.getLevel(Enchantments.MULTISHOT, itemStack) > 0) { + if (itemStack.getItem() instanceof CrossbowItem && Utils.hasEnchantment(itemStack, Enchantments.MULTISHOT)) { if (!simulator.set(player, itemStack, MULTISHOT_OFFSET, accurate.get(), tickDelta)) return; // left multishot arrow getEmptyPath().calculate(); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSmelter.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSmelter.java index fd07a778bf..4c6fd693f4 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSmelter.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSmelter.java @@ -15,11 +15,11 @@ import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.player.InvUtils; import net.minecraft.block.entity.AbstractFurnaceBlockEntity; -import net.minecraft.inventory.SimpleInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.recipe.RecipeType; +import net.minecraft.recipe.input.SingleStackRecipeInput; import net.minecraft.screen.AbstractFurnaceScreenHandler; import java.util.List; @@ -67,7 +67,7 @@ private boolean fuelItemFilter(Item item) { } private boolean smeltableItemFilter(Item item) { - return mc.world != null && mc.world.getRecipeManager().getFirstMatch(RecipeType.SMELTING, new SimpleInventory(item.getDefaultStack()), mc.world).isPresent(); + return mc.world != null && mc.world.getRecipeManager().getFirstMatch(RecipeType.SMELTING, new SingleStackRecipeInput(item.getDefaultStack()), mc.world).isPresent(); } public void tick(AbstractFurnaceScreenHandler c) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/EChestFarmer.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/EChestFarmer.java index 0f6667e89c..f2455ea334 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/EChestFarmer.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/EChestFarmer.java @@ -12,6 +12,7 @@ import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.player.FindItemResult; import meteordevelopment.meteorclient.utils.player.InvUtils; import meteordevelopment.meteorclient.utils.player.PlayerUtils; @@ -21,7 +22,6 @@ import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; -import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.enchantment.Enchantments; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; @@ -153,7 +153,7 @@ private void onTick(TickEvent.Pre event) { for (int i = 0; i < 9; i++) { ItemStack itemStack = mc.player.getInventory().getStack(i); - if (EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, itemStack) > 0) continue; + if (Utils.hasEnchantment(itemStack, Enchantments.SILK_TOUCH)) continue; double score = itemStack.getMiningSpeedMultiplier(Blocks.ENDER_CHEST.getDefaultState()); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java index 657525a1dd..fdb0a1d6d3 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java @@ -17,6 +17,7 @@ import meteordevelopment.meteorclient.systems.modules.player.AutoGap; import meteordevelopment.meteorclient.systems.modules.player.AutoTool; import meteordevelopment.meteorclient.systems.modules.player.InstantRebreak; +import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.misc.HorizontalDirection; import meteordevelopment.meteorclient.utils.misc.MBlockPos; import meteordevelopment.meteorclient.utils.player.CustomPlayerInput; @@ -33,7 +34,6 @@ import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.client.input.Input; -import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.enchantment.Enchantments; import net.minecraft.entity.Entity; import net.minecraft.entity.ItemEntity; @@ -1065,7 +1065,7 @@ protected int findAndMoveBestToolToHotbar(HighwayBuilder b, BlockState blockStat for (int i = 0; i < b.mc.player.getInventory().main.size(); i++) { double score = AutoTool.getScore(b.mc.player.getInventory().getStack(i), blockState, false, false, AutoTool.EnchantPreference.None, itemStack -> { - if (noSilkTouch && EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, itemStack) != 0) return false; + if (noSilkTouch && Utils.hasEnchantment(itemStack, Enchantments.SILK_TOUCH)) return false; return !b.dontBreakTools.get() || itemStack.getMaxDamage() - itemStack.getDamage() > 1; }); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/InfinityMiner.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/InfinityMiner.java index b1618bb819..1e6e5f768b 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/InfinityMiner.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/InfinityMiner.java @@ -184,8 +184,8 @@ private boolean needsRepair() { private boolean findPickaxe() { Predicate pickaxePredicate = (stack -> stack.getItem() instanceof PickaxeItem - && Utils.hasEnchantments(stack, Enchantments.MENDING) - && !Utils.hasEnchantments(stack, Enchantments.SILK_TOUCH)); + && Utils.hasEnchantment(stack, Enchantments.MENDING) + && !Utils.hasEnchantment(stack, Enchantments.SILK_TOUCH)); FindItemResult bestPick = InvUtils.findInHotbar(pickaxePredicate); if (bestPick.isOffhand()) InvUtils.shiftClick().fromOffhand().toHotbar(mc.player.getInventory().selectedSlot); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/Utils.java b/src/main/java/meteordevelopment/meteorclient/utils/Utils.java index 182b33176e..7da482b09a 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/Utils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/Utils.java @@ -7,10 +7,7 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.VertexSorter; -import it.unimi.dsi.fastutil.objects.Object2IntArrayMap; -import it.unimi.dsi.fastutil.objects.Object2IntMap; -import it.unimi.dsi.fastutil.objects.Reference2IntArrayMap; -import it.unimi.dsi.fastutil.objects.Reference2IntMap; +import it.unimi.dsi.fastutil.objects.*; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.gui.tabs.TabScreen; @@ -20,6 +17,7 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.BetterTooltips; import meteordevelopment.meteorclient.systems.modules.world.Timer; +import meteordevelopment.meteorclient.utils.misc.Names; import meteordevelopment.meteorclient.utils.player.EChestMemory; import meteordevelopment.meteorclient.utils.render.PeekScreen; import meteordevelopment.meteorclient.utils.render.color.Color; @@ -35,7 +33,6 @@ import net.minecraft.client.gui.screen.multiplayer.MultiplayerScreen; import net.minecraft.client.gui.screen.world.SelectWorldScreen; import net.minecraft.client.resource.ResourceReloadLogger; -import net.minecraft.client.resource.language.I18n; import net.minecraft.component.ComponentMap; import net.minecraft.component.DataComponentTypes; import net.minecraft.component.type.ItemEnchantmentsComponent; @@ -47,6 +44,7 @@ import net.minecraft.item.*; import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtList; +import net.minecraft.registry.RegistryKey; import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.util.DyeColor; import net.minecraft.util.collection.DefaultedList; @@ -145,30 +143,60 @@ public static Iterable blockEntities() { return BlockEntityIterator::new; } - public static void getEnchantments(ItemStack itemStack, Object2IntMap enchantments) { + public static void getEnchantments(ItemStack itemStack, Object2IntMap> enchantments) { enchantments.clear(); if (!itemStack.isEmpty()) { - Set> itemEnchantments = itemStack.getItem() == Items.ENCHANTED_BOOK - ? itemStack.get(DataComponentTypes.STORED_ENCHANTMENTS).getEnchantments() - : itemStack.getEnchantments().getEnchantments(); + Set>> itemEnchantments = itemStack.getItem() == Items.ENCHANTED_BOOK + ? itemStack.get(DataComponentTypes.STORED_ENCHANTMENTS).getEnchantmentEntries() + : itemStack.getEnchantments().getEnchantmentEntries(); - for (RegistryEntry itemEnchantment : itemEnchantments) { - enchantments.put(itemEnchantment.value(), itemStack.getEnchantments().getLevel(itemEnchantment.value())); + for (Object2IntMap.Entry> entry : itemEnchantments) { + enchantments.put(entry.getKey(), entry.getIntValue()); } } } - public static boolean hasEnchantments(ItemStack itemStack, Enchantment... enchantments) { - if (itemStack.isEmpty()) return false; + public static int getEnchantmentLevel(ItemStack itemStack, RegistryKey enchantment) { + if (itemStack.isEmpty()) return 0; + Object2IntMap> itemEnchantments = new Object2IntArrayMap<>(); + getEnchantments(itemStack, itemEnchantments); + return getEnchantmentLevel(itemEnchantments, enchantment); + } + + public static int getEnchantmentLevel(Object2IntMap> itemEnchantments, RegistryKey enchantment) { + for (Object2IntMap.Entry> entry : Object2IntMaps.fastIterable(itemEnchantments)) { + if (entry.getKey().matchesKey(enchantment)) return entry.getIntValue(); + } + return 0; + } - Object2IntMap itemEnchantments = new Object2IntArrayMap<>(); + @SafeVarargs + public static boolean hasEnchantments(ItemStack itemStack, RegistryKey... enchantments) { + if (itemStack.isEmpty()) return false; + Object2IntMap> itemEnchantments = new Object2IntArrayMap<>(); getEnchantments(itemStack, itemEnchantments); - for (Enchantment enchantment : enchantments) if (!itemEnchantments.containsKey(enchantment)) return false; + for (RegistryKey enchantment : enchantments) { + if (!hasEnchantment(itemEnchantments, enchantment)) return false; + } return true; } + public static boolean hasEnchantment(ItemStack itemStack, RegistryKey enchantmentKey) { + if (itemStack.isEmpty()) return false; + Object2IntMap> itemEnchantments = new Object2IntArrayMap<>(); + getEnchantments(itemStack, itemEnchantments); + return hasEnchantment(itemEnchantments, enchantmentKey); + } + + private static boolean hasEnchantment(Object2IntMap> itemEnchantments, RegistryKey enchantmentKey) { + for (RegistryEntry enchantment : itemEnchantments.keySet()) { + if (enchantment.matchesKey(enchantmentKey)) return true; + } + return false; + } + public static int getRenderDistance() { return Math.max(mc.options.getViewDistance().getValue(), ((ClientPlayNetworkHandlerAccessor) mc.getNetworkHandler()).getChunkLoadDistance()); } @@ -249,8 +277,8 @@ public static Color getShulkerColor(ItemStack shulkerItem) { if (block instanceof ShulkerBoxBlock shulkerBlock) { DyeColor dye = shulkerBlock.getColor(); if (dye == null) return WHITE; - final float[] colors = dye.getColorComponents(); - return new Color(colors[0], colors[1], colors[2], 1f); + final int color = dye.getEntityColor(); + return new Color((color >> 16) & 0xFF, (color >> 8) & 0xFF, color & 0xFF, 1f); } } return WHITE; @@ -268,8 +296,8 @@ public static Reference2IntMap createStatusEffectMap() { return new Reference2IntArrayMap<>(StatusEffectAmplifierMapSetting.EMPTY_STATUS_EFFECT_MAP); } - public static String getEnchantSimpleName(Enchantment enchantment, int length) { - String name = I18n.translate(enchantment.getTranslationKey()); + public static String getEnchantSimpleName(RegistryEntry enchantment, int length) { + String name = Names.get(enchantment); return name.length() > length ? name.substring(0, length) : name; } @@ -508,7 +536,7 @@ public static boolean isThrowable(Item item) { return item instanceof ExperienceBottleItem || item instanceof BowItem || item instanceof CrossbowItem || item instanceof SnowballItem || item instanceof EggItem || item instanceof EnderPearlItem || item instanceof SplashPotionItem || item instanceof LingeringPotionItem || item instanceof FishingRodItem || item instanceof TridentItem; } - public static void addEnchantment(ItemStack itemStack, Enchantment enchantment, int level) { + public static void addEnchantment(ItemStack itemStack, RegistryEntry enchantment, int level) { ItemEnchantmentsComponent.Builder b = new ItemEnchantmentsComponent.Builder(EnchantmentHelper.getEnchantments(itemStack)); b.add(enchantment, level); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/DamageUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/DamageUtils.java index fe0a0d2855..e2f65ee36b 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/entity/DamageUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/entity/DamageUtils.java @@ -9,7 +9,6 @@ import meteordevelopment.meteorclient.utils.player.PlayerUtils; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; -import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.*; import net.minecraft.entity.attribute.*; import net.minecraft.entity.damage.DamageSource; @@ -136,10 +135,11 @@ public static RaycastFactory getOverridingHitFactory(BlockPos overridePos, Block */ public static float getAttackDamage(LivingEntity attacker, LivingEntity target) { float itemDamage = (float) attacker.getAttributeValue(EntityAttributes.GENERIC_ATTACK_DAMAGE); + DamageSource damageSource = attacker instanceof PlayerEntity player ? mc.world.getDamageSources().playerAttack(player) : mc.world.getDamageSources().mobAttack(attacker); // Get enchant damage - ItemStack stack = attacker.getStackInHand(attacker.getActiveHand()); - float enchantDamage = EnchantmentHelper.getAttackDamage(stack, target.getType()); + ItemStack stack = attacker.getWeaponStack(); + float enchantDamage = /*fixme EnchantmentHelper.getDamage(attacker.getWorld() instanceof ServerWorld serverWorld ? serverWorld : null, stack, target, damageSource, itemDamage) - itemDamage*/ 0; // Factor charge if (attacker instanceof PlayerEntity playerEntity) { @@ -155,12 +155,7 @@ public static float getAttackDamage(LivingEntity attacker, LivingEntity target) float damage = itemDamage + enchantDamage; - damage = calculateReductions(damage, target, attacker instanceof PlayerEntity player ? mc.world.getDamageSources().playerAttack(player) : mc.world.getDamageSources().mobAttack(attacker)); - - // Factor Fire Aspect - if (EnchantmentHelper.getFireAspect(attacker) > 0 && !target.hasStatusEffect(StatusEffects.FIRE_RESISTANCE)) { - damage++; - } + damage = calculateReductions(damage, target, damageSource); return damage; } @@ -207,7 +202,7 @@ public static float calculateReductions(float damage, LivingEntity entity, Damag } // Armor reduction - damage = DamageUtil.getDamageLeft(damage, damageSource, getArmor(entity), (float) entity.getAttributeValue(EntityAttributes.GENERIC_ARMOR_TOUGHNESS)); + damage = DamageUtil.getDamageLeft(entity, damage, damageSource, getArmor(entity), (float) entity.getAttributeValue(EntityAttributes.GENERIC_ARMOR_TOUGHNESS)); // Resistance reduction damage = resistanceReduction(entity, damage); @@ -226,8 +221,8 @@ private static float getArmor(LivingEntity entity) { * @see LivingEntity#modifyAppliedDamage(DamageSource, float) */ private static float protectionReduction(LivingEntity player, float damage, DamageSource source) { - int protLevel = EnchantmentHelper.getProtectionAmount(player.getArmorItems(), source); - return DamageUtil.getInflictedDamage(damage, protLevel); + //fixme float protLevel = EnchantmentHelper.getProtectionAmount(player.getWorld() instanceof ServerWorld serverWorld ? serverWorld : null, player, source); + return DamageUtil.getInflictedDamage(damage, /*protLevel*/ 0); } /** diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/ComponentMapReader.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/ComponentMapReader.java index 2ed916302c..950ffff52c 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/ComponentMapReader.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/ComponentMapReader.java @@ -18,7 +18,7 @@ import net.minecraft.command.CommandRegistryAccess; import net.minecraft.command.CommandSource; import net.minecraft.component.ComponentMap; -import net.minecraft.component.DataComponentType; +import net.minecraft.component.ComponentType; import net.minecraft.nbt.NbtElement; import net.minecraft.nbt.NbtOps; import net.minecraft.nbt.StringNbtReader; @@ -88,11 +88,11 @@ public ComponentMap read() throws CommandSyntaxException { reader.expect('['); suggestor = this::suggestComponentType; - Set> set = new ReferenceArraySet<>(); + Set> set = new ReferenceArraySet<>(); while(reader.canRead() && reader.peek() != ']') { reader.skipWhitespace(); - DataComponentType dataComponentType = readComponentType(reader); + ComponentType dataComponentType = readComponentType(reader); if (!set.add(dataComponentType)) { throw REPEATED_COMPONENT_EXCEPTION.create(dataComponentType); } @@ -123,13 +123,13 @@ public ComponentMap read() throws CommandSyntaxException { return builder.build(); } - public static DataComponentType readComponentType(StringReader reader) throws CommandSyntaxException { + public static ComponentType readComponentType(StringReader reader) throws CommandSyntaxException { if (!reader.canRead()) { throw COMPONENT_EXPECTED_EXCEPTION.createWithContext(reader); } else { int i = reader.getCursor(); Identifier identifier = Identifier.fromCommandInput(reader); - DataComponentType dataComponentType = Registries.DATA_COMPONENT_TYPE.get(identifier); + ComponentType dataComponentType = Registries.DATA_COMPONENT_TYPE.get(identifier); if (dataComponentType != null && !dataComponentType.shouldSkipSerialization()) { return dataComponentType; } else { @@ -142,7 +142,7 @@ public static DataComponentType readComponentType(StringReader reader) throws private CompletableFuture suggestComponentType(SuggestionsBuilder builder) { String string = builder.getRemaining().toLowerCase(Locale.ROOT); CommandSource.forEachMatching(Registries.DATA_COMPONENT_TYPE.getEntrySet(), string, entry -> entry.getKey().getValue(), entry -> { - DataComponentType dataComponentType = entry.getValue(); + ComponentType dataComponentType = entry.getValue(); if (dataComponentType.getCodec() != null) { Identifier identifier = entry.getKey().getValue(); builder.suggest(identifier.toString() + "="); @@ -151,7 +151,7 @@ private CompletableFuture suggestComponentType(SuggestionsBuilder b return builder.buildFuture(); } - private void readComponentValue(StringReader reader, ComponentMap.Builder builder, DataComponentType type) throws CommandSyntaxException { + private void readComponentValue(StringReader reader, ComponentMap.Builder builder, ComponentType type) throws CommandSyntaxException { int i = reader.getCursor(); NbtElement nbtElement = new StringNbtReader(reader).parseElement(); DataResult dataResult = type.getCodecOrThrow().parse(this.nbtOps, nbtElement); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/FakeClientPlayer.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/FakeClientPlayer.java index db117d1fab..163e09151f 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/FakeClientPlayer.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/FakeClientPlayer.java @@ -44,7 +44,7 @@ public static PlayerEntity getPlayer() { if (player == null || (!id.equals(lastId))) { if (world == null) { world = new ClientWorld( - new ClientPlayNetworkHandler(mc, new ClientConnection(NetworkSide.CLIENTBOUND), new ClientConnectionState(new GameProfile(mc.getSession().getUuidOrNull(), mc.getSession().getUsername()), null, null, null, null, mc.getCurrentServerEntry(), null, null, null, false)), + new ClientPlayNetworkHandler(mc, new ClientConnection(NetworkSide.CLIENTBOUND), new ClientConnectionState(new GameProfile(mc.getSession().getUuidOrNull(), mc.getSession().getUsername()), null, null, null, null, mc.getCurrentServerEntry(), null, null, null, false, null, null)), new ClientWorld.Properties(Difficulty.NORMAL, false, false), world.getRegistryKey(), world.getDimensionEntry(), diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorIdentifier.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorIdentifier.java deleted file mode 100644 index 513215cf9f..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorIdentifier.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.utils.misc; - -import meteordevelopment.meteorclient.MeteorClient; -import net.minecraft.util.Identifier; - -public class MeteorIdentifier extends Identifier { - public MeteorIdentifier(String path) { - super(MeteorClient.MOD_ID, path); - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorStarscript.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorStarscript.java index ecb8802c57..1f8d352ea4 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorStarscript.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorStarscript.java @@ -584,7 +584,7 @@ private static Value crosshairValue() { public static Identifier popIdentifier(Starscript ss, String errorMessage) { try { - return new Identifier(ss.popString(errorMessage)); + return Identifier.of(ss.popString(errorMessage)); } catch (InvalidIdentifierException e) { ss.error(e.getMessage()); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/Names.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/Names.java index cd84260b38..eb569cfc82 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/Names.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/Names.java @@ -11,6 +11,8 @@ import meteordevelopment.meteorclient.utils.PreInit; import meteordevelopment.orbit.EventHandler; import net.minecraft.block.Block; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.ClientPlayNetworkHandler; import net.minecraft.client.resource.language.I18n; import net.minecraft.client.sound.WeightedSoundSet; import net.minecraft.enchantment.Enchantment; @@ -21,6 +23,9 @@ import net.minecraft.particle.ParticleEffect; import net.minecraft.particle.ParticleType; import net.minecraft.registry.Registries; +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.util.StringHelper; @@ -28,6 +33,8 @@ import java.util.HashMap; import java.util.Map; +import java.util.Optional; +import java.util.WeakHashMap; import static meteordevelopment.meteorclient.MeteorClient.mc; @@ -35,7 +42,8 @@ public class Names { private static final Map statusEffectNames = new Reference2ObjectOpenHashMap<>(16); private static final Map itemNames = new Reference2ObjectOpenHashMap<>(128); private static final Map blockNames = new Reference2ObjectOpenHashMap<>(128); - private static final Map enchantmentNames = new Reference2ObjectOpenHashMap<>(16); + private static final Map, String> enchantmentKeyNames = new WeakHashMap<>(16); + private static final Map, String> enchantmentEntryNames = new Reference2ObjectOpenHashMap<>(16); private static final Map, String> entityTypeNames = new Reference2ObjectOpenHashMap<>(64); private static final Map, String> particleTypesNames = new Reference2ObjectOpenHashMap<>(64); private static final Map soundNames = new HashMap<>(64); @@ -53,7 +61,7 @@ private static void onResourcePacksReloaded(ResourcePacksReloadedEvent event) { statusEffectNames.clear(); itemNames.clear(); blockNames.clear(); - enchantmentNames.clear(); + enchantmentEntryNames.clear(); entityTypeNames.clear(); particleTypesNames.clear(); soundNames.clear(); @@ -71,8 +79,26 @@ public static String get(Block block) { return blockNames.computeIfAbsent(block, block1 -> StringHelper.stripTextFormat(I18n.translate(block1.getTranslationKey()))); } - public static String get(Enchantment enchantment) { - return enchantmentNames.computeIfAbsent(enchantment, enchantment1 -> StringHelper.stripTextFormat(I18n.translate(enchantment1.getTranslationKey()))); + /** + * key -> entry, else key -> translation, else key -> identifier toString() + * @author Crosby + */ + @SuppressWarnings("StringEquality") + public static String get(RegistryKey enchantment) { + return enchantmentKeyNames.computeIfAbsent(enchantment, enchantment1 -> Optional.ofNullable(MinecraftClient.getInstance().getNetworkHandler()) + .map(ClientPlayNetworkHandler::getRegistryManager) + .flatMap(registryManager -> registryManager.getOptional(RegistryKeys.ENCHANTMENT)) + .flatMap(registry -> registry.getEntry(enchantment)) + .map(Names::get) + .orElseGet(() -> { + String key = "enchantment." + enchantment1.getValue().toTranslationKey(); + String translated = I18n.translate(key); + return translated == key ? enchantment1.getValue().toString() : translated; + })); + } + + public static String get(RegistryEntry enchantment) { + return enchantmentEntryNames.computeIfAbsent(enchantment, enchantment1 -> StringHelper.stripTextFormat(enchantment.value().description().getString())); } public static String get(EntityType entityType) { diff --git a/src/main/java/meteordevelopment/meteorclient/utils/network/Capes.java b/src/main/java/meteordevelopment/meteorclient/utils/network/Capes.java index 36020a2b15..372f296374 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/network/Capes.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/network/Capes.java @@ -8,7 +8,6 @@ import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.utils.PreInit; -import meteordevelopment.meteorclient.utils.misc.MeteorIdentifier; import meteordevelopment.orbit.EventHandler; import net.minecraft.client.texture.NativeImage; import net.minecraft.client.texture.NativeImageBackedTexture; @@ -101,7 +100,7 @@ public static Identifier get(PlayerEntity player) { Cape cape = TEXTURES.get(capeName); if (cape == null) return null; - if (cape.isDownloaded()) return cape; + if (cape.isDownloaded()) return cape.getIdentifier(); cape.download(); return null; @@ -110,10 +109,11 @@ public static Identifier get(PlayerEntity player) { return null; } - private static class Cape extends MeteorIdentifier { + private static class Cape { private static int COUNT = 0; private final String name; + private final Identifier identifier; private boolean downloaded; private boolean downloading; @@ -123,11 +123,14 @@ private static class Cape extends MeteorIdentifier { private int retryTimer; public Cape(String name) { - super("capes/" + COUNT++); - + this.identifier = MeteorClient.identifier("capes/" + COUNT++); this.name = name; } + public Identifier getIdentifier() { + return identifier; + } + public void download() { if (downloaded || downloading || retryTimer > 0) return; downloading = true; @@ -165,7 +168,7 @@ public void download() { } public void register() { - mc.getTextureManager().registerTexture(this, new NativeImageBackedTexture(img)); + mc.getTextureManager().registerTexture(identifier, new NativeImageBackedTexture(img)); img = null; downloading = false; diff --git a/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtils.java index 37e406956c..9a014f2705 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtils.java @@ -7,7 +7,9 @@ import com.mojang.datafixers.util.Pair; import com.mojang.serialization.Lifecycle; -import meteordevelopment.meteorclient.utils.misc.MeteorIdentifier; +import it.unimi.dsi.fastutil.objects.Object2ReferenceOpenHashMap; +import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap; +import meteordevelopment.meteorclient.MeteorClient; import net.minecraft.network.packet.Packet; import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKey; @@ -24,11 +26,11 @@ public class PacketUtils { public static final Registry>> REGISTRY = new PacketRegistry(); - private static final Map>, String> S2C_PACKETS = new HashMap<>(); - private static final Map>, String> C2S_PACKETS = new HashMap<>(); + private static final Map>, String> S2C_PACKETS = new Reference2ObjectOpenHashMap<>(); + private static final Map>, String> C2S_PACKETS = new Reference2ObjectOpenHashMap<>(); - private static final Map>> S2C_PACKETS_R = new HashMap<>(); - private static final Map>> C2S_PACKETS_R = new HashMap<>(); + private static final Map>> S2C_PACKETS_R = new Object2ReferenceOpenHashMap<>(); + private static final Map>> C2S_PACKETS_R = new Object2ReferenceOpenHashMap<>(); static { C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.ClientStatusC2SPacket.class, "ClientStatusC2SPacket"); @@ -37,10 +39,10 @@ public class PacketUtils { C2S_PACKETS_R.put("PlayerInteractItemC2SPacket", net.minecraft.network.packet.c2s.play.PlayerInteractItemC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.login.EnterConfigurationC2SPacket.class, "EnterConfigurationC2SPacket"); C2S_PACKETS_R.put("EnterConfigurationC2SPacket", net.minecraft.network.packet.c2s.login.EnterConfigurationC2SPacket.class); - C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.SelectMerchantTradeC2SPacket.class, "SelectMerchantTradeC2SPacket"); - C2S_PACKETS_R.put("SelectMerchantTradeC2SPacket", net.minecraft.network.packet.c2s.play.SelectMerchantTradeC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket.class, "PlayerActionC2SPacket"); C2S_PACKETS_R.put("PlayerActionC2SPacket", net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket.class); + C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.SelectMerchantTradeC2SPacket.class, "SelectMerchantTradeC2SPacket"); + C2S_PACKETS_R.put("SelectMerchantTradeC2SPacket", net.minecraft.network.packet.c2s.play.SelectMerchantTradeC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.CommandExecutionC2SPacket.class, "CommandExecutionC2SPacket"); C2S_PACKETS_R.put("CommandExecutionC2SPacket", net.minecraft.network.packet.c2s.play.CommandExecutionC2SPacket.class); C2S_PACKETS.put(net.minecraft.network.packet.c2s.play.RenameItemC2SPacket.class, "RenameItemC2SPacket"); @@ -246,10 +248,10 @@ public class PacketUtils { S2C_PACKETS_R.put("CooldownUpdateS2CPacket", net.minecraft.network.packet.s2c.play.CooldownUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.OpenScreenS2CPacket.class, "OpenScreenS2CPacket"); S2C_PACKETS_R.put("OpenScreenS2CPacket", net.minecraft.network.packet.s2c.play.OpenScreenS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityAnimationS2CPacket.class, "EntityAnimationS2CPacket"); - S2C_PACKETS_R.put("EntityAnimationS2CPacket", net.minecraft.network.packet.s2c.play.EntityAnimationS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ExperienceOrbSpawnS2CPacket.class, "ExperienceOrbSpawnS2CPacket"); S2C_PACKETS_R.put("ExperienceOrbSpawnS2CPacket", net.minecraft.network.packet.s2c.play.ExperienceOrbSpawnS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityAnimationS2CPacket.class, "EntityAnimationS2CPacket"); + S2C_PACKETS_R.put("EntityAnimationS2CPacket", net.minecraft.network.packet.s2c.play.EntityAnimationS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlayerAbilitiesS2CPacket.class, "PlayerAbilitiesS2CPacket"); S2C_PACKETS_R.put("PlayerAbilitiesS2CPacket", net.minecraft.network.packet.s2c.play.PlayerAbilitiesS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.config.ResetChatS2CPacket.class, "ResetChatS2CPacket"); @@ -260,8 +262,6 @@ public class PacketUtils { S2C_PACKETS_R.put("EntitiesDestroyS2CPacket", net.minecraft.network.packet.s2c.play.EntitiesDestroyS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlayerRemoveS2CPacket.class, "PlayerRemoveS2CPacket"); S2C_PACKETS_R.put("PlayerRemoveS2CPacket", net.minecraft.network.packet.s2c.play.PlayerRemoveS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.UnlockRecipesS2CPacket.class, "UnlockRecipesS2CPacket"); - S2C_PACKETS_R.put("UnlockRecipesS2CPacket", net.minecraft.network.packet.s2c.play.UnlockRecipesS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.LightUpdateS2CPacket.class, "LightUpdateS2CPacket"); S2C_PACKETS_R.put("LightUpdateS2CPacket", net.minecraft.network.packet.s2c.play.LightUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.OverlayMessageS2CPacket.class, "OverlayMessageS2CPacket"); @@ -296,14 +296,16 @@ public class PacketUtils { S2C_PACKETS_R.put("DeathMessageS2CPacket", net.minecraft.network.packet.s2c.play.DeathMessageS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.MapUpdateS2CPacket.class, "MapUpdateS2CPacket"); S2C_PACKETS_R.put("MapUpdateS2CPacket", net.minecraft.network.packet.s2c.play.MapUpdateS2CPacket.class); - S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.BlockEntityUpdateS2CPacket.class, "BlockEntityUpdateS2CPacket"); - S2C_PACKETS_R.put("BlockEntityUpdateS2CPacket", net.minecraft.network.packet.s2c.play.BlockEntityUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ScreenHandlerSlotUpdateS2CPacket.class, "ScreenHandlerSlotUpdateS2CPacket"); S2C_PACKETS_R.put("ScreenHandlerSlotUpdateS2CPacket", net.minecraft.network.packet.s2c.play.ScreenHandlerSlotUpdateS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.BlockEntityUpdateS2CPacket.class, "BlockEntityUpdateS2CPacket"); + S2C_PACKETS_R.put("BlockEntityUpdateS2CPacket", net.minecraft.network.packet.s2c.play.BlockEntityUpdateS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlayerSpawnPositionS2CPacket.class, "PlayerSpawnPositionS2CPacket"); S2C_PACKETS_R.put("PlayerSpawnPositionS2CPacket", net.minecraft.network.packet.s2c.play.PlayerSpawnPositionS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.EntityStatusEffectS2CPacket.class, "EntityStatusEffectS2CPacket"); S2C_PACKETS_R.put("EntityStatusEffectS2CPacket", net.minecraft.network.packet.s2c.play.EntityStatusEffectS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.common.CustomReportDetailsS2CPacket.class, "CustomReportDetailsS2CPacket"); + S2C_PACKETS_R.put("CustomReportDetailsS2CPacket", net.minecraft.network.packet.s2c.common.CustomReportDetailsS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ClearTitleS2CPacket.class, "ClearTitleS2CPacket"); S2C_PACKETS_R.put("ClearTitleS2CPacket", net.minecraft.network.packet.s2c.play.ClearTitleS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.login.LoginCompressionS2CPacket.class, "LoginCompressionS2CPacket"); @@ -334,10 +336,14 @@ public class PacketUtils { S2C_PACKETS_R.put("EntityDamageS2CPacket", net.minecraft.network.packet.s2c.play.EntityDamageS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ChatMessageS2CPacket.class, "ChatMessageS2CPacket"); S2C_PACKETS_R.put("ChatMessageS2CPacket", net.minecraft.network.packet.s2c.play.ChatMessageS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.common.ServerLinksS2CPacket.class, "ServerLinksS2CPacket"); + S2C_PACKETS_R.put("ServerLinksS2CPacket", net.minecraft.network.packet.s2c.common.ServerLinksS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.common.KeepAliveS2CPacket.class, "KeepAliveS2CPacket"); S2C_PACKETS_R.put("KeepAliveS2CPacket", net.minecraft.network.packet.s2c.common.KeepAliveS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.OpenWrittenBookS2CPacket.class, "OpenWrittenBookS2CPacket"); S2C_PACKETS_R.put("OpenWrittenBookS2CPacket", net.minecraft.network.packet.s2c.play.OpenWrittenBookS2CPacket.class); + S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.ChangeUnlockedRecipesS2CPacket.class, "ChangeUnlockedRecipesS2CPacket"); + S2C_PACKETS_R.put("ChangeUnlockedRecipesS2CPacket", net.minecraft.network.packet.s2c.play.ChangeUnlockedRecipesS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.common.ResourcePackRemoveS2CPacket.class, "ResourcePackRemoveS2CPacket"); S2C_PACKETS_R.put("ResourcePackRemoveS2CPacket", net.minecraft.network.packet.s2c.common.ResourcePackRemoveS2CPacket.class); S2C_PACKETS.put(net.minecraft.network.packet.s2c.play.PlaySoundFromEntityS2CPacket.class, "PlaySoundFromEntityS2CPacket"); @@ -463,7 +469,7 @@ public static Set>> getC2SPackets() { private static class PacketRegistry extends SimpleRegistry>> { public PacketRegistry() { - super(RegistryKey.ofRegistry(new MeteorIdentifier("packets")), Lifecycle.stable()); + super(RegistryKey.ofRegistry(MeteorClient.identifier("packets")), Lifecycle.stable()); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtilsUtil.java b/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtilsUtil.java index 2c983f232a..a1c7327cb8 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtilsUtil.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtilsUtil.java @@ -6,6 +6,7 @@ package meteordevelopment.meteorclient.utils.network; import net.minecraft.network.packet.BundlePacket; +import net.minecraft.network.packet.BundleSplitterPacket; import net.minecraft.network.packet.Packet; import org.reflections.Reflections; import org.reflections.scanners.Scanners; @@ -20,7 +21,7 @@ public class PacketUtilsUtil { private static final String packetRegistryClass = """ private static class PacketRegistry extends SimpleRegistry>> { public PacketRegistry() { - super(RegistryKey.ofRegistry(new MeteorIdentifier("packets")), Lifecycle.stable()); + super(RegistryKey.ofRegistry(MeteorClient.identifier("packets")), Lifecycle.stable()); } @Override @@ -183,7 +184,9 @@ public static void init() throws IOException { // Write imports writer.write("import com.mojang.datafixers.util.Pair;\n"); writer.write("import com.mojang.serialization.Lifecycle;\n"); - writer.write("import meteordevelopment.meteorclient.utils.misc.MeteorIdentifier;\n"); + writer.write("import it.unimi.dsi.fastutil.objects.Object2ReferenceOpenHashMap;\n"); + writer.write("import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap;\n"); + writer.write("import meteordevelopment.meteorclient.MeteorClient;\n"); writer.write("import net.minecraft.network.packet.Packet;\n"); writer.write("import net.minecraft.registry.Registry;\n"); writer.write("import net.minecraft.registry.RegistryKey;\n"); @@ -203,10 +206,10 @@ public static void init() throws IOException { // Write fields writer.write(" public static final Registry>> REGISTRY = new PacketRegistry();\n\n"); - writer.write(" private static final Map>, String> S2C_PACKETS = new HashMap<>();\n"); - writer.write(" private static final Map>, String> C2S_PACKETS = new HashMap<>();\n\n"); - writer.write(" private static final Map>> S2C_PACKETS_R = new HashMap<>();\n"); - writer.write(" private static final Map>> C2S_PACKETS_R = new HashMap<>();\n\n"); + writer.write(" private static final Map>, String> S2C_PACKETS = new Reference2ObjectOpenHashMap<>();\n"); + writer.write(" private static final Map>, String> C2S_PACKETS = new Reference2ObjectOpenHashMap<>();\n\n"); + writer.write(" private static final Map>> S2C_PACKETS_R = new Object2ReferenceOpenHashMap<>();\n"); + writer.write(" private static final Map>> C2S_PACKETS_R = new Object2ReferenceOpenHashMap<>();\n\n"); // Write static block writer.write(" static {\n"); @@ -231,7 +234,7 @@ public static void init() throws IOException { Set> s2cPackets = s2c.getSubTypesOf(Packet.class); for (Class s2cPacket : s2cPackets) { - if (s2cPacket == BundlePacket.class) continue; + if (s2cPacket == BundlePacket.class || s2cPacket == BundleSplitterPacket.class) continue; String name = s2cPacket.getName(); String className = name.substring(name.lastIndexOf('.') + 1).replace('$', '.'); String fullName = name.replace('$', '.'); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/notebot/NotebotUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/notebot/NotebotUtils.java index e0383f20c0..2491f894f5 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/notebot/NotebotUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/notebot/NotebotUtils.java @@ -9,7 +9,7 @@ import meteordevelopment.meteorclient.utils.notebot.song.Note; import net.minecraft.block.BlockState; import net.minecraft.block.NoteBlock; -import net.minecraft.block.enums.Instrument; +import net.minecraft.block.enums.NoteBlockInstrument; import net.minecraft.util.math.BlockPos; import org.jetbrains.annotations.Nullable; @@ -19,7 +19,7 @@ public class NotebotUtils { public static Note getNoteFromNoteBlock(BlockState noteBlock, BlockPos blockPos, NotebotMode mode, InstrumentDetectFunction instrumentDetectFunction) { - Instrument instrument = null; + NoteBlockInstrument instrument = null; int level = noteBlock.get(NoteBlock.NOTE); if (mode == NotebotMode.ExactInstruments) { instrument = instrumentDetectFunction.detectInstrument(noteBlock, blockPos); @@ -34,24 +34,24 @@ public enum NotebotMode { public enum OptionalInstrument { None(null), - Harp(Instrument.HARP), - Basedrum(Instrument.BASEDRUM), - Snare(Instrument.SNARE), - Hat(Instrument.HAT), - Bass(Instrument.BASS), - Flute(Instrument.FLUTE), - Bell(Instrument.BELL), - Guitar(Instrument.GUITAR), - Chime(Instrument.CHIME), - Xylophone(Instrument.XYLOPHONE), - IronXylophone(Instrument.IRON_XYLOPHONE), - CowBell(Instrument.COW_BELL), - Didgeridoo(Instrument.DIDGERIDOO), - Bit(Instrument.BIT), - Banjo(Instrument.BANJO), - Pling(Instrument.PLING) + Harp(NoteBlockInstrument.HARP), + Basedrum(NoteBlockInstrument.BASEDRUM), + Snare(NoteBlockInstrument.SNARE), + Hat(NoteBlockInstrument.HAT), + Bass(NoteBlockInstrument.BASS), + Flute(NoteBlockInstrument.FLUTE), + Bell(NoteBlockInstrument.BELL), + Guitar(NoteBlockInstrument.GUITAR), + Chime(NoteBlockInstrument.CHIME), + Xylophone(NoteBlockInstrument.XYLOPHONE), + IronXylophone(NoteBlockInstrument.IRON_XYLOPHONE), + CowBell(NoteBlockInstrument.COW_BELL), + Didgeridoo(NoteBlockInstrument.DIDGERIDOO), + Bit(NoteBlockInstrument.BIT), + Banjo(NoteBlockInstrument.BANJO), + Pling(NoteBlockInstrument.PLING) ; - public static final Map BY_MINECRAFT_INSTRUMENT = new HashMap<>(); + public static final Map BY_MINECRAFT_INSTRUMENT = new HashMap<>(); static { for (OptionalInstrument optionalInstrument : values()) { @@ -59,17 +59,17 @@ public enum OptionalInstrument { } } - private final Instrument minecraftInstrument; + private final NoteBlockInstrument minecraftInstrument; - OptionalInstrument(@Nullable Instrument minecraftInstrument) { + OptionalInstrument(@Nullable NoteBlockInstrument minecraftInstrument) { this.minecraftInstrument = minecraftInstrument; } - public Instrument toMinecraftInstrument() { + public NoteBlockInstrument toMinecraftInstrument() { return minecraftInstrument; } - public static OptionalInstrument fromMinecraftInstrument(Instrument instrument) { + public static OptionalInstrument fromMinecraftInstrument(NoteBlockInstrument instrument) { if (instrument != null) { return BY_MINECRAFT_INSTRUMENT.get(instrument); } else { diff --git a/src/main/java/meteordevelopment/meteorclient/utils/notebot/decoder/NBSSongDecoder.java b/src/main/java/meteordevelopment/meteorclient/utils/notebot/decoder/NBSSongDecoder.java index 222cd5991e..c0ad563bc0 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/notebot/decoder/NBSSongDecoder.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/notebot/decoder/NBSSongDecoder.java @@ -9,7 +9,7 @@ import com.google.common.collect.MultimapBuilder; import meteordevelopment.meteorclient.utils.notebot.song.Note; import meteordevelopment.meteorclient.utils.notebot.song.Song; -import net.minecraft.block.enums.Instrument; +import net.minecraft.block.enums.NoteBlockInstrument; import org.jetbrains.annotations.NotNull; import java.io.*; @@ -103,7 +103,7 @@ private Song parse(InputStream inputStream) throws Exception { readShort(dataInputStream); // note block pitch } - Instrument inst = fromNBSInstrument(instrument); + NoteBlockInstrument inst = fromNBSInstrument(instrument); // Probably a custom instrument. Ignore this note if (inst == null) continue; @@ -161,24 +161,24 @@ private static String readString(DataInputStream dataInputStream) throws IOExcep } // Magic Values (https://opennbs.org/nbs) - private static Instrument fromNBSInstrument(int instrument) { + private static NoteBlockInstrument fromNBSInstrument(int instrument) { return switch (instrument) { - case 0 -> Instrument.HARP; - case 1 -> Instrument.BASS; - case 2 -> Instrument.BASEDRUM; - case 3 -> Instrument.SNARE; - case 4 -> Instrument.HAT; - case 5 -> Instrument.GUITAR; - case 6 -> Instrument.FLUTE; - case 7 -> Instrument.BELL; - case 8 -> Instrument.CHIME; - case 9 -> Instrument.XYLOPHONE; - case 10 -> Instrument.IRON_XYLOPHONE; - case 11 -> Instrument.COW_BELL; - case 12 -> Instrument.DIDGERIDOO; - case 13 -> Instrument.BIT; - case 14 -> Instrument.BANJO; - case 15 -> Instrument.PLING; + case 0 -> NoteBlockInstrument.HARP; + case 1 -> NoteBlockInstrument.BASS; + case 2 -> NoteBlockInstrument.BASEDRUM; + case 3 -> NoteBlockInstrument.SNARE; + case 4 -> NoteBlockInstrument.HAT; + case 5 -> NoteBlockInstrument.GUITAR; + case 6 -> NoteBlockInstrument.FLUTE; + case 7 -> NoteBlockInstrument.BELL; + case 8 -> NoteBlockInstrument.CHIME; + case 9 -> NoteBlockInstrument.XYLOPHONE; + case 10 -> NoteBlockInstrument.IRON_XYLOPHONE; + case 11 -> NoteBlockInstrument.COW_BELL; + case 12 -> NoteBlockInstrument.DIDGERIDOO; + case 13 -> NoteBlockInstrument.BIT; + case 14 -> NoteBlockInstrument.BANJO; + case 15 -> NoteBlockInstrument.PLING; default -> null; }; } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/notebot/decoder/SongDecoders.java b/src/main/java/meteordevelopment/meteorclient/utils/notebot/decoder/SongDecoders.java index 2233b3bc6c..6404610394 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/notebot/decoder/SongDecoders.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/notebot/decoder/SongDecoders.java @@ -10,7 +10,7 @@ import meteordevelopment.meteorclient.utils.notebot.NotebotUtils; import meteordevelopment.meteorclient.utils.notebot.song.Note; import meteordevelopment.meteorclient.utils.notebot.song.Song; -import net.minecraft.block.enums.Instrument; +import net.minecraft.block.enums.NoteBlockInstrument; import org.apache.commons.io.FilenameUtils; import org.jetbrains.annotations.NotNull; @@ -89,7 +89,7 @@ private static void fixSong(Song song) { } if (notebot.mode.get() == NotebotUtils.NotebotMode.ExactInstruments) { - Instrument newInstrument = notebot.getMappedInstrument(note.getInstrument()); + NoteBlockInstrument newInstrument = notebot.getMappedInstrument(note.getInstrument()); if (newInstrument != null) { note.setInstrument(newInstrument); } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/notebot/decoder/TextSongDecoder.java b/src/main/java/meteordevelopment/meteorclient/utils/notebot/decoder/TextSongDecoder.java index cfe0be8233..f629360e59 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/notebot/decoder/TextSongDecoder.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/notebot/decoder/TextSongDecoder.java @@ -9,7 +9,7 @@ import com.google.common.collect.MultimapBuilder; import meteordevelopment.meteorclient.utils.notebot.song.Note; import meteordevelopment.meteorclient.utils.notebot.song.Song; -import net.minecraft.block.enums.Instrument; +import net.minecraft.block.enums.NoteBlockInstrument; import org.apache.commons.io.FilenameUtils; import java.io.File; @@ -57,7 +57,7 @@ public Song parse(File file) throws Exception { continue; } - Note note = new Note(Instrument.values()[type], val); + Note note = new Note(NoteBlockInstrument.values()[type], val); notesMap.put(key, note); } return new Song(notesMap, title, author); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/notebot/instrumentdetect/InstrumentDetectFunction.java b/src/main/java/meteordevelopment/meteorclient/utils/notebot/instrumentdetect/InstrumentDetectFunction.java index 96a6fbfe15..e554e80dab 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/notebot/instrumentdetect/InstrumentDetectFunction.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/notebot/instrumentdetect/InstrumentDetectFunction.java @@ -6,7 +6,7 @@ package meteordevelopment.meteorclient.utils.notebot.instrumentdetect; import net.minecraft.block.BlockState; -import net.minecraft.block.enums.Instrument; +import net.minecraft.block.enums.NoteBlockInstrument; import net.minecraft.util.math.BlockPos; public interface InstrumentDetectFunction { @@ -17,5 +17,5 @@ public interface InstrumentDetectFunction { * @param blockPos Noteblock position * @return Detected instrument */ - Instrument detectInstrument(BlockState noteBlock, BlockPos blockPos); + NoteBlockInstrument detectInstrument(BlockState noteBlock, BlockPos blockPos); } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/notebot/song/Note.java b/src/main/java/meteordevelopment/meteorclient/utils/notebot/song/Note.java index b6604b77c4..4fd87df501 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/notebot/song/Note.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/notebot/song/Note.java @@ -5,25 +5,25 @@ package meteordevelopment.meteorclient.utils.notebot.song; -import net.minecraft.block.enums.Instrument; +import net.minecraft.block.enums.NoteBlockInstrument; import java.util.Objects; public class Note { - private Instrument instrument; + private NoteBlockInstrument instrument; private int noteLevel; - public Note(Instrument instrument, int noteLevel) { + public Note(NoteBlockInstrument instrument, int noteLevel) { this.instrument = instrument; this.noteLevel = noteLevel; } - public Instrument getInstrument() { + public NoteBlockInstrument getInstrument() { return this.instrument; } - public void setInstrument(Instrument instrument) { + public void setInstrument(NoteBlockInstrument instrument) { this.instrument = instrument; } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/IVertexConsumerProvider.java b/src/main/java/meteordevelopment/meteorclient/utils/render/IVertexConsumerProvider.java index 9f991ad27a..4a41ab5e7c 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/IVertexConsumerProvider.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/IVertexConsumerProvider.java @@ -8,5 +8,5 @@ import net.minecraft.client.render.VertexConsumerProvider; public interface IVertexConsumerProvider extends VertexConsumerProvider { - void setOffset(double offsetX, double offsetY, double offsetZ); + void setOffset(float offsetX, float offsetY, float offsetZ); } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/MeshVertexConsumerProvider.java b/src/main/java/meteordevelopment/meteorclient/utils/render/MeshVertexConsumerProvider.java index fec0384191..b28366abf9 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/MeshVertexConsumerProvider.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/MeshVertexConsumerProvider.java @@ -27,18 +27,18 @@ public void setColor(Color color) { } @Override - public void setOffset(double offsetX, double offsetY, double offsetZ) { + public void setOffset(float offsetX, float offsetY, float offsetZ) { vertexConsumer.setOffset(offsetX, offsetY, offsetZ); } public static class MeshVertexConsumer implements VertexConsumer { private final Mesh mesh; - private double offsetX, offsetY, offsetZ; + private float offsetX, offsetY, offsetZ; - private final double[] xs = new double[4]; - private final double[] ys = new double[4]; - private final double[] zs = new double[4]; + private final float[] xs = new float[4]; + private final float[] ys = new float[4]; + private final float[] zs = new float[4]; private final Color color = new Color(); private int i; @@ -47,18 +47,29 @@ public MeshVertexConsumer(Mesh mesh) { this.mesh = mesh; } - public void setOffset(double offsetX, double offsetY, double offsetZ) { + public void setOffset(float offsetX, float offsetY, float offsetZ) { this.offsetX = offsetX; this.offsetY = offsetY; this.offsetZ = offsetZ; } @Override - public VertexConsumer vertex(double x, double y, double z) { + public VertexConsumer vertex(float x, float y, float z) { xs[i] = offsetX + x; ys[i] = offsetY + y; zs[i] = offsetZ + z; + if (++i >= 4) { + mesh.quad( + mesh.vec3(xs[0], ys[0], zs[0]).color(color).next(), + mesh.vec3(xs[1], ys[1], zs[1]).color(color).next(), + mesh.vec3(xs[2], ys[2], zs[2]).color(color).next(), + mesh.vec3(xs[3], ys[3], zs[3]).color(color).next() + ); + + i = 0; + } + return this; } @@ -87,26 +98,8 @@ public VertexConsumer normal(float x, float y, float z) { return null; } - @Override - public void next() { - if (++i >= 4) { - mesh.quad( - mesh.vec3(xs[0], ys[0], zs[0]).color(color).next(), - mesh.vec3(xs[1], ys[1], zs[1]).color(color).next(), - mesh.vec3(xs[2], ys[2], zs[2]).color(color).next(), - mesh.vec3(xs[3], ys[3], zs[3]).color(color).next() - ); - - i = 0; - } - } - - @Override public void fixedColor(int red, int green, int blue, int alpha) { color.set(red, green, blue, alpha); } - - @Override - public void unfixColor() {} } } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/MeteorToast.java b/src/main/java/meteordevelopment/meteorclient/utils/render/MeteorToast.java index 731f31401d..277a94490a 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/MeteorToast.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/MeteorToast.java @@ -28,7 +28,7 @@ public class MeteorToast implements Toast { public static final int TITLE_COLOR = Color.fromRGBA(145, 61, 226, 255); public static final int TEXT_COLOR = Color.fromRGBA(220, 220, 220, 255); - private static final Identifier TEXTURE = new Identifier("textures/gui/sprites/toast/advancement.png"); + private static final Identifier TEXTURE = Identifier.of("textures/gui/sprites/toast/advancement.png"); private ItemStack icon; private Text title, text; diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/PeekScreen.java b/src/main/java/meteordevelopment/meteorclient/utils/render/PeekScreen.java index 59de0030a1..5e546e6797 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/PeekScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/PeekScreen.java @@ -25,7 +25,7 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; public class PeekScreen extends ShulkerBoxScreen { - private final Identifier TEXTURE = new Identifier("textures/gui/container/shulker_box.png"); + private final Identifier TEXTURE = Identifier.of("textures/gui/container/shulker_box.png"); private final ItemStack[] contents; private final ItemStack storageBlock; diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/PlayerHeadTexture.java b/src/main/java/meteordevelopment/meteorclient/utils/render/PlayerHeadTexture.java index 34a451889d..455e6bae3b 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/PlayerHeadTexture.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/PlayerHeadTexture.java @@ -2,8 +2,8 @@ import com.mojang.blaze3d.platform.TextureUtil; import com.mojang.blaze3d.systems.RenderSystem; +import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.renderer.Texture; -import meteordevelopment.meteorclient.utils.misc.MeteorIdentifier; import meteordevelopment.meteorclient.utils.network.Http; import org.lwjgl.BufferUtils; import org.lwjgl.stb.STBImage; @@ -67,7 +67,7 @@ public PlayerHeadTexture(String url) { } public PlayerHeadTexture() { - try (InputStream inputStream = mc.getResourceManager().getResource(new MeteorIdentifier("textures/steve.png")).get().getInputStream()) { + try (InputStream inputStream = mc.getResourceManager().getResource(MeteorClient.identifier("textures/steve.png")).get().getInputStream()) { ByteBuffer data = TextureUtil.readResource(inputStream); data.rewind(); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/RenderUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/render/RenderUtils.java index b6896e02f8..1d255be2df 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/RenderUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/RenderUtils.java @@ -87,7 +87,7 @@ private static void bobView(MatrixStack matrices) { Entity cameraEntity = MinecraftClient.getInstance().getCameraEntity(); if (cameraEntity instanceof PlayerEntity playerEntity) { - float f = MinecraftClient.getInstance().getTickDelta(); + float f = mc.getRenderTickCounter().getTickDelta(true); float g = playerEntity.horizontalSpeed - playerEntity.prevHorizontalSpeed; float h = -(playerEntity.horizontalSpeed + g * f); float i = MathHelper.lerp(f, playerEntity.prevStrideDistance, playerEntity.strideDistance); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/SimpleBlockRenderer.java b/src/main/java/meteordevelopment/meteorclient/utils/render/SimpleBlockRenderer.java index dcd40f1e96..92fc06d2e5 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/SimpleBlockRenderer.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/SimpleBlockRenderer.java @@ -47,9 +47,9 @@ public static void render(BlockPos pos, BlockState state, VertexConsumerProvider BakedModel model = mc.getBlockRenderManager().getModel(state); Vec3d offset = state.getModelOffset(mc.world, pos); - double offsetX = pos.getX() + offset.x; - double offsetY = pos.getY() + offset.y; - double offsetZ = pos.getZ() + offset.z; + float offsetX = (float) (pos.getX() + offset.x); + float offsetY = (float) (pos.getY() + offset.y); + float offsetZ = (float) (pos.getZ() + offset.z); //noinspection ForLoopReplaceableByForEach for (int i = 0; i < DIRECTIONS.length; i++) { @@ -61,7 +61,7 @@ public static void render(BlockPos pos, BlockState state, VertexConsumerProvider if (!list.isEmpty()) renderQuads(list, offsetX, offsetY, offsetZ, consumer); } - private static void renderQuads(List quads, double offsetX, double offsetY, double offsetZ, VertexConsumer consumer) { + private static void renderQuads(List quads, float offsetX, float offsetY, float offsetZ, VertexConsumer consumer) { //noinspection ForLoopReplaceableByForEach for (int i = 0; i < quads.size(); i++) { IBakedQuad quad = (IBakedQuad) quads.get(i); @@ -71,7 +71,7 @@ private static void renderQuads(List quads, double offsetX, double of float y = quad.meteor$getY(j); float z = quad.meteor$getZ(j); - consumer.vertex(offsetX + x, offsetY + y, offsetZ + z).next(); + consumer.vertex(offsetX + x, offsetY + y, offsetZ + z); } } } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/ChamsShader.java b/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/ChamsShader.java index 1cd3ed1a26..e868c56d35 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/ChamsShader.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/ChamsShader.java @@ -12,7 +12,6 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.Chams; import meteordevelopment.meteorclient.utils.PostInit; -import meteordevelopment.meteorclient.utils.misc.MeteorIdentifier; import meteordevelopment.orbit.EventHandler; import net.minecraft.entity.Entity; import net.minecraft.resource.Resource; @@ -41,7 +40,7 @@ public static void load() { try { ByteBuffer data = null; for (String fileFormat : FILE_FORMATS) { - Optional optional = mc.getResourceManager().getResource(new MeteorIdentifier("textures/chams." + fileFormat)); + Optional optional = mc.getResourceManager().getResource(MeteorClient.identifier("textures/chams." + fileFormat)); if (optional.isEmpty() || optional.get().getInputStream() == null) { continue; } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/tooltip/BookTooltipComponent.java b/src/main/java/meteordevelopment/meteorclient/utils/tooltip/BookTooltipComponent.java index d484e305e9..feaef6575b 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/tooltip/BookTooltipComponent.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/tooltip/BookTooltipComponent.java @@ -16,7 +16,7 @@ import net.minecraft.util.Identifier; public class BookTooltipComponent implements TooltipComponent, MeteorTooltipData { - private static final Identifier TEXTURE_BOOK_BACKGROUND = new Identifier("textures/gui/book.png"); + private static final Identifier TEXTURE_BOOK_BACKGROUND = Identifier.of("textures/gui/book.png"); private final Text page; diff --git a/src/main/java/meteordevelopment/meteorclient/utils/tooltip/ContainerTooltipComponent.java b/src/main/java/meteordevelopment/meteorclient/utils/tooltip/ContainerTooltipComponent.java index 21dd00aafc..13c964d520 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/tooltip/ContainerTooltipComponent.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/tooltip/ContainerTooltipComponent.java @@ -6,7 +6,7 @@ package meteordevelopment.meteorclient.utils.tooltip; import com.mojang.blaze3d.systems.RenderSystem; -import meteordevelopment.meteorclient.utils.misc.MeteorIdentifier; +import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.utils.render.RenderUtils; import meteordevelopment.meteorclient.utils.render.color.Color; import net.minecraft.client.font.TextRenderer; @@ -17,7 +17,7 @@ import net.minecraft.util.Identifier; public class ContainerTooltipComponent implements TooltipComponent, MeteorTooltipData { - private static final Identifier TEXTURE_CONTAINER_BACKGROUND = new MeteorIdentifier("textures/container.png"); + private static final Identifier TEXTURE_CONTAINER_BACKGROUND = MeteorClient.identifier("textures/container.png"); private final ItemStack[] items; private final Color color; diff --git a/src/main/java/meteordevelopment/meteorclient/utils/tooltip/MapTooltipComponent.java b/src/main/java/meteordevelopment/meteorclient/utils/tooltip/MapTooltipComponent.java index ffbfbec6f2..651f8fe278 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/tooltip/MapTooltipComponent.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/tooltip/MapTooltipComponent.java @@ -22,7 +22,7 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; public class MapTooltipComponent implements TooltipComponent, MeteorTooltipData { - private static final Identifier TEXTURE_MAP_BACKGROUND = new Identifier("textures/map/map_background.png"); + private static final Identifier TEXTURE_MAP_BACKGROUND = Identifier.of("textures/map/map_background.png"); private final int mapId; public MapTooltipComponent(int mapId) { diff --git a/src/main/java/meteordevelopment/meteorclient/utils/tooltip/MeteorTooltipData.java b/src/main/java/meteordevelopment/meteorclient/utils/tooltip/MeteorTooltipData.java index 03bd6b6429..c23ae5ed4d 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/tooltip/MeteorTooltipData.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/tooltip/MeteorTooltipData.java @@ -6,7 +6,7 @@ package meteordevelopment.meteorclient.utils.tooltip; import net.minecraft.client.gui.tooltip.TooltipComponent; -import net.minecraft.client.item.TooltipData; +import net.minecraft.item.tooltip.TooltipData; public interface MeteorTooltipData extends TooltipData { TooltipComponent getComponent(); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java index e260159c57..f8b5c8f02a 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java @@ -10,6 +10,7 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.player.InstantRebreak; import meteordevelopment.meteorclient.utils.PreInit; +import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.player.FindItemResult; import meteordevelopment.meteorclient.utils.player.InvUtils; import meteordevelopment.meteorclient.utils.player.Rotations; @@ -19,7 +20,6 @@ import net.minecraft.block.*; import net.minecraft.block.enums.BlockHalf; import net.minecraft.block.enums.SlabType; -import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.enchantment.Enchantments; import net.minecraft.entity.effect.StatusEffectUtil; import net.minecraft.entity.effect.StatusEffects; @@ -374,7 +374,7 @@ private static double getBlockBreakingSpeed(int slot, BlockState block) { if (speed > 1) { ItemStack tool = mc.player.getInventory().getStack(slot); - int efficiency = EnchantmentHelper.getLevel(Enchantments.EFFICIENCY, tool); + int efficiency = Utils.getEnchantmentLevel(tool, Enchantments.EFFICIENCY); if (efficiency > 0 && !tool.isEmpty()) speed += efficiency * efficiency + 1; } @@ -394,7 +394,7 @@ private static double getBlockBreakingSpeed(int slot, BlockState block) { speed *= k; } - if (mc.player.isSubmergedIn(FluidTags.WATER) && !EnchantmentHelper.hasAquaAffinity(mc.player)) { + if (mc.player.isSubmergedIn(FluidTags.WATER) /*fixme && !EnchantmentHelper.hasAquaAffinity(mc.player)*/) { speed /= 5.0F; } diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 482ee94175..fa6b9ca5ea 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -46,7 +46,7 @@ }, "depends": { "java": ">=21", - "minecraft": ["1.20.5", "${minecraft_version}"], + "minecraft": ["${minecraft_version}"], "fabricloader": ">=${loader_version}" }, "breaks": { diff --git a/src/main/resources/meteor-client.mixins.json b/src/main/resources/meteor-client.mixins.json index bd79e725fd..f1d012c785 100644 --- a/src/main/resources/meteor-client.mixins.json +++ b/src/main/resources/meteor-client.mixins.json @@ -149,7 +149,7 @@ "RegistriesMixin", "ReloadStateAccessor", "RenderLayersMixin", - "RenderTickCounterMixin", + "RenderTickCounterDynamicMixin", "ResourceReloadLoggerAccessor", "ScreenMixin", "SectionedEntityCacheAccessor", From 19c8f7e9302b165eb93daa8a3ffd353fb129d4a9 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Sun, 5 May 2024 22:08:01 -0400 Subject: [PATCH 314/357] handle friend names case-insensitively --- .../meteordevelopment/meteorclient/systems/friends/Friends.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/friends/Friends.java b/src/main/java/meteordevelopment/meteorclient/systems/friends/Friends.java index 3642319fa1..cd4143d130 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/friends/Friends.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/friends/Friends.java @@ -56,7 +56,7 @@ public boolean remove(Friend friend) { public Friend get(String name) { for (Friend friend : friends) { - if (friend.name.equals(name)) { + if (friend.name.equalsIgnoreCase(name)) { return friend; } } From 71f439f7626772d78154b3ed527d4992c3dc859e Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Tue, 25 Jun 2024 22:56:41 +0100 Subject: [PATCH 315/357] fix issues with chams --- .../meteorclient/mixin/LivingEntityRendererMixin.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityRendererMixin.java index 1722122854..258f9d3692 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityRendererMixin.java @@ -97,7 +97,7 @@ private void renderTail(T livingEntity, float f, float g, MatrixStack matrixStac // Player chams - @ModifyArgs(method = "render(Lnet/minecraft/entity/LivingEntity;FFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/math/MatrixStack;scale(FFF)V")) + @ModifyArgs(method = "render(Lnet/minecraft/entity/LivingEntity;FFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/math/MatrixStack;scale(FFF)V", ordinal = 1)) private void modifyScale(Args args, T livingEntity, float f, float g, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i) { Chams module = Modules.get().get(Chams.class); if (!module.isActive() || !module.players.get() || !(livingEntity instanceof PlayerEntity)) return; @@ -115,10 +115,7 @@ private void modifyColor(Args args, T livingEntity, float f, float g, MatrixStac if (module.ignoreSelf.get() && livingEntity == mc.player) return; Color color = PlayerUtils.getPlayerColor(((PlayerEntity) livingEntity), module.playersColor.get()); - args.set(4, color.r / 255f); - args.set(5, color.g / 255f); - args.set(6, color.b / 255f); - args.set(7, module.playersColor.get().a / 255f); + args.set(4, color.getPacked()); } @Redirect(method = "render(Lnet/minecraft/entity/LivingEntity;FFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/entity/LivingEntityRenderer;getRenderLayer(Lnet/minecraft/entity/LivingEntity;ZZZ)Lnet/minecraft/client/render/RenderLayer;")) From bfb6e32f2df4b71702d118c854bc071400333432 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Thu, 27 Jun 2024 12:47:22 +0100 Subject: [PATCH 316/357] Add setting to criticals to always smash attack with the mace closes #4685 --- .../mixininterface/IPlayerMoveC2SPacket.java | 1 + .../systems/modules/combat/Criticals.java | 80 +++++++++++++------ 2 files changed, 55 insertions(+), 26 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixininterface/IPlayerMoveC2SPacket.java b/src/main/java/meteordevelopment/meteorclient/mixininterface/IPlayerMoveC2SPacket.java index d2c51899db..35a2cca29f 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixininterface/IPlayerMoveC2SPacket.java +++ b/src/main/java/meteordevelopment/meteorclient/mixininterface/IPlayerMoveC2SPacket.java @@ -7,5 +7,6 @@ public interface IPlayerMoveC2SPacket { int getTag(); + void setTag(int tag); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Criticals.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Criticals.java index 62dc0ce4a8..92e208f827 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Criticals.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Criticals.java @@ -11,16 +11,14 @@ import meteordevelopment.meteorclient.mixininterface.IPlayerInteractEntityC2SPacket; import meteordevelopment.meteorclient.mixininterface.IPlayerMoveC2SPacket; import meteordevelopment.meteorclient.mixininterface.IVec3d; -import meteordevelopment.meteorclient.settings.BoolSetting; -import meteordevelopment.meteorclient.settings.EnumSetting; -import meteordevelopment.meteorclient.settings.Setting; -import meteordevelopment.meteorclient.settings.SettingGroup; +import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.orbit.EventHandler; import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; +import net.minecraft.item.MaceItem; import net.minecraft.network.packet.c2s.play.HandSwingC2SPacket; import net.minecraft.network.packet.c2s.play.PlayerInteractEntityC2SPacket; import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket; @@ -28,6 +26,7 @@ public class Criticals extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); + private final SettingGroup sgMace = settings.createGroup("Mace"); private final Setting mode = sgGeneral.add(new EnumSetting.Builder() .name("mode") @@ -40,13 +39,32 @@ public class Criticals extends Module { .name("only-killaura") .description("Only performs crits when using killaura.") .defaultValue(false) + .visible(() -> mode.get() != Mode.None) .build() ); + private final Setting mace = sgMace.add(new BoolSetting.Builder() + .name("smash-attack") + .description("Will always perform smash attacks when using a mace.") + .defaultValue(true) + .build() + ); + + private final Setting extraHeight = sgMace.add(new DoubleSetting.Builder() + .name("additional-height") + .description("The amount of additional height to spoof. More height means more damage.") + .defaultValue(0.0) + .min(0) + .sliderRange(0, 100) + .visible(mace::get) + .build() + ); + private PlayerInteractEntityC2SPacket attackPacket; private HandSwingC2SPacket swingPacket; private boolean sendPackets; private int sendTimer; + public Criticals() { super(Categories.Combat, "criticals", "Performs critical attacks when you hit your target."); } @@ -62,31 +80,40 @@ public void onActivate() { @EventHandler private void onSendPacket(PacketEvent.Send event) { if (event.packet instanceof IPlayerInteractEntityC2SPacket packet && packet.getType() == PlayerInteractEntityC2SPacket.InteractType.ATTACK) { - if (skipCrit()) return; + if (mace.get() && mc.player.getMainHandStack().getItem() instanceof MaceItem) { + if (mc.player.isFallFlying()) return; - Entity entity = packet.getEntity(); + sendPacket(0); + sendPacket(1.501 + extraHeight.get()); + sendPacket(0); + } else { + if (skipCrit()) return; - if (!(entity instanceof LivingEntity) || (entity != Modules.get().get(KillAura.class).getTarget() && ka.get())) return; + Entity entity = packet.getEntity(); - switch (mode.get()) { - case Packet -> { - sendPacket(0.0625); - sendPacket(0); - } - case Bypass -> { - sendPacket(0.11); - sendPacket(0.1100013579); - sendPacket(0.0000013579); - } - default -> { - if (!sendPackets) { - sendPackets = true; - sendTimer = mode.get() == Mode.Jump ? 6 : 4; - attackPacket = (PlayerInteractEntityC2SPacket) event.packet; - - if (mode.get() == Mode.Jump) mc.player.jump(); - else ((IVec3d) mc.player.getVelocity()).setY(0.25); - event.cancel(); + if (!(entity instanceof LivingEntity) || (entity != Modules.get().get(KillAura.class).getTarget() && ka.get())) + return; + + switch (mode.get()) { + case Packet -> { + sendPacket(0.0625); + sendPacket(0); + } + case Bypass -> { + sendPacket(0.11); + sendPacket(0.1100013579); + sendPacket(0.0000013579); + } + case Jump, MiniJump -> { + if (!sendPackets) { + sendPackets = true; + sendTimer = mode.get() == Mode.Jump ? 6 : 4; + attackPacket = (PlayerInteractEntityC2SPacket) event.packet; + + if (mode.get() == Mode.Jump) mc.player.jump(); + else ((IVec3d) mc.player.getVelocity()).setY(0.25); + event.cancel(); + } } } } @@ -141,6 +168,7 @@ public String getInfoString() { } public enum Mode { + None, Packet, Bypass, Jump, From 120dac5a48679ce42edb11c31cf8edda50df8731 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Thu, 27 Jun 2024 13:20:22 +0100 Subject: [PATCH 317/357] add wind charges to the trajectories module --- .../systems/modules/render/Trajectories.java | 4 +++- .../utils/entity/ProjectileEntitySimulator.java | 10 ++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java index b5f4aba8f2..aabafb6beb 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java @@ -110,7 +110,9 @@ public Trajectories() { } private boolean itemFilter(Item item) { - return item instanceof BowItem || item instanceof CrossbowItem || item instanceof FishingRodItem || item instanceof TridentItem || item instanceof SnowballItem || item instanceof EggItem || item instanceof EnderPearlItem || item instanceof ExperienceBottleItem || item instanceof ThrowablePotionItem; + return item instanceof RangedWeaponItem || item instanceof FishingRodItem || item instanceof TridentItem || + item instanceof SnowballItem || item instanceof EggItem || item instanceof EnderPearlItem || + item instanceof ExperienceBottleItem || item instanceof ThrowablePotionItem || item instanceof WindChargeItem; } private List getDefaultItems() { diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/ProjectileEntitySimulator.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/ProjectileEntitySimulator.java index 1c2b63f2de..c0346a4ab4 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/entity/ProjectileEntitySimulator.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/entity/ProjectileEntitySimulator.java @@ -37,6 +37,9 @@ public class ProjectileEntitySimulator { private double gravity; private double airDrag, waterDrag; + + // held items + public boolean set(Entity user, ItemStack itemStack, double simulated, boolean accurate, double tickDelta) { Item item = itemStack.getItem(); @@ -68,6 +71,10 @@ else if (item instanceof ExperienceBottleItem) { else if (item instanceof ThrowablePotionItem) { set(user, -20, 0.5, simulated, 0.05, 0.8, accurate, tickDelta); } + else if (item instanceof WindChargeItem) { + set(user, 0, 1.5, simulated, 0, 1.0, accurate, tickDelta); + this.airDrag = 1.0; + } else { return false; } @@ -112,6 +119,9 @@ public void set(Entity user, double roll, double speed, double simulated, double this.waterDrag = waterDrag; } + + // fired projectiles + public boolean set(Entity entity, boolean accurate) { // skip entities in ground if (entity instanceof ProjectileInGroundAccessor ppe && ppe.getInGround()) return false; From cff4cf578c71691fc17bf4e50619975f0200f1fd Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Thu, 27 Jun 2024 22:41:59 +0200 Subject: [PATCH 318/357] Fix Vanilla Xray --- .../mixin/BlockModelRendererMixin.java | 30 +++++-------------- 1 file changed, 7 insertions(+), 23 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BlockModelRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BlockModelRendererMixin.java index af1fb3d3e4..00606da5be 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BlockModelRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BlockModelRendererMixin.java @@ -10,8 +10,6 @@ import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.render.block.BlockModelRenderer; import net.minecraft.client.render.model.BakedModel; -import net.minecraft.client.render.model.BakedQuad; -import net.minecraft.client.util.BufferAllocator; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.random.Random; @@ -19,14 +17,15 @@ 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.Constant; import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyConstant; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import java.nio.ByteBuffer; - @Mixin(BlockModelRenderer.class) public abstract class BlockModelRendererMixin { - @Unique private final ThreadLocal alphas = new ThreadLocal<>(); + @Unique + private final ThreadLocal alphas = new ThreadLocal<>(); @Inject(method = "render(Lnet/minecraft/world/BlockRenderView;Lnet/minecraft/client/render/model/BakedModel;Lnet/minecraft/block/BlockState;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumer;ZLnet/minecraft/util/math/random/Random;JI)V", at = @At("HEAD"), cancellable = true) private void onRender(BlockRenderView world, BakedModel model, BlockState state, BlockPos pos, MatrixStack matrices, VertexConsumer vertexConsumer, boolean cull, Random random, long seed, int overlay, CallbackInfo info) { @@ -36,24 +35,9 @@ private void onRender(BlockRenderView world, BakedModel model, BlockState state, else alphas.set(alpha); } - @Inject(method = "renderQuad(Lnet/minecraft/world/BlockRenderView;Lnet/minecraft/block/BlockState;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/client/render/VertexConsumer;Lnet/minecraft/client/util/math/MatrixStack$Entry;Lnet/minecraft/client/render/model/BakedQuad;FFFFIIIII)V", at = @At("TAIL")) - private void onRenderQuad(BlockRenderView world, BlockState state, BlockPos pos, VertexConsumer vertexConsumer, MatrixStack.Entry matrixEntry, BakedQuad quad, float brightness0, float brightness1, float brightness2, float brightness3, int light0, int light1, int light2, int light3, int overlay, CallbackInfo ci) { + @ModifyConstant(method = "renderQuad", constant = @Constant(floatValue = 1, ordinal = 3)) + private float renderQuad_modifyAlpha(float original) { int alpha = alphas.get(); - if (alpha != -1) rewriteBuffer(vertexConsumer, alpha); - } - - @Unique - private void rewriteBuffer(VertexConsumer vertexConsumer, int alpha) { - if (vertexConsumer instanceof BufferBuilderAccessor bufferBuilder) { - int i = bufferBuilder.getVertexFormat().getVertexSizeByte(); - try (BufferAllocator.CloseableBuffer allocatedBuffer = bufferBuilder.meteor$getAllocator().getAllocated()) { - if (allocatedBuffer != null) { - ByteBuffer buffer = allocatedBuffer.getBuffer(); - for (int l = 1; l <= 4; l++) { - buffer.put(buffer.capacity() - i * l + 15, (byte) (alpha)); - } - } - } - } + return alpha == -1 ? original : alpha / 255f; } } From 85157375d2e368cdfa78358b0a909b51ae7c2d1d Mon Sep 17 00:00:00 2001 From: squidoodly Date: Sun, 30 Jun 2024 17:27:22 +0100 Subject: [PATCH 319/357] Added mace to kill aura --- .../systems/modules/combat/KillAura.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java index 78e44c6316..da5c5c8e29 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java @@ -34,6 +34,7 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.AxeItem; import net.minecraft.item.ItemStack; +import net.minecraft.item.MaceItem; import net.minecraft.item.SwordItem; import net.minecraft.network.packet.c2s.play.UpdateSelectedSlotC2SPacket; import net.minecraft.util.Hand; @@ -56,7 +57,7 @@ public class KillAura extends Module { private final Setting weapon = sgGeneral.add(new EnumSetting.Builder() .name("weapon") .description("Only attacks an entity when a specified weapon is in your hand.") - .defaultValue(Weapon.Both) + .defaultValue(Weapon.All) .build() ); @@ -283,7 +284,8 @@ private void onTick(TickEvent.Pre event) { Predicate predicate = switch (weapon.get()) { case Axe -> stack -> stack.getItem() instanceof AxeItem; case Sword -> stack -> stack.getItem() instanceof SwordItem; - case Both -> stack -> stack.getItem() instanceof AxeItem || stack.getItem() instanceof SwordItem; + case Mace -> stack -> stack.getItem() instanceof MaceItem; + case All -> stack -> stack.getItem() instanceof AxeItem || stack.getItem() instanceof SwordItem || stack.getItem() instanceof MaceItem; default -> o -> true; }; FindItemResult weaponResult = InvUtils.findInHotbar(predicate); @@ -400,7 +402,8 @@ private boolean itemInHand() { return switch (weapon.get()) { case Axe -> mc.player.getMainHandStack().getItem() instanceof AxeItem; case Sword -> mc.player.getMainHandStack().getItem() instanceof SwordItem; - case Both -> mc.player.getMainHandStack().getItem() instanceof AxeItem || mc.player.getMainHandStack().getItem() instanceof SwordItem; + case Mace -> mc.player.getMainHandStack().getItem() instanceof MaceItem; + case All -> mc.player.getMainHandStack().getItem() instanceof AxeItem || mc.player.getMainHandStack().getItem() instanceof SwordItem || mc.player.getMainHandStack().getItem() instanceof MaceItem; default -> true; }; } @@ -419,7 +422,8 @@ public String getInfoString() { public enum Weapon { Sword, Axe, - Both, + Mace, + All, Any } From 946a4ba986cda7e721ad8e8376f960865904b27a Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Mon, 1 Jul 2024 13:18:55 +0100 Subject: [PATCH 320/357] fix better tooltips bees setting closes #4708 --- .../systems/modules/render/BetterTooltips.java | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java index 4487d23b09..c4215cfcf4 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java @@ -21,7 +21,7 @@ import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.tooltip.*; import meteordevelopment.orbit.EventHandler; -import net.minecraft.component.ComponentMap; +import net.minecraft.block.entity.BeehiveBlockEntity; import net.minecraft.component.DataComponentTypes; import net.minecraft.component.type.*; import net.minecraft.component.type.BannerPatternsComponent.Layer; @@ -33,7 +33,6 @@ import net.minecraft.entity.effect.StatusEffectUtil; import net.minecraft.inventory.Inventories; import net.minecraft.item.*; -import net.minecraft.nbt.NbtList; import net.minecraft.registry.DynamicRegistryManager; import net.minecraft.text.MutableText; import net.minecraft.text.RawFilteredPair; @@ -254,17 +253,15 @@ private void appendTooltip(ItemStackTooltipEvent event) { //Beehive if (beehive.get()) { if (event.itemStack.getItem() == Items.BEEHIVE || event.itemStack.getItem() == Items.BEE_NEST) { - ComponentMap components = event.itemStack.getComponents(); - BlockStateComponent blockStateComponent = components.get(DataComponentTypes.BLOCK_STATE); + BlockStateComponent blockStateComponent = event.itemStack.get(DataComponentTypes.BLOCK_STATE); if (blockStateComponent != null) { String level = blockStateComponent.properties().get("honey_level"); event.list.add(1, Text.literal(String.format("%sHoney level: %s%s%s.", Formatting.GRAY, Formatting.YELLOW, level, Formatting.GRAY))); } - NbtComponent nbtComponent = components.get(DataComponentTypes.BLOCK_ENTITY_DATA); - if (nbtComponent != null) { - NbtList beesTag = nbtComponent.copyNbt().getList("Bees", 10); - event.list.add(1, Text.literal(String.format("%sBees: %s%d%s.", Formatting.GRAY, Formatting.YELLOW, beesTag.size(), Formatting.GRAY))); + List bees = event.itemStack.get(DataComponentTypes.BEES); + if (bees != null) { + event.list.add(1, Text.literal(String.format("%sBees: %s%d%s.", Formatting.GRAY, Formatting.YELLOW, bees.size(), Formatting.GRAY))); } } } From c51867e02768d60f172893d49272687e43e6b35b Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Mon, 1 Jul 2024 20:16:28 +0100 Subject: [PATCH 321/357] Ensure toggleOnBindRelease doesn't enable modules when releasing the bind closes #4710, closes #4289, closes #4174, closes #2782 --- .../meteordevelopment/meteorclient/systems/modules/Modules.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java index c5583011a5..c1edf461a6 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java @@ -284,7 +284,7 @@ private void onAction(boolean isKey, int value, int modifiers, boolean isPress) if (mc.currentScreen != null || Input.isKeyPressed(GLFW.GLFW_KEY_F3)) return; for (Module module : moduleInstances.values()) { - if (module.keybind.matches(isKey, value, modifiers) && (isPress || module.toggleOnBindRelease)) { + if (module.keybind.matches(isKey, value, modifiers) && (isPress || (module.toggleOnBindRelease && module.isActive()))) { module.toggle(); module.sendToggledMsg(); } From f82d7dc7fce585585fb4fb63394532befd04e129 Mon Sep 17 00:00:00 2001 From: Adrian Date: Wed, 3 Jul 2024 22:27:07 +0200 Subject: [PATCH 322/357] Fixed game crash caused by ChatInputSuggestor Use length instead of 1 to prevent a crash that happens when you use the left arrow key in the chat and the command prefix is more than one character long. --- .../meteorclient/mixin/ChatInputSuggestorMixin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChatInputSuggestorMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChatInputSuggestorMixin.java index e610790137..7dd3a6b343 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChatInputSuggestorMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChatInputSuggestorMixin.java @@ -52,7 +52,7 @@ public void onRefresh(CallbackInfo ci, String string, StringReader reader) { } int cursor = textField.getCursor(); - if (cursor >= 1 && (this.window == null || !this.completingSuggestions)) { + if (cursor >= length && (this.window == null || !this.completingSuggestions)) { this.pendingSuggestions = Commands.DISPATCHER.getCompletionSuggestions(this.parse, cursor); this.pendingSuggestions.thenRun(() -> { if (this.pendingSuggestions.isDone()) { From f33e87bf752715b768b536b08d23ff0f3efc9332 Mon Sep 17 00:00:00 2001 From: Chen Meng <78586843+slmpc@users.noreply.github.com> Date: Thu, 4 Jul 2024 04:54:52 +0800 Subject: [PATCH 323/357] Added pause in creative mode option for middle click open (#4717) --- .../systems/modules/render/BetterTooltips.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java index c4215cfcf4..610e7952c4 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java @@ -76,6 +76,14 @@ public class BetterTooltips extends Module { .build() ); + private final Setting pauseInCreative = sgGeneral.add(new BoolSetting.Builder() + .name("pause-in-creative") + .description("Pauses middle click open while the player is in creative mode.") + .defaultValue(true) + .visible(middleClickOpen::get) + .build() + ); + // Previews private final Setting shulkers = sgPreviews.add(new BoolSetting.Builder() @@ -438,7 +446,8 @@ private ItemStack createBannerFromShield(ItemStack shieldItem) { } public boolean middleClickOpen() { - return isActive() && middleClickOpen.get(); + return (isActive() && middleClickOpen.get()) + && (!pauseInCreative.get() || !mc.player.isInCreativeMode()); } public boolean previewShulkers() { From 7e65731ab263e09e25bec52f84f654081442d56c Mon Sep 17 00:00:00 2001 From: Lubyanoy Ivan Date: Thu, 4 Jul 2024 00:20:37 +0300 Subject: [PATCH 324/357] Make .peek work for containers in item frames --- .../meteorclient/commands/commands/PeekCommand.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/PeekCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/PeekCommand.java index 28d589165d..52e9761622 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/PeekCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/PeekCommand.java @@ -10,12 +10,13 @@ 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; public class PeekCommand extends Command { private static final ItemStack[] ITEMS = new ItemStack[27]; - private static final SimpleCommandExceptionType NOT_HOLDING_SHULKER_BOX = new SimpleCommandExceptionType(Text.literal("You must be holding a storage block with items in it.")); + private static final SimpleCommandExceptionType CANT_PEEK = new SimpleCommandExceptionType(Text.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."); @@ -26,7 +27,10 @@ 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 throw NOT_HOLDING_SHULKER_BOX.create(); + else if (mc.targetedEntity instanceof ItemFrameEntity && + Utils.openContainer(((ItemFrameEntity) mc.targetedEntity).getHeldItemStack(), ITEMS, true) + ) return SINGLE_SUCCESS; + else throw CANT_PEEK.create(); }); } } From 65a84e1e99d9a67433e55e55bfeff211da2be01e Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Thu, 4 Jul 2024 18:32:56 +0100 Subject: [PATCH 325/357] Fix gui move stopping you for a tick when opening a gui --- .../entity/player/PlayerTickMovementEvent.java | 17 +++++++++++++++++ .../mixin/ClientPlayerEntityMixin.java | 8 ++++++++ .../systems/modules/movement/GUIMove.java | 9 ++++----- 3 files changed, 29 insertions(+), 5 deletions(-) create mode 100644 src/main/java/meteordevelopment/meteorclient/events/entity/player/PlayerTickMovementEvent.java diff --git a/src/main/java/meteordevelopment/meteorclient/events/entity/player/PlayerTickMovementEvent.java b/src/main/java/meteordevelopment/meteorclient/events/entity/player/PlayerTickMovementEvent.java new file mode 100644 index 0000000000..38b8775661 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/events/entity/player/PlayerTickMovementEvent.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.events.entity.player; + +/** + * @see net.minecraft.client.network.ClientPlayerEntity#tickMovement() + */ +public class PlayerTickMovementEvent { + private static final PlayerTickMovementEvent INSTANCE = new PlayerTickMovementEvent(); + + public static PlayerTickMovementEvent get() { + return INSTANCE; + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityMixin.java index a05a576944..8ab98835a4 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityMixin.java @@ -10,6 +10,7 @@ import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.entity.DamageEvent; 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.*; @@ -93,6 +94,13 @@ private boolean isSneaking(boolean sneaking) { return Modules.get().get(Sneak.class).doPacket() || Modules.get().get(NoSlow.class).airStrict() || sneaking; } + @Inject(method = "tickMovement", at = @At("HEAD")) + private void preTickMovement(CallbackInfo ci) { + MeteorClient.EVENT_BUS.post(PlayerTickMovementEvent.get()); + } + + // Sprint + @ModifyExpressionValue(method = "canStartSprinting", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;isWalking()Z")) private boolean modifyIsWalking(boolean original) { boolean rage = Modules.get().isActive(Sprint.class) && Modules.get().get(Sprint.class).mode.get() == Sprint.Mode.Rage; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/GUIMove.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/GUIMove.java index f9ed75835a..fc177623d3 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/GUIMove.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/GUIMove.java @@ -6,9 +6,9 @@ package meteordevelopment.meteorclient.systems.modules.movement; import meteordevelopment.meteorclient.MeteorClient; +import meteordevelopment.meteorclient.events.entity.player.PlayerTickMovementEvent; import meteordevelopment.meteorclient.events.meteor.KeyEvent; import meteordevelopment.meteorclient.events.render.Render3DEvent; -import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.gui.WidgetScreen; import meteordevelopment.meteorclient.mixin.CreativeInventoryScreenAccessor; import meteordevelopment.meteorclient.mixin.KeyBindingAccessor; @@ -63,7 +63,7 @@ public enum Screens { .build() ); - private final Setting sprint = sgGeneral.add(new BoolSetting.Builder() + public final Setting sprint = sgGeneral.add(new BoolSetting.Builder() .name("sprint") .description("Allows you to sprint while in GUIs.") .defaultValue(true) @@ -87,7 +87,7 @@ public enum Screens { .min(0) .build() ); - + public GUIMove() { super(Categories.Movement, "gui-move", "Allows you to perform various actions while in GUIs."); } @@ -112,7 +112,7 @@ public boolean disableArrows() { } @EventHandler - private void onTick(TickEvent.Pre event) { + private void onPlayerMoveEvent(PlayerTickMovementEvent event) { if (skip()) return; if (screens.get() == Screens.GUI && !(mc.currentScreen instanceof WidgetScreen)) return; if (screens.get() == Screens.Inventory && mc.currentScreen instanceof WidgetScreen) return; @@ -125,7 +125,6 @@ private void onTick(TickEvent.Pre event) { if (jump.get()) set(mc.options.jumpKey, Input.isPressed(mc.options.jumpKey)); if (sneak.get()) set(mc.options.sneakKey, Input.isPressed(mc.options.sneakKey)); if (sprint.get()) set(mc.options.sprintKey, Input.isPressed(mc.options.sprintKey)); - } @EventHandler From e3df815c44107f1aa6b74adaae879a3ec6b6bb7e Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Thu, 4 Jul 2024 19:34:28 +0100 Subject: [PATCH 326/357] refactor and fix some issues with sprint --- .../mixin/ClientPlayerEntityAccessor.java | 4 +++ .../mixin/ClientPlayerEntityMixin.java | 12 ++++++--- .../meteorclient/mixin/LivingEntityMixin.java | 11 +------- .../systems/modules/movement/Sprint.java | 27 +++++++++++-------- 4 files changed, 29 insertions(+), 25 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityAccessor.java index b7aa2c7ef4..c9b0337b9f 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityAccessor.java @@ -8,6 +8,7 @@ import net.minecraft.client.network.ClientPlayerEntity; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; +import org.spongepowered.asm.mixin.gen.Invoker; @Mixin(ClientPlayerEntity.class) public interface ClientPlayerEntityAccessor { @@ -16,4 +17,7 @@ public interface ClientPlayerEntityAccessor { @Accessor("ticksSinceLastPositionPacketSent") void setTicksSinceLastPositionPacketSent(int ticks); + + @Invoker("canSprint") + boolean invokeCanSprint(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityMixin.java index 8ab98835a4..ab98464f79 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityMixin.java @@ -6,6 +6,7 @@ package meteordevelopment.meteorclient.mixin; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; import com.mojang.authlib.GameProfile; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.entity.DamageEvent; @@ -103,8 +104,7 @@ private void preTickMovement(CallbackInfo ci) { @ModifyExpressionValue(method = "canStartSprinting", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;isWalking()Z")) private boolean modifyIsWalking(boolean original) { - boolean rage = Modules.get().isActive(Sprint.class) && Modules.get().get(Sprint.class).mode.get() == Sprint.Mode.Rage; - if (!rage) return original; + if (!Modules.get().get(Sprint.class).rageSprint()) return original; float forwards = Math.abs(input.movementSideways); float sideways = Math.abs(input.movementForward); @@ -114,12 +114,16 @@ private boolean modifyIsWalking(boolean original) { @ModifyExpressionValue(method = "tickMovement", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/input/Input;hasForwardMovement()Z")) private boolean modifyMovement(boolean original) { - boolean rage = Modules.get().isActive(Sprint.class) && Modules.get().get(Sprint.class).mode.get() == Sprint.Mode.Rage; - if (!rage) return original; + if (!Modules.get().get(Sprint.class).rageSprint()) return original; return Math.abs(input.movementSideways) > 1.0E-5F || Math.abs(input.movementForward) > 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) { + return !Modules.get().get(Sprint.class).rageSprint(); + } + // Rotations @Inject(method = "sendMovementPackets", at = @At("HEAD")) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java index f27d36d9b8..1ef16a142c 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java @@ -27,30 +27,21 @@ import net.minecraft.entity.LivingEntity; import net.minecraft.entity.damage.DamageSource; import net.minecraft.entity.effect.StatusEffect; -import net.minecraft.entity.effect.StatusEffectInstance; 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 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.*; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import java.util.Map; - import static meteordevelopment.meteorclient.MeteorClient.mc; @Mixin(LivingEntity.class) public abstract class LivingEntityMixin extends Entity { - @Shadow - @Final - private Map activeStatusEffects; - public LivingEntityMixin(EntityType type, World world) { super(type, world); } @@ -132,7 +123,7 @@ private float modifyGetYaw(float original) { if ((Object) this != mc.player) return original; Sprint s = Modules.get().get(Sprint.class); - if (!s.isActive() || s.mode.get() != Sprint.Mode.Rage || !s.jumpFix.get()) return original; + if (!s.rageSprint() || !s.jumpFix.get()) return original; float forward = Math.signum(mc.player.input.movementForward); float strafe = 90 * Math.signum(mc.player.input.movementSideways); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Sprint.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Sprint.java index 5b8e15e915..c25f855c24 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Sprint.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Sprint.java @@ -6,12 +6,14 @@ package meteordevelopment.meteorclient.systems.modules.movement; import meteordevelopment.meteorclient.events.world.TickEvent; +import meteordevelopment.meteorclient.mixin.ClientPlayerEntityAccessor; import meteordevelopment.meteorclient.settings.BoolSetting; import meteordevelopment.meteorclient.settings.EnumSetting; import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.settings.SettingGroup; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; +import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.orbit.EventHandler; public class Sprint extends Module { @@ -53,19 +55,22 @@ public void onDeactivate() { mc.player.setSprinting(false); } - private void sprint() { - if (mc.player.getHungerManager().getFoodLevel() <= 6) return; - mc.player.setSprinting(true); + @EventHandler + private void onTickMovement(TickEvent.Post event) { + if (shouldSprint()) mc.player.setSprinting(true); } - @EventHandler - private void onTick(TickEvent.Post event) { - switch (mode.get()) { - case Strict -> { - if (mc.player.forwardSpeed > 0) sprint(); - } - case Rage -> sprint(); - } + public boolean shouldSprint() { + boolean strictSprint = mc.player.forwardSpeed > 1.0E-5F + && ((ClientPlayerEntityAccessor) mc.player).invokeCanSprint() + && (!mc.player.horizontalCollision || mc.player.collidedSoftly) + && !(mc.player.isTouchingWater() && !mc.player.isSubmergedInWater()); + + return isActive() && (mode.get() == Mode.Rage || strictSprint) && (mc.currentScreen == null || Modules.get().get(GUIMove.class).sprint.get()); + } + + public boolean rageSprint() { + return isActive() && mode.get() == Mode.Rage; } public boolean stopSprinting() { From 2374b609bc4132f759a53fe20b70a3d37f74c75f Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Sat, 6 Jul 2024 22:24:51 +0100 Subject: [PATCH 327/357] fix issues with better tooltips when searching in the creative menu closes #4692 --- .../events/game/ItemStackTooltipEvent.java | 13 +--- .../meteorclient/mixin/ItemGroupsMixin.java | 21 ++++++ .../meteorclient/mixin/ItemStackMixin.java | 4 +- .../modules/render/BetterTooltips.java | 70 ++++++++++++------- src/main/resources/meteor-client.mixins.json | 1 + 5 files changed, 71 insertions(+), 38 deletions(-) create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/ItemGroupsMixin.java diff --git a/src/main/java/meteordevelopment/meteorclient/events/game/ItemStackTooltipEvent.java b/src/main/java/meteordevelopment/meteorclient/events/game/ItemStackTooltipEvent.java index d6046e2785..c0cf9c5f97 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/game/ItemStackTooltipEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/game/ItemStackTooltipEvent.java @@ -10,15 +10,4 @@ import java.util.List; -public class ItemStackTooltipEvent { - private static final ItemStackTooltipEvent INSTANCE = new ItemStackTooltipEvent(); - - public ItemStack itemStack; - public List list; - - public static ItemStackTooltipEvent get(ItemStack itemStack, List list) { - INSTANCE.itemStack = itemStack; - INSTANCE.list = list; - return INSTANCE; - } -} +public record ItemStackTooltipEvent(ItemStack itemStack, List list) {} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ItemGroupsMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ItemGroupsMixin.java new file mode 100644 index 0000000000..daa0577e9a --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ItemGroupsMixin.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 com.llamalad7.mixinextras.injector.ModifyReturnValue; +import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.render.BetterTooltips; +import net.minecraft.item.ItemGroups; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(ItemGroups.class) +public class ItemGroupsMixin { + @ModifyReturnValue(method = "updateDisplayContext", 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/ItemStackMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ItemStackMixin.java index cc139b4f24..fac7631650 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ItemStackMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ItemStackMixin.java @@ -33,8 +33,8 @@ public abstract class ItemStackMixin { @ModifyReturnValue(method = "getTooltip", at = @At("RETURN")) private List onGetTooltip(List original) { if (Utils.canUpdate()) { - ItemStackTooltipEvent event = MeteorClient.EVENT_BUS.post(ItemStackTooltipEvent.get((ItemStack) (Object) this, original)); - return event.list; + ItemStackTooltipEvent event = MeteorClient.EVENT_BUS.post(new ItemStackTooltipEvent((ItemStack) (Object) this, original)); + return event.list(); } return original; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java index 610e7952c4..9336b51568 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java @@ -58,6 +58,7 @@ public class BetterTooltips extends Module { .name("display-when") .description("When to display previews.") .defaultValue(DisplayWhen.Keybind) + .onChanged(value -> updateTooltips = true) .build() ); @@ -66,6 +67,7 @@ public class BetterTooltips extends Module { .description("The bind for keybind mode.") .defaultValue(Keybind.fromKey(GLFW_KEY_LEFT_ALT)) .visible(() -> displayWhen.get() == DisplayWhen.Keybind) + .onChanged(value -> updateTooltips = true) .build() ); @@ -90,6 +92,7 @@ public class BetterTooltips extends Module { .name("containers") .description("Shows a preview of a containers when hovering over it in an inventory.") .defaultValue(true) + .onChanged(value -> updateTooltips = true) .build() ); @@ -105,6 +108,7 @@ public class BetterTooltips extends Module { .name("echests") .description("Shows a preview of your echest when hovering over it in an inventory.") .defaultValue(true) + .onChanged(value -> updateTooltips = true) .build() ); @@ -112,6 +116,7 @@ public class BetterTooltips extends Module { .name("maps") .description("Shows a preview of a map when hovering over it in an inventory.") .defaultValue(true) + .onChanged(value -> updateTooltips = true) .build() ); @@ -129,6 +134,7 @@ public class BetterTooltips extends Module { .name("books") .description("Shows contents of a book when hovering over it in an inventory.") .defaultValue(true) + .onChanged(value -> updateTooltips = true) .build() ); @@ -136,6 +142,7 @@ public class BetterTooltips extends Module { .name("banners") .description("Shows banners' patterns when hovering over it in an inventory. Also works with shields.") .defaultValue(true) + .onChanged(value -> updateTooltips = true) .build() ); @@ -143,6 +150,7 @@ public class BetterTooltips extends Module { .name("entities-in-buckets") .description("Shows entities in buckets when hovering over it in an inventory.") .defaultValue(true) + .onChanged(value -> updateTooltips = true) .build() ); @@ -152,6 +160,7 @@ public class BetterTooltips extends Module { .name("byte-size") .description("Displays an item's size in bytes in the tooltip.") .defaultValue(true) + .onChanged(value -> updateTooltips = true) .build() ); @@ -159,6 +168,7 @@ public class BetterTooltips extends Module { .name("status-effects") .description("Adds list of status effects to tooltips of food items.") .defaultValue(true) + .onChanged(value -> updateTooltips = true) .build() ); @@ -166,6 +176,7 @@ public class BetterTooltips extends Module { .name("beehive") .description("Displays information about a beehive or bee nest.") .defaultValue(true) + .onChanged(value -> updateTooltips = true) .build() ); @@ -234,6 +245,8 @@ public class BetterTooltips extends Module { .build() ); + private boolean updateTooltips = false; + public BetterTooltips() { super(Categories.Render, "better-tooltips", "Displays more useful tooltips for certain items."); } @@ -242,34 +255,34 @@ public BetterTooltips() { private void appendTooltip(ItemStackTooltipEvent event) { // Status effects if (statusEffects.get()) { - if (event.itemStack.getItem() == Items.SUSPICIOUS_STEW) { - SuspiciousStewEffectsComponent stewEffectsComponent = event.itemStack.get(DataComponentTypes.SUSPICIOUS_STEW_EFFECTS); + if (event.itemStack().getItem() == Items.SUSPICIOUS_STEW) { + SuspiciousStewEffectsComponent stewEffectsComponent = event.itemStack().get(DataComponentTypes.SUSPICIOUS_STEW_EFFECTS); if (stewEffectsComponent != null) { for (StewEffect effectTag : stewEffectsComponent.effects()) { StatusEffectInstance effect = new StatusEffectInstance(effectTag.effect(), effectTag.duration(), 0); - event.list.add(1, getStatusText(effect)); + event.list().add(1, getStatusText(effect)); } } } else { - FoodComponent food = event.itemStack.get(DataComponentTypes.FOOD); + FoodComponent food = event.itemStack().get(DataComponentTypes.FOOD); if (food != null) { - food.effects().forEach(e -> event.list.add(1, getStatusText(e.effect()))); + food.effects().forEach(e -> event.list().add(1, getStatusText(e.effect()))); } } } //Beehive if (beehive.get()) { - if (event.itemStack.getItem() == Items.BEEHIVE || event.itemStack.getItem() == Items.BEE_NEST) { - BlockStateComponent blockStateComponent = event.itemStack.get(DataComponentTypes.BLOCK_STATE); + if (event.itemStack().getItem() == Items.BEEHIVE || event.itemStack().getItem() == Items.BEE_NEST) { + BlockStateComponent blockStateComponent = event.itemStack().get(DataComponentTypes.BLOCK_STATE); if (blockStateComponent != null) { String level = blockStateComponent.properties().get("honey_level"); - event.list.add(1, Text.literal(String.format("%sHoney level: %s%s%s.", Formatting.GRAY, Formatting.YELLOW, level, Formatting.GRAY))); + event.list().add(1, Text.literal(String.format("%sHoney level: %s%s%s.", Formatting.GRAY, Formatting.YELLOW, level, Formatting.GRAY))); } - List bees = event.itemStack.get(DataComponentTypes.BEES); + List bees = event.itemStack().get(DataComponentTypes.BEES); if (bees != null) { - event.list.add(1, Text.literal(String.format("%sBees: %s%d%s.", Formatting.GRAY, Formatting.YELLOW, bees.size(), Formatting.GRAY))); + event.list().add(1, Text.literal(String.format("%sBees: %s%d%s.", Formatting.GRAY, Formatting.YELLOW, bees.size(), Formatting.GRAY))); } } } @@ -277,7 +290,7 @@ private void appendTooltip(ItemStackTooltipEvent event) { // Item size tooltip if (byteSize.get()) { try { - event.itemStack.encode(mc.player.getRegistryManager()).write(ByteCountDataOutput.INSTANCE); + event.itemStack().encode(mc.player.getRegistryManager()).write(ByteCountDataOutput.INSTANCE); int byteCount = ByteCountDataOutput.INSTANCE.getCount(); String count; @@ -287,24 +300,24 @@ private void appendTooltip(ItemStackTooltipEvent event) { if (byteCount >= 1024) count = String.format("%.2f kb", byteCount / (float) 1024); else count = String.format("%d bytes", byteCount); - event.list.add(Text.literal(count).formatted(Formatting.GRAY)); + event.list().add(Text.literal(count).formatted(Formatting.GRAY)); } catch (Exception e) { - event.list.add(Text.literal("Error getting bytes.").formatted(Formatting.RED)); + event.list().add(Text.literal("Error getting bytes.").formatted(Formatting.RED)); } } // Hold to preview tooltip - if ((shulkers.get() && !previewShulkers() && Utils.hasItems(event.itemStack)) - || (event.itemStack.getItem() == Items.ENDER_CHEST && echest.get() && !previewEChest()) - || (event.itemStack.getItem() == Items.FILLED_MAP && maps.get() && !previewMaps()) - || (event.itemStack.getItem() == Items.WRITABLE_BOOK && books.get() && !previewBooks()) - || (event.itemStack.getItem() == Items.WRITTEN_BOOK && books.get() && !previewBooks()) - || (event.itemStack.getItem() instanceof EntityBucketItem && entitiesInBuckets.get() && !previewEntities()) - || (event.itemStack.getItem() instanceof BannerItem && banners.get() && !previewBanners()) - || (event.itemStack.getItem() instanceof BannerPatternItem && banners.get() && !previewBanners()) - || (event.itemStack.getItem() == Items.SHIELD && banners.get() && !previewBanners())) { - event.list.add(Text.literal("")); - event.list.add(Text.literal("Hold " + Formatting.YELLOW + keybind + Formatting.RESET + " to preview")); + if ((shulkers.get() && !previewShulkers() && Utils.hasItems(event.itemStack())) + || (event.itemStack().getItem() == Items.ENDER_CHEST && echest.get() && !previewEChest()) + || (event.itemStack().getItem() == Items.FILLED_MAP && maps.get() && !previewMaps()) + || (event.itemStack().getItem() == Items.WRITABLE_BOOK && books.get() && !previewBooks()) + || (event.itemStack().getItem() == Items.WRITTEN_BOOK && books.get() && !previewBooks()) + || (event.itemStack().getItem() instanceof EntityBucketItem && entitiesInBuckets.get() && !previewEntities()) + || (event.itemStack().getItem() instanceof BannerItem && banners.get() && !previewBanners()) + || (event.itemStack().getItem() instanceof BannerPatternItem && banners.get() && !previewBanners()) + || (event.itemStack().getItem() == Items.SHIELD && banners.get() && !previewBanners())) { + event.list().add(Text.literal("")); + event.list().add(Text.literal("Hold " + Formatting.YELLOW + keybind + Formatting.RESET + " to preview")); } } @@ -482,6 +495,15 @@ private boolean isPressed() { return (keybind.get().isPressed() && displayWhen.get() == DisplayWhen.Keybind) || displayWhen.get() == DisplayWhen.Always; } + public boolean updateTooltips() { + if (updateTooltips && isActive()) { + updateTooltips = false; + return true; + } + + return false; + } + public enum DisplayWhen { Keybind, Always diff --git a/src/main/resources/meteor-client.mixins.json b/src/main/resources/meteor-client.mixins.json index f1d012c785..02345053b9 100644 --- a/src/main/resources/meteor-client.mixins.json +++ b/src/main/resources/meteor-client.mixins.json @@ -108,6 +108,7 @@ "ItemEnchantmentsComponentMixin", "ItemEntityMixin", "ItemEntityRendererMixin", + "ItemGroupsMixin", "ItemMixin", "ItemRendererMixin", "ItemStackAccessor", From d4e047db2ccc638644e20b886e5b9409831aeff2 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Thu, 11 Jul 2024 10:07:05 -0400 Subject: [PATCH 328/357] use builtin io stream methods --- .../meteorclient/utils/Utils.java | 18 +++++-------- .../meteorclient/utils/files/StreamUtils.java | 25 +++++++------------ 2 files changed, 15 insertions(+), 28 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/utils/Utils.java b/src/main/java/meteordevelopment/meteorclient/utils/Utils.java index 7da482b09a..547948bba9 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/Utils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/Utils.java @@ -52,7 +52,7 @@ import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; import net.minecraft.world.chunk.Chunk; -import org.apache.commons.io.output.ByteArrayOutputStream; +import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.jetbrains.annotations.Range; import org.joml.Matrix4f; @@ -481,19 +481,13 @@ public static String getButtonName(int button) { public static byte[] readBytes(InputStream in) { try { - ByteArrayOutputStream out = new ByteArrayOutputStream(); - - byte[] buffer = new byte[256]; - int read; - while ((read = in.read(buffer)) > 0) out.write(buffer, 0, read); - - in.close(); - return out.toByteArray(); + return in.readAllBytes(); } catch (IOException e) { - e.printStackTrace(); + MeteorClient.LOG.error("Error reading from stream.", e); + return new byte[0]; + } finally { + IOUtils.closeQuietly(in); } - - return new byte[0]; } public static boolean canUpdate() { diff --git a/src/main/java/meteordevelopment/meteorclient/utils/files/StreamUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/files/StreamUtils.java index 725d76616f..17f76be0ab 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/files/StreamUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/files/StreamUtils.java @@ -5,6 +5,9 @@ package meteordevelopment.meteorclient.utils.files; +import meteordevelopment.meteorclient.MeteorClient; +import org.apache.commons.io.IOUtils; + import java.io.*; public class StreamUtils { @@ -14,29 +17,19 @@ private StreamUtils() { public static void copy(File from, File to) { try (InputStream in = new FileInputStream(from); OutputStream out = new FileOutputStream(to)) { - copy(in, out); + in.transferTo(out); } catch (IOException e) { - e.printStackTrace(); + MeteorClient.LOG.error("Error copying from file '%s' to file '%s'.".formatted(from.getName(), to.getName()), e); } } public static void copy(InputStream in, File to) { try (OutputStream out = new FileOutputStream(to)) { - copy(in, out); - in.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - public static void copy(InputStream in, OutputStream out) { - byte[] bytes = new byte[512]; - int read; - - try { - while ((read = in.read(bytes)) != -1) out.write(bytes, 0, read); + in.transferTo(out); } catch (IOException e) { - e.printStackTrace(); + MeteorClient.LOG.error("Error writing to file '%s'.".formatted(to.getName())); + } finally { + IOUtils.closeQuietly(in); } } } From 8f10a0f0df45816fb71eefe6a59077dbde263b9a Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Tue, 16 Jul 2024 03:31:47 -0400 Subject: [PATCH 329/357] Add exception handling to `Http` (#4749) --- .../commands/commands/NameHistoryCommand.java | 9 +++++--- .../meteorclient/mixin/TitleScreenMixin.java | 4 +++- .../meteorclient/utils/network/Capes.java | 22 +++++++++++-------- .../utils/network/FailedHttpResponse.java | 2 +- .../meteorclient/utils/network/Http.java | 16 ++++++++++++-- .../utils/network/OnlinePlayers.java | 4 ++-- .../utils/player/TitleScreenCredits.java | 1 + .../utils/render/PlayerHeadUtils.java | 5 ++++- 8 files changed, 44 insertions(+), 19 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/NameHistoryCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/NameHistoryCommand.java index 10ca1a99df..56b605c88a 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/NameHistoryCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/NameHistoryCommand.java @@ -36,11 +36,14 @@ public void build(LiteralArgumentBuilder builder) { PlayerListEntry lookUpTarget = PlayerListEntryArgumentType.get(context); UUID uuid = lookUpTarget.getProfile().getId(); - NameHistory history = Http.get("https://laby.net/api/v2/user/" + uuid + "/get-profile").sendJson(NameHistory.class); + NameHistory history = Http.get("https://laby.net/api/v2/user/" + uuid + "/get-profile") + .exceptionHandler(e -> error("There was an error fetching that users name history.")) + .sendJson(NameHistory.class); - if (history == null || history.username_history == null || history.username_history.length == 0) { - error("There was an error fetching that users name history."); + if (history == null) { return; + } else if (history.username_history == null || history.username_history.length == 0) { + error("There was an error fetching that users name history."); } String name = lookUpTarget.getProfile().getName(); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/TitleScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/TitleScreenMixin.java index cccfafa192..be16958768 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/TitleScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/TitleScreenMixin.java @@ -42,7 +42,9 @@ private void onRenderIdkDude(DrawContext context, int mouseX, int mouseY, float MeteorClient.LOG.info("Checking latest version of Meteor Client"); MeteorExecutor.execute(() -> { - String res = Http.get("https://meteorclient.com/api/stats").sendString(); + String res = Http.get("https://meteorclient.com/api/stats") + .exceptionHandler(e -> MeteorClient.LOG.error("Could not fetch version information.")) + .sendString(); if (res == null) return; Version latestVer = new Version(JsonParser.parseString(res).getAsJsonObject().get("version").getAsString()); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/network/Capes.java b/src/main/java/meteordevelopment/meteorclient/utils/network/Capes.java index 372f296374..5d9926b466 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/network/Capes.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/network/Capes.java @@ -47,15 +47,19 @@ public static void init() { MeteorExecutor.execute(() -> { // Cape owners - Stream lines = Http.get(CAPE_OWNERS_URL).sendLines(); - if (lines != null) lines.forEach(s -> { - String[] split = s.split(" "); - - if (split.length >= 2) { - OWNERS.put(UUID.fromString(split[0]), split[1]); - if (!TEXTURES.containsKey(split[1])) TEXTURES.put(split[1], new Cape(split[1])); - } - }); + Stream lines = Http.get(CAPE_OWNERS_URL) + .exceptionHandler(e -> MeteorClient.LOG.error("Could not load capes: " + e.getMessage())) + .sendLines(); + if (lines != null) { + lines.forEach(s -> { + String[] split = s.split(" "); + + if (split.length >= 2) { + OWNERS.put(UUID.fromString(split[0]), split[1]); + if (!TEXTURES.containsKey(split[1])) TEXTURES.put(split[1], new Cape(split[1])); + } + }); + } else return; // Capes lines = Http.get(CAPES_URL).sendLines(); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/network/FailedHttpResponse.java b/src/main/java/meteordevelopment/meteorclient/utils/network/FailedHttpResponse.java index 3d6577741f..c108179288 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/network/FailedHttpResponse.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/network/FailedHttpResponse.java @@ -23,7 +23,7 @@ * * @author Crosby */ -public record FailedHttpResponse(HttpRequest request) implements HttpResponse { +public record FailedHttpResponse(HttpRequest request, Exception exception) implements HttpResponse { @Override public int statusCode() { return Http.BAD_REQUEST; diff --git a/src/main/java/meteordevelopment/meteorclient/utils/network/Http.java b/src/main/java/meteordevelopment/meteorclient/utils/network/Http.java index c581e5f715..f74b7b04f5 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/network/Http.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/network/Http.java @@ -19,6 +19,7 @@ import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.util.Date; +import java.util.function.Consumer; import java.util.stream.Stream; public class Http { @@ -42,6 +43,7 @@ private enum Method { public static class Request { private final HttpRequest.Builder builder; private Method method; + private Consumer exceptionHandler = Exception::printStackTrace; private Request(Method method, String url) { try { @@ -96,6 +98,16 @@ public Request bodyJson(Object object) { return this; } + public Request ignoreExceptions() { + exceptionHandler = e -> {}; + return this; + } + + public Request exceptionHandler(Consumer exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + private HttpResponse _sendResponse(String accept, HttpResponse.BodyHandler responseBodyHandler) { builder.header("Accept", accept); if (method != null) builder.method(method.name(), HttpRequest.BodyPublishers.noBody()); @@ -105,8 +117,8 @@ private HttpResponse _sendResponse(String accept, HttpResponse.BodyHandle try { return CLIENT.send(request, responseBodyHandler); } catch (IOException | InterruptedException e) { - e.printStackTrace(); - return new FailedHttpResponse<>(request); + exceptionHandler.accept(e); + return new FailedHttpResponse<>(request, e); } } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/network/OnlinePlayers.java b/src/main/java/meteordevelopment/meteorclient/utils/network/OnlinePlayers.java index 30dc9c8f96..e716d2e0c7 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/network/OnlinePlayers.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/network/OnlinePlayers.java @@ -15,13 +15,13 @@ public static void update() { long time = System.currentTimeMillis(); if (time - lastPingTime > 5 * 60 * 1000) { - MeteorExecutor.execute(() -> Http.post("https://meteorclient.com/api/online/ping").send()); + MeteorExecutor.execute(() -> Http.post("https://meteorclient.com/api/online/ping").ignoreExceptions().send()); lastPingTime = time; } } public static void leave() { - MeteorExecutor.execute(() -> Http.post("https://meteorclient.com/api/online/leave").send()); + MeteorExecutor.execute(() -> Http.post("https://meteorclient.com/api/online/leave").ignoreExceptions().send()); } } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/player/TitleScreenCredits.java b/src/main/java/meteordevelopment/meteorclient/utils/player/TitleScreenCredits.java index 1481b9e137..96aafa97fb 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/player/TitleScreenCredits.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/player/TitleScreenCredits.java @@ -49,6 +49,7 @@ private static void init() { GithubRepo repo = credit.addon.getRepo(); Http.Request request = Http.get("https://api.github.com/repos/%s/branches/%s".formatted(repo.getOwnerName(), repo.branch())); + request.exceptionHandler(e -> MeteorClient.LOG.error("Could not fetch repository information for addon '%s'.".formatted(credit.addon.name), e)); repo.authenticate(request); HttpResponse res = request.sendJsonResponse(Response.class); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/PlayerHeadUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/render/PlayerHeadUtils.java index 0a5b69d560..828fb2c48e 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/PlayerHeadUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/PlayerHeadUtils.java @@ -1,6 +1,7 @@ package meteordevelopment.meteorclient.utils.render; import com.google.gson.Gson; +import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.systems.accounts.TexturesJson; import meteordevelopment.meteorclient.systems.accounts.UuidToProfileResponse; import meteordevelopment.meteorclient.utils.PostInit; @@ -28,7 +29,9 @@ public static PlayerHeadTexture fetchHead(UUID id) { } public static String getSkinUrl(UUID id) { - UuidToProfileResponse res2 = Http.get("https://sessionserver.mojang.com/session/minecraft/profile/" + id).sendJson(UuidToProfileResponse.class); + UuidToProfileResponse res2 = Http.get("https://sessionserver.mojang.com/session/minecraft/profile/" + id) + .exceptionHandler(e -> MeteorClient.LOG.error("Could not contact mojang session servers.", e)) + .sendJson(UuidToProfileResponse.class); if (res2 == null) return null; String base64Textures = res2.getPropertyValue("textures"); From 17ec839b71561a3a15990fe6054e54a8170d3146 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Sat, 13 Jul 2024 14:47:00 -0400 Subject: [PATCH 330/357] fix nuker render cube size --- .../systems/modules/world/Nuker.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java index 42801dc61f..0bcbd45cf7 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java @@ -253,9 +253,8 @@ public class Nuker extends Module { private int timer; private int noBlockTimer; - private BlockPos.Mutable pos1 = new BlockPos.Mutable(); // Rendering for cubes - private BlockPos.Mutable pos2 = new BlockPos.Mutable(); - private Box box; + private final BlockPos.Mutable pos1 = new BlockPos.Mutable(); // Rendering for cubes + private final BlockPos.Mutable pos2 = new BlockPos.Mutable(); int maxh = 0; int maxv = 0; @@ -272,11 +271,16 @@ public void onActivate() { @EventHandler private void onRender(Render3DEvent event) { - if (enableRenderBounding.get()){ + if (enableRenderBounding.get()) { // Render bounding box if cube and should break stuff if (shape.get() != Shape.Sphere && mode.get() != Mode.Smash) { - box = new Box(pos1.toCenterPos(), pos2.toCenterPos()); - event.renderer.box(box, sideColorBox.get(), lineColorBox.get(), shapeModeBox.get(), 0); + int minX = Math.min(pos1.getX(), pos2.getX()); + int minY = Math.min(pos1.getY(), pos2.getY()); + int minZ = Math.min(pos1.getZ(), pos2.getZ()); + int maxX = Math.max(pos1.getX(), pos2.getX()); + int maxY = Math.max(pos1.getY(), pos2.getY()); + int maxZ = Math.max(pos1.getZ(), pos2.getZ()); + event.renderer.box(minX, minY, minZ, maxX, maxY, maxZ, sideColorBox.get(), lineColorBox.get(), shapeModeBox.get(), 0); } } } @@ -341,7 +345,7 @@ private void onTickPre(TickEvent.Pre event) { if (mode.get() == Mode.Flatten){ pos1.setY((int) Math.floor(pY)); } - box = new Box(pos1.toCenterPos(), pos2.toCenterPos()); + Box box = new Box(pos1.toCenterPos(), pos2.toCenterPos()); // Find blocks to break BlockIterator.register(Math.max((int) Math.ceil(range.get()+1), maxh), Math.max((int) Math.ceil(range.get()), maxv), (blockPos, blockState) -> { From babc0c409c2c08cd69ab4398e6e5343b6222a1cc Mon Sep 17 00:00:00 2001 From: Jim Krok Date: Mon, 8 Jul 2024 20:12:05 -0400 Subject: [PATCH 331/357] fix(AutoWalk): Calculate x & z on first tick Calculate x & z on first tick() in the BaritonePathManager GoalDirection class, to fix AutoWalk smart mode so baritone walks in the direction the player is facing. This fixes an issue where smart mode always starts walking towards 0,0. --- .../meteorclient/pathing/BaritonePathManager.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/pathing/BaritonePathManager.java b/src/main/java/meteordevelopment/meteorclient/pathing/BaritonePathManager.java index 408c7288f0..742f707a88 100644 --- a/src/main/java/meteordevelopment/meteorclient/pathing/BaritonePathManager.java +++ b/src/main/java/meteordevelopment/meteorclient/pathing/BaritonePathManager.java @@ -178,8 +178,8 @@ public static double calculate(double xDiff, double zDiff) { } public void tick() { - if (timer > 20) { - timer = 0; + if (timer <= 0) { + timer = 20; Vec3d pos = mc.player.getPos(); float theta = (float) Math.toRadians(yaw); @@ -188,7 +188,7 @@ public void tick() { z = (int) Math.floor(pos.z + (double) MathHelper.cos(theta) * 100); } - timer++; + timer--; } public boolean isInGoal(int x, int y, int z) { From 3f45b4eecd4376836d9e90b057f4c8148cd5713e Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Tue, 16 Jul 2024 11:36:18 +0200 Subject: [PATCH 332/357] Fix README lines of code badge [no ci] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 185c474fa0..07237743e4 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ GitHub contributors
GitHub code size in bytes - GitHub lines of code + GitHub lines of code ## Usage From af60c8e83e67b788eb4b99ead08d3262bf3529e7 Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Tue, 16 Jul 2024 14:22:01 +0200 Subject: [PATCH 333/357] Track waypoints using UUIDs, fix multiple waypoints with the same name, compatible with old waypoints --- .../commands/commands/WaypointCommand.java | 2 +- .../modules/render/WaypointsModule.java | 25 +++--- .../systems/waypoints/Waypoint.java | 28 +++++- .../systems/waypoints/Waypoints.java | 88 +++++++++++++------ 4 files changed, 103 insertions(+), 40 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/WaypointCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/WaypointCommand.java index ac776f63c6..5771766766 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/WaypointCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/WaypointCommand.java @@ -27,7 +27,7 @@ public WaypointCommand() { @Override public void build(LiteralArgumentBuilder builder) { builder.then(literal("list").executes(context -> { - if (Waypoints.get().waypoints.isEmpty()) error("No created waypoints."); + if (Waypoints.get().isEmpty()) error("No created waypoints."); else { info(Formatting.WHITE + "Created Waypoints:"); for (Waypoint waypoint : Waypoints.get()) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WaypointsModule.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WaypointsModule.java index 569c4ba515..132754c0ef 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WaypointsModule.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WaypointsModule.java @@ -28,6 +28,7 @@ import meteordevelopment.meteorclient.utils.render.NametagUtils; import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.orbit.EventHandler; +import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.DeathScreen; import net.minecraft.text.MutableText; import net.minecraft.text.Text; @@ -37,7 +38,7 @@ import java.text.SimpleDateFormat; import java.util.Date; -import java.util.ListIterator; +import java.util.Iterator; import static meteordevelopment.meteorclient.utils.player.ChatUtils.formatCoords; @@ -181,13 +182,14 @@ public void addDeath(Vec3d deathPos) { private void cleanDeathWPs(int max) { int oldWpC = 0; - ListIterator wps = Waypoints.get().iteratorReverse(); - while (wps.hasPrevious()) { - Waypoint wp = wps.previous(); - if (wp.name.get().startsWith("Death ") && "skull".equals(wp.icon.get())) { + for (Iterator it = Waypoints.get().iterator(); it.hasNext();) { + Waypoint wp = it.next(); + + if (wp.name.get().startsWith("Death ") && wp.icon.get().equals("skull")) { oldWpC++; + if (oldWpC > max) - Waypoints.get().remove(wp); + it.remove(); } } } @@ -219,7 +221,7 @@ private void initTable(GuiTheme theme, WTable table) { }; WButton edit = table.add(theme.button(GuiRenderer.EDIT)).widget(); - edit.action = () -> mc.setScreen(new EditWaypointScreen(theme, waypoint, null)); + edit.action = () -> mc.setScreen(new EditWaypointScreen(theme, waypoint, () -> initTable(theme, table))); // Goto if (validDim) { @@ -248,7 +250,7 @@ private void initTable(GuiTheme theme, WTable table) { create.action = () -> mc.setScreen(new EditWaypointScreen(theme, null, () -> initTable(theme, table))); } - private class EditWaypointScreen extends EditSystemScreen { + private static class EditWaypointScreen extends EditSystemScreen { public EditWaypointScreen(GuiTheme theme, Waypoint value, Runnable reload) { super(theme, value, reload); } @@ -256,14 +258,17 @@ public EditWaypointScreen(GuiTheme theme, Waypoint value, Runnable reload) { @Override public Waypoint create() { return new Waypoint.Builder() - .pos(mc.player.getBlockPos().up(2)) + .pos(MinecraftClient.getInstance().player.getBlockPos().up(2)) .dimension(PlayerUtils.getDimension()) .build(); } @Override public boolean save() { - return !isNew || Waypoints.get().add(value); + if (value.name.get().isBlank()) return false; + + Waypoints.get().add(value); + return true; } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/waypoints/Waypoint.java b/src/main/java/meteordevelopment/meteorclient/systems/waypoints/Waypoint.java index 46bbcbd4b5..f09e53cde1 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/waypoints/Waypoint.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/waypoints/Waypoint.java @@ -20,6 +20,7 @@ import java.util.Map; import java.util.Objects; +import java.util.UUID; public class Waypoint implements ISerializable { public final Settings settings = new Settings(); @@ -93,9 +94,19 @@ public class Waypoint implements ISerializable { .build() ); - private Waypoint() {} + public final UUID uuid; + + private Waypoint() { + uuid = UUID.randomUUID(); + } + public Waypoint(NbtElement tag) { - fromTag((NbtCompound) tag); + NbtCompound nbt = (NbtCompound) tag; + + if (nbt.containsUuid("uuid")) uuid = nbt.getUuid("uuid"); + else uuid = UUID.randomUUID(); + + fromTag(nbt); } public void renderIcon(double x, double y, double a, double size) { @@ -177,6 +188,7 @@ public Waypoint build() { public NbtCompound toTag() { NbtCompound tag = new NbtCompound(); + tag.putUuid("uuid", uuid); tag.put("settings", settings.toTag()); return tag; @@ -196,6 +208,16 @@ public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Waypoint waypoint = (Waypoint) o; - return Objects.equals(waypoint.name.get(), this.name.get()); + return Objects.equals(uuid, waypoint.uuid); + } + + @Override + public int hashCode() { + return Objects.hashCode(uuid); + } + + @Override + public String toString() { + return name.get(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/waypoints/Waypoints.java b/src/main/java/meteordevelopment/meteorclient/systems/waypoints/Waypoints.java index 5c7e74932e..193dae163d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/waypoints/Waypoints.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/waypoints/Waypoints.java @@ -21,21 +21,22 @@ import net.minecraft.client.texture.NativeImage; import net.minecraft.client.texture.NativeImageBackedTexture; import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.NbtElement; import org.jetbrains.annotations.NotNull; import java.io.File; import java.io.FileInputStream; import java.io.IOException; +import java.io.InputStream; import java.util.*; import java.util.concurrent.ConcurrentHashMap; -import java.util.stream.Collectors; public class Waypoints extends System implements Iterable { public static final String[] BUILTIN_ICONS = {"square", "circle", "triangle", "star", "diamond", "skull"}; public final Map icons = new ConcurrentHashMap<>(); - public final Map waypoints = new ConcurrentHashMap<>(); + private final List waypoints = Collections.synchronizedList(new ArrayList<>()); public Waypoints() { super(null); @@ -56,42 +57,51 @@ public void init() { } File[] files = iconsFolder.listFiles(); - if (files == null) { - return; - } + if (files == null) return; + for (File file : files) { if (file.getName().endsWith(".png")) { try { String name = file.getName().replace(".png", ""); AbstractTexture texture = new NativeImageBackedTexture(NativeImage.read(new FileInputStream(file))); icons.put(name, texture); - } catch (IOException e) { - e.printStackTrace(); + } + catch (IOException e) { + MeteorClient.LOG.error("Failed to read a waypoint icon", e); } } } } + /** + * Adds a waypoint or saves it if it already exists + * @return {@code true} if waypoint already exists + */ public boolean add(Waypoint waypoint) { - Waypoint added = waypoints.put(waypoint.name.get().toLowerCase(Locale.ROOT), waypoint); - if (added != null) { + if (waypoints.contains(waypoint)) { save(); + return true; } - return added != null; + waypoints.add(waypoint); + save(); + + return false; } public boolean remove(Waypoint waypoint) { - Waypoint removed = waypoints.remove(waypoint.name.get().toLowerCase(Locale.ROOT)); - if (removed != null) { - save(); - } + boolean removed = waypoints.remove(waypoint); + if (removed) save(); - return removed != null; + return removed; } public Waypoint get(String name) { - return waypoints.get(name.toLowerCase(Locale.ROOT)); + for (Waypoint waypoint : waypoints) { + if (waypoint.name.get().equalsIgnoreCase(name)) return waypoint; + } + + return null; } @EventHandler @@ -129,30 +139,56 @@ public boolean isEmpty() { @Override public @NotNull Iterator iterator() { - return waypoints.values().iterator(); - } - - public ListIterator iteratorReverse() { - return new ArrayList<>(waypoints.values()).listIterator(waypoints.size()); + return new WaypointIterator(); } private void copyIcon(File file) { - StreamUtils.copy(Waypoints.class.getResourceAsStream("/assets/" + MeteorClient.MOD_ID + "/textures/icons/waypoints/" + file.getName()), file); + String path = "/assets/" + MeteorClient.MOD_ID + "/textures/icons/waypoints/" + file.getName(); + InputStream in = Waypoints.class.getResourceAsStream(path); + + if (in == null) { + MeteorClient.LOG.error("Failed to read a resource: {}", path); + return; + } + + StreamUtils.copy(in, file); } @Override public NbtCompound toTag() { NbtCompound tag = new NbtCompound(); - tag.put("waypoints", NbtUtils.listToTag(waypoints.values())); + tag.put("waypoints", NbtUtils.listToTag(waypoints)); return tag; } @Override public Waypoints fromTag(NbtCompound tag) { - Map fromNbt = NbtUtils.listFromTag(tag.getList("waypoints", 10), Waypoint::new).stream().collect(Collectors.toMap(o -> o.name.get().toLowerCase(Locale.ROOT), o -> o)); - this.waypoints.clear(); - this.waypoints.putAll(fromNbt); + waypoints.clear(); + + for (NbtElement waypointTag : tag.getList("waypoints", 10)) { + waypoints.add(new Waypoint(waypointTag)); + } return this; } + + private final class WaypointIterator implements Iterator { + private final Iterator it = waypoints.iterator(); + + @Override + public boolean hasNext() { + return it.hasNext(); + } + + @Override + public Waypoint next() { + return it.next(); + } + + @Override + public void remove() { + Iterator.super.remove(); + save(); + } + } } From 21e034d007a9ae06806a2097f5f89e54c8037a3a Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Wed, 17 Jul 2024 20:03:56 +0200 Subject: [PATCH 334/357] Fix binding keys --- .../meteordevelopment/meteorclient/systems/modules/Modules.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java index c1edf461a6..5b0b98343a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java @@ -246,7 +246,7 @@ private boolean onBinding(boolean isKey, int value, int modifiers) { if (!isBinding()) return false; if (awaitingKeyRelease) { - if (!isKey || value != GLFW.GLFW_KEY_ENTER) return false; + if (!isKey || (value != GLFW.GLFW_KEY_ENTER && value != GLFW.GLFW_KEY_KP_ENTER)) return false; awaitingKeyRelease = false; return false; From ab5f7ac151ca83879ea0a112fdb5e7bd119f5dd4 Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Fri, 19 Jul 2024 10:19:51 +0200 Subject: [PATCH 335/357] Fix Axiom compatibility --- .../meteorclient/mixin/BlockModelRendererMixin.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BlockModelRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BlockModelRendererMixin.java index 00606da5be..97d9aa82dd 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BlockModelRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BlockModelRendererMixin.java @@ -27,8 +27,8 @@ public abstract class BlockModelRendererMixin { @Unique private final ThreadLocal alphas = new ThreadLocal<>(); - @Inject(method = "render(Lnet/minecraft/world/BlockRenderView;Lnet/minecraft/client/render/model/BakedModel;Lnet/minecraft/block/BlockState;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumer;ZLnet/minecraft/util/math/random/Random;JI)V", at = @At("HEAD"), cancellable = true) - private void onRender(BlockRenderView world, BakedModel model, BlockState state, BlockPos pos, MatrixStack matrices, VertexConsumer vertexConsumer, boolean cull, Random random, long seed, int overlay, CallbackInfo info) { + @Inject(method = {"renderSmooth", "renderFlat"}, at = @At("HEAD"), cancellable = true) + private void onRenderSmooth(BlockRenderView world, BakedModel model, BlockState state, BlockPos pos, MatrixStack matrices, VertexConsumer vertexConsumer, boolean cull, Random random, long seed, int overlay, CallbackInfo info) { int alpha = Xray.getAlpha(state, pos); if (alpha == 0) info.cancel(); From 30a1b68f7eef5e18c1d88394ebd6a7ca8c4b64a7 Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Fri, 19 Jul 2024 10:46:09 +0200 Subject: [PATCH 336/357] Add a per-entity cooldown to AutoNametag --- .../systems/modules/world/AutoNametag.java | 42 ++++++++++++++----- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoNametag.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoNametag.java index 3e1ea5576a..3444077d42 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoNametag.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoNametag.java @@ -5,6 +5,8 @@ package meteordevelopment.meteorclient.systems.modules.world; +import it.unimi.dsi.fastutil.objects.Object2IntMap; +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Categories; @@ -21,6 +23,7 @@ import net.minecraft.item.Items; import net.minecraft.util.Hand; +import java.util.Iterator; import java.util.Set; public class AutoNametag extends Module { @@ -62,6 +65,8 @@ public class AutoNametag extends Module { .build() ); + private final Object2IntMap entityCooldowns = new Object2IntOpenHashMap<>(); + private Entity target; private boolean offHand; @@ -69,9 +74,14 @@ public AutoNametag() { super(Categories.World, "auto-nametag", "Automatically uses nametags on entities without a nametag. WILL nametag ALL entities in the specified distance."); } + @Override + public void onDeactivate() { + entityCooldowns.clear(); + } + @EventHandler - private void onTick(TickEvent.Pre event) { - // Nametag in hobar + private void onTickPre(TickEvent.Pre event) { + // Find nametag in hotbar FindItemResult findNametag = InvUtils.findInHotbar(Items.NAME_TAG); if (!findNametag.found()) { @@ -80,33 +90,45 @@ private void onTick(TickEvent.Pre event) { return; } - // Target target = TargetUtils.get(entity -> { if (!PlayerUtils.isWithin(entity, range.get())) return false; if (!entities.get().contains(entity.getType())) return false; - if (entity.hasCustomName()) { - return renametag.get() && !entity.getCustomName().equals(mc.player.getInventory().getStack(findNametag.slot()).getName()); - } - return true; - }, priority.get()); - if (target == null) return; + if (entity.hasCustomName() && (!renametag.get() || entity.getCustomName().equals(mc.player.getInventory().getStack(findNametag.slot()).getName()))) + return false; + + return entityCooldowns.getInt(entity) <= 0; + }, priority.get()); + if (target == null) + return; // Swapping slots InvUtils.swap(findNametag.slot(), true); offHand = findNametag.isOffhand(); - // Interaction if (rotate.get()) Rotations.rotate(Rotations.getYaw(target), Rotations.getPitch(target), -100, this::interact); else interact(); } + @EventHandler + private void onTickPost(TickEvent.Post event) { + for (Iterator it = entityCooldowns.keySet().iterator(); it.hasNext(); ) { + Entity entity = it.next(); + int cooldown = entityCooldowns.getInt(entity) - 1; + + if (cooldown <= 0) it.remove(); + else entityCooldowns.put(entity, cooldown); + } + } + private void interact() { mc.interactionManager.interactEntity(mc.player, target, offHand ? Hand.OFF_HAND : Hand.MAIN_HAND); InvUtils.swapBack(); + + entityCooldowns.put(target, 20); } } From c7d2f7f2f1d0b0b259617f486fff9a01134d10ed Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Fri, 19 Jul 2024 22:11:02 +0200 Subject: [PATCH 337/357] AutoLog will now disable AutoReconnect after a disconnect --- .../meteorclient/systems/modules/misc/AutoLog.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/AutoLog.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/AutoLog.java index 8e9f1ba7e5..26c4b5e1be 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/AutoLog.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/AutoLog.java @@ -14,6 +14,7 @@ import meteordevelopment.meteorclient.systems.friends.Friends; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; +import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.entity.DamageUtils; import meteordevelopment.meteorclient.utils.player.PlayerUtils; @@ -22,7 +23,9 @@ import net.minecraft.entity.decoration.EndCrystalEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.network.packet.s2c.common.DisconnectS2CPacket; +import net.minecraft.text.MutableText; import net.minecraft.text.Text; +import net.minecraft.util.Colors; public class AutoLog extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); @@ -137,7 +140,15 @@ private void onTick(TickEvent.Post event) { } private void disconnect(String reason) { - mc.player.networkHandler.onDisconnect(new DisconnectS2CPacket(Text.literal("[AutoLog] " + reason))); + MutableText text = Text.literal("[AutoLog] " + reason); + AutoReconnect autoReconnect = Modules.get().get(AutoReconnect.class); + + if (autoReconnect.isActive()) { + text.append(Text.literal("\n\nINFO - AutoReconnect was disabled").withColor(Colors.GRAY)); + autoReconnect.toggle(); + } + + mc.player.networkHandler.onDisconnect(new DisconnectS2CPacket(text)); } private class StaticListener { From fdf8e1cb151f4f98677befb1c82d665168093a26 Mon Sep 17 00:00:00 2001 From: Anand Surendra Bhasme <96731982+Hyped1XGeek@users.noreply.github.com> Date: Sat, 20 Jul 2024 01:57:11 +0530 Subject: [PATCH 338/357] Fix auto dimension in NoFall overriding every item instead of just the bucket and removed the setting, making it always enabled (#4759) --- .../meteorclient/systems/modules/movement/NoFall.java | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/NoFall.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/NoFall.java index 0ec72a7f64..006c472e78 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/NoFall.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/NoFall.java @@ -24,7 +24,6 @@ import meteordevelopment.meteorclient.utils.player.PlayerUtils; import meteordevelopment.meteorclient.utils.player.Rotations; import meteordevelopment.meteorclient.utils.world.BlockUtils; -import meteordevelopment.meteorclient.utils.world.Dimension; import meteordevelopment.orbit.EventHandler; import net.minecraft.block.Block; import net.minecraft.block.Blocks; @@ -74,14 +73,6 @@ public class NoFall extends Module { .build() ); - private final Setting autoDimension = sgGeneral.add(new BoolSetting.Builder() - .name("auto-dimension") - .description("Use powder snow bucket in nether.") - .defaultValue(true) - .visible(() -> mode.get() == Mode.Place) - .build() - ); - private final Setting antiBounce = sgGeneral.add(new BoolSetting.Builder() .name("anti-bounce") .description("Disables bouncing on slime-block and bed upon landing.") @@ -157,7 +148,7 @@ private void onTick(TickEvent.Pre event) { // Bucket mode else if (mode.get() == Mode.Place) { - PlacedItem placedItem1 = autoDimension.get() && PlayerUtils.getDimension() == Dimension.Nether ? PlacedItem.PowderSnow : placedItem.get(); + PlacedItem placedItem1 = mc.world.getDimension().ultrawarm() && placedItem.get() == PlacedItem.Bucket ? PlacedItem.PowderSnow : placedItem.get(); if (mc.player.fallDistance > 3 && !EntityUtils.isAboveWater(mc.player)) { Item item = placedItem1.item; From f99666f6f91d2f2a51f7cd86483747468c98c0c0 Mon Sep 17 00:00:00 2001 From: Anand Surendra Bhasme <96731982+AnandBhasme@users.noreply.github.com> Date: Sun, 21 Jul 2024 18:56:53 +0530 Subject: [PATCH 339/357] NoFall consistently picks up Powder Snow after fall (#4761) --- .../meteorclient/systems/modules/movement/NoFall.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/NoFall.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/NoFall.java index 006c472e78..af4259de2c 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/NoFall.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/NoFall.java @@ -178,6 +178,8 @@ else if (mode.get() == Mode.Place) { timer++; if (mc.player.getBlockStateAtPos().getBlock() == placedItem1.block) { useItem(InvUtils.findInHotbar(Items.BUCKET), false, targetPos, true); + } else if (mc.world.getBlockState(mc.player.getBlockPos().down()).getBlock() == Blocks.POWDER_SNOW && mc.player.fallDistance==0 && placedItem1.block==Blocks.POWDER_SNOW){ //check if the powder snow block is still there and the player is on the ground + useItem(InvUtils.findInHotbar(Items.BUCKET), false, targetPos.down(), true); } } } From 4dc99b3ca91f19696efeeb86494e6b8f269d78a9 Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Sun, 21 Jul 2024 16:37:49 +0200 Subject: [PATCH 340/357] Build against 1.21 version of Baritone --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 4ae76d382c..75a09a970c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -14,7 +14,7 @@ archives_base_name=meteor-client # Dependency Versions # Baritone (https://github.com/MeteorDevelopment/baritone) -baritone_version=1.20.6 +baritone_version=1.21 # Sodium (https://github.com/CaffeineMC/sodium-fabric) sodium_version=mc1.21-0.5.9 From 271a0e5da2e6bc7e3da7798df3724b79d0ece4ec Mon Sep 17 00:00:00 2001 From: Anand Surendra Bhasme <96731982+AnandBhasme@users.noreply.github.com> Date: Tue, 23 Jul 2024 15:12:03 +0530 Subject: [PATCH 341/357] Add entities to AutoLog (#4766) --- .../systems/modules/misc/AutoLog.java | 121 ++++++++++++++---- 1 file changed, 96 insertions(+), 25 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/AutoLog.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/AutoLog.java index 26c4b5e1be..d2a786aa75 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/AutoLog.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/AutoLog.java @@ -5,9 +5,14 @@ package meteordevelopment.meteorclient.systems.modules.misc; +import java.util.HashMap; +import java.util.Set; +import java.util.Map; + import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.settings.BoolSetting; +import meteordevelopment.meteorclient.settings.EntityTypeListSetting; import meteordevelopment.meteorclient.settings.IntSetting; import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.settings.SettingGroup; @@ -20,15 +25,18 @@ import meteordevelopment.meteorclient.utils.player.PlayerUtils; import meteordevelopment.orbit.EventHandler; import net.minecraft.entity.Entity; -import net.minecraft.entity.decoration.EndCrystalEntity; +import net.minecraft.entity.EntityType; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.network.packet.s2c.common.DisconnectS2CPacket; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Colors; +import it.unimi.dsi.fastutil.objects.Object2IntMap; +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; public class AutoLog extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); + private final SettingGroup sgEntities = settings.createGroup("Entities"); private final Setting health = sgGeneral.add(new IntSetting.Builder() .name("health") @@ -60,20 +68,47 @@ public class AutoLog extends Module { .build() ); - private final Setting crystalLog = sgGeneral.add(new BoolSetting.Builder() - .name("crystal-nearby") - .description("Disconnects when a crystal appears near you.") - .defaultValue(false) + private final Setting>> entities = sgEntities.add(new EntityTypeListSetting.Builder() + .name("entities") + .description("Disconnects when a specified entity is present within a specified range.") + .defaultValue(EntityType.END_CRYSTAL) + .build() + ); + + private final Setting useTotalCount = sgEntities.add(new BoolSetting.Builder() + .name("use-total-count") + .description("Toggle between counting the total number of all selected entities or each entity individually.") + .defaultValue(true) + .visible(() -> !entities.get().isEmpty()) + .build()); + + private final Setting combinedEntityThreshold = sgEntities.add(new IntSetting.Builder() + .name("combined-entity-threshold") + .description("The minimum total number of selected entities that must be near you before disconnection occurs.") + .defaultValue(10) + .min(1) + .sliderMax(32) + .visible(() -> useTotalCount.get() && !entities.get().isEmpty()) .build() ); - private final Setting range = sgGeneral.add(new IntSetting.Builder() + private final Setting individualEntityThreshold = sgEntities.add(new IntSetting.Builder() + .name("individual-entity-threshold") + .description("The minimum number of entities individually that must be near you before disconnection occurs.") + .defaultValue(2) + .min(1) + .sliderMax(16) + .visible(() -> !useTotalCount.get() && !entities.get().isEmpty()) + .build() + ); + + private final Setting range = sgEntities.add(new IntSetting.Builder() .name("range") - .description("How close a crystal has to be to you before you disconnect.") - .defaultValue(4) - .range(1, 10) - .sliderMax(5) - .visible(crystalLog::get) + .description("How close an entity has to be to you before you disconnect.") + .defaultValue(5) + .min(1) + .sliderMax(16) + .visible(() -> !entities.get().isEmpty()) .build() ); @@ -91,6 +126,10 @@ public class AutoLog extends Module { .build() ); + //Declaring variables outside the loop for better efficiency + private final Object2IntMap> entityCounts = new Object2IntOpenHashMap<>(); + private int totalEntities = 0; + public AutoLog() { super(Categories.Combat, "auto-log", "Automatically disconnects you when certain requirements are met."); } @@ -110,31 +149,63 @@ private void onTick(TickEvent.Post event) { } } - if (smart.get() && playerHealth + mc.player.getAbsorptionAmount() - PlayerUtils.possibleHealthReductions() < health.get()){ + if (smart.get() && playerHealth + mc.player.getAbsorptionAmount() + - PlayerUtils.possibleHealthReductions() < health.get()) { disconnect("Health was going to be lower than " + health.get() + "."); if (toggleOff.get()) this.toggle(); } - - if (!onlyTrusted.get() && !instantDeath.get() && !crystalLog.get()) return; // only check all entities if needed + if (!onlyTrusted.get() && !instantDeath.get() && entities.get().isEmpty()) + return; // only check all entities if needed for (Entity entity : mc.world.getEntities()) { if (entity instanceof PlayerEntity player && player.getUuid() != mc.player.getUuid()) { if (onlyTrusted.get() && player != mc.player && !Friends.get().isFriend(player)) { - disconnect("A non-trusted player appeared in your render distance."); - if (toggleOff.get()) this.toggle(); - break; + disconnect("A non-trusted player appeared in your render distance."); + if (toggleOff.get()) this.toggle(); + break; } if (instantDeath.get() && PlayerUtils.isWithin(entity, 8) && DamageUtils.getAttackDamage(player, mc.player) - > playerHealth + mc.player.getAbsorptionAmount()) { + > playerHealth + mc.player.getAbsorptionAmount()) { disconnect("Anti-32k measures."); - if (toggleOff.get()) this.toggle(); + if (toggleOff.get()) + this.toggle(); break; } } - if (crystalLog.get() && entity instanceof EndCrystalEntity && PlayerUtils.isWithin(entity, range.get())) { - disconnect("End Crystal appeared within specified range."); - if (toggleOff.get()) this.toggle(); + } + + // Entities detection Logic + if (!entities.get().isEmpty()) { + // Reset totalEntities count and clear the entityCounts map + totalEntities = 0; + entityCounts.clear(); + + // Iterate through all entities in the world and count the ones that match the selected types and are within range + for (Entity entity : mc.world.getEntities()) { + if (PlayerUtils.isWithin(entity, range.get()) && entities.get().contains(entity.getType())) { + totalEntities++; + if (!useTotalCount.get()) { + entityCounts.put(entity.getType(), entityCounts.getOrDefault(entity.getType(), 0) + 1); + } + } + } + + if (useTotalCount.get() && totalEntities >= combinedEntityThreshold.get()) { + disconnect("Total number of selected entities within range exceeded the limit."); + if (toggleOff.get()) + this.toggle(); + } else if (!useTotalCount.get()) { + // Check if the count of each entity type exceeds the specified limit + for (Object2IntMap.Entry> entry : entityCounts.object2IntEntrySet()) { + if (entry.getIntValue() >= individualEntityThreshold.get()) { + disconnect("Number of " + entry.getKey().getName().getString() + + " within range exceeded the limit."); + if (toggleOff.get()) + this.toggle(); + break; + } + } } } } @@ -157,11 +228,11 @@ private void healthListener(TickEvent.Post event) { if (isActive()) disableHealthListener(); else if (Utils.canUpdate() - && !mc.player.isDead() - && mc.player.getHealth() > health.get()) { + && !mc.player.isDead() + && mc.player.getHealth() > health.get()) { toggle(); disableHealthListener(); - } + } } } From 6c714bf62ff9e7b3121213e5a5c3b0bf38e42957 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Wed, 31 Jul 2024 15:05:12 +0100 Subject: [PATCH 342/357] sprint module: fix jumping in place, add unsprint on hit setting --- .../meteorclient/mixin/LivingEntityMixin.java | 8 +++++ .../systems/modules/movement/Sprint.java | 30 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java index 1ef16a142c..b99504bf35 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java @@ -134,4 +134,12 @@ private float modifyGetYaw(float original) { return original; } + + @ModifyExpressionValue(method = "jump", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;isSprinting()Z")) + private boolean modifyIsSprinting(boolean original) { + if ((Object) this != mc.player || !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.input.movementForward) > 1.0E-5F || Math.abs(mc.player.input.movementSideways) > 1.0E-5F); + } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Sprint.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Sprint.java index c25f855c24..4e116c269a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Sprint.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Sprint.java @@ -5,8 +5,10 @@ package meteordevelopment.meteorclient.systems.modules.movement; +import meteordevelopment.meteorclient.events.packets.PacketEvent; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.mixin.ClientPlayerEntityAccessor; +import meteordevelopment.meteorclient.mixininterface.IPlayerInteractEntityC2SPacket; import meteordevelopment.meteorclient.settings.BoolSetting; import meteordevelopment.meteorclient.settings.EnumSetting; import meteordevelopment.meteorclient.settings.Setting; @@ -15,6 +17,8 @@ import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.orbit.EventHandler; +import net.minecraft.network.packet.c2s.play.ClientCommandC2SPacket; +import net.minecraft.network.packet.c2s.play.PlayerInteractEntityC2SPacket; public class Sprint extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); @@ -46,6 +50,13 @@ public enum Mode { .build() ); + private final Setting unsprintOnHit = sgGeneral.add(new BoolSetting.Builder() + .name("unsprint-on-hit") + .description("Whether to stop sprinting when attacking, to ensure you get crits and sweep attacks.") + .defaultValue(false) + .build() + ); + public Sprint() { super(Categories.Movement, "sprint", "Automatically sprints."); } @@ -60,6 +71,25 @@ private void onTickMovement(TickEvent.Post event) { if (shouldSprint()) mc.player.setSprinting(true); } + @EventHandler + private void onPacketSend(PacketEvent.Send event) { + if (!unsprintOnHit.get() || !(event.packet instanceof IPlayerInteractEntityC2SPacket packet) || packet.getType() != PlayerInteractEntityC2SPacket.InteractType.ATTACK) return; + + mc.getNetworkHandler().sendPacket(new ClientCommandC2SPacket(mc.player, ClientCommandC2SPacket.Mode.STOP_SPRINTING)); + mc.player.setSprinting(false); + } + + @EventHandler + private void onPacketSent(PacketEvent.Sent event) { + if (!unsprintOnHit.get() || !keepSprint.get()) return; + if (!(event.packet instanceof IPlayerInteractEntityC2SPacket packet) || packet.getType() != PlayerInteractEntityC2SPacket.InteractType.ATTACK) return; + + if (shouldSprint() && !mc.player.isSprinting()) { + mc.getNetworkHandler().sendPacket(new ClientCommandC2SPacket(mc.player, ClientCommandC2SPacket.Mode.START_SPRINTING)); + mc.player.setSprinting(true); + } + } + public boolean shouldSprint() { boolean strictSprint = mc.player.forwardSpeed > 1.0E-5F && ((ClientPlayerEntityAccessor) mc.player).invokeCanSprint() From 23c87ce6e977ba44aee81473a39322b04f4d42e2 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Fri, 2 Aug 2024 14:38:12 +0100 Subject: [PATCH 343/357] Fix no mining trace crashing. closes #4788, closes #4797 --- .../meteorclient/mixin/GameRendererMixin.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java index f84d80e9b5..59014c3dbe 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java @@ -41,6 +41,7 @@ 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 org.spongepowered.asm.mixin.injection.callback.LocalCapture; @Mixin(GameRenderer.class) @@ -120,11 +121,10 @@ private void onRenderWorldTail(CallbackInfo info) { MeteorClient.EVENT_BUS.post(RenderAfterWorldEvent.get()); } - @Inject(method = "updateCrosshairTarget", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/GameRenderer;findCrosshairTarget(Lnet/minecraft/entity/Entity;DDF)Lnet/minecraft/util/hit/HitResult;"), cancellable = true) - private void onUpdateTargetedEntity(float tickDelta, CallbackInfo info) { - if (Modules.get().get(NoMiningTrace.class).canWork() && client.crosshairTarget.getType() == HitResult.Type.BLOCK) { - client.getProfiler().pop(); - info.cancel(); + @Inject(method = "findCrosshairTarget", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/projectile/ProjectileUtil;raycast(Lnet/minecraft/entity/Entity;Lnet/minecraft/util/math/Vec3d;Lnet/minecraft/util/math/Vec3d;Lnet/minecraft/util/math/Box;Ljava/util/function/Predicate;D)Lnet/minecraft/util/hit/EntityHitResult;"), cancellable = true) + private void onUpdateTargetedEntity(Entity camera, double blockInteractionRange, double entityInteractionRange, float tickDelta, CallbackInfoReturnable cir, @Local HitResult hitResult) { + if (Modules.get().get(NoMiningTrace.class).canWork() && hitResult.getType() == HitResult.Type.BLOCK) { + cir.setReturnValue(hitResult); } } From 6b9c11ee530fb40b650eef54dca861eeab20422e Mon Sep 17 00:00:00 2001 From: ccetl Date: Thu, 1 Aug 2024 00:18:16 +0200 Subject: [PATCH 344/357] refactor: rename 'WindowResizedEvent' to 'ResolutionChangedEvent' --- ...{WindowResizedEvent.java => ResolutionChangedEvent.java} | 6 +++--- .../meteorclient/mixin/MinecraftClientMixin.java | 4 ++-- .../meteorclient/systems/modules/render/Blur.java | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) rename src/main/java/meteordevelopment/meteorclient/events/game/{WindowResizedEvent.java => ResolutionChangedEvent.java} (57%) diff --git a/src/main/java/meteordevelopment/meteorclient/events/game/WindowResizedEvent.java b/src/main/java/meteordevelopment/meteorclient/events/game/ResolutionChangedEvent.java similarity index 57% rename from src/main/java/meteordevelopment/meteorclient/events/game/WindowResizedEvent.java rename to src/main/java/meteordevelopment/meteorclient/events/game/ResolutionChangedEvent.java index 97aeb128cc..0ba8069ab2 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/game/WindowResizedEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/game/ResolutionChangedEvent.java @@ -5,10 +5,10 @@ package meteordevelopment.meteorclient.events.game; -public class WindowResizedEvent { - private static final WindowResizedEvent INSTANCE = new WindowResizedEvent(); +public class ResolutionChangedEvent { + private static final ResolutionChangedEvent INSTANCE = new ResolutionChangedEvent(); - public static WindowResizedEvent get() { + public static ResolutionChangedEvent get() { return INSTANCE; } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftClientMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftClientMixin.java index dc829daf43..c07acd01bc 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftClientMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftClientMixin.java @@ -12,7 +12,7 @@ import meteordevelopment.meteorclient.events.game.GameLeftEvent; import meteordevelopment.meteorclient.events.game.OpenScreenEvent; import meteordevelopment.meteorclient.events.game.ResourcePacksReloadedEvent; -import meteordevelopment.meteorclient.events.game.WindowResizedEvent; +import meteordevelopment.meteorclient.events.game.ResolutionChangedEvent; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.gui.WidgetScreen; import meteordevelopment.meteorclient.mixininterface.IMinecraftClient; @@ -163,7 +163,7 @@ private String setTitle(String original) { @Inject(method = "onResolutionChanged", at = @At("TAIL")) private void onResolutionChanged(CallbackInfo info) { - MeteorClient.EVENT_BUS.post(WindowResizedEvent.get()); + MeteorClient.EVENT_BUS.post(ResolutionChangedEvent.get()); } @Inject(method = "getFramerateLimit", at = @At("HEAD"), cancellable = true) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Blur.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Blur.java index 9f62e1c3d9..5ecef03d49 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Blur.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Blur.java @@ -7,7 +7,7 @@ import it.unimi.dsi.fastutil.ints.IntDoubleImmutablePair; import meteordevelopment.meteorclient.MeteorClient; -import meteordevelopment.meteorclient.events.game.WindowResizedEvent; +import meteordevelopment.meteorclient.events.game.ResolutionChangedEvent; import meteordevelopment.meteorclient.events.render.RenderAfterWorldEvent; import meteordevelopment.meteorclient.gui.WidgetScreen; import meteordevelopment.meteorclient.renderer.*; @@ -107,7 +107,7 @@ public Blur() { super(Categories.Render, "blur", "Blurs background when in GUI screens."); // The listeners need to run even when the module is not enabled - MeteorClient.EVENT_BUS.subscribe(new ConsumerListener<>(WindowResizedEvent.class, event -> { + MeteorClient.EVENT_BUS.subscribe(new ConsumerListener<>(ResolutionChangedEvent.class, event -> { // Resize all fbos for (int i = 0; i < fbos.length; i++) { if (fbos[i] != null) { From 31b71cc8bb8ff7f197851b394e6c4de8dee1340b Mon Sep 17 00:00:00 2001 From: Funtimes909 <68979259+Funtimes909@users.noreply.github.com> Date: Fri, 2 Aug 2024 18:18:24 +0000 Subject: [PATCH 345/357] Nuker refactor (#4787) --- .../systems/modules/world/Nuker.java | 90 ++++++++++--------- 1 file changed, 48 insertions(+), 42 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java index 0bcbd45cf7..7245c5f0e1 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java @@ -13,7 +13,6 @@ import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.Utils; -import meteordevelopment.meteorclient.utils.misc.Pool; import meteordevelopment.meteorclient.utils.player.Rotations; import meteordevelopment.meteorclient.utils.render.RenderUtils; import meteordevelopment.meteorclient.utils.render.color.SettingColor; @@ -244,8 +243,7 @@ public class Nuker extends Module { .build() ); - private final Pool blockPosPool = new Pool<>(BlockPos.Mutable::new); - private final List blocks = new ArrayList<>(); + private final List blocks = new ArrayList<>(); private boolean firstBlock; private final BlockPos.Mutable lastBlockPos = new BlockPos.Mutable(); @@ -310,55 +308,64 @@ private void onTickPre(TickEvent.Pre event) { if (shape.get() == Shape.UniformCube) { pX_ += 1; // weired position stuff - pos1.set(pX_ - r, pY - r + 1, pZ - r+1); // down - pos2.set(pX_ + r-1, pY + r, pZ + r); // up + pos1.set(pX_ - r, pY - r + 1, pZ - r + 1); // down + pos2.set(pX_ + r - 1, pY + r, pZ + r); // up } else { int direction = Math.round((mc.player.getRotationClient().y % 360) / 90); direction = Math.floorMod(direction, 4); // direction == 1 - pos1.set(pX_ - (range_forward.get()), Math.ceil(pY) - range_down.get(), pZ_ - range_right.get()); // down - pos2.set(pX_ + range_back.get()+1, Math.ceil(pY + range_up.get() + 1), pZ_ + range_left.get()+1); // up + pos1.set(pX_ - range_forward.get(), Math.ceil(pY) - range_down.get(), pZ_ - range_right.get()); // down + pos2.set(pX_ + range_back.get() + 1, Math.ceil(pY + range_up.get() + 1), pZ_ + range_left.get() + 1); // up // Only change me if you want to mess with 3D rotations: - if (direction == 2) { - pX_ += 1; - pZ_ += 1; - pos1.set(pX_ - (range_left.get()+1), Math.ceil(pY) - range_down.get(), pZ_ - (range_forward.get()+1)); // down - pos2.set(pX_ + range_right.get(), Math.ceil(pY + range_up.get() + 1), pZ_ + range_back.get()); // up - } else if (direction == 3) { - pX_ += 1; - pos1.set(pX_ - (range_back.get()+1), Math.ceil(pY) - range_down.get(), pZ_ - range_left.get()); // down - pos2.set(pX_ + range_forward.get(), Math.ceil(pY + range_up.get() + 1), pZ_ + range_right.get()+1); // up - } else if (direction == 0) { - pZ_ += 1; - pX_ += 1; - pos1.set(pX_ - (range_right.get()+1), Math.ceil(pY) - range_down.get(), pZ_ - (range_back.get()+1)); // down - pos2.set(pX_ + range_left.get(), Math.ceil(pY + range_up.get() + 1), pZ_ + range_forward.get()); // up + // I messed with it + switch (direction) { + case 0 -> { + pZ_ += 1; + pX_ += 1; + pos1.set(pX_ - (range_right.get() + 1), Math.ceil(pY) - range_down.get(), pZ_ - (range_back.get() + 1)); // down + pos2.set(pX_ + range_left.get(), Math.ceil(pY + range_up.get() + 1), pZ_ + range_forward.get()); // up + } + case 2 -> { + pX_ += 1; + pZ_ += 1; + pos1.set(pX_ - (range_left.get() + 1), Math.ceil(pY) - range_down.get(), pZ_ - (range_forward.get() + 1)); // down + pos2.set(pX_ + range_right.get(), Math.ceil(pY + range_up.get() + 1), pZ_ + range_back.get()); // up + } + case 3 -> { + pX_ += 1; + pos1.set(pX_ - (range_back.get() + 1), Math.ceil(pY) - range_down.get(), pZ_ - range_left.get()); // down + pos2.set(pX_ + range_forward.get(), Math.ceil(pY + range_up.get() + 1), pZ_ + range_right.get() + 1); // up + } } // get largest horizontal - maxh = 1 + Math.max(Math.max(Math.max(range_back.get(),range_right.get()),range_forward.get()),range_left.get()); + maxh = 1 + Math.max(Math.max(Math.max(range_back.get(), range_right.get()), range_forward.get()), range_left.get()); maxv = 1 + Math.max(range_up.get(), range_down.get()); } - if (mode.get() == Mode.Flatten){ + if (mode.get() == Mode.Flatten) { pos1.setY((int) Math.floor(pY)); } Box box = new Box(pos1.toCenterPos(), pos2.toCenterPos()); // Find blocks to break - BlockIterator.register(Math.max((int) Math.ceil(range.get()+1), maxh), Math.max((int) Math.ceil(range.get()), maxv), (blockPos, blockState) -> { + BlockIterator.register(Math.max((int) Math.ceil(range.get() + 1), maxh), Math.max((int) Math.ceil(range.get()), maxv), (blockPos, blockState) -> { // Check for air, unbreakable blocks and distance - boolean toofarSphere = Utils.squaredDistance(pX, pY, pZ, blockPos.getX() + 0.5, blockPos.getY() + 0.5, blockPos.getZ() + 0.5) > rangeSq; - boolean toofarUniformCube = maxDist(Math.floor(pX), Math.floor(pY), Math.floor(pZ), blockPos.getX(), blockPos.getY(), blockPos.getZ()) >= range.get(); - boolean toofarCube = !box.contains(Vec3d.ofCenter(blockPos)); - - if (!BlockUtils.canBreak(blockPos, blockState) - || (toofarSphere && shape.get() == Shape.Sphere) - || (toofarUniformCube && shape.get() == Shape.UniformCube) - || (toofarCube && shape.get() == Shape.Cube)) - return; + switch (shape.get()) { + case Sphere -> { + if (Utils.squaredDistance(pX, pY, pZ, blockPos.getX() + 0.5, blockPos.getY() + 0.5, blockPos.getZ() + 0.5) > rangeSq) return; + } + case UniformCube -> { + if (chebyshevDist(mc.player.getBlockPos().getX(), mc.player.getBlockPos().getY(), mc.player.getBlockPos().getZ(), blockPos.getX(), blockPos.getY(), blockPos.getZ()) >= range.get()) return; + } + case Cube -> { + if (!box.contains(Vec3d.ofCenter(blockPos))) return; + } + } + + if (!BlockUtils.canBreak(blockPos, blockState)) return; // Flatten if (mode.get() == Mode.Flatten && blockPos.getY() < Math.floor(mc.player.getY())) return; @@ -371,14 +378,14 @@ private void onTickPre(TickEvent.Pre event) { if (listMode.get() == ListMode.Blacklist && blacklist.get().contains(blockState.getBlock())) return; // Add block - blocks.add(blockPosPool.get().set(blockPos)); + blocks.add(blockPos.toImmutable()); }); // Break block if found BlockIterator.after(() -> { // Sort blocks if (sortMode.get() == SortMode.TopDown) - blocks.sort(Comparator.comparingDouble(value -> -1*value.getY())); + blocks.sort(Comparator.comparingDouble(value -> -value.getY())); else if (sortMode.get() != SortMode.None) blocks.sort(Comparator.comparingDouble(value -> Utils.squaredDistance(pX, pY, pZ, value.getX() + 0.5, value.getY() + 0.5, value.getZ() + 0.5) * (sortMode.get() == SortMode.Closest ? 1 : -1))); @@ -413,7 +420,7 @@ else if (sortMode.get() != SortMode.None) if (rotate.get()) Rotations.rotate(Rotations.getYaw(block), Rotations.getPitch(block), () -> breakBlock(block)); else breakBlock(block); - if (enableRenderBreaking.get()) RenderUtils.renderTickingBlock(block.toImmutable(), sideColor.get(), lineColor.get(), shapeModeBreak.get(), 0, 8, true, false); + if (enableRenderBreaking.get()) RenderUtils.renderTickingBlock(block, sideColor.get(), lineColor.get(), shapeModeBreak.get(), 0, 8, true, false); lastBlockPos.set(block); count++; @@ -423,7 +430,6 @@ else if (sortMode.get() != SortMode.None) firstBlock = false; // Clear current block positions - for (BlockPos.Mutable blockPos : blocks) blockPosPool.free(blockPos); blocks.clear(); }); } @@ -467,11 +473,11 @@ public enum Shape { Sphere } - public static double maxDist(double x1, double y1, double z1, double x2, double y2, double z2) { - // Gets the largest X, Y or Z difference, manhattan style - double dX = Math.ceil(Math.abs(x2 - x1)); - double dY = Math.ceil(Math.abs(y2 - y1)); - double dZ = Math.ceil(Math.abs(z2 - z1)); + public static int chebyshevDist(int x1, int y1, int z1, int x2, int y2, int z2) { + // Gets the largest X, Y or Z difference, chebyshev distance + int dX = Math.abs(x2 - x1); + int dY = Math.abs(y2 - y1); + int dZ = Math.abs(z2 - z1); return Math.max(Math.max(dX, dY), dZ); } } From aefbefbdf27913f41d4ac79e8b630e09c0012fef Mon Sep 17 00:00:00 2001 From: Wide-Cat <74723656+Wide-Cat@users.noreply.github.com> Date: Sat, 3 Aug 2024 15:08:38 +0100 Subject: [PATCH 346/357] Improvements to trajectories and the projectile simulator (#4804) --- .../systems/modules/render/Trajectories.java | 45 +++++++++- .../entity/ProjectileEntitySimulator.java | 88 +++++++++++-------- 2 files changed, 92 insertions(+), 41 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java index aabafb6beb..06df6370e4 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java @@ -98,6 +98,38 @@ public class Trajectories extends Module { .build() ); + private final Setting renderPositionBox = sgRender.add(new BoolSetting.Builder() + .name("render-position-boxes") + .description("Renders the actual position the projectile will be at each tick along it's trajectory.") + .defaultValue(false) + .build() + ); + + private final Setting positionBoxSize = sgRender.add(new DoubleSetting.Builder() + .name("position-box-size") + .description("The size of the box drawn at the simulated positions.") + .defaultValue(0.02) + .sliderRange(0.01, 0.1) + .visible(renderPositionBox::get) + .build() + ); + + private final Setting positionSideColor = sgRender.add(new ColorSetting.Builder() + .name("position-side-color") + .description("The side color.") + .defaultValue(new SettingColor(255, 150, 0, 35)) + .visible(renderPositionBox::get) + .build() + ); + + private final Setting positionLineColor = sgRender.add(new ColorSetting.Builder() + .name("position-line-color") + .description("The line color.") + .defaultValue(new SettingColor(255, 150, 0)) + .visible(renderPositionBox::get) + .build() + ); + private final ProjectileEntitySimulator simulator = new ProjectileEntitySimulator(); private final Pool vec3s = new Pool<>(Vector3d::new); @@ -169,17 +201,19 @@ private void calculateFiredPath(Entity entity, double tickDelta) { @EventHandler private void onRender(Render3DEvent event) { + float tickDelta = mc.world.getTickManager().isFrozen() ? 1 : event.tickDelta; + for (PlayerEntity player : mc.world.getPlayers()) { if (!otherPlayers.get() && player != mc.player) continue; - calculatePath(player, event.tickDelta); + calculatePath(player, tickDelta); for (Path path : paths) path.render(event); } if (firedProjectiles.get()) { for (Entity entity : mc.world.getEntities()) { if (entity instanceof ProjectileEntity) { - calculateFiredPath(entity, event.tickDelta); + calculateFiredPath(entity, tickDelta); for (Path path : paths) path.render(event); } } @@ -279,7 +313,12 @@ else if (result.getType() == HitResult.Type.ENTITY) { public void render(Render3DEvent event) { // Render path for (Vector3d point : points) { - if (lastPoint != null) event.renderer.line(lastPoint.x, lastPoint.y, lastPoint.z, point.x, point.y, point.z, lineColor.get()); + if (lastPoint != null) { + event.renderer.line(lastPoint.x, lastPoint.y, lastPoint.z, point.x, point.y, point.z, lineColor.get()); + if (renderPositionBox.get()) + event.renderer.box(point.x - positionBoxSize.get(), point.y - positionBoxSize.get(), point.z - positionBoxSize.get(), + point.x + positionBoxSize.get(), point.y + positionBoxSize.get(), point.z + positionBoxSize.get(), positionSideColor.get(), positionLineColor.get(), shapeMode.get(), 0); + } lastPoint = point; } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/ProjectileEntitySimulator.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/ProjectileEntitySimulator.java index c0346a4ab4..bca5203b8e 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/entity/ProjectileEntitySimulator.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/entity/ProjectileEntitySimulator.java @@ -11,7 +11,9 @@ import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.misc.MissHitResult; import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.ChargedProjectilesComponent; import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; import net.minecraft.entity.projectile.*; import net.minecraft.entity.projectile.thrown.*; import net.minecraft.fluid.FluidState; @@ -34,8 +36,10 @@ public class ProjectileEntitySimulator { public final Vector3d pos = new Vector3d(); private final Vector3d velocity = new Vector3d(); + private Entity simulatingEntity; private double gravity; private double airDrag, waterDrag; + private float height, width; // held items @@ -43,46 +47,42 @@ public class ProjectileEntitySimulator { public boolean set(Entity user, ItemStack itemStack, double simulated, boolean accurate, double tickDelta) { Item item = itemStack.getItem(); - if (item instanceof BowItem) { - double charge = BowItem.getPullProgress(mc.player.getItemUseTime()); - if (charge <= 0) return false; + switch (item) { + case BowItem ignored -> { + double charge = BowItem.getPullProgress(mc.player.getItemUseTime()); + if (charge <= 0.1) return false; - set(user, 0, charge * 3, simulated, 0.05000000074505806, 0.6, accurate, tickDelta); - } - else if (item instanceof CrossbowItem) { - if (!CrossbowItem.isCharged(itemStack)) return false; - if (itemStack.get(DataComponentTypes.CHARGED_PROJECTILES).contains(Items.FIREWORK_ROCKET)) { - set(user, 0, CrossbowItemAccessor.getSpeed(itemStack.get(DataComponentTypes.CHARGED_PROJECTILES)), simulated, 0, 0.6, accurate, tickDelta); + set(user, 0, charge * 3, simulated, 0.05, 0.6, accurate, tickDelta, EntityType.ARROW); + } + case CrossbowItem ignored -> { + ChargedProjectilesComponent projectilesComponent = itemStack.get(DataComponentTypes.CHARGED_PROJECTILES); + if (projectilesComponent == null) return false; + + if (projectilesComponent.contains(Items.FIREWORK_ROCKET)) { + set(user, 0, CrossbowItemAccessor.getSpeed(projectilesComponent), simulated, 0, 0.6, accurate, tickDelta, EntityType.FIREWORK_ROCKET); + } + else set(user, 0, CrossbowItemAccessor.getSpeed(projectilesComponent), simulated, 0.05, 0.6, accurate, tickDelta, EntityType.ARROW); + } + case WindChargeItem ignored -> { + set(user, 0, 1.5, simulated, 0, 1.0, accurate, tickDelta, EntityType.WIND_CHARGE); + this.airDrag = 1.0; + } + case FishingRodItem ignored -> setFishingBobber(user, tickDelta); + case TridentItem ignored -> set(user, 0, 2.5, simulated, 0.05, 0.99, accurate, tickDelta, EntityType.TRIDENT); + case SnowballItem ignored -> set(user, 0, 1.5, simulated, 0.03, 0.8, accurate, tickDelta, EntityType.SNOWBALL); + case EggItem ignored -> set(user, 0, 1.5, simulated, 0.03, 0.8, accurate, tickDelta, EntityType.EGG); + case EnderPearlItem ignored -> set(user, 0, 1.5, simulated, 0.03, 0.8, accurate, tickDelta, EntityType.ENDER_PEARL); + case ExperienceBottleItem ignored -> set(user, -20, 0.7, simulated, 0.07, 0.8, accurate, tickDelta, EntityType.EXPERIENCE_BOTTLE); + case ThrowablePotionItem ignored -> set(user, -20, 0.5, simulated, 0.05, 0.8, accurate, tickDelta, EntityType.POTION); + default -> { + return false; } - else set(user, 0, CrossbowItemAccessor.getSpeed(itemStack.get(DataComponentTypes.CHARGED_PROJECTILES)), simulated, 0.05, 0.6, accurate, tickDelta); - } - else if (item instanceof FishingRodItem) { - setFishingBobber(user, tickDelta); - } - else if (item instanceof TridentItem) { - set(user, 0, 2.5, simulated, 0.05, 0.99, accurate, tickDelta); - } - else if (item instanceof SnowballItem || item instanceof EggItem || item instanceof EnderPearlItem) { - set(user, 0, 1.5, simulated, 0.03, 0.8, accurate, tickDelta); - } - else if (item instanceof ExperienceBottleItem) { - set(user, -20, 0.7, simulated, 0.07, 0.8, accurate, tickDelta); - } - else if (item instanceof ThrowablePotionItem) { - set(user, -20, 0.5, simulated, 0.05, 0.8, accurate, tickDelta); - } - else if (item instanceof WindChargeItem) { - set(user, 0, 1.5, simulated, 0, 1.0, accurate, tickDelta); - this.airDrag = 1.0; - } - else { - return false; } return true; } - public void set(Entity user, double roll, double speed, double simulated, double gravity, double waterDrag, boolean accurate, double tickDelta) { + public void set(Entity user, double roll, double speed, double simulated, double gravity, double waterDrag, boolean accurate, double tickDelta, EntityType type) { Utils.set(pos, user, tickDelta).add(0, user.getEyeHeight(user.getPose()), 0); double yaw = MathHelper.lerp(tickDelta, user.prevYaw, user.getYaw()); @@ -114,9 +114,12 @@ public void set(Entity user, double roll, double speed, double simulated, double velocity.add(vel.x, user.isOnGround() ? 0.0D : vel.y, vel.z); } + this.simulatingEntity = user; this.gravity = gravity; this.airDrag = 0.99; this.waterDrag = waterDrag; + this.width = type.getWidth(); + this.height = type.getHeight(); } @@ -167,9 +170,12 @@ public void set(Entity entity, double gravity, double waterDrag, boolean accurat velocity.add(vel.x, entity.isOnGround() ? 0.0D : vel.y, vel.z); } + this.simulatingEntity = entity; this.gravity = gravity; this.airDrag = 0.99; this.waterDrag = waterDrag; + this.width = entity.getWidth(); + this.height = entity.getHeight(); } public void setFishingBobber(Entity user, double tickDelta) { @@ -188,9 +194,12 @@ public void setFishingBobber(Entity user, double tickDelta) { double l = velocity.length(); velocity.mul(0.6 / l + 0.5, 0.6 / l + 0.5, 0.6 / l + 0.5); + simulatingEntity = user; gravity = 0.03; airDrag = 0.92; waterDrag = 0; + width = EntityType.FISHING_BOBBER.getWidth(); + height = EntityType.FISHING_BOBBER.getHeight(); } public HitResult tick() { @@ -229,14 +238,17 @@ private boolean isTouchingWater() { } private HitResult getCollision() { - Vec3d vec3d3 = prevPos3d; - - HitResult hitResult = mc.world.raycast(new RaycastContext(vec3d3, pos3d, RaycastContext.ShapeType.COLLIDER, waterDrag == 0 ? RaycastContext.FluidHandling.ANY : RaycastContext.FluidHandling.NONE, mc.player)); + HitResult hitResult = mc.world.raycast(new RaycastContext(prevPos3d, pos3d, RaycastContext.ShapeType.COLLIDER, waterDrag == 0 ? RaycastContext.FluidHandling.ANY : RaycastContext.FluidHandling.NONE, simulatingEntity)); if (hitResult.getType() != HitResult.Type.MISS) { - vec3d3 = hitResult.getPos(); + ((IVec3d) pos3d).set(hitResult.getPos().x, hitResult.getPos().y, hitResult.getPos().z); } - HitResult hitResult2 = ProjectileUtil.getEntityCollision(mc.world, mc.player, vec3d3, pos3d, new Box(pos.x, pos.y, pos.z, pos.x, pos.y, pos.z).stretch(mc.player.getVelocity()).expand(1.0D), entity -> !entity.isSpectator() && entity.isAlive() && entity.canHit()); + // Vanilla uses the current and next positions to check collisions, we use the previous and current positions + Box box = new Box(prevPos3d.x - (width / 2f), prevPos3d.y, prevPos3d.z - (width / 2f), prevPos3d.x + (width / 2f), prevPos3d.y + height, prevPos3d.z + (width / 2f)) + .stretch(velocity.x, velocity.y, velocity.z).expand(1.0D); + HitResult hitResult2 = ProjectileUtil.getEntityCollision( + mc.world, simulatingEntity == mc.player ? null : simulatingEntity, prevPos3d, pos3d, box, entity -> !entity.isSpectator() && entity.isAlive() && entity.canHit() + ); if (hitResult2 != null) { hitResult = hitResult2; } From e32839a9c504663e4c62f80e90f250d7746f4d34 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Sun, 4 Aug 2024 18:25:45 +0100 Subject: [PATCH 347/357] Fix text box and int/double/blockpos setting issues closes #4807 --- .../gui/widgets/input/WBlockPosEdit.java | 12 +++++-- .../gui/widgets/input/WDoubleEdit.java | 11 +++--- .../gui/widgets/input/WIntEdit.java | 9 +++-- .../gui/widgets/input/WTextBox.java | 36 +++++++++---------- 4 files changed, 39 insertions(+), 29 deletions(-) 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 cca613b5fb..44cdb8999e 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WBlockPosEdit.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WBlockPosEdit.java @@ -128,7 +128,9 @@ private void addTextBox() { lastValue = value; if (textBoxX.get().isEmpty()) set(new BlockPos(0, 0, 0)); else { - set(new BlockPos(Integer.parseInt(textBoxX.get()), value.getY(), value.getZ())); + try { + set(new BlockPos(Integer.parseInt(textBoxX.get()), value.getY(), value.getZ())); + } catch (NumberFormatException ignored) {} } newValueCheck(); }; @@ -137,7 +139,9 @@ private void addTextBox() { lastValue = value; if (textBoxY.get().isEmpty()) set(new BlockPos(0, 0, 0)); else { - set(new BlockPos(value.getX(), Integer.parseInt(textBoxY.get()), value.getZ())); + try { + set(new BlockPos(value.getX(), Integer.parseInt(textBoxY.get()), value.getZ())); + } catch (NumberFormatException ignored) {} } newValueCheck(); }; @@ -146,7 +150,9 @@ private void addTextBox() { lastValue = value; if (textBoxZ.get().isEmpty()) set(new BlockPos(0, 0, 0)); else { - set(new BlockPos(value.getX(), value.getY(), Integer.parseInt(textBoxZ.get()))); + try { + set(new BlockPos(value.getX(), value.getY(), Integer.parseInt(textBoxZ.get()))); + } catch (NumberFormatException ignored) {} } 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 885363ceb8..47fed3323a 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WDoubleEdit.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WDoubleEdit.java @@ -15,7 +15,7 @@ public class WDoubleEdit extends WHorizontalList { private final double min, max; private final double sliderMin, sliderMax; - public int decimalPlaces = 3; + public int decimalPlaces; public boolean noSlider = false; public boolean small = false; @@ -53,7 +53,11 @@ public void init() { else if (textBox.get().equals("-")) value = -0; else if (textBox.get().equals(".")) value = 0; else if (textBox.get().equals("-.")) value = 0; - else value = Double.parseDouble(textBox.get()); + else { + try { + value = Double.parseDouble(textBox.get()); + } catch (NumberFormatException ignored) {} + } double preValidationValue = value; @@ -114,8 +118,7 @@ private void setButton(double v) { if (this.value == v) return; if (v < min) this.value = min; - else if (v > max) this.value = max; - else this.value = v; + else this.value = Math.min(v, max); if (this.value == v) { textBox.set(valueString()); 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 b8cc53a88f..c3cc4287a6 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WIntEdit.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WIntEdit.java @@ -48,7 +48,11 @@ public void init() { if (textBox.get().isEmpty()) value = 0; else if (textBox.get().equals("-")) value = -0; - else value = Integer.parseInt(textBox.get()); + else { + try { + value = Integer.parseInt(textBox.get()); + } catch (NumberFormatException ignored) {} + } if (slider != null) slider.set(value); @@ -99,8 +103,7 @@ private void setButton(int v) { if (this.value == v) return; if (v < min) this.value = min; - else if (v > max) this.value = max; - else this.value = v; + else this.value = Math.min(v, max); if (this.value == v) { textBox.set(Integer.toString(this.value)); 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 b2e1c9efd1..2aa35dc543 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WTextBox.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WTextBox.java @@ -277,18 +277,16 @@ public boolean onKeyRepeated(int key, int mods) { int addedChars = 0; StringBuilder sb = new StringBuilder(text.length() + clipboard.length()); - sb.append(text, 0, cursor); + sb.append(text); for (int i = 0; i < clipboard.length(); i++) { char c = clipboard.charAt(i); - if (filter.filter(text, c)) { - sb.append(c); + if (filter.filter(sb.toString(), c)) { + sb.insert(cursor + addedChars, c); addedChars++; } } - sb.append(text, cursor, text.length()); - text = sb.toString(); cursor += addedChars; resetSelection(); @@ -319,24 +317,24 @@ else if (cursor != selectionStart || cursor != selectionEnd) { return true; } else if (key == GLFW_KEY_DELETE) { - if (cursor == selectionStart && cursor == selectionEnd) { - if (cursor < text.length()) { - String preText = text; + if (cursor == selectionStart && cursor == selectionEnd) { + if (cursor < text.length()) { + String preText = text; - int count = mods == (SystemUtils.IS_OS_WINDOWS ? GLFW_MOD_ALT : MinecraftClient.IS_SYSTEM_MAC ? GLFW_MOD_SUPER : GLFW_MOD_CONTROL) - ? text.length() - cursor - : (mods == (SystemUtils.IS_OS_WINDOWS ? GLFW_MOD_CONTROL : GLFW_MOD_ALT)) - ? countToNextSpace(false) - : 1; + int count = mods == (SystemUtils.IS_OS_WINDOWS ? GLFW_MOD_ALT : MinecraftClient.IS_SYSTEM_MAC ? GLFW_MOD_SUPER : GLFW_MOD_CONTROL) + ? text.length() - cursor + : (mods == (SystemUtils.IS_OS_WINDOWS ? GLFW_MOD_CONTROL : GLFW_MOD_ALT)) + ? countToNextSpace(false) + : 1; - text = text.substring(0, cursor) + text.substring(cursor + count); + text = text.substring(0, cursor) + text.substring(cursor + count); - if (!text.equals(preText)) runAction(); - } - } - else { - clearSelection(); + if (!text.equals(preText)) runAction(); } + } + else { + clearSelection(); + } return true; } else if (key == GLFW_KEY_LEFT) { From 7f74c25e0d7ed6c4b9b8fa994b2098bed9c6a4b5 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Tue, 6 Aug 2024 16:47:48 +0100 Subject: [PATCH 348/357] Hopefully fix instant rebreak kicking you --- .../meteorclient/systems/modules/player/InstantRebreak.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/InstantRebreak.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/InstantRebreak.java index 7994ed980f..7fa856c8ee 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/InstantRebreak.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/InstantRebreak.java @@ -117,7 +117,7 @@ private void onTick(TickEvent.Pre event) { } public void sendPacket() { - mc.getNetworkHandler().sendPacket(new PlayerActionC2SPacket(PlayerActionC2SPacket.Action.STOP_DESTROY_BLOCK, blockPos, direction)); + mc.getNetworkHandler().sendPacket(new PlayerActionC2SPacket(PlayerActionC2SPacket.Action.STOP_DESTROY_BLOCK, blockPos, direction == null ? Direction.UP : direction)); } public boolean shouldMine() { From 31e879edca8c9c8db0ffbe4470cc11e7e3b764b2 Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Tue, 6 Aug 2024 17:16:36 +0100 Subject: [PATCH 349/357] Prevent EntityTypeListSetting suggesting and accepting filtered values in commands --- .../meteorclient/settings/EntityTypeListSetting.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/settings/EntityTypeListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/EntityTypeListSetting.java index 1b867478d5..edc48908e0 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/EntityTypeListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/EntityTypeListSetting.java @@ -24,7 +24,7 @@ public class EntityTypeListSetting extends Setting>> { public final Predicate> filter; - private static List suggestions; + private List suggestions; private final static List groups = List.of("animal", "wateranimal", "monster", "ambient", "misc"); public EntityTypeListSetting(String name, String description, Set> defaultValue, Consumer>> onChanged, Consumer>>> onModuleActivated, IVisible visible, Predicate> filter) { @@ -51,7 +51,9 @@ protected Set> parseImpl(String str) { String lowerValue = value.trim().toLowerCase(); if (!groups.contains(lowerValue)) continue; - Registries.ENTITY_TYPE.forEach(entityType -> { + for (EntityType entityType : Registries.ENTITY_TYPE) { + if (filter != null && !filter.test(entityType)) continue; + switch (lowerValue) { case "animal" -> { if (entityType.getSpawnGroup() == SpawnGroup.CREATURE) entities.add(entityType); @@ -72,7 +74,7 @@ protected Set> parseImpl(String str) { if (entityType.getSpawnGroup() == SpawnGroup.MISC) entities.add(entityType); } } - }); + } } } } catch (Exception ignored) {} @@ -89,7 +91,9 @@ protected boolean isValueValid(Set> value) { public List getSuggestions() { if (suggestions == null) { suggestions = new ArrayList<>(groups); - Registries.ENTITY_TYPE.getIds().forEach(id -> suggestions.add(id.toString())); + for (EntityType entityType : Registries.ENTITY_TYPE) { + if (filter == null || filter.test(entityType)) suggestions.add(Registries.ENTITY_TYPE.getId(entityType).toString()); + } } return suggestions; From c094f4691d7acad1caf606f704bfab2689638b2a Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Wed, 7 Aug 2024 03:00:34 -0400 Subject: [PATCH 350/357] Patch owolib/gadget compat --- .../meteordevelopment/meteorclient/mixin/ScreenMixin.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ScreenMixin.java index 053a43dde6..41b7676137 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ScreenMixin.java @@ -17,6 +17,7 @@ import net.minecraft.client.gui.screen.ChatScreen; import net.minecraft.client.gui.screen.Screen; import net.minecraft.text.Style; +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; @@ -36,8 +37,8 @@ private void onRenderBackground(CallbackInfo info) { } @Inject(method = "handleTextClick", at = @At(value = "HEAD"), cancellable = true) - private void onInvalidClickEvent(Style style, CallbackInfoReturnable cir) { - if (!(style.getClickEvent() instanceof RunnableClickEvent runnableClickEvent)) return; + private void onInvalidClickEvent(@Nullable Style style, CallbackInfoReturnable cir) { + if (style == null || !(style.getClickEvent() instanceof RunnableClickEvent runnableClickEvent)) return; runnableClickEvent.runnable.run(); cir.setReturnValue(true); From 28350de6d72b5b962ef6d5c4edd0f0f914822ee4 Mon Sep 17 00:00:00 2001 From: RedCarlos26 <58893097+RedCarlos26@users.noreply.github.com> Date: Thu, 8 Aug 2024 21:27:33 -0400 Subject: [PATCH 351/357] Distance check for totem pops --- .../systems/modules/misc/Notifier.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java index 4a91c48eee..1388450438 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java @@ -18,6 +18,7 @@ import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.entity.fakeplayer.FakePlayerEntity; import meteordevelopment.meteorclient.utils.player.ChatUtils; +import meteordevelopment.meteorclient.utils.player.PlayerUtils; import meteordevelopment.orbit.EventHandler; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; @@ -49,6 +50,24 @@ public class Notifier extends Module { .build() ); + private final Setting totemsDistanceCheck = sgTotemPops.add(new BoolSetting.Builder() + .name("distance-check") + .description("Limits the distance in which the pops are recognized.") + .defaultValue(false) + .visible(totemPops::get) + .build() + ); + + private final Setting totemsDistance = sgTotemPops.add(new IntSetting.Builder() + .name("player-radius") + .description("The radius in which to log totem pops.") + .defaultValue(30) + .sliderRange(1, 50) + .range(1, 100) + .visible(() -> totemPops.get() && totemsDistanceCheck.get()) + .build() + ); + private final Setting totemsIgnoreOwn = sgTotemPops.add(new BoolSetting.Builder() .name("ignore-own") .description("Ignores your own totem pops.") @@ -246,6 +265,9 @@ private void onReceivePacket(PacketEvent.Receive event) { int pops = totemPopMap.getOrDefault(entity.getUuid(), 0); totemPopMap.put(entity.getUuid(), ++pops); + double distance = PlayerUtils.distanceTo(entity); + if (totemsDistanceCheck.get() && distance > totemsDistance.get()) return; + ChatUtils.sendMsg(getChatId(entity), Formatting.GRAY, "(highlight)%s (default)popped (highlight)%d (default)%s.", entity.getName().getString(), pops, pops == 1 ? "totem" : "totems"); } } From d5763daf618e4fbbf2983b1365b34b9b5f371ef6 Mon Sep 17 00:00:00 2001 From: Big-Iron-Cheems <52252627+Big-Iron-Cheems@users.noreply.github.com> Date: Thu, 8 Aug 2024 19:49:41 +0200 Subject: [PATCH 352/357] 1.21.1 update - also fix accidental regression --- gradle.properties | 15 +++++++-------- .../commands/commands/EnchantCommand.java | 4 +++- .../systems/modules/movement/Velocity.java | 2 +- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/gradle.properties b/gradle.properties index 75a09a970c..d5f9db597e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,10 +1,10 @@ org.gradle.jvmargs=-Xmx2G # Fabric (https://fabricmc.net/develop) -minecraft_version=1.21 -yarn_mappings=1.21+build.2 +minecraft_version=1.21.1 +yarn_mappings=1.21.1+build.1 loader_version=0.15.11 -fapi_version=0.100.3+1.21 +fapi_version=0.102.0+1.21.1 # Mod Properties mod_version=0.5.8 @@ -17,17 +17,16 @@ archives_base_name=meteor-client baritone_version=1.21 # Sodium (https://github.com/CaffeineMC/sodium-fabric) -sodium_version=mc1.21-0.5.9 +sodium_version=mc1.21-0.5.11 # Lithium (https://github.com/CaffeineMC/lithium-fabric) lithium_version=mc1.21-0.12.7 # Iris (https://github.com/IrisShaders/Iris) -iris_version=1.7.1+1.20.6 -# 1.7.1+1.21 seems to cause loom remapping issues atm +iris_version=1.7.3+1.21 # Indium (https://github.com/comp500/Indium) -indium_version=1.0.33+mc1.21 +indium_version=1.0.34+mc1.21 # Orbit (https://github.com/MeteorDevelopment/orbit) orbit_version=0.2.4 @@ -45,7 +44,7 @@ reflections_version=0.10.2 netty_version=4.1.90.Final # ViaFabricPlus (https://github.com/ViaVersion/ViaFabricPlus) -viafabricplus_version=3.4.1 +viafabricplus_version=3.4.4 # WaybackAuthLib (https://github.com/FlorianMichael/WaybackAuthLib) waybackauthlib_version=1.0.1 diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/EnchantCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/EnchantCommand.java index aaa3fc2962..6091cdb05f 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/EnchantCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/EnchantCommand.java @@ -98,7 +98,9 @@ private void all(boolean onlyPossible, ToIntFunction level) throws REGISTRY_ACCESS.getOptionalWrapper(RegistryKeys.ENCHANTMENT).ifPresent(registry -> { registry.streamEntries().forEach(enchantment -> { - Utils.addEnchantment(itemStack, enchantment, level.applyAsInt(enchantment.value())); + if (!onlyPossible || enchantment.value().isAcceptableItem(itemStack)) { + Utils.addEnchantment(itemStack, enchantment, level.applyAsInt(enchantment.value())); + } }); }); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Velocity.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Velocity.java index f10a263548..f4b31b8b5f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Velocity.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Velocity.java @@ -150,7 +150,7 @@ private void onTick(TickEvent.Post event) { @EventHandler private void onPacketReceive(PacketEvent.Receive event) { if (knockback.get() && event.packet instanceof EntityVelocityUpdateS2CPacket packet - && packet.getId() == mc.player.getId()) { + && packet.getEntityId() == mc.player.getId()) { double velX = (packet.getVelocityX() / 8000d - mc.player.getVelocity().x) * knockbackHorizontal.get(); double velY = (packet.getVelocityY() / 8000d - mc.player.getVelocity().y) * knockbackVertical.get(); double velZ = (packet.getVelocityZ() / 8000d - mc.player.getVelocity().z) * knockbackHorizontal.get(); From a20389b6ad99b5a4b8f6c7ccf73ad79fa6d1ac8d Mon Sep 17 00:00:00 2001 From: Wide-Cat Date: Sat, 10 Aug 2024 12:51:54 +0100 Subject: [PATCH 353/357] remove unused settings --- .../meteorclient/systems/config/Config.java | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/config/Config.java b/src/main/java/meteordevelopment/meteorclient/systems/config/Config.java index acd6ac65b6..92239d2f5e 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/config/Config.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/config/Config.java @@ -142,23 +142,6 @@ public class Config extends System { .build() ); - public final Setting heuristicCombatUtils = sgMisc.add(new BoolSetting.Builder() - .name("heuristic-damage-utils") - .description("Spends extra computation time in order to make combat-related calculations more accurate at the expense of framerate.") - .defaultValue(true) - .build() - ); - - public final Setting heuristicDepth = sgMisc.add(new IntSetting.Builder() - .name("heuristic-depth") - .description("The amount of extra computation time to give, in an exponential scale.") - .defaultValue(4) - .min(2) - .sliderRange(2, 5) - .visible(heuristicCombatUtils::get) - .build() - ); - public List dontShowAgainPrompts = new ArrayList<>(); public Config() { From 202b14034f7a236c1e57985dde7ff08f0bff7b9b Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Fri, 16 Aug 2024 17:52:11 -0400 Subject: [PATCH 354/357] Add swap, drop and hotbar keys to .input command --- .../commands/commands/InputCommand.java | 59 ++++++++++++++----- .../mixin/KeyBindingAccessor.java | 6 ++ 2 files changed, 51 insertions(+), 14 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/InputCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/InputCommand.java index 6d1041047b..8852feccce 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/InputCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/InputCommand.java @@ -7,29 +7,37 @@ import com.mojang.brigadier.arguments.IntegerArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.datafixers.util.Pair; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.commands.Command; import meteordevelopment.meteorclient.events.world.TickEvent; +import meteordevelopment.meteorclient.mixin.KeyBindingAccessor; import meteordevelopment.orbit.EventHandler; import net.minecraft.client.option.KeyBinding; +import net.minecraft.client.resource.language.I18n; import net.minecraft.command.CommandSource; import java.util.ArrayList; import java.util.List; -import java.util.Map; public class InputCommand extends Command { private static final List activeHandlers = new ArrayList<>(); - private static final Map keys = Map.of( - mc.options.forwardKey, "forwards", - mc.options.backKey, "backwards", - mc.options.leftKey, "left", - mc.options.rightKey, "right", - mc.options.jumpKey, "jump", - mc.options.sneakKey, "sneak", - mc.options.useKey, "use", - mc.options.attackKey, "attack" + 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> pressKeys = List.of( + new Pair<>(mc.options.swapHandsKey, "swap"), + new Pair<>(mc.options.dropKey, "drop") ); public InputCommand() { @@ -38,17 +46,35 @@ public InputCommand() { @Override public void build(LiteralArgumentBuilder builder) { - for (Map.Entry keyBinding : keys.entrySet()) { - builder.then(literal(keyBinding.getValue()) + for (Pair keyBinding : holdKeys) { + builder.then(literal(keyBinding.getSecond()) .then(argument("ticks", IntegerArgumentType.integer(1)) .executes(context -> { - activeHandlers.add(new KeypressHandler(keyBinding.getKey(), context.getArgument("ticks", Integer.class))); + activeHandlers.add(new KeypressHandler(keyBinding.getFirst(), context.getArgument("ticks", Integer.class))); return SINGLE_SUCCESS; }) ) ); } + for (Pair keyBinding : pressKeys) { + builder.then(literal(keyBinding.getSecond()) + .executes(context -> { + press(keyBinding.getFirst()); + return SINGLE_SUCCESS; + }) + ); + } + + for (KeyBinding keyBinding : mc.options.hotbarKeys) { + builder.then(literal(keyBinding.getTranslationKey().substring(4)) + .executes(context -> { + press(keyBinding); + return SINGLE_SUCCESS; + }) + ); + } + builder.then(literal("clear").executes(ctx -> { if (activeHandlers.isEmpty()) warning("No active keypress handlers."); else { @@ -65,7 +91,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, keys.get(handler.key), handler.ticks, handler.totalTicks); + info("(highlight)%d(default) - (highlight)%s %d(default) ticks left out of (highlight)%d(default).", i, I18n.translate(handler.key.getTranslationKey()), handler.ticks, handler.totalTicks); } } return SINGLE_SUCCESS; @@ -83,6 +109,11 @@ public void build(LiteralArgumentBuilder builder) { }))); } + private static void press(KeyBinding keyBinding) { + KeyBindingAccessor accessor = (KeyBindingAccessor) keyBinding; + accessor.meteor$setTimesPressed(accessor.meteor$getTimesPressed() + 1); + } + private static class KeypressHandler { private final KeyBinding key; private final int totalTicks; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/KeyBindingAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/KeyBindingAccessor.java index 44f169c68e..f30ef37910 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/KeyBindingAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/KeyBindingAccessor.java @@ -19,4 +19,10 @@ public interface KeyBindingAccessor { @Accessor("boundKey") InputUtil.Key getKey(); + + @Accessor("timesPressed") + int meteor$getTimesPressed(); + + @Accessor("timesPressed") + void meteor$setTimesPressed(int timesPressed); } From 4bef53181678fd593b07c203c9ab2b919b453279 Mon Sep 17 00:00:00 2001 From: Big Iron <52252627+Big-Iron-Cheems@users.noreply.github.com> Date: Sat, 17 Aug 2024 14:33:41 +0200 Subject: [PATCH 355/357] Fix Indium mixin signature (#4835) --- gradle.properties | 8 ++++---- .../meteorclient/mixin/BundleItemMixin.java | 2 +- .../meteorclient/mixin/DyedColorComponentMixin.java | 2 +- .../mixin/ItemEnchantmentsComponentMixin.java | 2 +- .../meteorclient/mixin/ItemGroupsMixin.java | 2 +- .../meteorclient/mixin/UnbreakableComponentMixin.java | 2 +- .../mixin/indium/AbstractBlockRenderContextMixin.java | 4 ++-- .../mixin/lithium/LithiumEntityCollisionsMixin.java | 2 +- .../mixin/viafabricplus/GeneralSettingsMixin.java | 2 +- 9 files changed, 13 insertions(+), 13 deletions(-) diff --git a/gradle.properties b/gradle.properties index d5f9db597e..850e7f38c9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,9 +2,9 @@ org.gradle.jvmargs=-Xmx2G # Fabric (https://fabricmc.net/develop) minecraft_version=1.21.1 -yarn_mappings=1.21.1+build.1 +yarn_mappings=1.21.1+build.3 loader_version=0.15.11 -fapi_version=0.102.0+1.21.1 +fapi_version=0.102.1+1.21.1 # Mod Properties mod_version=0.5.8 @@ -20,13 +20,13 @@ baritone_version=1.21 sodium_version=mc1.21-0.5.11 # Lithium (https://github.com/CaffeineMC/lithium-fabric) -lithium_version=mc1.21-0.12.7 +lithium_version=mc1.21.1-0.13.0 # Iris (https://github.com/IrisShaders/Iris) iris_version=1.7.3+1.21 # Indium (https://github.com/comp500/Indium) -indium_version=1.0.34+mc1.21 +indium_version=1.0.35+mc1.21 # Orbit (https://github.com/MeteorDevelopment/orbit) orbit_version=0.2.4 diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BundleItemMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BundleItemMixin.java index 30237e0225..68bd6873af 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BundleItemMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BundleItemMixin.java @@ -13,7 +13,7 @@ import org.spongepowered.asm.mixin.injection.At; @Mixin(BundleItem.class) -public class BundleItemMixin { +public abstract class BundleItemMixin { @ModifyExpressionValue(method = "getTooltipData", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;contains(Lnet/minecraft/component/ComponentType;)Z", ordinal = 0)) private boolean modifyContains1(boolean original) { BetterTooltips bt = Modules.get().get(BetterTooltips.class); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/DyedColorComponentMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/DyedColorComponentMixin.java index 7d7a80da8d..7d1eae3275 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/DyedColorComponentMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/DyedColorComponentMixin.java @@ -13,7 +13,7 @@ import org.spongepowered.asm.mixin.injection.At; @Mixin(DyedColorComponent.class) -public class DyedColorComponentMixin { +public abstract class DyedColorComponentMixin { @ModifyExpressionValue(method = "appendTooltip", at = @At(value = "FIELD", target = "Lnet/minecraft/component/type/DyedColorComponent;showInTooltip:Z")) private boolean modifyShowInTooltip(boolean original) { BetterTooltips bt = Modules.get().get(BetterTooltips.class); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ItemEnchantmentsComponentMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ItemEnchantmentsComponentMixin.java index 1744328465..a720f5f997 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ItemEnchantmentsComponentMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ItemEnchantmentsComponentMixin.java @@ -13,7 +13,7 @@ import org.spongepowered.asm.mixin.injection.At; @Mixin(ItemEnchantmentsComponent.class) -public class ItemEnchantmentsComponentMixin { +public abstract class ItemEnchantmentsComponentMixin { @ModifyExpressionValue(method = "appendTooltip", at = @At(value = "FIELD", target = "Lnet/minecraft/component/type/ItemEnchantmentsComponent;showInTooltip:Z")) private boolean modifyShowInTooltip(boolean original) { BetterTooltips bt = Modules.get().get(BetterTooltips.class); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ItemGroupsMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ItemGroupsMixin.java index daa0577e9a..0842200b8c 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ItemGroupsMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ItemGroupsMixin.java @@ -13,7 +13,7 @@ import org.spongepowered.asm.mixin.injection.At; @Mixin(ItemGroups.class) -public class ItemGroupsMixin { +public abstract class ItemGroupsMixin { @ModifyReturnValue(method = "updateDisplayContext", 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/UnbreakableComponentMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/UnbreakableComponentMixin.java index 307f2e6216..c3fc16109b 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/UnbreakableComponentMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/UnbreakableComponentMixin.java @@ -13,7 +13,7 @@ import org.spongepowered.asm.mixin.injection.At; @Mixin(UnbreakableComponent.class) -public class UnbreakableComponentMixin { +public abstract class UnbreakableComponentMixin { @ModifyExpressionValue(method = "appendTooltip", at = @At(value = "FIELD", target = "Lnet/minecraft/component/type/UnbreakableComponent;showInTooltip:Z")) private boolean modifyShowInTooltip(boolean original) { BetterTooltips bt = Modules.get().get(BetterTooltips.class); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/indium/AbstractBlockRenderContextMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/indium/AbstractBlockRenderContextMixin.java index 07a433d3a4..bf791f8bdf 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/indium/AbstractBlockRenderContextMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/indium/AbstractBlockRenderContextMixin.java @@ -20,8 +20,8 @@ public abstract class AbstractBlockRenderContextMixin { @Shadow protected BlockRenderInfo blockInfo; - @Inject(method = "renderQuad(Llink/infra/indium/renderer/mesh/MutableQuadViewImpl;Z)V", at = @At(value = "INVOKE", target = "Llink/infra/indium/renderer/render/AbstractBlockRenderContext;bufferQuad(Llink/infra/indium/renderer/mesh/MutableQuadViewImpl;Lme/jellysquid/mods/sodium/client/render/chunk/terrain/material/Material;)V"), cancellable = true) - private void onBufferQuad(MutableQuadViewImpl quad, boolean isVanilla, CallbackInfo ci) { + @Inject(method = "renderQuad", at = @At(value = "INVOKE", target = "Llink/infra/indium/renderer/render/AbstractBlockRenderContext;bufferQuad(Llink/infra/indium/renderer/mesh/MutableQuadViewImpl;Lme/jellysquid/mods/sodium/client/render/chunk/terrain/material/Material;)V"), cancellable = true) + private void onBufferQuad(MutableQuadViewImpl quad, CallbackInfo ci) { int alpha = Xray.getAlpha(blockInfo.blockState, blockInfo.blockPos); if (alpha == 0) ci.cancel(); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/lithium/LithiumEntityCollisionsMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/lithium/LithiumEntityCollisionsMixin.java index e04058c0ab..728efe6d94 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/lithium/LithiumEntityCollisionsMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/lithium/LithiumEntityCollisionsMixin.java @@ -16,7 +16,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(value = LithiumEntityCollisions.class) -public class LithiumEntityCollisionsMixin { +public abstract class LithiumEntityCollisionsMixin { @Inject(method = "isWithinWorldBorder", at = @At("HEAD"), cancellable = true) private static void onIsWithinWorldBorder(WorldBorder border, Box box, CallbackInfoReturnable cir) { if (Modules.get().get(Collisions.class).ignoreBorder()) { diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/viafabricplus/GeneralSettingsMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/viafabricplus/GeneralSettingsMixin.java index b85ee55887..ef7c8a4ca0 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/viafabricplus/GeneralSettingsMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/viafabricplus/GeneralSettingsMixin.java @@ -11,7 +11,7 @@ import org.spongepowered.asm.mixin.injection.At; @Mixin(GeneralSettings.class) -public class GeneralSettingsMixin { +public abstract class GeneralSettingsMixin { // specifies the '2' value on this line: // public final ModeSetting multiplayerScreenButtonOrientation = new ModeSetting(this, Text.translatable("general_settings.viafabricplus.multiplayer_screen_button_orientation"), 2, ORIENTATION_OPTIONS); @ModifyExpressionValue(method = "", at = @At(value = "CONSTANT", args = "intValue=2", ordinal = 1), remap = false) From caa885f20de0417761e8a46ca70164c79b979ef1 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+RacoonDog@users.noreply.github.com> Date: Wed, 21 Aug 2024 22:45:23 -0400 Subject: [PATCH 356/357] add tridents to killaura weapons --- .../systems/modules/combat/KillAura.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java index da5c5c8e29..0be5773e47 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java @@ -32,10 +32,7 @@ import net.minecraft.entity.passive.AnimalEntity; import net.minecraft.entity.passive.WolfEntity; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.AxeItem; -import net.minecraft.item.ItemStack; -import net.minecraft.item.MaceItem; -import net.minecraft.item.SwordItem; +import net.minecraft.item.*; import net.minecraft.network.packet.c2s.play.UpdateSelectedSlotC2SPacket; import net.minecraft.util.Hand; import net.minecraft.util.math.Box; @@ -285,7 +282,8 @@ private void onTick(TickEvent.Pre event) { case Axe -> stack -> stack.getItem() instanceof AxeItem; case Sword -> stack -> stack.getItem() instanceof SwordItem; case Mace -> stack -> stack.getItem() instanceof MaceItem; - case All -> stack -> stack.getItem() instanceof AxeItem || stack.getItem() instanceof SwordItem || stack.getItem() instanceof MaceItem; + case Trident -> stack -> stack.getItem() instanceof TridentItem; + case All -> stack -> stack.getItem() instanceof AxeItem || stack.getItem() instanceof SwordItem || stack.getItem() instanceof MaceItem || stack.getItem() instanceof TridentItem; default -> o -> true; }; FindItemResult weaponResult = InvUtils.findInHotbar(predicate); @@ -403,7 +401,8 @@ private boolean itemInHand() { case Axe -> mc.player.getMainHandStack().getItem() instanceof AxeItem; case Sword -> mc.player.getMainHandStack().getItem() instanceof SwordItem; case Mace -> mc.player.getMainHandStack().getItem() instanceof MaceItem; - case All -> mc.player.getMainHandStack().getItem() instanceof AxeItem || mc.player.getMainHandStack().getItem() instanceof SwordItem || mc.player.getMainHandStack().getItem() instanceof MaceItem; + case Trident -> mc.player.getMainHandStack().getItem() instanceof TridentItem; + case All -> mc.player.getMainHandStack().getItem() instanceof AxeItem || mc.player.getMainHandStack().getItem() instanceof SwordItem || mc.player.getMainHandStack().getItem() instanceof MaceItem || mc.player.getMainHandStack().getItem() instanceof TridentItem; default -> true; }; } @@ -423,6 +422,7 @@ public enum Weapon { Sword, Axe, Mace, + Trident, All, Any } From 8f83d5d0320b8e10a1d0e860eec79b1bad1e35ff Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Fri, 23 Aug 2024 12:59:32 +0200 Subject: [PATCH 357/357] Update to Sodium 0.6.0-beta.1 and fix XRay with Fabric API --- gradle.properties | 2 +- .../meteorclient/MixinPlugin.java | 5 -- .../AbstractBlockRenderContextMixin.java | 2 +- .../AbstractBlockRenderContextMixin.java | 29 --------- .../sodium/SodiumBiomeColorCacheMixin.java | 42 ------------- .../SodiumBlockOcclusionCacheMixin.java | 2 +- .../sodium/SodiumBlockRendererMixin.java | 13 ++-- ...RendererImplDefaultRenderContextMixin.java | 50 +++++++++++++++ .../sodium/SodiumFluidRendererImplMixin.java | 29 +++++++++ .../sodium/SodiumFluidRendererMixin.java | 62 ------------------- .../sodium/SodiumLightDataAccessMixin.java | 6 +- src/main/resources/fabric.mod.json | 1 - .../meteor-client-indium.mixins.json | 12 ---- .../meteor-client-sodium.mixins.json | 4 +- 14 files changed, 94 insertions(+), 165 deletions(-) delete mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/indium/AbstractBlockRenderContextMixin.java delete mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBiomeColorCacheMixin.java create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumFluidRendererImplDefaultRenderContextMixin.java create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumFluidRendererImplMixin.java delete mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumFluidRendererMixin.java delete mode 100644 src/main/resources/meteor-client-indium.mixins.json diff --git a/gradle.properties b/gradle.properties index 850e7f38c9..7c3f6857a2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,7 +17,7 @@ archives_base_name=meteor-client baritone_version=1.21 # Sodium (https://github.com/CaffeineMC/sodium-fabric) -sodium_version=mc1.21-0.5.11 +sodium_version=mc1.21-0.6.0-beta.1-fabric # Lithium (https://github.com/CaffeineMC/lithium-fabric) lithium_version=mc1.21.1-0.13.0 diff --git a/src/main/java/meteordevelopment/meteorclient/MixinPlugin.java b/src/main/java/meteordevelopment/meteorclient/MixinPlugin.java index ab7d7bb59d..60e8d8eb7b 100644 --- a/src/main/java/meteordevelopment/meteorclient/MixinPlugin.java +++ b/src/main/java/meteordevelopment/meteorclient/MixinPlugin.java @@ -28,7 +28,6 @@ public class MixinPlugin implements IMixinConfigPlugin { private static boolean isCanvasPresent; private static boolean isLithiumPresent; public static boolean isIrisPresent; - private static boolean isIndiumPresent; private static boolean isVFPPresent; @Override @@ -74,7 +73,6 @@ public void onLoad(String mixinPackage) { isCanvasPresent = FabricLoader.getInstance().isModLoaded("canvas"); isLithiumPresent = FabricLoader.getInstance().isModLoaded("lithium"); isIrisPresent = FabricLoader.getInstance().isModLoaded("iris"); - isIndiumPresent = FabricLoader.getInstance().isModLoaded("indium"); isVFPPresent = FabricLoader.getInstance().isModLoaded("viafabricplus"); loaded = true; @@ -105,9 +103,6 @@ else if (mixinClassName.startsWith(mixinPackage + ".canvas")) { else if (mixinClassName.startsWith(mixinPackage + ".lithium")) { return isLithiumPresent; } - else if (mixinClassName.startsWith(mixinPackage + ".indium")) { - return isIndiumPresent; - } else if (mixinClassName.startsWith(mixinPackage + ".viafabricplus")) { return isVFPPresent; } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/indigo/AbstractBlockRenderContextMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/indigo/AbstractBlockRenderContextMixin.java index 5f047ab745..2f2bd4cd18 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/indigo/AbstractBlockRenderContextMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/indigo/AbstractBlockRenderContextMixin.java @@ -22,7 +22,7 @@ public abstract class AbstractBlockRenderContextMixin { @Final @Shadow(remap = false) protected BlockRenderInfo blockInfo; @Inject(method = "renderQuad", at = @At(value = "INVOKE", target = "Lnet/fabricmc/fabric/impl/client/indigo/renderer/render/AbstractBlockRenderContext;bufferQuad(Lnet/fabricmc/fabric/impl/client/indigo/renderer/mesh/MutableQuadViewImpl;Lnet/minecraft/client/render/VertexConsumer;)V"), cancellable = true) - private void onBufferQuad(MutableQuadViewImpl quad, boolean isVanilla, CallbackInfo ci) { + private void onBufferQuad(MutableQuadViewImpl quad, CallbackInfo ci) { int alpha = Xray.getAlpha(blockInfo.blockState, blockInfo.blockPos); if (alpha == 0) ci.cancel(); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/indium/AbstractBlockRenderContextMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/indium/AbstractBlockRenderContextMixin.java deleted file mode 100644 index bf791f8bdf..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/indium/AbstractBlockRenderContextMixin.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.indium; - -import link.infra.indium.renderer.mesh.MutableQuadViewImpl; -import link.infra.indium.renderer.render.AbstractBlockRenderContext; -import link.infra.indium.renderer.render.BlockRenderInfo; -import meteordevelopment.meteorclient.systems.modules.render.Xray; -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(value = AbstractBlockRenderContext.class, remap = false) -public abstract class AbstractBlockRenderContextMixin { - @Shadow - protected BlockRenderInfo blockInfo; - - @Inject(method = "renderQuad", at = @At(value = "INVOKE", target = "Llink/infra/indium/renderer/render/AbstractBlockRenderContext;bufferQuad(Llink/infra/indium/renderer/mesh/MutableQuadViewImpl;Lme/jellysquid/mods/sodium/client/render/chunk/terrain/material/Material;)V"), cancellable = true) - private void onBufferQuad(MutableQuadViewImpl quad, CallbackInfo ci) { - int alpha = Xray.getAlpha(blockInfo.blockState, blockInfo.blockPos); - - if (alpha == 0) ci.cancel(); - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBiomeColorCacheMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBiomeColorCacheMixin.java deleted file mode 100644 index 28ed15a500..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBiomeColorCacheMixin.java +++ /dev/null @@ -1,42 +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.sodium; - -import com.llamalad7.mixinextras.injector.ModifyExpressionValue; -import me.jellysquid.mods.sodium.client.world.biome.BiomeColorCache; -import meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.systems.modules.world.Ambience; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(value = BiomeColorCache.class, remap = false) -public abstract class SodiumBiomeColorCacheMixin { - @Unique - private Ambience ambience; - - @Inject(method = "", at = @At("TAIL")) - private void onInit(CallbackInfo info) { - ambience = Modules.get().get(Ambience.class); - } - - @ModifyExpressionValue(method = "getColor(Lme/jellysquid/mods/sodium/client/world/biome/BiomeColorSource;III)I", at = @At(value = "INVOKE", target = "Lme/jellysquid/mods/sodium/client/world/biome/BiomeColorCache;getColor(Lnet/minecraft/world/biome/ColorResolver;III)I", ordinal = 0, remap = true)) - private int modify_getGrassColorAt(int color) { - return ambience.isActive() && ambience.customGrassColor.get() ? ambience.grassColor.get().getPacked() : color; - } - - @ModifyExpressionValue(method = "getColor(Lme/jellysquid/mods/sodium/client/world/biome/BiomeColorSource;III)I", at = @At(value = "INVOKE", target = "Lme/jellysquid/mods/sodium/client/world/biome/BiomeColorCache;getColor(Lnet/minecraft/world/biome/ColorResolver;III)I", ordinal = 1, remap = true)) - private int modify_getFoliageColor(int color) { - return ambience.isActive() && ambience.customFoliageColor.get() ? ambience.foliageColor.get().getPacked() : color; - } - - @ModifyExpressionValue(method = "getColor(Lme/jellysquid/mods/sodium/client/world/biome/BiomeColorSource;III)I", at = @At(value = "INVOKE", target = "Lme/jellysquid/mods/sodium/client/world/biome/BiomeColorCache;getColor(Lnet/minecraft/world/biome/ColorResolver;III)I", ordinal = 2, remap = true)) - private int modify_getWaterColor(int color) { - return ambience.isActive() && ambience.customWaterColor.get() ? ambience.waterColor.get().getPacked() : color; - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBlockOcclusionCacheMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBlockOcclusionCacheMixin.java index 8e57991da8..9c34df0b5b 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBlockOcclusionCacheMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBlockOcclusionCacheMixin.java @@ -6,9 +6,9 @@ package meteordevelopment.meteorclient.mixin.sodium; import com.llamalad7.mixinextras.injector.ModifyReturnValue; -import me.jellysquid.mods.sodium.client.render.chunk.compile.pipeline.BlockOcclusionCache; 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; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBlockRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBlockRendererMixin.java index 3863c5f5a1..9416e69d19 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBlockRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBlockRendererMixin.java @@ -5,10 +5,11 @@ package meteordevelopment.meteorclient.mixin.sodium; -import me.jellysquid.mods.sodium.client.render.chunk.compile.ChunkBuildBuffers; -import me.jellysquid.mods.sodium.client.render.chunk.compile.pipeline.BlockRenderContext; -import me.jellysquid.mods.sodium.client.render.chunk.compile.pipeline.BlockRenderer; import meteordevelopment.meteorclient.systems.modules.render.Xray; +import net.caffeinemc.mods.sodium.client.render.chunk.compile.pipeline.BlockRenderer; +import net.minecraft.block.BlockState; +import net.minecraft.client.render.model.BakedModel; +import net.minecraft.util.math.BlockPos; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -16,9 +17,9 @@ @Mixin(value = BlockRenderer.class, remap = false) public abstract class SodiumBlockRendererMixin { - @Inject(method = "renderModel", at = @At("HEAD"), cancellable = true) - private void onRenderModel(BlockRenderContext ctx, ChunkBuildBuffers buffers, CallbackInfo info) { - int alpha = Xray.getAlpha(ctx.state(), ctx.pos()); + @Inject(method = "renderModel", at = @At(value = "INVOKE", target = "Lnet/caffeinemc/mods/sodium/client/model/color/ColorProviderRegistry;getColorProvider(Lnet/minecraft/block/Block;)Lnet/caffeinemc/mods/sodium/client/model/color/ColorProvider;", shift = At.Shift.AFTER), cancellable = true) + private void onRenderModel(BakedModel model, BlockState state, BlockPos pos, BlockPos origin, CallbackInfo info) { + int alpha = Xray.getAlpha(state, pos); if (alpha == 0) info.cancel(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumFluidRendererImplDefaultRenderContextMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumFluidRendererImplDefaultRenderContextMixin.java new file mode 100644 index 0000000000..539821df1e --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumFluidRendererImplDefaultRenderContextMixin.java @@ -0,0 +1,50 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixin.sodium; + +import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.world.Ambience; +import meteordevelopment.meteorclient.utils.render.color.Color; +import net.caffeinemc.mods.sodium.api.util.ColorABGR; +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 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 org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.Arrays; + +@Mixin(targets = "net.caffeinemc.mods.sodium.fabric.render.FluidRendererImpl$DefaultRenderContext", remap = false) +public abstract class SodiumFluidRendererImplDefaultRenderContextMixin { + @Unique + private Ambience ambience; + + @Inject(method = "", at = @At("TAIL")) + private void onInit(CallbackInfo info) { + 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); + } + } + + @Unique + private void lavaColorProvider(LevelSlice level, BlockPos pos, BlockPos.Mutable posMutable, FluidState state, ModelQuadView quads, int[] colors) { + Color c = ambience.lavaColor.get(); + Arrays.fill(colors, 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 new file mode 100644 index 0000000000..0cdc0e4945 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumFluidRendererImplMixin.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.sodium; + +import meteordevelopment.meteorclient.systems.modules.render.Xray; +import net.caffeinemc.mods.sodium.client.render.chunk.compile.ChunkBuildBuffers; +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 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 = 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); + + if (alpha == 0) info.cancel(); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumFluidRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumFluidRendererMixin.java deleted file mode 100644 index 32ac55f6d1..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumFluidRendererMixin.java +++ /dev/null @@ -1,62 +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.sodium; - -import me.jellysquid.mods.sodium.client.model.color.ColorProvider; -import me.jellysquid.mods.sodium.client.model.light.LightPipeline; -import me.jellysquid.mods.sodium.client.model.quad.ModelQuadView; -import me.jellysquid.mods.sodium.client.render.chunk.compile.ChunkBuildBuffers; -import me.jellysquid.mods.sodium.client.render.chunk.compile.pipeline.FluidRenderer; -import me.jellysquid.mods.sodium.client.world.WorldSlice; -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.caffeinemc.mods.sodium.api.util.ColorABGR; -import net.minecraft.fluid.FluidState; -import net.minecraft.registry.tag.FluidTags; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -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.Arrays; - -@Mixin(value = FluidRenderer.class, remap = false) -public abstract class SodiumFluidRendererMixin { - @Final - @Shadow - private int[] quadColors; - - @Unique - private Ambience ambience; - - @Inject(method = "", at = @At("TAIL")) - private void onInit(CallbackInfo info) { - ambience = Modules.get().get(Ambience.class); - } - - @Inject(method = "render", at = @At("HEAD"), cancellable = true) - private void onRender(WorldSlice world, FluidState fluidState, BlockPos blockPos, BlockPos offset, ChunkBuildBuffers buffers, CallbackInfo info) { - int alpha = Xray.getAlpha(fluidState.getBlockState(), blockPos); - - if (alpha == 0) info.cancel(); - } - - @Inject(method = "updateQuad", at = @At("TAIL")) - private void onUpdateQuad(ModelQuadView quad, WorldSlice world, BlockPos pos, LightPipeline lighter, Direction dir, float brightness, ColorProvider colorProvider, FluidState fluidState, CallbackInfo info) { - // Ambience - if (ambience.isActive() && ambience.customLavaColor.get() && fluidState.isIn(FluidTags.LAVA)) { - Color c = ambience.lavaColor.get(); - Arrays.fill(quadColors, ColorABGR.pack(c.r, c.g, c.b, c.a)); - } - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumLightDataAccessMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumLightDataAccessMixin.java index 61bf0faed8..ef8b67befe 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumLightDataAccessMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumLightDataAccessMixin.java @@ -5,10 +5,10 @@ package meteordevelopment.meteorclient.mixin.sodium; -import me.jellysquid.mods.sodium.client.model.light.data.LightDataAccess; import meteordevelopment.meteorclient.systems.modules.Modules; 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; @@ -28,7 +28,7 @@ public abstract class SodiumLightDataAccessMixin { private static final int FULL_LIGHT = 15 | 15 << 4 | 15 << 8; @Shadow - protected BlockRenderView world; + protected BlockRenderView level; @Shadow @Final private BlockPos.Mutable pos; @@ -47,7 +47,7 @@ private void onInit(CallbackInfo info) { @ModifyVariable(method = "compute", at = @At(value = "TAIL"), name = "bl") private int compute_modifyBL(int light) { if (xray.isActive()) { - BlockState state = world.getBlockState(pos); + BlockState state = level.getBlockState(pos); if (!xray.isBlocked(state.getBlock(), pos)) return FULL_LIGHT; } diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index fa6b9ca5ea..d8a85d9a79 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -30,7 +30,6 @@ "meteor-client-sodium.mixins.json", "meteor-client-canvas.mixins.json", "meteor-client-lithium.mixins.json", - "meteor-client-indium.mixins.json", "meteor-client-viafabricplus.mixins.json" ], "accessWidener": "meteor-client.accesswidener", diff --git a/src/main/resources/meteor-client-indium.mixins.json b/src/main/resources/meteor-client-indium.mixins.json deleted file mode 100644 index 6e2db25f32..0000000000 --- a/src/main/resources/meteor-client-indium.mixins.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "required": true, - "package": "meteordevelopment.meteorclient.mixin.indium", - "compatibilityLevel": "JAVA_21", - "plugin": "meteordevelopment.meteorclient.MixinPlugin", - "client": [ - "AbstractBlockRenderContextMixin" - ], - "injectors": { - "defaultRequire": 1 - } -} diff --git a/src/main/resources/meteor-client-sodium.mixins.json b/src/main/resources/meteor-client-sodium.mixins.json index c41ff42c6d..88cc4725ca 100644 --- a/src/main/resources/meteor-client-sodium.mixins.json +++ b/src/main/resources/meteor-client-sodium.mixins.json @@ -8,8 +8,8 @@ "MeshVertexConsumerMixin", "SodiumBlockOcclusionCacheMixin", "SodiumBlockRendererMixin", - "SodiumFluidRendererMixin", - "SodiumBiomeColorCacheMixin" + "SodiumFluidRendererImplMixin", + "SodiumFluidRendererImplDefaultRenderContextMixin" ], "injectors": { "defaultRequire": 1