1.20.6 Update (#347)

* initial no tests

* Initial 1.20.6 update + tests/fixes

* Initial 1.20.6 update + tests/fixes

* 1.20.6 fixes

* more 1.20.6 updates

* initial port 1.20.6
This commit is contained in:
crazymoose77756
2024-05-15 05:04:21 -04:00
committed by GitHub
parent f1a204e7ad
commit f204244797
29 changed files with 226 additions and 297 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -8,7 +8,7 @@
<a href="https://anticope.ml/pages/MeteorAddons.html"><img src="https://img.shields.io/badge/Verified%20Addon-Yes-blueviolet" alt="Verified Addon"></a>
<a href="https://github.com/AntiCope/meteor-rejects/releases"><img src="https://img.shields.io/badge/Version-v0.1-orange" alt="Version"></a>
<img src="https://img.shields.io/badge/spaghetti%20code-yes-success?logo=java" alt="Spagetti code: yes">
<img src="https://img.shields.io/badge/Minecraft%20Version-1.19-blue" alt="Minecraft Version">
<img src="https://img.shields.io/badge/Minecraft%20Version-1.20.6-blue" alt="Minecraft Version">
<a href="https://github.com/AntiCope/meteor-rejects/commits/master"><img src="https://img.shields.io/github/last-commit/AntiCope/meteor-rejects?logo=git" alt="Last commit"></a>
<img src="https://img.shields.io/github/workflow/status/AntiCope/meteor-rejects/Java%20CI%20with%20Gradle?logo=github" alt="build status">
<img src="https://img.shields.io/github/languages/code-size/AntiCope/meteor-rejects" alt="Code Size">

View File

@@ -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
}

View File

@@ -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
meteor_version=0.5.7
baritone_version=1.20.4

View File

@@ -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
zipStorePath=wrapper/dists

View File

@@ -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;
})));

View File

@@ -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;
});

View File

@@ -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() {}
}

View File

@@ -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 {
}
}
}
}
}

View File

@@ -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() {}
}

View File

@@ -16,10 +16,10 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Environment(EnvType.CLIENT)
@Mixin(LivingEntityRenderer.class)
public class LivingEntityRendererMixin {
public class LivingEntityRendererMixin<T extends LivingEntity> {
@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()) {

View File

@@ -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
}
}
}

View File

@@ -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;

View File

@@ -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) {

View File

@@ -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) {

View File

@@ -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<Enchantment, Integer> enchantments = EnchantmentHelper.get(stack);
Map<Enchantment, Integer> enchantments = (Map<Enchantment, Integer>) 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;
}
}

View File

@@ -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<Class<? extends Module>> 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<StatusEffectInstance> 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<StatusEffectInstance> 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<StatusEffectInstance> 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<StatusEffectInstance> 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<StatusEffectInstance> 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<StatusEffectInstance> 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<StatusEffectInstance> 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<StatusEffectInstance> 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<StatusEffect, StatusEffectInstance> effects = mc.player.getActiveStatusEffects();
Map<RegistryEntry<StatusEffect>, StatusEffectInstance> effects = mc.player.getActiveStatusEffects();
return !effects.containsKey(StatusEffects.STRENGTH);
}
}

View File

@@ -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;
}

View File

@@ -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() : "");

View File

@@ -49,13 +49,13 @@ public class ColorSigns extends Module {
}
}
if (books.get() && event.packet instanceof BookUpdateC2SPacket packet) {
List<String> newPages = packet.getPages().stream().map(text ->
List<String> 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();
}
}

View File

@@ -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<String, BadlionMod> mods = GSON_NON_PRETTY.fromJson(json, BADLION_MODS_TYPE);
ChatUtils.sendMsg("Badlion", format("Mods", formatMods(mods)));

View File

@@ -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<BlockPos> 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;
}

View File

@@ -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;
});
});

View File

@@ -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()
);
}
}

View File

@@ -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;
}

View File

@@ -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<ClientConnection> clientConnections = Collections.synchronizedList(Lists.newArrayList());
private final ArrayList<IServerFinderDisconnectListener> 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<InetSocketAddress> 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<Text> 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<ByteBuf>() {
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 {
}
}
}
}
}

View File

@@ -1,7 +1,7 @@
{
"required": true,
"package": "anticope.rejects.mixin.meteor",
"compatibilityLevel": "JAVA_16",
"compatibilityLevel": "JAVA_21",
"client": [
"AccountMixin",
"AccountsMixin",

View File

@@ -1,7 +1,7 @@
{
"required": true,
"package": "anticope.rejects.mixin",
"compatibilityLevel": "JAVA_16",
"compatibilityLevel": "JAVA_21",
"client": [
"ClientCommonNetwokHandlerMixin",
"ClientPlayerInteractionManagerMixin",