diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 79bc30c1..055df603 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -34,9 +34,9 @@ jobs: - uses: "marvinpinto/action-automatic-releases@latest" with: repo_token: "${{ secrets.GITHUB_TOKEN }}" - automatic_release_tag: "latest-1.20.2" + automatic_release_tag: "latest-1.20.4" prerelease: false - title: "1.20.2 Build" + title: "1.20.4 Build" files: | ./build/libs/*.jar diff --git a/build.gradle b/build.gradle index 9b729a5b..951e56f6 100644 --- a/build.gradle +++ b/build.gradle @@ -30,7 +30,7 @@ dependencies { modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" modImplementation("meteordevelopment:meteor-client:${project.meteor_version}-SNAPSHOT") - modImplementation "baritone:fabric:${project.minecraft_version}-SNAPSHOT" + modImplementation "meteordevelopment:baritone:${project.minecraft_version}-SNAPSHOT" // seed .locate and ore sim extraLibs('com.seedfinding:mc_math:ffd2edcfcc0d18147549c88cc7d8ec6cf21b5b91') { transitive = false } diff --git a/gradle.properties b/gradle.properties index 36b4ffcc..73d9250f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,13 +2,13 @@ org.gradle.jvmargs=-Xmx2G # Fabric Properties -minecraft_version=1.20.2 -yarn_version=1.20.2+build.4 -loader_version=0.14.24 +minecraft_version=1.20.4 +yarn_version=1.20.4+build.3 +loader_version=0.15.2 # Mod Properties mod_version = 0.3 maven_group = anticope.rejects archives_base_name = meteor-rejects-addon -meteor_version=0.5.5 \ No newline at end of file +meteor_version=0.5.6 \ No newline at end of file diff --git a/src/main/java/anticope/rejects/commands/GiveCommand.java b/src/main/java/anticope/rejects/commands/GiveCommand.java index 2f95af23..d6d6d729 100644 --- a/src/main/java/anticope/rejects/commands/GiveCommand.java +++ b/src/main/java/anticope/rejects/commands/GiveCommand.java @@ -77,7 +77,7 @@ public void build(LiteralArgumentBuilder builder) { tag.putBoolean("Interpret", true); tag.putBoolean("NoGravity", true); tag.putBoolean("CustomNameVisible", true); - tag.putString("CustomName", Text.Serializer.toJson(Text.literal(message))); + tag.putString("CustomName", Text.Serialization.toJsonString(Text.literal(message))); tag.put("Pos", NbtList); stack.setSubNbt("EntityTag", tag); GiveUtils.giveItem(stack); @@ -88,7 +88,7 @@ public void build(LiteralArgumentBuilder builder) { String message = ctx.getArgument("message", String.class).replace("&", "\247"); ItemStack stack = new ItemStack(Items.BAT_SPAWN_EGG); NbtCompound tag = new NbtCompound(); - tag.putString("CustomName", Text.Serializer.toJson(Text.literal(message))); + tag.putString("CustomName", Text.Serialization.toJsonString(Text.literal(message))); tag.putBoolean("NoAI", true); tag.putBoolean("Silent", true); tag.putBoolean("PersistenceRequired", true); diff --git a/src/main/java/anticope/rejects/commands/ReconnectCommand.java b/src/main/java/anticope/rejects/commands/ReconnectCommand.java index 121f7e0a..1b4ed5ea 100644 --- a/src/main/java/anticope/rejects/commands/ReconnectCommand.java +++ b/src/main/java/anticope/rejects/commands/ReconnectCommand.java @@ -2,7 +2,7 @@ import com.mojang.brigadier.builder.LiteralArgumentBuilder; import meteordevelopment.meteorclient.commands.Command; -import net.minecraft.client.gui.screen.ConnectScreen; +import net.minecraft.client.gui.screen.multiplayer.ConnectScreen; import net.minecraft.client.gui.screen.TitleScreen; import net.minecraft.client.gui.screen.multiplayer.MultiplayerScreen; import net.minecraft.client.network.ServerAddress; diff --git a/src/main/java/anticope/rejects/gui/screens/StatsScreen.java b/src/main/java/anticope/rejects/gui/screens/StatsScreen.java index 57e846eb..17f7a8c9 100644 --- a/src/main/java/anticope/rejects/gui/screens/StatsScreen.java +++ b/src/main/java/anticope/rejects/gui/screens/StatsScreen.java @@ -10,6 +10,7 @@ import meteordevelopment.orbit.EventHandler; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.world.TickEvent; +import meteordevelopment.meteorclient.utils.world.TickRate; import meteordevelopment.meteorclient.gui.GuiTheme; import meteordevelopment.meteorclient.gui.GuiThemes; import meteordevelopment.meteorclient.gui.WindowScreen; @@ -48,10 +49,11 @@ private void updateData() { effectList.action = () -> effectListExpanded = effectList.isExpanded(); liv.getActiveStatusEffects().forEach((effect, instance) -> { String status = lang.get(effect.getTranslationKey()); + float tps = TickRate.INSTANCE.getTickRate(); if (instance.getAmplifier() != 0) { - status += (String.format(" %d (%s)", instance.getAmplifier()+1, StatusEffectUtil.getDurationText(instance, 1))); + status += (String.format(" %d (%s)", instance.getAmplifier()+1, StatusEffectUtil.getDurationText(instance, 1, tps))); } else { - status += (String.format(" (%s)", StatusEffectUtil.getDurationText(instance, 1))); + status += (String.format(" (%s)", StatusEffectUtil.getDurationText(instance, 1, tps))); } effectList.add(theme.label(status)).expandX(); }); diff --git a/src/main/java/anticope/rejects/modules/AutoFarm.java b/src/main/java/anticope/rejects/modules/AutoFarm.java index 5e86f58f..0765a5e1 100644 --- a/src/main/java/anticope/rejects/modules/AutoFarm.java +++ b/src/main/java/anticope/rejects/modules/AutoFarm.java @@ -270,19 +270,20 @@ private boolean isMature(BlockState state, Block block) { private boolean bonemealFilter(Block block) { return block instanceof CropBlock || - block instanceof CocoaBlock || block instanceof StemBlock || block instanceof MushroomPlantBlock || - block instanceof SweetBerryBushBlock || block instanceof AzaleaBlock || - block instanceof SaplingBlock; + block instanceof SaplingBlock || + block == Blocks.COCOA || + block == Blocks.SWEET_BERRY_BUSH; } private boolean harvestFilter(Block block) { return block instanceof CropBlock || - block instanceof GourdBlock || - block instanceof NetherWartBlock || - block instanceof SweetBerryBushBlock; + block == Blocks.PUMPKIN || + block == Blocks.MELON || + block == Blocks.NETHER_WART || + block == Blocks.SWEET_BERRY_BUSH; } private boolean plantFilter(Item item) { diff --git a/src/main/java/anticope/rejects/modules/CoordLogger.java b/src/main/java/anticope/rejects/modules/CoordLogger.java index 399f81a3..b2d89cdc 100644 --- a/src/main/java/anticope/rejects/modules/CoordLogger.java +++ b/src/main/java/anticope/rejects/modules/CoordLogger.java @@ -107,7 +107,7 @@ private void onPacketReceive(PacketEvent.Receive event) { Vec3d playerPosition = entity.getPos(); if (playerPosition.distanceTo(packetPosition) >= minDistance.get()) { - info(formatMessage("Player '" + entity.getEntityName() + "' has teleported to ", packetPosition)); + info(formatMessage("Player '" + entity.getNameForScoreboard() + "' has teleported to ", packetPosition)); } } diff --git a/src/main/java/anticope/rejects/modules/NewChunks.java b/src/main/java/anticope/rejects/modules/NewChunks.java index 715315f0..4ae8c962 100644 --- a/src/main/java/anticope/rejects/modules/NewChunks.java +++ b/src/main/java/anticope/rejects/modules/NewChunks.java @@ -17,6 +17,7 @@ import net.minecraft.util.math.Box; import net.minecraft.util.math.ChunkPos; import net.minecraft.util.math.Direction; +import net.minecraft.util.math.Vec3d; import net.minecraft.world.chunk.WorldChunk; import java.util.Collections; @@ -112,7 +113,7 @@ private void onRender(Render3DEvent event) { synchronized (newChunks) { for (ChunkPos c : newChunks) { if (mc.getCameraEntity().getBlockPos().isWithinDistance(c.getStartPos(), 1024)) { - render(new Box(c.getStartPos(), c.getStartPos().add(16, renderHeight.get(), 16)), newChunksSideColor.get(), newChunksLineColor.get(), shapeMode.get(), event); + render(new Box(Vec3d.of(c.getStartPos()), Vec3d.of(c.getStartPos().add(16, renderHeight.get(), 16))), newChunksSideColor.get(), newChunksLineColor.get(), shapeMode.get(), event); } } } @@ -122,7 +123,7 @@ private void onRender(Render3DEvent event) { synchronized (oldChunks) { for (ChunkPos c : oldChunks) { if (mc.getCameraEntity().getBlockPos().isWithinDistance(c.getStartPos(), 1024)) { - render(new Box(c.getStartPos(), c.getStartPos().add(16, renderHeight.get(), 16)), oldChunksSideColor.get(), oldChunksLineColor.get(), shapeMode.get(), event); + render(new Box(Vec3d.of(c.getStartPos()), Vec3d.of(c.getStartPos().add(16, renderHeight.get(), 16))), oldChunksSideColor.get(), oldChunksLineColor.get(), shapeMode.get(), event); } } } diff --git a/src/main/java/anticope/rejects/modules/TreeAura.java b/src/main/java/anticope/rejects/modules/TreeAura.java index e1d41331..559a7589 100644 --- a/src/main/java/anticope/rejects/modules/TreeAura.java +++ b/src/main/java/anticope/rejects/modules/TreeAura.java @@ -117,7 +117,7 @@ private void doBonemeal(BlockPos sapling) { private boolean canPlant(BlockPos pos) { Block b = mc.world.getBlockState(pos).getBlock(); - if (b.equals(Blocks.GRASS) || b.equals(Blocks.GRASS_BLOCK) || b.equals(Blocks.DIRT) || b.equals(Blocks.COARSE_DIRT)) { + if (b.equals(Blocks.SHORT_GRASS) || b.equals(Blocks.GRASS_BLOCK) || b.equals(Blocks.DIRT) || b.equals(Blocks.COARSE_DIRT)) { final AtomicBoolean plant = new AtomicBoolean(true); IntStream.rangeClosed(1, 5).forEach(i -> { // Check above diff --git a/src/main/java/anticope/rejects/utils/accounts/CustomYggdrasilLogin.java b/src/main/java/anticope/rejects/utils/accounts/CustomYggdrasilLogin.java index 9845a826..7ae52b0d 100644 --- a/src/main/java/anticope/rejects/utils/accounts/CustomYggdrasilLogin.java +++ b/src/main/java/anticope/rejects/utils/accounts/CustomYggdrasilLogin.java @@ -6,12 +6,17 @@ import com.google.gson.*; import com.mojang.authlib.Environment; import com.mojang.authlib.GameProfile; +import com.mojang.authlib.SignatureState; import com.mojang.authlib.exceptions.AuthenticationException; import com.mojang.authlib.minecraft.InsecurePublicKeyException; import com.mojang.authlib.minecraft.MinecraftProfileTexture; +import com.mojang.authlib.minecraft.MinecraftProfileTextures; import com.mojang.authlib.properties.Property; +import com.mojang.authlib.yggdrasil.TextureUrlChecker; +import com.mojang.authlib.yggdrasil.ServicesKeyInfo; import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService; import com.mojang.authlib.yggdrasil.YggdrasilMinecraftSessionService; +import com.mojang.authlib.yggdrasil.YggdrasilServicesKeyInfo; import com.mojang.authlib.yggdrasil.response.MinecraftTexturesPayload; import com.mojang.util.UUIDTypeAdapter; import meteordevelopment.meteorclient.utils.network.Http; @@ -31,7 +36,7 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; public class CustomYggdrasilLogin { - public static Environment localYggdrasilApi = new Environment("/api", "/sessionserver", "/minecraftservices", "Custom-Yggdrasil"); + public static Environment localYggdrasilApi = new Environment("/sessionserver", "/minecraftservices", "Custom-Yggdrasil"); public static Session login(String name, String password, String server) throws AuthenticationException { try { @@ -61,7 +66,7 @@ public static Session login(String name, String password, String server) throws public static class LocalYggdrasilMinecraftSessionService extends YggdrasilMinecraftSessionService { private static final Logger LOGGER = LogManager.getLogger(); - private final PublicKey publicKey; + private final ServicesKeyInfo publicKey; private final Gson gson = new GsonBuilder().registerTypeAdapter(UUID.class, new UUIDTypeAdapter()).create(); public LocalYggdrasilMinecraftSessionService(YggdrasilAuthenticationService service, String serverUrl) { @@ -71,50 +76,53 @@ public LocalYggdrasilMinecraftSessionService(YggdrasilAuthenticationService serv this.publicKey = getPublicKey(json.get("signaturePublickey").getAsString()); } - private static PublicKey getPublicKey(String key) { + private static ServicesKeyInfo getPublicKey(String key) { key = key.replace("-----BEGIN PUBLIC KEY-----", "").replace("-----END PUBLIC KEY-----", ""); try { byte[] byteKey = Base64.getDecoder().decode(key.replace("\n", "")); - X509EncodedKeySpec spec = new X509EncodedKeySpec(byteKey); - KeyFactory factory = KeyFactory.getInstance("RSA"); - return factory.generatePublic(spec); - } catch (NoSuchAlgorithmException | InvalidKeySpecException e) { + return YggdrasilServicesKeyInfo.parse(byteKey); + } catch (IllegalArgumentException e) { e.printStackTrace(); } return null; } - @Override - public Map getTextures(final GameProfile profile, final boolean requireSecure) { - final Property textureProperty = Iterables.getFirst(profile.getProperties().get("textures"), null); - - if (textureProperty == null) - return new HashMap<>(); - - if (requireSecure) { - if (!textureProperty.hasSignature()) { - LOGGER.error("Signature is missing from textures payload"); - throw new InsecurePublicKeyException("Signature is missing from textures payload"); - } - if (!textureProperty.isSignatureValid(publicKey)) { - LOGGER.error("Textures payload has been tampered with (signature invalid)"); - throw new InsecurePublicKeyException("Textures payload has been tampered with (signature invalid)"); - } + private SignatureState getPropertySignatureState(final Property property) { + if (!property.hasSignature()) { + return SignatureState.UNSIGNED; + } + if (!publicKey.validateProperty(property)) { + return SignatureState.INVALID; } + return SignatureState.SIGNED; + } + + @Override + public MinecraftProfileTextures unpackTextures(final Property packedTextures) { + final String value = packedTextures.value(); + final SignatureState signatureState = getPropertySignatureState(packedTextures); final MinecraftTexturesPayload result; try { - final String json = new String(org.apache.commons.codec.binary.Base64.decodeBase64(textureProperty.value()), StandardCharsets.UTF_8); + final String json = new String(Base64.getDecoder().decode(value), StandardCharsets.UTF_8); result = gson.fromJson(json, MinecraftTexturesPayload.class); - } catch (final JsonParseException e) { + } catch (final JsonParseException | IllegalArgumentException e) { LOGGER.error("Could not decode textures payload", e); - return new HashMap<>(); + return MinecraftProfileTextures.EMPTY; + } + + if (result == null || result.textures() == null || result.textures().isEmpty()) { + return MinecraftProfileTextures.EMPTY; } - if (result == null || result.textures() == null) - return new HashMap<>(); + final Map textures = result.textures(); - return result.textures(); + return new MinecraftProfileTextures( + textures.get(MinecraftProfileTexture.Type.SKIN), + textures.get(MinecraftProfileTexture.Type.CAPE), + textures.get(MinecraftProfileTexture.Type.ELYTRA), + signatureState + ); } }