diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 055df60..04caf0a 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -3,7 +3,7 @@ name: Java CI with Gradle -concurrency: +concurrency: group: "build" cancel-in-progress: true @@ -12,7 +12,7 @@ on: branches: [ master ] paths-ignore: - '*.md' - + jobs: build: @@ -20,10 +20,10 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - name: Set up JDK 17 + - name: Set up JDK 21 uses: actions/setup-java@v3.10.0 with: - java-version: 17 + java-version: 21 distribution: 'zulu' - name: Grant execute permission for gradlew run: chmod +x gradlew @@ -34,9 +34,9 @@ jobs: - uses: "marvinpinto/action-automatic-releases@latest" with: repo_token: "${{ secrets.GITHUB_TOKEN }}" - automatic_release_tag: "latest-1.20.4" + automatic_release_tag: "latest-1.20.6" prerelease: false - title: "1.20.4 Build" + title: "1.20.6 Build" files: | ./build/libs/*.jar - + diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index eb42b3d..5bd6eeb 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -11,10 +11,10 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - name: Set up JDK 17 + - name: Set up JDK 21 uses: actions/setup-java@v3.10.0 with: - java-version: 17 + java-version: 21 distribution: 'zulu' - name: Grant execute permission for gradlew run: chmod +x gradlew diff --git a/README.md b/README.md index 406c2c5..d23e352 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ Verified Addon Version Spagetti code: yes - Minecraft Version + Minecraft Version Last commit build status Code Size diff --git a/build.gradle b/build.gradle index d5fe24c..2041161 100644 --- a/build.gradle +++ b/build.gradle @@ -1,8 +1,8 @@ plugins { - id 'fabric-loom' version '1.1-SNAPSHOT' + id 'fabric-loom' version '1.6-SNAPSHOT' } -sourceCompatibility = targetCompatibility = JavaVersion.VERSION_17 +sourceCompatibility = targetCompatibility = JavaVersion.VERSION_21 archivesBaseName = project.archives_base_name version = project.mod_version @@ -35,7 +35,7 @@ dependencies { modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" modImplementation("meteordevelopment:meteor-client:${project.meteor_version}-SNAPSHOT") - modImplementation "meteordevelopment:baritone:${project.minecraft_version}-SNAPSHOT" + modCompileOnly "meteordevelopment:baritone:${project.baritone_version}-SNAPSHOT" // seed .locate and ore sim extraLibs('com.seedfinding:mc_math:ffd2edcfcc0d18147549c88cc7d8ec6cf21b5b91') { transitive = false } @@ -45,7 +45,7 @@ dependencies { extraLibs('com.seedfinding:mc_biome:41a42cb9019a552598f12089059538853e18ec78') { transitive = false } extraLibs('com.seedfinding:mc_terrain:b4246cbd5880c4f8745ccb90e1b102bde3448126') { transitive = false } extraLibs('com.seedfinding:mc_feature:919b7e513cc1e87e029a9cd703fc4e2dc8686229') { transitive = false } - + // seedcracker api implementation (include('com.github.19MisterX98.SeedcrackerX:seedcrackerx-api:2.10.1')) {transitive = false} // implementation (include('com.github.19MisterX98.SeedcrackerX:seedcrackerx-api:master-SNAPSHOT')) {transitive = false} @@ -90,7 +90,7 @@ tasks.withType(JavaCompile).configureEach { // The Minecraft launcher currently installs Java 8 for users, so your mod probably wants to target Java 8 too // JDK 9 introduced a new way of specifying this that will make sure no newer classes or methods are used. // We'll use that if it's available, but otherwise we'll use the older option. - def targetVersion = 17 + def targetVersion = 21 if (JavaVersion.current().isJava9Compatible()) { it.options.release = targetVersion } diff --git a/gradle.properties b/gradle.properties index 73d9250..46b26e2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,13 +2,14 @@ org.gradle.jvmargs=-Xmx2G # Fabric Properties -minecraft_version=1.20.4 -yarn_version=1.20.4+build.3 -loader_version=0.15.2 +minecraft_version=1.20.6 +yarn_version=1.20.6+build.1 +loader_version=0.15.11 # Mod Properties mod_version = 0.3 maven_group = anticope.rejects archives_base_name = meteor-rejects-addon -meteor_version=0.5.6 \ No newline at end of file +meteor_version=0.5.7 +baritone_version=1.20.4 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ef62641..48c0a02 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists \ No newline at end of file +zipStorePath=wrapper/dists diff --git a/src/main/java/anticope/rejects/commands/GiveCommand.java b/src/main/java/anticope/rejects/commands/GiveCommand.java index d6d6d72..c14fe40 100644 --- a/src/main/java/anticope/rejects/commands/GiveCommand.java +++ b/src/main/java/anticope/rejects/commands/GiveCommand.java @@ -6,6 +6,8 @@ import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import meteordevelopment.meteorclient.commands.Command; import net.minecraft.command.CommandSource; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.NbtComponent; import net.minecraft.item.BlockItem; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; @@ -35,35 +37,41 @@ public class GiveCommand extends Command { ItemStack inHand = mc.player.getMainHandStack(); ItemStack item = new ItemStack(Items.STRIDER_SPAWN_EGG); NbtCompound ct = new NbtCompound(); + + NbtCompound itemNbt = inHand + .getOrDefault(DataComponentTypes.CUSTOM_DATA, NbtComponent.DEFAULT) + .copyNbt(); + if (inHand.getItem() instanceof BlockItem) { - ct.putInt("Time", 1); - ct.putString("id", "minecraft:falling_block"); - ct.put("BlockState", new NbtCompound()); - ct.getCompound("BlockState").putString("Name", Registries.ITEM.getId(inHand.getItem()).toString()); - if (inHand.hasNbt() && inHand.getNbt().contains("BlockEntityTag")) { - ct.put("TileEntityData", inHand.getNbt().getCompound("BlockEntityTag")); + itemNbt.putInt("Time", 1); + itemNbt.putString("id", "minecraft:falling_block"); + itemNbt.put("BlockState", new NbtCompound()); + itemNbt.getCompound("BlockState").putString("Name", Registries.ITEM.getId(inHand.getItem()).toString()); + if (inHand.getComponents().contains(DataComponentTypes.BLOCK_ENTITY_DATA)) { + itemNbt.put("TileEntityData", inHand.get(DataComponentTypes.BLOCK_ENTITY_DATA).copyNbt()); } NbtCompound t = new NbtCompound(); t.put("EntityTag", ct); - item.setNbt(t); + item.set(DataComponentTypes.CUSTOM_DATA, NbtComponent.of(itemNbt)); } else { ct.putString("id", "minecraft:item"); NbtCompound it = new NbtCompound(); it.putString("id", Registries.ITEM.getId(inHand.getItem()).toString()); it.putInt("Count", inHand.getCount()); - if (inHand.hasNbt()) { - it.put("tag", inHand.getNbt()); + if (!inHand.getComponents().isEmpty()) { + it.put("tag", inHand.getOrDefault(DataComponentTypes.CUSTOM_DATA, NbtComponent.DEFAULT).copyNbt()); } ct.put("Item", it); } NbtCompound t = new NbtCompound(); t.put("EntityTag", ct); - item.setNbt(t); - item.setCustomName(inHand.getName()); + item.set(DataComponentTypes.CUSTOM_DATA, NbtComponent.of(t)); + item.set(DataComponentTypes.CUSTOM_NAME, inHand.getName()); GiveUtils.giveItem(item); return SINGLE_SUCCESS; })); + //TODO: allow for custom cords to place oob builder.then(literal("holo").then(argument("message", StringArgumentType.greedyString()).executes(ctx -> { String message = ctx.getArgument("message", String.class).replace("&", "\247"); ItemStack stack = new ItemStack(Items.ARMOR_STAND); @@ -77,9 +85,9 @@ public class GiveCommand extends Command { tag.putBoolean("Interpret", true); tag.putBoolean("NoGravity", true); tag.putBoolean("CustomNameVisible", true); - tag.putString("CustomName", Text.Serialization.toJsonString(Text.literal(message))); + tag.putString("CustomName", Text.literal(message).toString()); tag.put("Pos", NbtList); - stack.setSubNbt("EntityTag", tag); + stack.set(DataComponentTypes.ENTITY_DATA, NbtComponent.of(tag)); GiveUtils.giveItem(stack); return SINGLE_SUCCESS; }))); @@ -88,13 +96,13 @@ public class GiveCommand extends Command { 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.Serialization.toJsonString(Text.literal(message))); + tag.putString("CustomName", Text.literal(message).toString()); tag.putBoolean("NoAI", true); tag.putBoolean("Silent", true); tag.putBoolean("PersistenceRequired", true); tag.putBoolean("Invisible", true); tag.put("id", NbtString.of("minecraft:wither")); - stack.setSubNbt("EntityTag", tag); + stack.set(DataComponentTypes.ENTITY_DATA, NbtComponent.of(tag)); GiveUtils.giveItem(stack); return SINGLE_SUCCESS; }))); @@ -104,7 +112,7 @@ public class GiveCommand extends Command { ItemStack itemStack = new ItemStack(Items.PLAYER_HEAD); NbtCompound tag = new NbtCompound(); tag.putString("SkullOwner", playerName); - itemStack.setNbt(tag); + itemStack.set(DataComponentTypes.CUSTOM_DATA, NbtComponent.of(tag)); GiveUtils.giveItem(itemStack); return SINGLE_SUCCESS; }))); diff --git a/src/main/java/anticope/rejects/commands/ReconnectCommand.java b/src/main/java/anticope/rejects/commands/ReconnectCommand.java index 1b4ed5e..855fa68 100644 --- a/src/main/java/anticope/rejects/commands/ReconnectCommand.java +++ b/src/main/java/anticope/rejects/commands/ReconnectCommand.java @@ -24,7 +24,7 @@ public class ReconnectCommand extends Command { if (info != null) { mc.world.disconnect(); ConnectScreen.connect(new MultiplayerScreen(new TitleScreen()), mc, - ServerAddress.parse(info.address), info, false); + ServerAddress.parse(info.address), info, false, null); } return SINGLE_SUCCESS; }); diff --git a/src/main/java/anticope/rejects/gui/screens/HeadScreen.java b/src/main/java/anticope/rejects/gui/screens/HeadScreen.java index f3c7e71..2208ad0 100644 --- a/src/main/java/anticope/rejects/gui/screens/HeadScreen.java +++ b/src/main/java/anticope/rejects/gui/screens/HeadScreen.java @@ -14,6 +14,8 @@ import meteordevelopment.meteorclient.settings.Settings; import meteordevelopment.meteorclient.utils.network.Http; import meteordevelopment.meteorclient.utils.network.MeteorExecutor; import meteordevelopment.meteorclient.utils.player.ChatUtils; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.NbtComponent; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.nbt.NbtCompound; @@ -80,7 +82,7 @@ public class HeadScreen extends WindowScreen { heads.add(createHeadStack(a.get("uuid"), a.get("value"), a.get("name"))); } catch (Exception e) { } }); - + WTable t = theme.table(); for (ItemStack head : heads) { t.add(theme.item(head)); @@ -118,11 +120,11 @@ public class HeadScreen extends WindowScreen { properties.put("textures", textures); skullOwner.put("Properties", properties); tag.put("SkullOwner", skullOwner); - head.setNbt(tag); - head.setCustomName(Text.literal(name)); + head.set(DataComponentTypes.CUSTOM_DATA, NbtComponent.of(tag)); + head.set(DataComponentTypes.CUSTOM_NAME, Text.literal(name)); return head; } - + @Override public void initWidgets() {} } diff --git a/src/main/java/anticope/rejects/gui/screens/InteractionScreen.java b/src/main/java/anticope/rejects/gui/screens/InteractionScreen.java index e56c4d5..f70d3b1 100644 --- a/src/main/java/anticope/rejects/gui/screens/InteractionScreen.java +++ b/src/main/java/anticope/rejects/gui/screens/InteractionScreen.java @@ -23,7 +23,9 @@ import net.minecraft.client.option.KeyBinding; import net.minecraft.client.render.GameRenderer; import net.minecraft.client.util.InputUtil; import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.component.DataComponentTypes; import net.minecraft.entity.Entity; +import net.minecraft.entity.LivingEntity; import net.minecraft.entity.Saddleable; import net.minecraft.entity.mob.EndermanEntity; import net.minecraft.entity.passive.AbstractHorseEntity; @@ -114,7 +116,7 @@ public class InteractionScreen extends Screen { functions.put("Open Inventory", (Entity e) -> { closeScreen(); ItemStack container = new ItemStack(Items.CHEST); - container.setCustomName(e.getName()); + container.set(DataComponentTypes.CUSTOM_NAME, e.getName()); client.setScreen(new PeekScreen(container, getInventory(e))); }); } @@ -190,18 +192,21 @@ public class InteractionScreen extends Screen { index[0]++; } } - e.getHandItems().forEach(itemStack -> { + LivingEntity a = (LivingEntity) e; + a.getHandItems().forEach(itemStack -> { if (itemStack != null) { stack[index[0]] = itemStack; index[0]++; } }); - e.getArmorItems().forEach(itemStack -> { + + a.getArmorItems().forEach(itemStack -> { if (itemStack != null) { stack[index[0]] = itemStack; index[0]++; } }); + for (int i = index[0]; i < 27; i++) stack[i] = Items.AIR.getDefaultStack(); return stack; } @@ -363,4 +368,4 @@ public class InteractionScreen extends Screen { } } } -} \ No newline at end of file +} diff --git a/src/main/java/anticope/rejects/gui/screens/StatsScreen.java b/src/main/java/anticope/rejects/gui/screens/StatsScreen.java index 17f7a8c..d5c8deb 100644 --- a/src/main/java/anticope/rejects/gui/screens/StatsScreen.java +++ b/src/main/java/anticope/rejects/gui/screens/StatsScreen.java @@ -44,11 +44,11 @@ public class StatsScreen extends WindowScreen { if (entity instanceof LivingEntity liv) { add(theme.label(String.format("Health: %.2f/%.2f", liv.getHealth(), liv.getMaxHealth()))); add(theme.label(String.format("Armor: %d/20", liv.getArmor()))); - + WSection effectList = add(theme.section("Status Effects", effectListExpanded)).expandX().widget(); effectList.action = () -> effectListExpanded = effectList.isExpanded(); liv.getActiveStatusEffects().forEach((effect, instance) -> { - String status = lang.get(effect.getTranslationKey()); + String status = lang.get(effect.value().getTranslationKey()); float tps = TickRate.INSTANCE.getTickRate(); if (instance.getAmplifier() != 0) { status += (String.format(" %d (%s)", instance.getAmplifier()+1, StatusEffectUtil.getDurationText(instance, 1, tps))); @@ -60,11 +60,11 @@ public class StatsScreen extends WindowScreen { if (liv.getActiveStatusEffects().isEmpty()) { effectList.add(theme.label("No effects")).expandX(); } - + WSection attribList = add(theme.section("Attributes", attribListExpanded)).expandX().widget(); attribList.action = () -> attribListExpanded = attribList.isExpanded(); liv.getAttributes().getTracked().forEach((attrib) -> attribList.add(theme.label(String.format("%s: %.2f", - lang.get(attrib.getAttribute().getTranslationKey()), + lang.get(attrib.getAttribute().value().getTranslationKey()), attrib.getValue() ))).expandX()); } @@ -73,7 +73,7 @@ public class StatsScreen extends WindowScreen { dimension.add(theme.label(String.format("Position: %.2f, %.2f, %.2f", entity.getX(), entity.getY(), entity.getZ()))).expandX(); dimension.add(theme.label(String.format("Yaw: %.2f, Pitch: %.2f", entity.getYaw(), entity.getPitch()))).expandX(); Box box = entity.getBoundingBox(); - dimension.add(theme.label(String.format("Bounding Box: %.2f, %.2f, %.2f", + dimension.add(theme.label(String.format("Bounding Box: %.2f, %.2f, %.2f", box.maxX-box.minX, box.maxY-box.minY, box.maxZ-box.minZ ))).expandX(); } @@ -82,7 +82,7 @@ public class StatsScreen extends WindowScreen { private void onTick(TickEvent.Post event) { updateData(); } - + @Override public void initWidgets() {} } diff --git a/src/main/java/anticope/rejects/mixin/LivingEntityRendererMixin.java b/src/main/java/anticope/rejects/mixin/LivingEntityRendererMixin.java index 5ece6ba..ed4cce6 100644 --- a/src/main/java/anticope/rejects/mixin/LivingEntityRendererMixin.java +++ b/src/main/java/anticope/rejects/mixin/LivingEntityRendererMixin.java @@ -16,10 +16,10 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Environment(EnvType.CLIENT) @Mixin(LivingEntityRenderer.class) -public class LivingEntityRendererMixin { +public class LivingEntityRendererMixin { @Inject(method = "setupTransforms", at = @At(value = "TAIL")) - private void dinnerboneEntities(LivingEntity entity, MatrixStack matrices, float _animationProgress, float _bodyYaw, float _tickDelta, CallbackInfo _info) { + private void dinnerboneEntities(T entity, MatrixStack matrices, float animationProgress, float bodyYaw, float tickDelta, float scale, CallbackInfo ci) { Rendering renderingModule = Modules.get().get(Rendering.class); if (renderingModule == null) return; if ((!(entity instanceof PlayerEntity)) && renderingModule.dinnerboneEnabled()) { diff --git a/src/main/java/anticope/rejects/modules/AntiVanish.java b/src/main/java/anticope/rejects/modules/AntiVanish.java index e3af556..f85a2cf 100644 --- a/src/main/java/anticope/rejects/modules/AntiVanish.java +++ b/src/main/java/anticope/rejects/modules/AntiVanish.java @@ -75,7 +75,7 @@ public class AntiVanish extends Module { @EventHandler private void onPacket(PacketEvent.Receive event) { if (mode.get() == Mode.RealJoinMessage && event.packet instanceof CommandSuggestionsS2CPacket packet) { - if (completionIDs.contains(packet.getCompletionId())) { + if (completionIDs.contains(packet.id())) { var lastUsernames = completionPlayerCache.stream().toList(); completionPlayerCache = packet.getSuggestions().getList().stream() @@ -100,7 +100,7 @@ public class AntiVanish extends Module { } } - completionIDs.remove(Integer.valueOf(packet.getCompletionId())); + completionIDs.remove(Integer.valueOf(packet.id())); event.cancel(); } } @@ -143,4 +143,4 @@ public class AntiVanish extends Module { LeaveMessage, RealJoinMessage//https://github.com/xtrm-en/meteor-antistaff/blob/main/src/main/java/me/xtrm/meteorclient/antistaff/modules/AntiStaff.java } -} \ No newline at end of file +} diff --git a/src/main/java/anticope/rejects/modules/AutoEnchant.java b/src/main/java/anticope/rejects/modules/AutoEnchant.java index 993192c..a633bcc 100644 --- a/src/main/java/anticope/rejects/modules/AutoEnchant.java +++ b/src/main/java/anticope/rejects/modules/AutoEnchant.java @@ -10,6 +10,7 @@ import meteordevelopment.meteorclient.utils.player.InvUtils; import meteordevelopment.orbit.EventHandler; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.screen.EnchantmentScreenHandler; import net.minecraft.screen.ScreenHandler; @@ -50,7 +51,7 @@ public class AutoEnchant extends meteordevelopment.meteorclient.systems.modules. .name("item-whitelist") .description("Item that require enchantment.") .defaultValue() - .filter(item -> item.equals(Items.BOOK) || item.isDamageable()) + .filter(item -> item.equals(Items.BOOK) || new ItemStack(item).isDamageable()) .build() ); @@ -109,7 +110,7 @@ public class AutoEnchant extends meteordevelopment.meteorclient.systems.modules. } private boolean fillCanEnchantItem() { - FindItemResult res = InvUtils.find(stack -> itemWhitelist.get().contains(stack.getItem()) && EnchantmentHelper.get(stack).isEmpty()); + FindItemResult res = InvUtils.find(stack -> itemWhitelist.get().contains(stack.getItem()) && EnchantmentHelper.canHaveEnchantments(stack)); if (!res.found()) return false; InvUtils.shiftClick().slot(res.slot()); return true; diff --git a/src/main/java/anticope/rejects/modules/AutoExtinguish.java b/src/main/java/anticope/rejects/modules/AutoExtinguish.java index a05cada..bb858b3 100644 --- a/src/main/java/anticope/rejects/modules/AutoExtinguish.java +++ b/src/main/java/anticope/rejects/modules/AutoExtinguish.java @@ -82,9 +82,9 @@ public class AutoExtinguish extends Module { private boolean hasPlacedWater = false; private BlockPos blockPos = null; private boolean doesWaterBucketWork = true; - + private static final StatusEffect FIRE_RESISTANCE = Registries.STATUS_EFFECT.get(new Identifier("fire_resistance")); - + public AutoExtinguish() { super(MeteorRejectsAddon.CATEGORY, "auto-extinguish", "Automatically extinguishes fire around you"); } @@ -114,7 +114,7 @@ public class AutoExtinguish extends Module { place(slot); hasPlacedWater = false; - } else if (!mc.player.hasStatusEffect(FIRE_RESISTANCE) && mc.player.isOnFire()) { + } else if (!mc.player.hasStatusEffect(Registries.STATUS_EFFECT.getEntry(FIRE_RESISTANCE)) && mc.player.isOnFire()) { blockPos = mc.player.getBlockPos(); final int slot = findSlot(Items.WATER_BUCKET); if (mc.world.getBlockState(blockPos).getBlock() == Blocks.FIRE || mc.world.getBlockState(blockPos).getBlock() == Blocks.SOUL_FIRE) { diff --git a/src/main/java/anticope/rejects/modules/AutoFarm.java b/src/main/java/anticope/rejects/modules/AutoFarm.java index 0765a5e..cd4cb9f 100644 --- a/src/main/java/anticope/rejects/modules/AutoFarm.java +++ b/src/main/java/anticope/rejects/modules/AutoFarm.java @@ -257,13 +257,13 @@ public class AutoFarm extends Module { if (block instanceof CropBlock cropBlock) { return cropBlock.isMature(state); } else if (block instanceof CocoaBlock cocoaBlock) { - return !cocoaBlock.hasRandomTicks(state); + return state.get(cocoaBlock.AGE) >= 2; } else if (block instanceof StemBlock) { return state.get(StemBlock.AGE) == StemBlock.MAX_AGE; } else if (block instanceof SweetBerryBushBlock sweetBerryBushBlock) { - return !sweetBerryBushBlock.hasRandomTicks(state); + return state.get(sweetBerryBushBlock.AGE) >= 2; } else if (block instanceof NetherWartBlock netherWartBlock) { - return !netherWartBlock.hasRandomTicks(state); + return state.get(netherWartBlock.AGE) >= 3; } return true; } @@ -283,7 +283,8 @@ public class AutoFarm extends Module { block == Blocks.PUMPKIN || block == Blocks.MELON || block == Blocks.NETHER_WART || - block == Blocks.SWEET_BERRY_BUSH; + block == Blocks.SWEET_BERRY_BUSH || + block == Blocks.COCOA; } private boolean plantFilter(Item item) { diff --git a/src/main/java/anticope/rejects/modules/AutoGrind.java b/src/main/java/anticope/rejects/modules/AutoGrind.java index 25336d6..c0463fe 100644 --- a/src/main/java/anticope/rejects/modules/AutoGrind.java +++ b/src/main/java/anticope/rejects/modules/AutoGrind.java @@ -7,6 +7,7 @@ import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.network.MeteorExecutor; import meteordevelopment.meteorclient.utils.player.InvUtils; import meteordevelopment.orbit.EventHandler; +import net.minecraft.component.DataComponentTypes; import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.item.Item; @@ -32,7 +33,7 @@ public class AutoGrind extends Module { .name("item-blacklist") .description("Items that should be ignored.") .defaultValue() - .filter(Item::isDamageable) + .filter(Item -> Item.getComponents().get(DataComponentTypes.DAMAGE) != null) .build() ); @@ -73,7 +74,7 @@ public class AutoGrind extends Module { private boolean canGrind(ItemStack stack) { if (itemBlacklist.get().contains(stack.getItem())) return false; - Map enchantments = EnchantmentHelper.get(stack); + Map enchantments = (Map) EnchantmentHelper.getEnchantments(stack); int availEnchs = 0; for (Enchantment enchantment : enchantments.keySet()) { @@ -84,6 +85,6 @@ public class AutoGrind extends Module { return false; } - return enchantments.size() > 0 && availEnchs > 0; + return !enchantments.isEmpty() && availEnchs > 0; } } diff --git a/src/main/java/anticope/rejects/modules/AutoPot.java b/src/main/java/anticope/rejects/modules/AutoPot.java index 042a342..771a46c 100644 --- a/src/main/java/anticope/rejects/modules/AutoPot.java +++ b/src/main/java/anticope/rejects/modules/AutoPot.java @@ -19,15 +19,17 @@ import meteordevelopment.meteorclient.systems.modules.combat.KillAura; import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.player.Rotations; import meteordevelopment.orbit.EventHandler; +import net.minecraft.component.DataComponentTypes; import net.minecraft.entity.effect.StatusEffect; import net.minecraft.entity.effect.StatusEffectInstance; import net.minecraft.entity.effect.StatusEffects; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; -import net.minecraft.potion.PotionUtil; +import net.minecraft.registry.entry.RegistryEntry; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Map; @@ -86,7 +88,7 @@ public class AutoPot extends Module { private boolean drinking, splashing; private final List> wasAura = new ArrayList<>(); private boolean wasBaritone; - + public AutoPot() { super(MeteorRejectsAddon.CATEGORY, "auto-pot", "Automatically Drinks Potions"); } @@ -322,14 +324,12 @@ public class AutoPot extends Module { ItemStack stack = mc.player.getInventory().getStack(i); if (stack.isEmpty()) continue; if (stack.getItem() != Items.POTION) continue; - if (stack.getItem() == Items.POTION) { - List effects = PotionUtil.getPotion(mc.player.getInventory().getStack(i)).getEffects(); - if (effects.size() > 0) { - StatusEffectInstance effect = effects.get(0); - if (effect.getTranslationKey().equals("effect.minecraft.instant_health")) { - slot = i; - break; - } + Iterator effects = stack.getItem().getComponents().get(DataComponentTypes.POTION_CONTENTS).getEffects().iterator(); + if (effects.hasNext()) { + StatusEffectInstance effect = effects.next(); + if (effect.getTranslationKey().equals("effect.minecraft.instant_health")) { + slot = i; + break; } } } @@ -342,14 +342,12 @@ public class AutoPot extends Module { ItemStack stack = mc.player.getInventory().getStack(i); if (stack.isEmpty()) continue; if (stack.getItem() != Items.SPLASH_POTION) continue; - if (stack.getItem() == Items.SPLASH_POTION) { - List effects = PotionUtil.getPotion(mc.player.getInventory().getStack(i)).getEffects(); - if (effects.size() > 0) { - StatusEffectInstance effect = effects.get(0); - if (effect.getTranslationKey().equals("effect.minecraft.instant_health")) { - slot = i; - break; - } + Iterator effects = stack.getItem().getComponents().get(DataComponentTypes.POTION_CONTENTS).getEffects().iterator(); + if (effects.hasNext()) { + StatusEffectInstance effect = effects.next(); + if (effect.getTranslationKey().equals("effect.minecraft.instant_health")) { + slot = i; + break; } } } @@ -363,17 +361,15 @@ public class AutoPot extends Module { ItemStack stack = mc.player.getInventory().getStack(i); if (stack.isEmpty()) continue; if (stack.getItem() != Items.SPLASH_POTION) continue; - if (stack.getItem() == Items.SPLASH_POTION) { - List effects = PotionUtil.getPotion(mc.player.getInventory().getStack(i)).getEffects(); - if (effects.size() > 0) { - StatusEffectInstance effect = effects.get(0); - if (effect.getTranslationKey().equals("effect.minecraft.strength")) { - slot = i; - break; - } + Iterator effects = stack.getItem().getComponents().get(DataComponentTypes.POTION_CONTENTS).getEffects().iterator(); + if (effects.hasNext()) { + StatusEffectInstance effect = effects.next(); + if (effect.getTranslationKey().equals("effect.minecraft.strength")) { + slot = i; + break; } - } + } return slot; } @@ -384,17 +380,15 @@ public class AutoPot extends Module { ItemStack stack = mc.player.getInventory().getStack(i); if (stack.isEmpty()) continue; if (stack.getItem() != Items.POTION) continue; - if (stack.getItem() == Items.POTION) { - List effects = PotionUtil.getPotion(mc.player.getInventory().getStack(i)).getEffects(); - if (effects.size() > 0) { - StatusEffectInstance effect = effects.get(0); - if (effect.getTranslationKey().equals("effect.minecraft.strength")) { - slot = i; - break; - } + Iterator effects = stack.getItem().getComponents().get(DataComponentTypes.POTION_CONTENTS).getEffects().iterator(); + if (effects.hasNext()) { + StatusEffectInstance effect = effects.next(); + if (effect.getTranslationKey().equals("effect.minecraft.strength")) { + slot = i; + break; } - } + } return slot; } @@ -415,7 +409,7 @@ public class AutoPot extends Module { return false; } private boolean ShouldDrinkStrength(){ - Map effects = mc.player.getActiveStatusEffects(); + Map, StatusEffectInstance> effects = mc.player.getActiveStatusEffects(); return !effects.containsKey(StatusEffects.STRENGTH); } } diff --git a/src/main/java/anticope/rejects/modules/AutoRename.java b/src/main/java/anticope/rejects/modules/AutoRename.java index bcc66b4..b3903aa 100644 --- a/src/main/java/anticope/rejects/modules/AutoRename.java +++ b/src/main/java/anticope/rejects/modules/AutoRename.java @@ -9,6 +9,8 @@ import meteordevelopment.orbit.EventHandler; import net.minecraft.block.ShulkerBoxBlock; import net.minecraft.client.gui.screen.ingame.AnvilScreen; import net.minecraft.client.gui.widget.TextFieldWidget; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.NbtComponent; import net.minecraft.item.BlockItem; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -124,7 +126,7 @@ public class AutoRename extends Module { if (!(item instanceof BlockItem && ((BlockItem) item).getBlock() instanceof ShulkerBoxBlock)) { return ""; } - NbtCompound compound = stack.getNbt(); + NbtCompound compound = stack.getOrDefault(DataComponentTypes.CUSTOM_DATA, NbtComponent.DEFAULT).copyNbt(); if (compound == null) { return ""; } @@ -148,7 +150,7 @@ public class AutoRename extends Module { if (itemId == null) { continue; } - name = ItemStack.fromNbt(invItem).getName().getString(); + name = String.valueOf(invItem.getCompound("Name")); minslot = invSlot; } return name; @@ -183,7 +185,7 @@ public class AutoRename extends Module { continue; } var st = sl.getStack(); - if (gItems.contains(st.getItem()) && !st.hasCustomName()) { + if (gItems.contains(st.getItem()) && !st.getComponents().contains(DataComponentTypes.CUSTOM_NAME)) { from = i; break; } diff --git a/src/main/java/anticope/rejects/modules/BungeeCordSpoof.java b/src/main/java/anticope/rejects/modules/BungeeCordSpoof.java index b1e9bca..d79eac8 100644 --- a/src/main/java/anticope/rejects/modules/BungeeCordSpoof.java +++ b/src/main/java/anticope/rejects/modules/BungeeCordSpoof.java @@ -10,6 +10,7 @@ import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.orbit.EventHandler; import net.minecraft.network.NetworkState; +import net.minecraft.network.packet.c2s.handshake.ConnectionIntent; import net.minecraft.network.packet.c2s.handshake.HandshakeC2SPacket; import java.util.List; @@ -54,7 +55,7 @@ public class BungeeCordSpoof extends Module { @EventHandler private void onPacketSend(PacketEvent.Send event) { - if (event.packet instanceof HandshakeC2SPacket packet && packet.getNewNetworkState() == NetworkState.LOGIN) { + if (event.packet instanceof HandshakeC2SPacket packet && packet.intendedState() == ConnectionIntent.LOGIN) { if (whitelist.get() && !whitelistedServers.get().contains(Utils.getWorldName())) return; String address = packet.address() + "\0" + forwardedIP + "\0" + mc.getSession().getUuidOrNull().toString().replace("-", "") + (spoofProfile.get() ? getProperty() : ""); diff --git a/src/main/java/anticope/rejects/modules/ColorSigns.java b/src/main/java/anticope/rejects/modules/ColorSigns.java index a130ba9..708171c 100644 --- a/src/main/java/anticope/rejects/modules/ColorSigns.java +++ b/src/main/java/anticope/rejects/modules/ColorSigns.java @@ -49,13 +49,13 @@ public class ColorSigns extends Module { } } if (books.get() && event.packet instanceof BookUpdateC2SPacket packet) { - List newPages = packet.getPages().stream().map(text -> + List newPages = packet.pages().stream().map(text -> text.replaceAll("(?i)&([0-9A-Z])", "§$1")).toList(); // BookUpdateC2SPacket.pages is final, so we need to create a new packet - if (!packet.getPages().equals(newPages)) { + if (!packet.pages().equals(newPages)) { assert mc.getNetworkHandler() != null; mc.getNetworkHandler().sendPacket(new BookUpdateC2SPacket( - packet.getSlot(), newPages, packet.getTitle())); + packet.slot(), newPages, packet.title())); event.cancel(); } } diff --git a/src/main/java/anticope/rejects/modules/CustomPackets.java b/src/main/java/anticope/rejects/modules/CustomPackets.java index 9cc649f..0225a41 100644 --- a/src/main/java/anticope/rejects/modules/CustomPackets.java +++ b/src/main/java/anticope/rejects/modules/CustomPackets.java @@ -54,7 +54,7 @@ public class CustomPackets extends Module { @EventHandler private void onCustomPayloadPacket(PacketEvent.Receive event) { if (event.packet instanceof CustomPayloadS2CPacket packet) { - switch (packet.payload().id().toString()) { + switch (packet.payload().getId().toString()) { case "badlion:mods" -> event.setCancelled(onBadlionModsPacket(packet)); default -> onUnknownPacket(packet); } @@ -65,9 +65,8 @@ public class CustomPackets extends Module { private void onUnknownPacket(CustomPayloadS2CPacket packet) { if (!unknownPackets.get()) return; - MutableText text = Text.literal(packet.payload().id().toString()); + MutableText text = Text.literal(packet.payload().getId().toString()); buffer.clear(); - packet.payload().write(buffer); text.setStyle(text.getStyle() .withHoverEvent(new HoverEvent( HoverEvent.Action.SHOW_TEXT, @@ -79,7 +78,6 @@ public class CustomPackets extends Module { private boolean onBadlionModsPacket(CustomPayloadS2CPacket packet) { if (!mods.get()) return false; buffer.clear(); - packet.payload().write(buffer); String json = readString(buffer); Map mods = GSON_NON_PRETTY.fromJson(json, BADLION_MODS_TYPE); ChatUtils.sendMsg("Badlion", format("Mods", formatMods(mods))); diff --git a/src/main/java/anticope/rejects/modules/ObsidianFarm.java b/src/main/java/anticope/rejects/modules/ObsidianFarm.java index 931c60b..d628b75 100644 --- a/src/main/java/anticope/rejects/modules/ObsidianFarm.java +++ b/src/main/java/anticope/rejects/modules/ObsidianFarm.java @@ -7,6 +7,7 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.player.AutoEat; import meteordevelopment.orbit.EventHandler; import net.minecraft.block.Blocks; +import net.minecraft.component.DataComponentTypes; import net.minecraft.item.Items; import net.minecraft.util.Hand; import net.minecraft.util.math.BlockPos; @@ -40,7 +41,7 @@ public class ObsidianFarm extends Module { return; } if (!allowBreakAgain) return; - if ((mc.player.isUsingItem() || Modules.get().get(AutoEat.class).isActive()) && (mc.player.getOffHandStack().getItem().isFood() || mc.player.getMainHandStack().getItem().isFood())) + if ((mc.player.isUsingItem() || Modules.get().get(AutoEat.class).isActive()) && (mc.player.getOffHandStack().contains(DataComponentTypes.FOOD) || mc.player.getMainHandStack().contains(DataComponentTypes.FOOD))) return; if(mc.player.getMainHandStack().getItem() != Items.NETHERITE_PICKAXE && mc.player.getMainHandStack().getItem() != Items.DIAMOND_PICKAXE) { @@ -65,7 +66,6 @@ public class ObsidianFarm extends Module { } } - private BlockPos findObsidian() { List blocksList = new ArrayList<>(); @@ -106,14 +106,12 @@ public class ObsidianFarm extends Module { return null; } - private int findPickAxe() { - int result = -1; for (int i = 0; i < 9; i++) { if (mc.player.getInventory().getStack(i).getItem() == Items.NETHERITE_PICKAXE) return i; - if (mc.player.getInventory().getStack(i).getItem() == Items.DIAMOND_PICKAXE) result = i; + if (mc.player.getInventory().getStack(i).getItem() == Items.DIAMOND_PICKAXE) return i; } - return result; + return -1; } diff --git a/src/main/java/anticope/rejects/utils/GiveUtils.java b/src/main/java/anticope/rejects/utils/GiveUtils.java index 308ccd0..b5e2aed 100644 --- a/src/main/java/anticope/rejects/utils/GiveUtils.java +++ b/src/main/java/anticope/rejects/utils/GiveUtils.java @@ -1,5 +1,7 @@ package anticope.rejects.utils; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.NbtComponent; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; @@ -59,7 +61,7 @@ public class GiveUtils { public static void giveItem(ItemStack item) throws CommandSyntaxException { if (!mc.player.getAbilities().creativeMode) throw NOT_IN_CREATIVE.create(); - + if (!mc.player.getInventory().insertStack(item)) { throw NO_SPACE.create(); } @@ -71,9 +73,9 @@ public class GiveUtils { if (preview) preset.getMiddle().getDefaultStack(); ItemStack item = preset.getMiddle().getDefaultStack(); try { - item.setNbt(StringNbtReader.parse(preset.getRight())); + item.set(DataComponentTypes.CUSTOM_DATA, NbtComponent.of(StringNbtReader.parse(preset.getRight()))); } catch (CommandSyntaxException e) { } - item.setCustomName(Text.literal(toName(preset.getLeft()))); + item.set(DataComponentTypes.CUSTOM_NAME, Text.literal(toName(preset.getLeft()))); return item; }); }); @@ -82,10 +84,11 @@ public class GiveUtils { if (preview) Items.SPIDER_SPAWN_EGG.getDefaultStack(); ItemStack item = Items.SPIDER_SPAWN_EGG.getDefaultStack(); String nick = mc.player.getName().getString(); + try { - item.setNbt(StringNbtReader.parse("{EntityTag:{Time:1,BlockState:{Name:\"minecraft:spawner\"},id:\"minecraft:falling_block\",TileEntityData:{SpawnCount:20,SpawnData:{id:\"minecraft:villager\",Passengers:[{Time:1,BlockState:{Name:\"minecraft:redstone_block\"},id:\"minecraft:falling_block\",Passengers:[{id:\"minecraft:fox\",Passengers:[{Time:1,BlockState:{Name:\"minecraft:activator_rail\"},id:\"minecraft:falling_block\",Passengers:[{Command:\"execute as @e run op "+nick+"\",id:\"minecraft:command_block_minecart\"}]}],NoAI:1b,Health:1.0f,ActiveEffects:[{Duration:1000,Id:20b,Amplifier:4b}]}]}],NoAI:1b,Health:1.0f,ActiveEffects:[{Duration:1000,Id:20b,Amplifier:4b}]},MaxSpawnDelay:100,SpawnRange:10,Delay:1,MinSpawnDelay:100}}}")); + item.set(DataComponentTypes.CUSTOM_DATA, NbtComponent.of(StringNbtReader.parse("{EntityTag:{Time:1,BlockState:{Name:\"minecraft:spawner\"},id:\"minecraft:falling_block\",TileEntityData:{SpawnCount:20,SpawnData:{id:\"minecraft:villager\",Passengers:[{Time:1,BlockState:{Name:\"minecraft:redstone_block\"},id:\"minecraft:falling_block\",Passengers:[{id:\"minecraft:fox\",Passengers:[{Time:1,BlockState:{Name:\"minecraft:activator_rail\"},id:\"minecraft:falling_block\",Passengers:[{Command:\"execute as @e run op "+nick+"\",id:\"minecraft:command_block_minecart\"}]}],NoAI:1b,Health:1.0f,ActiveEffects:[{Duration:1000,Id:20b,Amplifier:4b}]}]}],NoAI:1b,Health:1.0f,ActiveEffects:[{Duration:1000,Id:20b,Amplifier:4b}]},MaxSpawnDelay:100,SpawnRange:10,Delay:1,MinSpawnDelay:100}}}"))); } catch (CommandSyntaxException e) { } - item.setCustomName(Text.literal("Force OP")); + item.set(DataComponentTypes.CUSTOM_NAME, Text.of("Force OP")); return item; }); @@ -103,8 +106,8 @@ public class GiveUtils { } NbtCompound nbt = new NbtCompound(); nbt.put("CustomPotionEffects", effects); - stack.setNbt(nbt); - stack.setCustomName(Text.literal("Lingering Potion of Trolling")); + stack.set(DataComponentTypes.CUSTOM_DATA, NbtComponent.of(nbt)); + stack.set(DataComponentTypes.CUSTOM_NAME, Text.literal("Lingering Potion of Trolling")); return stack; }); @@ -122,8 +125,8 @@ public class GiveUtils { addEnchant(enchants, "minecraft:vanishing_curse", (short)1); NbtCompound nbt = new NbtCompound(); nbt.put("Enchantments", enchants); - stack.setNbt(nbt); - stack.setCustomName(Text.literal("Bonk")); + stack.set(DataComponentTypes.CUSTOM_DATA, NbtComponent.of(nbt)); + stack.set(DataComponentTypes.CUSTOM_NAME, Text.literal("Bonk")); return stack; }); @@ -135,8 +138,8 @@ public class GiveUtils { for(int i = 0; i < 40000; i++) nbtList.add(new NbtList()); nbtCompound.put("nothingsuspicioushere", nbtList); - stack.setNbt(nbtCompound); - stack.setCustomName(Text.literal("Copy Me")); + stack.set(DataComponentTypes.CUSTOM_DATA, NbtComponent.of(nbtCompound)); + stack.set(DataComponentTypes.CUSTOM_NAME, Text.literal("Copy Me")); return stack; }); @@ -160,10 +163,10 @@ public class GiveUtils { tagCompound.putInt("Flight", 0); tagCompound.put("Explosions", explosionList); baseCompound.put("Fireworks", tagCompound); - firework.setNbt(baseCompound); + firework.set(DataComponentTypes.CUSTOM_DATA, NbtComponent.of(baseCompound)); return firework; }); - + HIDDEN_ENTITIES.forEach((id) -> { PRESETS.put(id.getPath()+"_spawn_egg", (preview) -> { if (preview) return Items.PIG_SPAWN_EGG.getDefaultStack(); @@ -172,8 +175,8 @@ public class GiveUtils { NbtCompound entityTag = new NbtCompound(); entityTag.putString("id", id.toString()); tag.put("EntityTag", entityTag); - egg.setNbt(tag); - egg.setCustomName(Text.literal(String.format("%s", toName(id.getPath())))); + egg.set(DataComponentTypes.CUSTOM_DATA, NbtComponent.of(tag)); + egg.set(DataComponentTypes.CUSTOM_NAME, Text.literal(String.format("%s", toName(id.getPath())))); return egg; }); }); diff --git a/src/main/java/anticope/rejects/utils/WorldGenUtils.java b/src/main/java/anticope/rejects/utils/WorldGenUtils.java index eae3db2..26fee35 100644 --- a/src/main/java/anticope/rejects/utils/WorldGenUtils.java +++ b/src/main/java/anticope/rejects/utils/WorldGenUtils.java @@ -19,6 +19,10 @@ import meteordevelopment.meteorclient.utils.player.PlayerUtils; import net.minecraft.block.Block; import net.minecraft.block.Blocks; +import net.minecraft.component.DataComponentType; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.MapDecorationsComponent; +import net.minecraft.component.type.MapIdComponent; import net.minecraft.entity.Entity; import net.minecraft.entity.mob.*; import net.minecraft.entity.passive.IronGolemEntity; @@ -345,12 +349,14 @@ public class WorldGenUtils { return new BlockPos(pos.getX(), pos.getY(), pos.getZ()); } + // TODO: check this lmao private static boolean isValidMap(Feature feature, ItemStack stack) { - if (!stack.hasNbt()) return false; - if (!stack.getNbt().contains("display")) return false; - NbtCompound displayTag = stack.getNbt().getCompound("display"); - if (!displayTag.contains("Name")) return false; - String nameTag = displayTag.getString("Name"); + if (stack.getComponents().isEmpty()) return false; + if (!stack.getComponents().contains(DataComponentTypes.MAP_DECORATIONS)) return false; + MapDecorationsComponent displayTag = stack.getDefaultComponents().get(DataComponentTypes.MAP_DECORATIONS); + + if (!displayTag.toString().contains("Name")) return false; + String nameTag = String.valueOf(displayTag.decorations().get("Name")); if (!nameTag.contains("translate")) return false; if (feature == Feature.buried_treasure) { @@ -364,15 +370,17 @@ public class WorldGenUtils { } private static BlockPos getMapMarker(ItemStack stack) { - if (!stack.hasNbt()) return null; - if (!stack.getNbt().contains("Decorations")) return null; - NbtList decorationsTag = stack.getNbt().getList("Decorations", NbtElement.COMPOUND_TYPE); - if (decorationsTag.size() < 1) return null; - NbtCompound iconTag = decorationsTag.getCompound(0); + if (stack.getComponents().isEmpty()) return null; + if (!stack.getDefaultComponents().contains(DataComponentTypes.MAP_DECORATIONS)) return null; + + MapDecorationsComponent decorationsTag = stack.get(DataComponentTypes.MAP_DECORATIONS); + if (decorationsTag.decorations().isEmpty()) return null; + MapDecorationsComponent.Decoration iconTag = decorationsTag.decorations().get(0); + // check this return new BlockPos( - (int)iconTag.getDouble("x"), - (int)iconTag.getDouble("y"), - (int)iconTag.getDouble("z") + (int)iconTag.x(), + 0, + (int)iconTag.z() ); } } diff --git a/src/main/java/anticope/rejects/utils/server/LegacyServerPinger.java b/src/main/java/anticope/rejects/utils/server/LegacyServerPinger.java index d6e1daa..3c45a09 100644 --- a/src/main/java/anticope/rejects/utils/server/LegacyServerPinger.java +++ b/src/main/java/anticope/rejects/utils/server/LegacyServerPinger.java @@ -26,19 +26,18 @@ public class LegacyServerPinger { private void pingInCurrentThread(String ip, int port) { MultiplayerServerListPinger pinger = new MultiplayerServerListPinger(); - MeteorRejectsAddon.LOG.info("Pinging " + ip + ":" + port + "..."); + MeteorRejectsAddon.LOG.info("Pinging {}:{}...", ip, port); try { - pinger.add(server, () -> { - }); - MeteorRejectsAddon.LOG.info("Ping successful: " + ip + ":" + port); + pinger.add(server, () -> {}, () -> {}); + MeteorRejectsAddon.LOG.info("Ping successful: {}:{}", ip, port); } catch (UnknownHostException e) { - MeteorRejectsAddon.LOG.warn("Unknown host: " + ip + ":" + port); + MeteorRejectsAddon.LOG.warn("Unknown host: {}:{}", ip, port); failed = true; } catch (Exception e2) { - MeteorRejectsAddon.LOG.warn("Ping failed: " + ip + ":" + port); + MeteorRejectsAddon.LOG.warn("Ping failed: {}:{}", ip, port); failed = true; } diff --git a/src/main/java/anticope/rejects/utils/server/ServerListPinger.java b/src/main/java/anticope/rejects/utils/server/ServerListPinger.java index ffc7df8..ae5e0c4 100644 --- a/src/main/java/anticope/rejects/utils/server/ServerListPinger.java +++ b/src/main/java/anticope/rejects/utils/server/ServerListPinger.java @@ -1,19 +1,15 @@ package anticope.rejects.utils.server; import com.google.common.base.Splitter; -import com.google.common.collect.Iterables; import com.google.common.collect.Lists; -import com.mojang.authlib.GameProfile; import io.netty.bootstrap.Bootstrap; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.Unpooled; import io.netty.channel.*; -import io.netty.channel.socket.nio.NioSocketChannel; +import net.minecraft.client.network.Address; +import net.minecraft.client.network.AllowedAddressResolver; +import net.minecraft.client.network.LegacyServerPinger; import net.minecraft.client.network.ServerAddress; import net.minecraft.network.ClientConnection; -import net.minecraft.network.NetworkState; import net.minecraft.network.listener.ClientQueryPacketListener; -import net.minecraft.network.packet.c2s.handshake.HandshakeC2SPacket; import net.minecraft.network.packet.c2s.query.QueryPingC2SPacket; import net.minecraft.network.packet.c2s.query.QueryRequestC2SPacket; import net.minecraft.network.packet.s2c.query.PingResultS2CPacket; @@ -21,19 +17,15 @@ import net.minecraft.network.packet.s2c.query.QueryResponseS2CPacket; import net.minecraft.server.ServerMetadata; import net.minecraft.text.Text; import net.minecraft.util.Util; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.profiler.PerformanceLog; +import net.minecraft.util.profiler.MultiValueDebugSampleLogImpl; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.UnknownHostException; -import java.nio.charset.StandardCharsets; import java.util.*; public class ServerListPinger { - private static final Splitter ZERO_SPLITTER = Splitter.on('\u0000').limit(6); private static final Logger LOGGER = LogManager.getLogger(); private final List clientConnections = Collections.synchronizedList(Lists.newArrayList()); private final ArrayList disconnectListeners = new ArrayList<>(); @@ -67,15 +59,13 @@ public class ServerListPinger { public void add(final MServerInfo entry, final Runnable runnable) throws UnknownHostException { - Timer timeoutTimer = new Timer(); ServerAddress serverAddress = ServerAddress.parse(entry.address); - timeoutTimer.schedule(new TimerTask() { - @Override - public void run() { - notifyDisconnectListeners(); - } - }, 20000); - final ClientConnection clientConnection = ClientConnection.connect(new InetSocketAddress(InetAddress.getByName(serverAddress.getAddress()), serverAddress.getPort()), false, (PerformanceLog) null); + Optional address = AllowedAddressResolver.DEFAULT.resolve(serverAddress).map(Address::getInetSocketAddress); + if (address.isEmpty()) { + return; + } + final ClientConnection clientConnection = ClientConnection.connect(address.get(), false, (MultiValueDebugSampleLogImpl) null); + failedToConnect = false; this.clientConnections.add(clientConnection); entry.label = "multiplayer.status.pinging"; @@ -89,52 +79,30 @@ public class ServerListPinger { public void onResponse(QueryResponseS2CPacket packet) { if (this.received) { clientConnection.disconnect(Text.translatable("multiplayer.status.unrequested")); - } else { - this.received = true; - ServerMetadata serverMetadata = packet.metadata(); - entry.label = serverMetadata.description().getString(); - serverMetadata.version().ifPresentOrElse((version) -> { - entry.version = version.gameVersion(); - entry.protocolVersion = version.protocolVersion(); - }, () -> { - entry.version = "multiplayer.status.old"; - entry.protocolVersion = 0; - }); - serverMetadata.players().ifPresentOrElse((players) -> { - entry.playerCountLabel = getPlayerCountLabel(players.online(), players.max()); - entry.playerCount = players.online(); - if (!players.sample().isEmpty()) { - List list = new ArrayList(players.sample().size()); - Iterator var3 = players.sample().iterator(); - - while (var3.hasNext()) { - GameProfile gameProfile = (GameProfile) var3.next(); - list.add(Text.literal(gameProfile.getName())); - } - - if (players.sample().size() < players.online()) { - list.add(Text.translatable("multiplayer.status.and_more", players.online() - players.sample().size())); - } - - entry.playerListSummary = list; - } else { - entry.playerListSummary = List.of(); - } - - }, () -> entry.playerCountLabel = "multiplayer.status.unknown"); - serverMetadata.favicon().ifPresent((favicon) -> { - if (!Arrays.equals(favicon.iconBytes(), entry.getIcon())) { - entry.setIcon(favicon.iconBytes()); - runnable.run(); - } - - }); - this.startTime = Util.getMeasuringTimeMs(); - clientConnection.send(new QueryPingC2SPacket(this.startTime)); - this.sentQuery = true; - notifyDisconnectListeners(); + return; + } + this.received = true; + ServerMetadata serverMetadata = packet.metadata(); + if (serverMetadata.description() != null) { + entry.label = serverMetadata.description().getString(); + } else { + entry.label = ""; + } + + entry.version = serverMetadata.version().map(ServerMetadata.Version::gameVersion).orElse("multiplayer.status.old"); + serverMetadata.players().ifPresentOrElse(players -> { + entry.playerCountLabel = ServerListPinger.getPlayerCountLabel(players.online(), players.max()); + entry.playerCount = players.online(); + entry.playercountMax = players.max(); + }, () -> { + entry.playerCountLabel = "multiplayer.status.unknown"; + }); + + this.startTime = Util.getMeasuringTimeMs(); + clientConnection.send(new QueryPingC2SPacket(this.startTime)); + this.sentQuery = true; + notifyDisconnectListeners(); } - } public void onPingResult(PingResultS2CPacket packet) { long l = this.startTime; @@ -160,11 +128,9 @@ public class ServerListPinger { } }; - clientConnection.setPacketListener(clientQueryPacketListener); - try { clientConnection.connect(serverAddress.getAddress(), serverAddress.getPort(), clientQueryPacketListener); - clientConnection.send(new QueryRequestC2SPacket()); + clientConnection.send(QueryRequestC2SPacket.INSTANCE); } catch (Throwable var8) { LOGGER.error("Failed to ping server {}", serverAddress, var8); } @@ -173,79 +139,20 @@ public class ServerListPinger { private void ping(final MServerInfo serverInfo) { final ServerAddress serverAddress = ServerAddress.parse(serverInfo.address); - (new Bootstrap()).group(ClientConnection.CLIENT_IO_GROUP.get()).handler(new ChannelInitializer<>() { - protected void initChannel(Channel channel) { + new Bootstrap().group(ClientConnection.CLIENT_IO_GROUP.get()).handler(new ChannelInitializer<>() { + @Override + protected void initChannel(Channel ch) throws Exception { try { - channel.config().setOption(ChannelOption.TCP_NODELAY, true); + ch.config().setOption(ChannelOption.TCP_NODELAY, true); } catch (ChannelException ignored) { } - - channel.pipeline().addLast(new SimpleChannelInboundHandler() { - public void channelActive(ChannelHandlerContext channelHandlerContext) throws Exception { - super.channelActive(channelHandlerContext); - ByteBuf byteBuf = Unpooled.buffer(); - - try { - byteBuf.writeByte(254); - byteBuf.writeByte(1); - byteBuf.writeByte(250); - char[] cs = "MC|PingHost".toCharArray(); - byteBuf.writeShort(cs.length); - char[] var4 = cs; - int var5 = cs.length; - - int var6; - char d; - for (var6 = 0; var6 < var5; ++var6) { - d = var4[var6]; - byteBuf.writeChar(d); - } - - byteBuf.writeShort(7 + 2 * serverAddress.getAddress().length()); - byteBuf.writeByte(127); - cs = serverAddress.getAddress().toCharArray(); - byteBuf.writeShort(cs.length); - var4 = cs; - var5 = cs.length; - - for (var6 = 0; var6 < var5; ++var6) { - d = var4[var6]; - byteBuf.writeChar(d); - } - - byteBuf.writeInt(serverAddress.getPort()); - channelHandlerContext.channel().writeAndFlush(byteBuf).addListener(ChannelFutureListener.CLOSE_ON_FAILURE); - } finally { - byteBuf.release(); - } - } - - protected void channelRead0(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf) { - short s = byteBuf.readUnsignedByte(); - if (s == 255) { - String string = new String(byteBuf.readBytes(byteBuf.readShort() * 2).array(), StandardCharsets.UTF_16BE); - String[] strings = Iterables.toArray(ServerListPinger.ZERO_SPLITTER.split(string), String.class); - if ("§1".equals(strings[0])) { - String string2 = strings[2]; - String string3 = strings[3]; - int j = MathHelper.parseInt(strings[4], -1); - int k = MathHelper.parseInt(strings[5], -1); - serverInfo.protocolVersion = -1; - serverInfo.version = string2; - serverInfo.label = string3; - serverInfo.playerCountLabel = ServerListPinger.getPlayerCountLabel(j, k); - } - } - - channelHandlerContext.close(); - } - - public void exceptionCaught(ChannelHandlerContext channelHandlerContext, Throwable throwable) { - channelHandlerContext.close(); - } - }); + ch.pipeline().addLast(new LegacyServerPinger(serverAddress, ((protocolVersion, version, label, currentPlayers, maxPlayers) -> { + serverInfo.version = version; + serverInfo.label = label; + serverInfo.playerCountLabel = ServerListPinger.getPlayerCountLabel(currentPlayers, maxPlayers); + }))); } - }).channel(NioSocketChannel.class).connect(serverAddress.getAddress(), serverAddress.getPort()); + }); } public void tick() { @@ -277,4 +184,4 @@ public class ServerListPinger { } } } -} +} \ No newline at end of file diff --git a/src/main/resources/meteor-rejects-meteor.mixins.json b/src/main/resources/meteor-rejects-meteor.mixins.json index 4cb4a2f..caa371f 100644 --- a/src/main/resources/meteor-rejects-meteor.mixins.json +++ b/src/main/resources/meteor-rejects-meteor.mixins.json @@ -1,7 +1,7 @@ { "required": true, "package": "anticope.rejects.mixin.meteor", - "compatibilityLevel": "JAVA_16", + "compatibilityLevel": "JAVA_21", "client": [ "AccountMixin", "AccountsMixin", diff --git a/src/main/resources/meteor-rejects.mixins.json b/src/main/resources/meteor-rejects.mixins.json index 4ab9b30..da932cb 100644 --- a/src/main/resources/meteor-rejects.mixins.json +++ b/src/main/resources/meteor-rejects.mixins.json @@ -1,7 +1,7 @@ { "required": true, "package": "anticope.rejects.mixin", - "compatibilityLevel": "JAVA_16", + "compatibilityLevel": "JAVA_21", "client": [ "ClientCommonNetwokHandlerMixin", "ClientPlayerInteractionManagerMixin",