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
+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
zcmZ5|V|b-Ow`DrE&5mumW81cE=Y%KbiP^DjcWk?3+fFCx>6tsvz4Ohlz2CR$=c;F|
zT6^#MID}aG4FRPr2LTBW`i6*=gpctJ9u&NTmn5bAFZuTe1riJl%*oY?83OEocCBOm
z*CGh=8xamX7#J+C0*+bp4!wIR!7Z>`zJF3fU1o%?Ta>9+
zb-2peu)j)U%4NJxdO9RTp8zB
z8G$R+K7NS&89TU8`7`jFQ5EkG2dq8m&9&TEBKB(HPwk~d$*fOb_dZ97Lji@y^}(dD
zUyb!PNSw$z??0BT1su-E$$`u5gPFw6R$Y(MIf`$l9{{Wj3_kVK#v+3@AWhwGGo2p_
za@!Sp;73eSL-w1*QTY0dBn|RRztPA^X~Cl{vOM*|x+%#!Q(0bB(jBY-91ClV41hNN4ha3Wt-UvEpsqD#Hsf+03eq0Q3O(;*H@ejQEl)FD7nqQIoS&%6)
zkh*@#{RSjiA5a*)pG};XG!R+F2BwKm7m(Uqg4fZ64op!kc<`~}gW
zkN*73{t3K@52<72dH?l82vMBw(81X;!_|syzokGxH&DN7A(U#+-_C
zAGo#FRR^*Qp<$dL^~{gkc+ZSAJA|{e*mP{-tOQV_JB;jlvg46hw=uv(W^T1^15DF}
z_9^;8>JX}t6o|IL)!G#87N1NjJhNr0cAOvl75hc>7_rz$1jL&&%MMi3NapHMw(#@7
z^~Au_fJMfVkY#+t_`ShS=zl*J$IY`8p^Rz9bk7=VWL0-7O^)ky{p=Z^Q}m*spz=_QI88LhYI=X_HHz)(tDt8__Wcn}kB1%q)#nay(OszQEpEH%!Jg)OBy
zBS#LwR=<=0vNY?V~PNYQ`;z)?M+&MXqaA+>MHiLD~52PO^h03(>^FjYK{ZWI2x<5(kzNH9jwU>c^lU(7sk@!VKQ
z;wY{rD@xZpbz-!cWjY6Pm62GH8$y=dt#nts@x(9>tMPK>C_tqtHmRJ+2}LvHBU^Ma
zx+Q(;XmLYUosOzP@yNpfP`1bw!&N1feI|r>P8F-fQmi>7w2?8pD4;S{H@-JOp3i#C
z7{&Y(yaH5}!hNG_R~?#yIit_OzN*-k5|QmD=a+Fb#g&VmKT6A7@X*+Qj@LT1c#nPd
zlYDS>OW2;L&F8>eH39wS`uc~XmtC!}G&FWd#>}s+{opUs1VO_jK=xIGmhS#@9S^%w
ztIbLMd`cnd;2C%alY)1~wETRqC|z9Z^kdP~xVp^5jVRP|T6;Z$f;)v$4BV(C^Lt9F
zz+zLHLIUUp0Y5J=%FkfK^H5-7pwx$qcVJTS)c7-S6ZS2iItYam)(i*I(~S$lBFD>O
znsesGe43tTC!4bl5SG8w-R5>lT9VWk(l?A$lyMg{xG>o;L<-%IUv$j23zj#vqx!h_
zy`xghtWEf}BNt3spDi*E$~1;N?7FGq7l51-=k@&>N!1<$TV
zlTV=~?OH-Xf-8mP1)UXb7k#vSj&CFe-;^ag!qO#Ep(4!)z#AoOoKi3`gy-bc&)hjY
zi3Tj=Vvn5-lrE&2X)hJ8lp`IKUscf(MeO3XlcEw1#~qYkkU!91Czy`&q^YhnVx}qi
z_F{aCpM-Od>|H4$q-VjQZ-A|;C$5?g=7fBtGHr;z$wgvuW}h*}xE9B_9f=)6Bic`(iG$O7?D
z_GKr$n*qVfLMJm6nT9M0Z9e%poBpaeL*qk_$QrR)X0KGGdK#yVT5fYQmPbf+ai5qx
zi2Zc~Ls?Bbec&CFtJwL$;l;$#n=t!bGj>0XUVR?ZTG8Y|FoQZOST7*GzND_azzaLg`5LS6a)(WQ&TQ+S=An^xE$`wk@n%r^NlWbMCx!7S6mu#*Po;V*YL6sB3niNGf
zGRlSCVYA=-^tR+yCkJnShM^%VZen?zGk$OK-
zzhbzo#v8T*|K^D~gz^R|jhxA!t&AgW25Np)vC~A$gaWkz?G!BcP+J(*e387crj>DV
zEgQ7gYLz1~?ix!qU4=IuPgP$ijkx{Rk5locq13WrIDx^v&IiDM3BM!+r~jk+r2nt>
zGeX4smsRiKffn~zn+6eofdBhM*vD%kLP>}G2H(_zk^1dlki#v603l*849gFNHjGD6JA8-cBj?gLUf&SL&6^_e?aS(
zc&M!DN7-FwtjmmJu&G`vF8be`$*CNtUS587zre4rd#qpIH7PjA7o^41MG?r*O>rMh
zVPANFyw?cR<&g2L@i2r3=-nA9-}gvI$>V9E6W(MQAqx=!TQXZ?60X3UY5F92!#Ik^
z8b+N-Dh&mlw73w{p>bdRWp%e?lh)Ps4<`h<9L9#2mm1b~3|~zXYqXG(+?r-n0nnmP
zax>*qY>p8KN#im`wC(4lv&(r&1ulD~3X7K4f`l~mPIoD-BpEXfJiJaEk1L}3Kmkur
zrr9LCmKretP7G9AlhtTa+Nz+j%7czr^ZeUWLKakS_(;Wlxavy5Y}YYXX;ZGtWXN>p
zW@!jiAUroGr)H`}Oz6#VT*s(Lo>P@rx7pclMf;YVK6PB!?GOMTKZ=-rk_vn6Ph}p6-!@S
zW{KrR_o;QTeXrFdCE=^8@NbW{3t1zhY%B^5r@JLu#{A@@%EA6hJ1$O0e2YN)MKo|mY6G#x49O!97`(1Wkxf?fYftm>lE*h8$dp}|
zvi3EJK3)jiYK6{vm|2t5mHN7EX8`w?MON9k1G``opNwnhake9z7gShZu;LI4_+4)_
zDe~P~G@8d9Ta3x?s{!z7nYKrm|8r9R`#x5JCtd`KBUJ!2mwy-1f()j24vHol5x*s+
zz*0z*^fqa1w&Lx%&b%skMf+gtO%$h`A41uUV4E?VbzMk?Fw44}nVR{swDfZP^RU`R
z0%qy55frZiVH4{C;;1dM{vIU*p;qrMf01D_rrzzF8)G|;#xy=FiN4TQ
z>abs1E(rkSLjjkFqGQI*KXX@LrSpe6lEU
zGJr`N7W12)M~An=xEpWLib>Hm*YTq`phBewiz|g?Vi;lkby@X;$5-H@;Zw(Bwj}VY
zVS)ZDO^*qO({4FEzML`EiG`xQy5jIRHlD8lnh4-D!{XF#V!FKfR1JxMXpG2o7-xP&
z^W-M{%}StQKT3Gn{A=jlV7um*6xl|b;a7v3chk%W))9blbdP4Z>e>ELqqaI}0LN@R4;=GAs3
zW*Ec<|EOPjhEyW;;|Wv7U`{3lnjuicG+iC3hvS({gg?J1re@HX
zU@Xbu=UKdfB6x6deQaRa9Es?OwWgu&z8N4Um5g9523E|Dm7_5S88?&%hmCjzC)iOhm@Z;%|RFKhL>^3uLm@l-%%f#w?a!c#6d?nr&6S
zl2!PboK>1?(^uUl=Uy6JwHv$(hFtQ49Rtp83r3$FNLt-nh3VP9%@bFu9dh?lQ0+Nv
zEw*~g(yAz;ju{nd94lK%pA`xycG(bX&QTck`b^dU9%XAZ+zxCsZ3=2_tChArwV>aH
z%wyhKVwg7C{K{9NidGDW5NSH@>Kn8Io`{o&uVE&0dVam9bEJBDpf{=WHrvw5tW^2=
z2BfCsixl}cv734Y+>lBGv?Y(VA}6bkck$%5TV!iJ>kUg^k8UUL`tVB8#Zi^@!!y_c
z*p^m+n^eGMpng2r;0(by{a;ketxW`hT(rSz++*DRo=vmF7|p>I8Y^*8WUo_sglnvv
z;m8n^oW1tZL?P_5{rdo@?AMe7b|^}F)}fDA^;@ufc7`|KPN(aP6^tf1%RIqL>3-f=
zICUdd3KXw;Q!RYXE%#dCB$^J}H3;>(8W
zx78%hpH#*xOV6Hs{at{>tNtiAJ`)ei&at+@=wKQ|2k=T;tSu9s9r(q`6fG}32^d&F
z8f3_wA*#I#YW^OVXWzxh1Obg;4OEwwB6%HofvaMLj#^Y&2@?+q;q+4A8S%NR*6W|a
z{O0GrAVA08zH&LDQ99Elek7I2VKOw8ZW}D|A4{$*-3ncL%_s}i6v@J*iPEK>Xdl7P
z-@3&PWL!p$=SQ(oEpcv{#(`(CkF2tQ*1g*DwB*=5h#V)~PXxjMjw-)I*>TJbi5w9n7?rd^Ts_HX1Ic)Ul2+&C@ZR0v-x0N@;2=nVPIaj@
z){l%pRk-4@W13phI2&78cE`lvzNCXh9?>%L@8DM11=!MBg_&KO4G`Dw;U-)se2U(5
zf8u#tep%^{5@`jsK=`is&`$Aw$dJ5*JPWIqgesoj
z4LuKKi;_
z(rkEyjyzVyZ%KyCf}@k4GgpCzC_o0Zx815rU6S7O$2?IYX;3*e@s
zJwh$S>+i~oKB|8uSnbu_pnS;bl>7*l?sG!{CjWCPDK^}u!O}g=%*WyhGV`jVZETt-
zJK#B^DKn$O9`zB+hfgB7x4(dd)sC@3UT4}7pWUU5t@eIqACFLf(BnAMMuCd&Xn(=%
z8bE&aH|U0qFs3C{X{_e{2J-EoFOr7pO4bZJDu@Y+xMc{g`DbdFD;8YBf_{l0Ues7CuyA$Oj&XDA6
zrfYO&1lI@Ie=Ig*VQ}yIVTn!0p5Zq`B7A(r2a5bZagBrxgQ@Ec20-%fDPd)l0^~on
z#cEA5dukmrWZ-7e%C}13a@z9leSDgoe
zH>jL{1_BM~uPXri@tK)-NCDsl$n+vBxx+MqXZ>-V0adN65{Z>e^tC1L92>hgV7RU@
zh^`t>_>1_g0X0-UfA9CFQ|Oy256eO`uM{(Bne}+8U?!L3ThqO@u0+U&WLh?}Yv&(cD#w
zNCl0UArE`L&lw2k>N`C}_ji+sFdV4BKYvg3T`nyQ4b$umCMMYob$xVZCgE!bZJfVH
zyy)8S*BUuF8&^FzXYmqY>PMw^Ut(rtS6zEKE=xR-*wTb9Hm&(W`&suZEU0q10xpy4SrMsMhH1FIB+Fd8seDYG`c~R%KOKCbwnk
zsxkSjI&M~v$~2|l!B@4(^;fMi);DgcKlPJ(>7~gN%@cZzwF2Y9@|3xCTJeR$Pc7l<
zXxBnjpbSpc>v8NbyW=_0w^7@R%iFq;Mho=sAHo6h$h!UAAxf9^`d
z+AzE0yfC|Cw&0O>1)*--D1LV?(yso*pKSD8Lfcv?oBsGNq%plI`azcwS;
z=@xqc{_8M;?oUVjn&}(DC1)EXwQ3m7^S*SP42p}cQfy45bZ`h$!vfl&DYec_cNhVk
z+@%NVK1A4RN_4eyc2jF?_4!C^rIPBT%aor|k+3Zn%bu*AnRNo?pR$yxO>`NGV4c6Gc&O>GUc<@h0$-LhvqAy%W~Qle?E8u
zvOKmG-B8t)+?o2ZU>9W%K;N~{%&9+LX^VQe=;8}0d=X1NrO^078m%v32j)k}6AKlj
zP@`t3jo(ZXqzGydNWYmfPYe;ON3XIfbqC`&px{J)YLjgbEr&G?oW$BWGw$YUtL^1#
zucF@!{Z8|xUf~vhA!=uuyJk!t&=#Bru#WjP?BdeBSEbBxXDl1xf1>Yg*RlMenR#d8
z0!~al<$T!jr4Ns&XoPqSSznXxYoF_=h;0XX<0SL^$m&bbbwPF57jutJ5J0F5IMYG!
zt%qL)IaZw!ijG4eocTlWK{#-G|Avs0&f@?!NwMZrCV<>nqIE`ofdB($5n6QRdd+@12kM3~AEekW!Nk4v5udjvSDTcVll6@oZM}f*Wv_9NG
z?N_XKl2YLo(b!2k!FH#JK>!@-NUGX(`Zq#7=HU?${@$-M5SQgl?B!*YRTRqhaak^=`_?)U@I0lQi*0}om${*5vBt=aqf(Fcbe
z#1rZ>vlziB8}$%&E^3KT2&nP7ht#Xn)GADSX?-eg=+Rz0edy}eZP0sw-{SJL>))l!
z;uIdlq)3sK;MVB#z#W7%xsJ>?u`%Ofdw*J+S0hAAj$9ee-&T-#CB~vxzr1coQOzQm
z4DJ3*y4IQtbcy_1={%>n(=*k}CMt9N9qEgEsK1HyP53|Ak7B5|u;icYdi=+L0{^!R
z4En>y2XIhYRK^_r>qW4&f`vyHnIJE|4$+8|L|P6v6M;*eWz5pAg|jl1b&c)BUw9Yi
z^tkvciXJ|M69^`pa<|z!^-T_XGWj}Z!!7Wn;VQqcFAySQI5{5Dl`naWT856sLstr(
zdwD%JIoc)VAj4uVhjG?boUjcSX!Lq7$7G;Z3-H}!$BQi!&1kfBTjewWc4Uzg3