From 3119a9145cb0ec18fc17f5e75c640fec183e31eb Mon Sep 17 00:00:00 2001 From: MonkeySaint <62266035+MonkeySaint@users.noreply.github.com> Date: Tue, 14 Nov 2023 15:03:57 -0500 Subject: [PATCH 01/26] Port to 1.20.2 (#305) Co-authored-by: Cloudburst <18114966+C10udburst@users.noreply.github.com> --- .github/workflows/gradle.yml | 6 +- gradle.properties | 8 +-- .../rejects/commands/KickCommand.java | 2 +- .../gui/servers/LegacyServerFinderScreen.java | 2 +- .../gui/servers/ServerFinderScreen.java | 2 +- .../gui/servers/ServerManagerScreen.java | 2 +- .../mixin/ClientCommonNetwokHandlerMixin.java | 25 ++++++++ .../mixin/ClientPlayNetworkHandlerMixin.java | 15 ----- .../anticope/rejects/modules/AutoCraft.java | 5 +- .../anticope/rejects/modules/AutoGrind.java | 2 +- .../anticope/rejects/modules/AutoSoup.java | 2 +- .../rejects/modules/BungeeCordSpoof.java | 8 +-- .../anticope/rejects/modules/ColorSigns.java | 2 +- .../rejects/modules/CustomPackets.java | 19 ++++-- .../anticope/rejects/modules/NewChunks.java | 6 +- .../accounts/CustomYggdrasilAccount.java | 4 +- .../utils/accounts/CustomYggdrasilLogin.java | 62 ++++--------------- .../utils/server/LegacyServerPinger.java | 2 +- .../utils/server/ServerListPinger.java | 15 +++-- src/main/resources/meteor-rejects.mixins.json | 1 + 20 files changed, 86 insertions(+), 104 deletions(-) create mode 100644 src/main/java/anticope/rejects/mixin/ClientCommonNetwokHandlerMixin.java diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 3dcf1391..79bc30c1 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -4,7 +4,7 @@ name: Java CI with Gradle concurrency: - group: "build-1.20" + group: "build" cancel-in-progress: true on: @@ -34,9 +34,9 @@ jobs: - uses: "marvinpinto/action-automatic-releases@latest" with: repo_token: "${{ secrets.GITHUB_TOKEN }}" - automatic_release_tag: "latest-1.20.1" + automatic_release_tag: "latest-1.20.2" prerelease: false - title: "1.20.1 Build" + title: "1.20.2 Build" files: | ./build/libs/*.jar diff --git a/gradle.properties b/gradle.properties index a759d224..36b4ffcc 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,13 +2,13 @@ org.gradle.jvmargs=-Xmx2G # Fabric Properties -minecraft_version=1.20.1 -yarn_version=1.20.1+build.1 -loader_version=0.14.21 +minecraft_version=1.20.2 +yarn_version=1.20.2+build.4 +loader_version=0.14.24 # Mod Properties mod_version = 0.3 maven_group = anticope.rejects archives_base_name = meteor-rejects-addon -meteor_version=0.5.4 \ No newline at end of file +meteor_version=0.5.5 \ No newline at end of file diff --git a/src/main/java/anticope/rejects/commands/KickCommand.java b/src/main/java/anticope/rejects/commands/KickCommand.java index 7d55e520..3ee57d21 100644 --- a/src/main/java/anticope/rejects/commands/KickCommand.java +++ b/src/main/java/anticope/rejects/commands/KickCommand.java @@ -7,7 +7,7 @@ import net.minecraft.command.CommandSource; import net.minecraft.network.packet.c2s.play.PlayerInteractEntityC2SPacket; import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket; -import net.minecraft.network.packet.s2c.play.DisconnectS2CPacket; +import net.minecraft.network.packet.s2c.common.DisconnectS2CPacket; import net.minecraft.text.Text; import org.apache.commons.lang3.SystemUtils; diff --git a/src/main/java/anticope/rejects/gui/servers/LegacyServerFinderScreen.java b/src/main/java/anticope/rejects/gui/servers/LegacyServerFinderScreen.java index 568fd2dc..938a8960 100644 --- a/src/main/java/anticope/rejects/gui/servers/LegacyServerFinderScreen.java +++ b/src/main/java/anticope/rejects/gui/servers/LegacyServerFinderScreen.java @@ -156,7 +156,7 @@ private void updatePingers(ArrayList pingers) { if (!isServerInList(pingers.get(i).getServerIP())) { multiplayerScreen.getServerList() .add(new ServerInfo("Server discovery " + working, - pingers.get(i).getServerIP(), false), false); + pingers.get(i).getServerIP(), ServerInfo.ServerType.OTHER), false); multiplayerScreen.getServerList().saveFile(); ((MultiplayerScreenAccessor) multiplayerScreen).getServerListWidget() .setSelected(null); diff --git a/src/main/java/anticope/rejects/gui/servers/ServerFinderScreen.java b/src/main/java/anticope/rejects/gui/servers/ServerFinderScreen.java index af96dcf1..564edee1 100644 --- a/src/main/java/anticope/rejects/gui/servers/ServerFinderScreen.java +++ b/src/main/java/anticope/rejects/gui/servers/ServerFinderScreen.java @@ -241,7 +241,7 @@ public void onServerDone(ServerPinger pinger) { if (!isServerInList(pinger.getServerIP()) && filterPass(pinger.getServerInfo())) { synchronized (serverFinderLock) { working++; - multiplayerScreen.getServerList().add(new ServerInfo("Server discovery #" + working, pinger.getServerIP(), false), false); + multiplayerScreen.getServerList().add(new ServerInfo("Server discovery #" + working, pinger.getServerIP(), ServerInfo.ServerType.OTHER), false); multiplayerScreen.getServerList().saveFile(); ((MultiplayerScreenAccessor) multiplayerScreen).getServerListWidget().setSelected(null); ((MultiplayerScreenAccessor) multiplayerScreen).getServerListWidget().setServers(multiplayerScreen.getServerList()); diff --git a/src/main/java/anticope/rejects/gui/servers/ServerManagerScreen.java b/src/main/java/anticope/rejects/gui/servers/ServerManagerScreen.java index bda7b3cc..a7ff64e1 100644 --- a/src/main/java/anticope/rejects/gui/servers/ServerManagerScreen.java +++ b/src/main/java/anticope/rejects/gui/servers/ServerManagerScreen.java @@ -120,7 +120,7 @@ public void initWidgets() { for (ServerInfo server : servers) presentAddresses.add(server.address); for (String addr : MinecraftClient.getInstance().keyboard.getClipboard().split("[\r\n]+")) { if (presentAddresses.add(addr = addr.split(" ")[0])) { - servers.add(new ServerInfo("Server discovery #" + presentAddresses.size(), addr, false)); + servers.add(new ServerInfo("Server discovery #" + presentAddresses.size(), addr, ServerInfo.ServerType.OTHER)); newIPs++; } } diff --git a/src/main/java/anticope/rejects/mixin/ClientCommonNetwokHandlerMixin.java b/src/main/java/anticope/rejects/mixin/ClientCommonNetwokHandlerMixin.java new file mode 100644 index 00000000..c8905537 --- /dev/null +++ b/src/main/java/anticope/rejects/mixin/ClientCommonNetwokHandlerMixin.java @@ -0,0 +1,25 @@ +package anticope.rejects.mixin; + +import anticope.rejects.modules.SilentDisconnect; +import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.utils.player.ChatUtils; +import net.minecraft.client.network.ClientCommonNetworkHandler; +import net.minecraft.text.Text; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import static meteordevelopment.meteorclient.MeteorClient.mc; + +@Mixin(ClientCommonNetworkHandler.class) +public class ClientCommonNetwokHandlerMixin { + @Inject(method = "onDisconnected", at = @At("HEAD"), cancellable = true) + private void onDisconnected(Text reason, CallbackInfo info) { + if (Modules.get().isActive(SilentDisconnect.class) && mc.world != null && mc.player != null) { + ChatUtils.info(Text.translatable("disconnect.lost").getString() + ":"); + ChatUtils.sendMsg(reason); + info.cancel(); + } + } +} diff --git a/src/main/java/anticope/rejects/mixin/ClientPlayNetworkHandlerMixin.java b/src/main/java/anticope/rejects/mixin/ClientPlayNetworkHandlerMixin.java index 5073e642..725d5d1e 100644 --- a/src/main/java/anticope/rejects/mixin/ClientPlayNetworkHandlerMixin.java +++ b/src/main/java/anticope/rejects/mixin/ClientPlayNetworkHandlerMixin.java @@ -1,20 +1,14 @@ package anticope.rejects.mixin; import anticope.rejects.events.PlayerRespawnEvent; -import anticope.rejects.modules.SilentDisconnect; import meteordevelopment.meteorclient.MeteorClient; -import meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.utils.player.ChatUtils; import net.minecraft.client.network.ClientPlayNetworkHandler; import net.minecraft.network.packet.s2c.play.PlayerRespawnS2CPacket; -import net.minecraft.text.Text; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import static meteordevelopment.meteorclient.MeteorClient.mc; - @Mixin(ClientPlayNetworkHandler.class) public class ClientPlayNetworkHandlerMixin { @@ -23,13 +17,4 @@ public class ClientPlayNetworkHandlerMixin { public void onPlayerRespawn(PlayerRespawnS2CPacket packet, CallbackInfo ci) { MeteorClient.EVENT_BUS.post(PlayerRespawnEvent.get()); } - - @Inject(method = "onDisconnected", at = @At("HEAD"), cancellable = true) - private void onDisconnected(Text reason, CallbackInfo info) { - if (Modules.get().isActive(SilentDisconnect.class) && mc.world != null && mc.player != null) { - ChatUtils.info(Text.translatable("disconnect.lost").getString() + ":"); - ChatUtils.sendMsg(reason); - info.cancel(); - } - } } diff --git a/src/main/java/anticope/rejects/modules/AutoCraft.java b/src/main/java/anticope/rejects/modules/AutoCraft.java index a5a17810..5551e830 100644 --- a/src/main/java/anticope/rejects/modules/AutoCraft.java +++ b/src/main/java/anticope/rejects/modules/AutoCraft.java @@ -11,6 +11,7 @@ import net.minecraft.client.gui.screen.recipebook.RecipeResultCollection; import net.minecraft.item.Item; import net.minecraft.recipe.Recipe; +import net.minecraft.recipe.RecipeEntry; import net.minecraft.screen.CraftingScreenHandler; import net.minecraft.screen.slot.SlotActionType; @@ -70,8 +71,8 @@ private void onTick(TickEvent.Post event) { List itemList = items.get(); List recipeResultCollectionList = mc.player.getRecipeBook().getOrderedResults(); for (RecipeResultCollection recipeResultCollection : recipeResultCollectionList) { - for (Recipe recipe : recipeResultCollection.getRecipes(true)) { - if (!itemList.contains(recipe.getOutput(mc.world.getRegistryManager()).getItem())) continue; + for (RecipeEntry recipe : recipeResultCollection.getRecipes(true)) { + if (!itemList.contains(recipe.value().getResult(mc.world.getRegistryManager()).getItem())) continue; mc.interactionManager.clickRecipe(currentScreenHandler.syncId, recipe, craftAll.get()); mc.interactionManager.clickSlot(currentScreenHandler.syncId, 0, 1, drop.get() ? SlotActionType.THROW : SlotActionType.QUICK_MOVE, mc.player); diff --git a/src/main/java/anticope/rejects/modules/AutoGrind.java b/src/main/java/anticope/rejects/modules/AutoGrind.java index 168f1237..483f1b87 100644 --- a/src/main/java/anticope/rejects/modules/AutoGrind.java +++ b/src/main/java/anticope/rejects/modules/AutoGrind.java @@ -63,7 +63,7 @@ private void onOpenScreen(OpenScreenEvent event) { if (mc.currentScreen == null) break; - InvUtils.quickMove().slot(i); + InvUtils.quickSwap().slot(i); InvUtils.move().fromId(2).to(i); } } diff --git a/src/main/java/anticope/rejects/modules/AutoSoup.java b/src/main/java/anticope/rejects/modules/AutoSoup.java index ab16c683..3e5fc8f4 100644 --- a/src/main/java/anticope/rejects/modules/AutoSoup.java +++ b/src/main/java/anticope/rejects/modules/AutoSoup.java @@ -104,7 +104,7 @@ private void onTick(TickEvent.Post event) { // move soup in inventory to hotbar if (soupInInventory != -1) - InvUtils.quickMove().slot(soupInInventory); + InvUtils.quickSwap().slot(soupInInventory); } private int findSoup(int startSlot, int endSlot) { diff --git a/src/main/java/anticope/rejects/modules/BungeeCordSpoof.java b/src/main/java/anticope/rejects/modules/BungeeCordSpoof.java index 956b8cab..b1e9bca3 100644 --- a/src/main/java/anticope/rejects/modules/BungeeCordSpoof.java +++ b/src/main/java/anticope/rejects/modules/BungeeCordSpoof.java @@ -54,16 +54,16 @@ public BungeeCordSpoof() { @EventHandler private void onPacketSend(PacketEvent.Send event) { - if (event.packet instanceof HandshakeC2SPacket packet && packet.getIntendedState() == NetworkState.LOGIN) { + if (event.packet instanceof HandshakeC2SPacket packet && packet.getNewNetworkState() == NetworkState.LOGIN) { if (whitelist.get() && !whitelistedServers.get().contains(Utils.getWorldName())) return; - String address = packet.getAddress() + "\0" + forwardedIP + "\0" + mc.getSession().getUuid().replace("-", "") + String address = packet.address() + "\0" + forwardedIP + "\0" + mc.getSession().getUuidOrNull().toString().replace("-", "") + (spoofProfile.get() ? getProperty() : ""); - ((HandshakeC2SPacketAccessor) packet).setAddress(address); + ((HandshakeC2SPacketAccessor) (Object) packet).setAddress(address); } } private String getProperty() { - PropertyMap propertyMap = mc.getSession().getProfile().getProperties(); + PropertyMap propertyMap = mc.getGameProfile().getProperties(); return "\0" + GSON.toJson(propertyMap.values().toArray()); } } diff --git a/src/main/java/anticope/rejects/modules/ColorSigns.java b/src/main/java/anticope/rejects/modules/ColorSigns.java index b8a4ffb8..87b80e92 100644 --- a/src/main/java/anticope/rejects/modules/ColorSigns.java +++ b/src/main/java/anticope/rejects/modules/ColorSigns.java @@ -35,7 +35,7 @@ public void onActivate() { } private void checkWarning() { - String brand = mc.player.getServerBrand(); + String brand = mc.player.getServer().getServerModName(); if (brand == null) return; if (brand.contains("Paper")) warning("You are on a paper server. Color signs won't work here"); } diff --git a/src/main/java/anticope/rejects/modules/CustomPackets.java b/src/main/java/anticope/rejects/modules/CustomPackets.java index 37b1bc18..9cc649fc 100644 --- a/src/main/java/anticope/rejects/modules/CustomPackets.java +++ b/src/main/java/anticope/rejects/modules/CustomPackets.java @@ -5,6 +5,7 @@ import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; import com.google.gson.reflect.TypeToken; +import io.netty.buffer.Unpooled; import meteordevelopment.meteorclient.events.packets.PacketEvent; import meteordevelopment.meteorclient.settings.BoolSetting; import meteordevelopment.meteorclient.settings.Setting; @@ -13,7 +14,7 @@ import meteordevelopment.meteorclient.utils.player.ChatUtils; import meteordevelopment.orbit.EventHandler; import net.minecraft.network.PacketByteBuf; -import net.minecraft.network.packet.s2c.play.CustomPayloadS2CPacket; +import net.minecraft.network.packet.s2c.common.CustomPayloadS2CPacket; import net.minecraft.text.HoverEvent; import net.minecraft.text.MutableText; import net.minecraft.text.Text; @@ -53,27 +54,33 @@ public CustomPackets() { @EventHandler private void onCustomPayloadPacket(PacketEvent.Receive event) { if (event.packet instanceof CustomPayloadS2CPacket packet) { - switch (packet.getChannel().toString()) { + switch (packet.payload().id().toString()) { case "badlion:mods" -> event.setCancelled(onBadlionModsPacket(packet)); default -> onUnknownPacket(packet); } } } + PacketByteBuf buffer = new PacketByteBuf(Unpooled.buffer()); + private void onUnknownPacket(CustomPayloadS2CPacket packet) { if (!unknownPackets.get()) return; - MutableText text = Text.literal(packet.getChannel().toString()); + MutableText text = Text.literal(packet.payload().id().toString()); + buffer.clear(); + packet.payload().write(buffer); text.setStyle(text.getStyle() .withHoverEvent(new HoverEvent( HoverEvent.Action.SHOW_TEXT, - Text.literal(readString(packet.getData())) - ))); + Text.literal(readString(buffer) + )))); info(text); } private boolean onBadlionModsPacket(CustomPayloadS2CPacket packet) { if (!mods.get()) return false; - String json = readString(packet.getData()); + 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))); return true; diff --git a/src/main/java/anticope/rejects/modules/NewChunks.java b/src/main/java/anticope/rejects/modules/NewChunks.java index ebc2ac08..715315f0 100644 --- a/src/main/java/anticope/rejects/modules/NewChunks.java +++ b/src/main/java/anticope/rejects/modules/NewChunks.java @@ -171,12 +171,12 @@ else if (event.packet instanceof BlockUpdateS2CPacket) { else if (event.packet instanceof ChunkDataS2CPacket && mc.world != null) { ChunkDataS2CPacket packet = (ChunkDataS2CPacket) event.packet; - ChunkPos pos = new ChunkPos(packet.getX(), packet.getZ()); + ChunkPos pos = new ChunkPos(packet.getChunkX(), packet.getChunkZ()); - if (!newChunks.contains(pos) && mc.world.getChunkManager().getChunk(packet.getX(), packet.getZ()) == null) { + if (!newChunks.contains(pos) && mc.world.getChunkManager().getChunk(packet.getChunkX(), packet.getChunkZ()) == null) { WorldChunk chunk = new WorldChunk(mc.world, pos); try { - chunk.loadFromPacket(packet.getChunkData().getSectionsDataBuf(), new NbtCompound(), packet.getChunkData().getBlockEntities(packet.getX(), packet.getZ())); + chunk.loadFromPacket(packet.getChunkData().getSectionsDataBuf(), new NbtCompound(), packet.getChunkData().getBlockEntities(packet.getChunkX(), packet.getChunkZ())); } catch (ArrayIndexOutOfBoundsException e) { return; } diff --git a/src/main/java/anticope/rejects/utils/accounts/CustomYggdrasilAccount.java b/src/main/java/anticope/rejects/utils/accounts/CustomYggdrasilAccount.java index 628aa67d..83caa473 100644 --- a/src/main/java/anticope/rejects/utils/accounts/CustomYggdrasilAccount.java +++ b/src/main/java/anticope/rejects/utils/accounts/CustomYggdrasilAccount.java @@ -7,7 +7,7 @@ import meteordevelopment.meteorclient.systems.accounts.Account; import meteordevelopment.meteorclient.systems.accounts.AccountType; import meteordevelopment.meteorclient.utils.misc.NbtException; -import net.minecraft.client.util.Session; +import net.minecraft.client.session.Session; import net.minecraft.nbt.NbtCompound; import static meteordevelopment.meteorclient.MeteorClient.mc; @@ -27,7 +27,7 @@ public boolean fetchInfo() { Session session = CustomYggdrasilLogin.login(name, password, server); cache.username = session.getUsername(); - cache.uuid = session.getUuid(); + cache.uuid = session.getUuidOrNull().toString(); return true; } catch (AuthenticationException e) { diff --git a/src/main/java/anticope/rejects/utils/accounts/CustomYggdrasilLogin.java b/src/main/java/anticope/rejects/utils/accounts/CustomYggdrasilLogin.java index 7602726d..9845a826 100644 --- a/src/main/java/anticope/rejects/utils/accounts/CustomYggdrasilLogin.java +++ b/src/main/java/anticope/rejects/utils/accounts/CustomYggdrasilLogin.java @@ -15,7 +15,7 @@ import com.mojang.authlib.yggdrasil.response.MinecraftTexturesPayload; import com.mojang.util.UUIDTypeAdapter; import meteordevelopment.meteorclient.utils.network.Http; -import net.minecraft.client.util.Session; +import net.minecraft.client.session.Session; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -28,7 +28,11 @@ import java.security.spec.X509EncodedKeySpec; import java.util.*; +import static meteordevelopment.meteorclient.MeteorClient.mc; + public class CustomYggdrasilLogin { + public static Environment localYggdrasilApi = new Environment("/api", "/sessionserver", "/minecraftservices", "Custom-Yggdrasil"); + public static Session login(String name, String password, String server) throws AuthenticationException { try { String url = server + "/authserver/authenticate"; @@ -47,7 +51,7 @@ public static Session login(String name, String password, String server) throws throw new AuthenticationException(json.get("errorMessage").getAsString()); } String token = json.get("accessToken").getAsString(); - String uuid = json.get("selectedProfile").getAsJsonObject().get("id").getAsString(); + UUID uuid = UUID.fromString(json.get("selectedProfile").getAsJsonObject().get("id").getAsString()); String username = json.get("selectedProfile").getAsJsonObject().get("name").getAsString(); return new Session(username, uuid, token, Optional.empty(), Optional.empty(), Session.AccountType.MOJANG); } catch (Exception e) { @@ -55,57 +59,13 @@ public static Session login(String name, String password, String server) throws } } - public static class LocalYggdrasilApi implements Environment { - private final String url; - - public LocalYggdrasilApi(String serverUrl) { - this.url = serverUrl; - } - - @Override - public String getAuthHost() { - return url + "/authserver"; - } - - @Override - public String getAccountsHost() { - return url + "/api"; - } - - @Override - public String getSessionHost() { - return url + "/sessionserver"; - } - - @Override - public String getServicesHost() { - return url + "/minecraftservices"; - } - - @Override - public String getName() { - return "Custom-Yggdrasil"; - } - - @Override - public String asString() { - return new StringJoiner(", ", "", "") - .add("authHost='" + getAuthHost() + "'") - .add("accountsHost='" + getAccountsHost() + "'") - .add("sessionHost='" + getSessionHost() + "'") - .add("servicesHost='" + getServicesHost() + "'") - .add("name='" + getName() + "'") - .toString(); - } - } - public static class LocalYggdrasilMinecraftSessionService extends YggdrasilMinecraftSessionService { private static final Logger LOGGER = LogManager.getLogger(); private final PublicKey publicKey; private final Gson gson = new GsonBuilder().registerTypeAdapter(UUID.class, new UUIDTypeAdapter()).create(); public LocalYggdrasilMinecraftSessionService(YggdrasilAuthenticationService service, String serverUrl) { - super(service, new LocalYggdrasilApi(serverUrl)); + super(service.getServicesKeySet(), mc.getNetworkProxy(), localYggdrasilApi); String data = Http.get(serverUrl).sendString(); JsonObject json = JsonParser.parseString(data).getAsJsonObject(); this.publicKey = getPublicKey(json.get("signaturePublickey").getAsString()); @@ -144,17 +104,17 @@ public Map getTextures(fi final MinecraftTexturesPayload result; try { - final String json = new String(org.apache.commons.codec.binary.Base64.decodeBase64(textureProperty.getValue()), StandardCharsets.UTF_8); + final String json = new String(org.apache.commons.codec.binary.Base64.decodeBase64(textureProperty.value()), StandardCharsets.UTF_8); result = gson.fromJson(json, MinecraftTexturesPayload.class); } catch (final JsonParseException e) { LOGGER.error("Could not decode textures payload", e); return new HashMap<>(); } - if (result == null || result.getTextures() == null) + if (result == null || result.textures() == null) return new HashMap<>(); - return result.getTextures(); + return result.textures(); } } @@ -162,7 +122,7 @@ public static class LocalYggdrasilAuthenticationService extends YggdrasilAuthent public final String server; public LocalYggdrasilAuthenticationService(Proxy proxy, String server) { - super(proxy, new LocalYggdrasilApi(server)); + super(proxy, localYggdrasilApi); this.server = server; } } diff --git a/src/main/java/anticope/rejects/utils/server/LegacyServerPinger.java b/src/main/java/anticope/rejects/utils/server/LegacyServerPinger.java index 2f68c8a1..d6e1daa1 100644 --- a/src/main/java/anticope/rejects/utils/server/LegacyServerPinger.java +++ b/src/main/java/anticope/rejects/utils/server/LegacyServerPinger.java @@ -18,7 +18,7 @@ public void ping(String ip) { } public void ping(String ip, int port) { - server = new ServerInfo("", ip + ":" + port, false); + server = new ServerInfo("", ip + ":" + port, ServerInfo.ServerType.OTHER); new Thread(() -> pingInCurrentThread(ip, port), "Server Pinger #" + threadNumber.incrementAndGet()).start(); diff --git a/src/main/java/anticope/rejects/utils/server/ServerListPinger.java b/src/main/java/anticope/rejects/utils/server/ServerListPinger.java index a99152b4..ffc7df80 100644 --- a/src/main/java/anticope/rejects/utils/server/ServerListPinger.java +++ b/src/main/java/anticope/rejects/utils/server/ServerListPinger.java @@ -16,12 +16,13 @@ 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.QueryPongS2CPacket; +import net.minecraft.network.packet.s2c.query.PingResultS2CPacket; 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 org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -74,13 +75,13 @@ public void run() { notifyDisconnectListeners(); } }, 20000); - final ClientConnection clientConnection = ClientConnection.connect(new InetSocketAddress(InetAddress.getByName(serverAddress.getAddress()), serverAddress.getPort()), false); + final ClientConnection clientConnection = ClientConnection.connect(new InetSocketAddress(InetAddress.getByName(serverAddress.getAddress()), serverAddress.getPort()), false, (PerformanceLog) null); failedToConnect = false; this.clientConnections.add(clientConnection); entry.label = "multiplayer.status.pinging"; entry.ping = -1L; entry.playerListSummary = null; - clientConnection.setPacketListener(new ClientQueryPacketListener() { + ClientQueryPacketListener clientQueryPacketListener = new ClientQueryPacketListener() { private boolean sentQuery; private boolean received; private long startTime; @@ -135,7 +136,7 @@ public void onResponse(QueryResponseS2CPacket packet) { } } - public void onPong(QueryPongS2CPacket packet) { + public void onPingResult(PingResultS2CPacket packet) { long l = this.startTime; long m = Util.getMeasuringTimeMs(); entry.ping = m - l; @@ -157,10 +158,12 @@ public void onDisconnected(Text reason) { public boolean isConnectionOpen() { return clientConnection.isOpen(); } - }); + }; + + clientConnection.setPacketListener(clientQueryPacketListener); try { - clientConnection.send(new HandshakeC2SPacket(serverAddress.getAddress(), serverAddress.getPort(), NetworkState.STATUS)); + clientConnection.connect(serverAddress.getAddress(), serverAddress.getPort(), clientQueryPacketListener); clientConnection.send(new QueryRequestC2SPacket()); } catch (Throwable var8) { LOGGER.error("Failed to ping server {}", serverAddress, var8); diff --git a/src/main/resources/meteor-rejects.mixins.json b/src/main/resources/meteor-rejects.mixins.json index dfb50dbf..a349ba07 100644 --- a/src/main/resources/meteor-rejects.mixins.json +++ b/src/main/resources/meteor-rejects.mixins.json @@ -3,6 +3,7 @@ "package": "anticope.rejects.mixin", "compatibilityLevel": "JAVA_16", "client": [ + "ClientCommonNetwokHandlerMixin", "ClientPlayerInteractionManagerMixin", "ClientPlayNetworkHandlerMixin", "CommandSuggestorMixin", From fb2be95eb57e97833c452aeb13d9fa5828121542 Mon Sep 17 00:00:00 2001 From: Spongecade Date: Thu, 5 Oct 2023 16:05:09 -0500 Subject: [PATCH 02/26] Update Minecraft wiki link to new domain --- src/main/java/anticope/rejects/utils/seeds/Seeds.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/anticope/rejects/utils/seeds/Seeds.java b/src/main/java/anticope/rejects/utils/seeds/Seeds.java index 6e6ca616..4f561122 100644 --- a/src/main/java/anticope/rejects/utils/seeds/Seeds.java +++ b/src/main/java/anticope/rejects/utils/seeds/Seeds.java @@ -88,7 +88,7 @@ public Seeds fromTag(NbtCompound tag) { return this; } - // https://minecraft.fandom.com/wiki/Seed_(level_generation)#Java_Edition + // https://minecraft.wiki/w/Seed_(level_generation)#Java_Edition private static long toSeed(String inSeed) { try { return Long.parseLong(inSeed); From 1446d6e636bec17ace323cdfcf99beb1430a7d57 Mon Sep 17 00:00:00 2001 From: misterx Date: Fri, 17 Nov 2023 22:02:08 +0100 Subject: [PATCH 03/26] Oresim update --- .../mixin/CountPlacementModifierAccessor.java | 12 + .../rejects/mixin/HeightContextMixin.java | 22 ++ .../HeightRangePlacementModifierAccessor.java | 13 + ...RarityFilterPlacementModifierAccessor.java | 11 + .../java/anticope/rejects/modules/OreSim.java | 192 +++++------ src/main/java/anticope/rejects/utils/Ore.java | 324 +++++++----------- src/main/resources/meteor-rejects.mixins.json | 4 + 7 files changed, 288 insertions(+), 290 deletions(-) create mode 100644 src/main/java/anticope/rejects/mixin/CountPlacementModifierAccessor.java create mode 100644 src/main/java/anticope/rejects/mixin/HeightContextMixin.java create mode 100644 src/main/java/anticope/rejects/mixin/HeightRangePlacementModifierAccessor.java create mode 100644 src/main/java/anticope/rejects/mixin/RarityFilterPlacementModifierAccessor.java diff --git a/src/main/java/anticope/rejects/mixin/CountPlacementModifierAccessor.java b/src/main/java/anticope/rejects/mixin/CountPlacementModifierAccessor.java new file mode 100644 index 00000000..02cb6d46 --- /dev/null +++ b/src/main/java/anticope/rejects/mixin/CountPlacementModifierAccessor.java @@ -0,0 +1,12 @@ +package anticope.rejects.mixin; + +import net.minecraft.util.math.intprovider.IntProvider; +import net.minecraft.world.gen.placementmodifier.CountPlacementModifier; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(CountPlacementModifier.class) +public interface CountPlacementModifierAccessor { + @Accessor + IntProvider getCount(); +} diff --git a/src/main/java/anticope/rejects/mixin/HeightContextMixin.java b/src/main/java/anticope/rejects/mixin/HeightContextMixin.java new file mode 100644 index 00000000..18a50726 --- /dev/null +++ b/src/main/java/anticope/rejects/mixin/HeightContextMixin.java @@ -0,0 +1,22 @@ +package anticope.rejects.mixin; + +import net.minecraft.world.gen.HeightContext; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(HeightContext.class) +public abstract class HeightContextMixin { + + @Redirect(method = "", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/gen/chunk/ChunkGenerator;getMinimumY()I")) + private int onMinY(ChunkGenerator instance) { + return instance == null ? -9999999 : instance.getMinimumY(); + } + + + @Redirect(method = "", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/gen/chunk/ChunkGenerator;getWorldHeight()I")) + private int onHeight(ChunkGenerator instance) { + return instance == null ? 100000000 : instance.getWorldHeight(); + } +} diff --git a/src/main/java/anticope/rejects/mixin/HeightRangePlacementModifierAccessor.java b/src/main/java/anticope/rejects/mixin/HeightRangePlacementModifierAccessor.java new file mode 100644 index 00000000..fe261f7c --- /dev/null +++ b/src/main/java/anticope/rejects/mixin/HeightRangePlacementModifierAccessor.java @@ -0,0 +1,13 @@ +package anticope.rejects.mixin; + +import net.minecraft.world.gen.heightprovider.HeightProvider; +import net.minecraft.world.gen.placementmodifier.HeightRangePlacementModifier; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(HeightRangePlacementModifier.class) +public interface HeightRangePlacementModifierAccessor { + + @Accessor + HeightProvider getHeight(); +} diff --git a/src/main/java/anticope/rejects/mixin/RarityFilterPlacementModifierAccessor.java b/src/main/java/anticope/rejects/mixin/RarityFilterPlacementModifierAccessor.java new file mode 100644 index 00000000..43537958 --- /dev/null +++ b/src/main/java/anticope/rejects/mixin/RarityFilterPlacementModifierAccessor.java @@ -0,0 +1,11 @@ +package anticope.rejects.mixin; + +import net.minecraft.world.gen.placementmodifier.RarityFilterPlacementModifier; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(RarityFilterPlacementModifier.class) +public interface RarityFilterPlacementModifierAccessor { + @Accessor + int getChance(); +} diff --git a/src/main/java/anticope/rejects/modules/OreSim.java b/src/main/java/anticope/rejects/modules/OreSim.java index c62e3be6..3d0bbd24 100755 --- a/src/main/java/anticope/rejects/modules/OreSim.java +++ b/src/main/java/anticope/rejects/modules/OreSim.java @@ -7,29 +7,35 @@ import anticope.rejects.utils.seeds.Seed; import anticope.rejects.utils.seeds.Seeds; import baritone.api.BaritoneAPI; -import com.seedfinding.mccore.version.MCVersion; import meteordevelopment.meteorclient.events.render.Render3DEvent; import meteordevelopment.meteorclient.events.world.ChunkDataEvent; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Module; +import meteordevelopment.meteorclient.utils.player.PlayerUtils; import meteordevelopment.orbit.EventHandler; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; import net.minecraft.client.world.ClientWorld; -import net.minecraft.registry.RegistryKeys; -import net.minecraft.util.Identifier; +import net.minecraft.registry.RegistryKey; import net.minecraft.util.math.*; import net.minecraft.util.math.random.ChunkRandom; import net.minecraft.world.Heightmap; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.chunk.ChunkSection; import net.minecraft.world.chunk.ChunkStatus; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; public class OreSim extends Module { - private final HashMap>> chunkRenderers = new HashMap<>(); + private final Map>> chunkRenderers = new ConcurrentHashMap<>(); private Seed worldSeed = null; - private List oreConfig; - public ArrayList oreGoals = new ArrayList<>(); + private Map, List> oreConfig; + public List oreGoals = new ArrayList<>(); private ChunkPos prevOffset = new ChunkPos(0, 0); public enum AirCheck { @@ -97,16 +103,15 @@ private void onRender(Render3DEvent event) { } private void renderChunk(int x, int z, Render3DEvent event) { - long chunkKey = (long) x + ((long) z << 32); + long chunkKey = ChunkPos.toLong(x,z); if (chunkRenderers.containsKey(chunkKey)) { - for (Ore ore : oreConfig) { - if (ore.enabled.get()) { - if (!chunkRenderers.get(chunkKey).containsKey(ore)) { - continue; - } - for (Vec3d pos : chunkRenderers.get(chunkKey).get(ore)) { - event.renderer.boxLines(pos.x, pos.y, pos.z, pos.x + 1, pos.y + 1, pos.z + 1, ore.color, 0); + Map> chunk = chunkRenderers.get(chunkKey); + + for (Map.Entry> oreRenders : chunk.entrySet()) { + if (oreRenders.getKey().active.get()) { + for (Vec3d pos : oreRenders.getValue()) { + event.renderer.boxLines(pos.x, pos.y, pos.z, pos.x + 1, pos.y + 1, pos.z + 1, oreRenders.getKey().color, 0); } } } @@ -118,8 +123,8 @@ private void onTick(TickEvent.Pre event) { if (mc.player == null || mc.world == null || oreConfig == null) return; if (airCheck.get() == AirCheck.RECHECK) { - long chunkX = mc.player.getChunkPos().x; - long chunkZ = mc.player.getChunkPos().z; + int chunkX = mc.player.getChunkPos().x; + int chunkZ = mc.player.getChunkPos().z; ClientWorld world = mc.world; int renderdistance = mc.options.getViewDistance().getValue(); @@ -128,20 +133,27 @@ private void onTick(TickEvent.Pre event) { loop: while (true) { - for (long offsetX = prevOffset.x; offsetX <= renderdistance; offsetX++) { - for (long offsetZ = prevOffset.z; offsetZ <= renderdistance; offsetZ++) { - prevOffset = new ChunkPos((int) offsetX, (int) offsetZ); + for (int offsetX = prevOffset.x; offsetX <= renderdistance; offsetX++) { + for (int offsetZ = prevOffset.z; offsetZ <= renderdistance; offsetZ++) { + prevOffset = new ChunkPos(offsetX, offsetZ); if (chunkCounter <= 0) { break loop; } - long chunkKey = (chunkX + offsetX) + ((chunkZ + offsetZ) << 32); - - if (chunkRenderers.containsKey(chunkKey)) { - chunkRenderers.get(chunkKey).values().forEach(oreSet -> oreSet.removeIf(ore -> !world.getBlockState(new BlockPos((int) ore.x, (int) ore.y, (int) ore.z)).isOpaque())); + long chunkKey = ChunkPos.toLong(chunkX + offsetX, chunkZ + offsetZ); + + Chunk chunk = world.getChunk(chunkX + offsetX, chunkZ + offsetZ, ChunkStatus.FULL, false); + if (chunk != null && chunkRenderers.containsKey(chunkKey)) { + chunkRenderers.get(chunkKey).values().forEach(oreSet -> + oreSet.removeIf(ore -> { + BlockState state = world.getBlockState(new BlockPos((int) ore.x, (int) ore.y, (int) ore.z)); + return state.isOpaque() && !state.isOf(Blocks.VOID_AIR); + }) + ); } + chunkCounter--; } - prevOffset = new ChunkPos((int) offsetX, -renderdistance); + prevOffset = new ChunkPos(offsetX, -renderdistance); } prevOffset = new ChunkPos(-renderdistance, -renderdistance); } @@ -164,18 +176,15 @@ private void onTick(TickEvent.Pre event) { private ArrayList addToBaritone(int chunkX, int chunkZ) { ArrayList baritoneGoals = new ArrayList<>(); - long chunkKey = (long) chunkX + ((long) chunkZ << 32); - if (!this.chunkRenderers.containsKey(chunkKey)) { - return baritoneGoals; - } else { - this.oreConfig.stream().filter((config) -> config.enabled.get()).forEach((ore) -> chunkRenderers - .get(chunkKey) - .getOrDefault(ore, new HashSet<>()) - .stream() + long chunkKey = ChunkPos.toLong(chunkX, chunkZ); + if (this.chunkRenderers.containsKey(chunkKey)) { + this.chunkRenderers.get(chunkKey).entrySet().stream() + .filter(entry -> entry.getKey().active.get()) + .flatMap(entry -> entry.getValue().stream()) .map(BlockPos::ofFloored) - .forEach(baritoneGoals::add)); - return baritoneGoals; + .forEach(baritoneGoals::add); } + return baritoneGoals; } @Override @@ -187,6 +196,12 @@ public void onActivate() { reload(); } + @Override + public void onDeactivate() { + this.chunkRenderers.clear(); + this.oreConfig.clear(); + } + @EventHandler private void onSeedChanged(SeedChangedEvent event) { reload(); @@ -198,7 +213,7 @@ private void onPlayerRespawn(PlayerRespawnEvent event) { } private void loadVisibleChunks() { - int renderdistance = mc.options.getViewDistance().getValue(); + int renderdistance = mc.options.getViewDistance().getValue()+2; if (mc.player == null) { return; @@ -217,12 +232,7 @@ private void reload() { Seed seed = Seeds.get().getSeed(); if (seed == null) return; worldSeed = seed; - oreConfig = Ore.getConfig(Seeds.get().getSeed().version); - if (oreConfig == null) { - error("Ore Sim only works with seeds from version 1.14 or higher. (Current seed is from version " + Seeds.get().getSeed().version.toString() + ")"); - this.toggle(); - return; - } + oreConfig = Ore.getRegistry(PlayerUtils.getDimension()); chunkRenderers.clear(); if (mc.world != null && worldSeed != null) { @@ -236,7 +246,8 @@ public void onChunkData(ChunkDataEvent event) { } private void doMathOnChunk(int chunkX, int chunkZ) { - long chunkKey = (long) chunkX + ((long) chunkZ << 32); + var chunkPos = new ChunkPos(chunkX, chunkZ); + long chunkKey = chunkPos.toLong(); ClientWorld world = mc.world; @@ -244,84 +255,59 @@ private void doMathOnChunk(int chunkX, int chunkZ) { return; } - if (world.getChunkManager().getChunk(chunkX, chunkZ, ChunkStatus.FULL, false) == null) { + Chunk chunk = world.getChunk(chunkX, chunkZ, ChunkStatus.FULL, false); + + if (chunk == null) { return; } - chunkX = chunkX << 4; - chunkZ = chunkZ << 4; - - - ChunkRandom random = new ChunkRandom(ChunkRandom.RandomProvider.LEGACY.create(0)); + Set> biomes = new HashSet<>(); + ChunkPos.stream(chunkPos, 1).forEach(chunkPosx -> { + Chunk chunkxx = world.getChunk(chunkPosx.x, chunkPosx.z, ChunkStatus.BIOMES, false); + if (chunkxx == null) return; - if (worldSeed.version.isNewerOrEqualTo(MCVersion.v1_18)) { //1.18 and above - random = new ChunkRandom(ChunkRandom.RandomProvider.XOROSHIRO.create(0)); - } + for(ChunkSection chunkSection : chunkxx.getSectionArray()) { + chunkSection.getBiomeContainer().forEachValue(entry -> biomes.add(entry.getKey().get())); + } + }); + Set oreSet = biomes.stream().flatMap(b -> getDefaultOres(b).stream()).collect(Collectors.toSet()); - HashMap> h = new HashMap<>(); + chunkX = chunkX << 4; + chunkZ = chunkZ << 4; + ChunkRandom random = new ChunkRandom(ChunkRandom.RandomProvider.XOROSHIRO.create(0)); long populationSeed = random.setPopulationSeed(worldSeed.seed, chunkX, chunkZ); + HashMap> h = new HashMap<>(); - var optional = world.getBiomeAccess().getBiomeForNoiseGen(new BlockPos(chunkX, 0, chunkZ)).getKeyOrValue(); - Identifier id = (optional.right().isPresent()) ? world.getRegistryManager().get(RegistryKeys.BIOME).getId(optional.right().get()) : optional.left().get().getValue(); - if (id == null) { - error("Something went wrong, you may have some mods that mess with world generation"); - toggle(); - return; - } - String biomeName = id.getPath(); - Identifier dimensionName = world.getDimension().effects(); - - for (Ore ore : oreConfig) { - - if (!dimensionName.getPath().equals(ore.dimension.getPath())) { - continue; - } + for (Ore ore : oreSet) { HashSet ores = new HashSet<>(); - int index; - if (ore.index.containsKey(biomeName)) { - index = ore.index.get(biomeName); - } else { - index = ore.index.get("default"); - } - if (index < 0) { - continue; - } - - random.setDecoratorSeed(populationSeed, index, ore.step); + random.setDecoratorSeed(populationSeed, ore.index, ore.step); int repeat = ore.count.get(random); for (int i = 0; i < repeat; i++) { - if (ore.chance != 1F && random.nextFloat() >= ore.chance) { + if (ore.rarity != 1F && random.nextFloat() >= ore.rarity) { continue; } int x = random.nextInt(16) + chunkX; - int z; - int y; - if (worldSeed.version.isBetween(MCVersion.v1_14, MCVersion.v1_14_4)) { - y = ore.depthAverage ? random.nextInt(ore.maxY) + random.nextInt(ore.maxY) - ore.maxY : random.nextInt(ore.maxY - ore.minY); - z = random.nextInt(16) + chunkZ; - } else { - z = random.nextInt(16) + chunkZ; - y = ore.depthAverage ? random.nextInt(ore.maxY) + random.nextInt(ore.maxY) - ore.maxY : random.nextInt(ore.maxY - ore.minY); + int z = random.nextInt(16) + chunkZ; + int y = ore.heightProvider.get(random, ore.heightContext); + BlockPos origin = new BlockPos(x,y,z); + + RegistryKey biome = chunk.getBiomeForNoiseGen(x,y,z).getKey().get(); + + if (!getDefaultOres(biome).contains(ore)) { + continue; } - y += ore.minY; - - switch (ore.generator) { - case DEFAULT -> - ores.addAll(generateNormal(world, random, new BlockPos(x, y, z), ore.size, ore.discardOnAir)); - case EMERALD -> { - if (airCheck.get() == AirCheck.OFF || world.getBlockState(new BlockPos(x, y, z)).isOpaque()) { - ores.add(new Vec3d(x, y, z)); - } - } - case NO_SURFACE -> ores.addAll(generateHidden(world, random, new BlockPos(x, y, z), ore.size)); - default -> System.out.println(ore.type + " has some unknown generator. Fix it!"); + + if (ore.scattered) { + ores.addAll(generateHidden(world, random, origin, ore.size)); + } else { + ores.addAll(generateNormal(world, random, origin, ore.size, ore.discardOnAirChance)); } } if (!ores.isEmpty()) { @@ -331,6 +317,14 @@ private void doMathOnChunk(int chunkX, int chunkZ) { chunkRenderers.put(chunkKey, h); } + private List getDefaultOres(RegistryKey biomeRegistryKey) { + if (oreConfig.containsKey(biomeRegistryKey)) { + return oreConfig.get(biomeRegistryKey); + } else { + return this.oreConfig.values().stream().findAny().get(); + } + } + // ==================================== // Mojang code // ==================================== diff --git a/src/main/java/anticope/rejects/utils/Ore.java b/src/main/java/anticope/rejects/utils/Ore.java index d2ef6265..762679bb 100755 --- a/src/main/java/anticope/rejects/utils/Ore.java +++ b/src/main/java/anticope/rejects/utils/Ore.java @@ -1,16 +1,36 @@ package anticope.rejects.utils; +import anticope.rejects.mixin.CountPlacementModifierAccessor; +import anticope.rejects.mixin.HeightRangePlacementModifierAccessor; +import anticope.rejects.mixin.RarityFilterPlacementModifierAccessor; import meteordevelopment.meteorclient.settings.BoolSetting; import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.utils.render.color.Color; -import com.seedfinding.mccore.version.MCVersion; -import net.minecraft.util.Identifier; +import meteordevelopment.meteorclient.utils.world.Dimension; +import net.minecraft.client.MinecraftClient; +import net.minecraft.registry.*; +import net.minecraft.registry.entry.RegistryEntry; + +import net.minecraft.registry.entry.RegistryEntryList; import net.minecraft.util.math.intprovider.ConstantIntProvider; import net.minecraft.util.math.intprovider.IntProvider; -import net.minecraft.util.math.intprovider.UniformIntProvider; -import net.minecraft.world.dimension.DimensionTypes; + +import net.minecraft.world.HeightLimitView; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.dimension.DimensionOptions; +import net.minecraft.world.gen.HeightContext; +import net.minecraft.world.gen.WorldPresets; +import net.minecraft.world.gen.feature.*; +import net.minecraft.world.gen.feature.util.PlacedFeatureIndexer; +import net.minecraft.world.gen.heightprovider.HeightProvider; +import net.minecraft.world.gen.placementmodifier.CountPlacementModifier; +import net.minecraft.world.gen.placementmodifier.HeightRangePlacementModifier; +import net.minecraft.world.gen.placementmodifier.PlacementModifier; +import net.minecraft.world.gen.placementmodifier.RarityFilterPlacementModifier; + import java.util.*; + public class Ore { private static final Setting coal = new BoolSetting.Builder().name("Coal").build(); @@ -24,210 +44,132 @@ public class Ore { private static final Setting quartz = new BoolSetting.Builder().name("Quartz").build(); private static final Setting debris = new BoolSetting.Builder().name("Ancient Debris").build(); public static final List> oreSettings = new ArrayList<>(Arrays.asList(coal, iron, gold, redstone, diamond, lapis, copper, emerald, quartz, debris)); - public final Type type; - public final Identifier dimension; - public final Map index; - public final boolean depthAverage; - public final Generator generator; - public final int size; - public final Setting enabled; - public final Color color; - public int step; - public IntProvider count; - public int minY; - public int maxY; - public float discardOnAir; - public float chance; - - Ore(Type type, Identifier dimension, Map index, int step, IntProvider count, float chance, boolean depthAverage, int minY, int maxY, Generator generator, int size, float discardOnAir, Setting enabled, Color color) { - this.type = type; - this.dimension = dimension; - this.index = index; - this.step = step; - this.count = count; - this.depthAverage = depthAverage; - this.minY = minY; - this.maxY = maxY; - this.generator = generator; - this.size = size; - this.enabled = enabled; - this.color = color; - this.discardOnAir = discardOnAir; - this.chance = chance; - } - - Ore(Type type, Identifier dimension, int index, int step, IntProvider count, float chance, boolean depthAverage, int minY, int maxY, Generator generator, int size, float discardOnAir, Setting enabled, Color color) { - this(type, dimension, indexToMap(index), step, count, chance, depthAverage, minY, maxY, generator, size, discardOnAir, enabled, color); - } - Ore(Type type, Identifier dimension, int index, int step, IntProvider count, boolean depthAverage, int minY, int maxY, - @SuppressWarnings("SameParameterValue") Generator generator, int size, Setting enabled, Color color) { - this(type, dimension, indexToMap(index), step, count, 1F, depthAverage, minY, maxY, generator, size, 0F, enabled, color); + public static Map, List> getRegistry(Dimension dimension) { + + RegistryWrapper.WrapperLookup registry = BuiltinRegistries.createWrapperLookup(); + RegistryWrapper.Impl features = registry.getWrapperOrThrow(RegistryKeys.PLACED_FEATURE); + var reg = registry.getWrapperOrThrow(RegistryKeys.WORLD_PRESET).getOrThrow(WorldPresets.DEFAULT).value().createDimensionsRegistryHolder().dimensions(); + + var dim = switch (dimension) { + case Overworld -> reg.get(DimensionOptions.OVERWORLD); + case Nether -> reg.get(DimensionOptions.NETHER); + case End -> reg.get(DimensionOptions.END); + }; + + var biomes = dim.chunkGenerator().getBiomeSource().getBiomes(); + var biomes1 = biomes.stream().toList(); + + List indexer = PlacedFeatureIndexer.collectIndexedFeatures( + biomes1, biomeEntry -> biomeEntry.value().getGenerationSettings().getFeatures(), true + ); + + + Map featureToOre = new HashMap<>(); + registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_COAL_LOWER, 6, coal, new Color(47, 44, 54)); + registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_COAL_UPPER, 6, coal, new Color(47, 44, 54)); + registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_IRON_MIDDLE, 6, iron, new Color(236, 173, 119)); + registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_IRON_SMALL, 6, iron, new Color(236, 173, 119)); + registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_IRON_UPPER, 6, iron, new Color(236, 173, 119)); + registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_GOLD, 6, gold, new Color(247, 229, 30)); + registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_GOLD_LOWER, 6, gold, new Color(247, 229, 30)); + registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_GOLD_EXTRA, 6, gold, new Color(247, 229, 30)); + registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_GOLD_NETHER, 7, gold, new Color(247, 229, 30)); + registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_GOLD_DELTAS, 7, gold, new Color(247, 229, 30)); + registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_REDSTONE, 6, redstone, new Color(245, 7, 23)); + registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_REDSTONE_LOWER, 6, redstone, new Color(245, 7, 23)); + registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_DIAMOND, 6, diamond, new Color(33, 244, 255)); + registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_DIAMOND_BURIED, 6, diamond, new Color(33, 244, 255)); + registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_DIAMOND_LARGE, 6, diamond, new Color(33, 244, 255)); + registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_DIAMOND_MEDIUM, 6, diamond, new Color(33, 244, 255)); + registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_LAPIS, 6, lapis, new Color(8, 26, 189)); + registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_LAPIS_BURIED, 6, lapis, new Color(8, 26, 189)); + registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_COPPER, 6, copper, new Color(239, 151, 0)); + registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_COPPER_LARGE, 6, copper, new Color(239, 151, 0)); + registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_EMERALD, 6, emerald, new Color(27, 209, 45)); + registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_QUARTZ_NETHER, 7, quartz, new Color(205, 205, 205)); + registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_QUARTZ_DELTAS, 7, quartz, new Color(205, 205, 205)); + registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_DEBRIS_SMALL, 7, debris, new Color(209, 27, 245)); + registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_ANCIENT_DEBRIS_LARGE, 7, debris, new Color(209, 27, 245)); + + + Map, List> biomeOreMap = new HashMap<>(); + + biomes1.forEach(biome -> { + biomeOreMap.put(biome.getKey().get(), new ArrayList<>()); + biome.value().getGenerationSettings().getFeatures().stream() + .flatMap(RegistryEntryList::stream) + .map(RegistryEntry::value) + .filter(featureToOre::containsKey) + .forEach(feature -> { + biomeOreMap.get(biome.getKey().get()).add(featureToOre.get(feature)); + }); + }); + return biomeOreMap; } - Ore(Type type, Identifier dimension, Map index, int step, IntProvider count, boolean depthAverage, int minY, int maxY, - @SuppressWarnings("SameParameterValue") Generator generator, int size, Setting enabled, Color color) { - this(type, dimension, index, step, count, 1F, depthAverage, minY, maxY, generator, size, 0F, enabled, color); - } + private static void registerOre( + Map map, + List indexer, + RegistryWrapper.Impl oreRegistry, + RegistryKey oreKey, + int genStep, + Setting active, + Color color + ) { + var orePlacement = oreRegistry.getOrThrow(oreKey).value(); - private static HashMap indexToMap(int index) { - HashMap map = new HashMap<>(); - map.put("default", index); - return map; - } - - private static List V1_19() { - return V1_18(); - } + int index = indexer.get(genStep).indexMapping().applyAsInt(orePlacement); - private static List V1_18() { - List ores = new ArrayList<>(); + Ore ore = new Ore(orePlacement, genStep, index, active, color); - HashMap extraGoldIndex = new HashMap<>(); - extraGoldIndex.put("default", -1); - String[] extraGoldBiomes = new String[]{"badlands", "eroded_badlands", "wooded_badlands"}; - for (String extraGoldBiome : extraGoldBiomes) { - extraGoldIndex.put(extraGoldBiome, 27); - } - - HashMap emeraldIndex = new HashMap<>(); - emeraldIndex.put("default", -1); - String[] emeraldBiomes = new String[]{"windswept_hills", "meadow", "grove", "jagged_peaks", "snowy_slopes", "frozen_peaks", "stony_peaks"}; - for (String emeraldBiome : emeraldBiomes) { - emeraldIndex.put(emeraldBiome, 27); - } - - ores.add(new Ore(Type.COAL, DimensionTypes.OVERWORLD_ID, 9, 6, ConstantIntProvider.create(30), false, 136, 320, Generator.DEFAULT, 17, coal, new Color(47, 44, 54))); - ores.add(new Ore(Type.COAL, DimensionTypes.OVERWORLD_ID, 10, 6, ConstantIntProvider.create(20), 1F, true, 97, 97, Generator.DEFAULT, 17, 0.5F, coal, new Color(47, 44, 54))); - ores.add(new Ore(Type.IRON, DimensionTypes.OVERWORLD_ID, 11, 6, ConstantIntProvider.create(90), true, 233, 153, Generator.DEFAULT, 9, iron, new Color(236, 173, 119))); - ores.add(new Ore(Type.IRON, DimensionTypes.OVERWORLD_ID, 12, 6, ConstantIntProvider.create(10), true, 17, 41, Generator.DEFAULT, 9, iron, new Color(236, 173, 119))); - ores.add(new Ore(Type.IRON, DimensionTypes.OVERWORLD_ID, 13, 6, ConstantIntProvider.create(10), false, -64, 73, Generator.DEFAULT, 4, iron, new Color(236, 173, 119))); - ores.add(new Ore(Type.GOLD_EXTRA, DimensionTypes.OVERWORLD_ID, extraGoldIndex, 6, ConstantIntProvider.create(50), false, 32, 257, Generator.DEFAULT, 9, gold, new Color(247, 229, 30))); - ores.add(new Ore(Type.GOLD, DimensionTypes.OVERWORLD_ID, 14, 6, ConstantIntProvider.create(4), 1F, true, -15, 49, Generator.DEFAULT, 9, 0.5F, gold, new Color(247, 229, 30))); - ores.add(new Ore(Type.GOLD, DimensionTypes.OVERWORLD_ID, 15, 6, UniformIntProvider.create(0, 1), 1F, false, -64, -47, Generator.DEFAULT, 9, 0.5F, gold, new Color(247, 229, 30))); - ores.add(new Ore(Type.REDSTONE, DimensionTypes.OVERWORLD_ID, 16, 6, ConstantIntProvider.create(4), false, -64, 16, Generator.DEFAULT, 8, redstone, new Color(245, 7, 23))); - ores.add(new Ore(Type.REDSTONE, DimensionTypes.OVERWORLD_ID, 17, 6, ConstantIntProvider.create(8), true, -63, 33, Generator.DEFAULT, 8, redstone, new Color(245, 7, 23))); - ores.add(new Ore(Type.DIAMOND, DimensionTypes.OVERWORLD_ID, 18, 6, ConstantIntProvider.create(7), 1F, true, -63, 81, Generator.DEFAULT, 4, 0.5F, diamond, new Color(33, 244, 255))); - ores.add(new Ore(Type.DIAMOND, DimensionTypes.OVERWORLD_ID, 19, 6, ConstantIntProvider.create(1), (1F / 9F), true, -63, 81, Generator.DEFAULT, 12, 0.7F, diamond, new Color(33, 244, 255))); - ores.add(new Ore(Type.DIAMOND, DimensionTypes.OVERWORLD_ID, 20, 6, ConstantIntProvider.create(4), 1F, true, -63, 81, Generator.DEFAULT, 8, 1F, diamond, new Color(33, 244, 255))); - ores.add(new Ore(Type.LAPIS, DimensionTypes.OVERWORLD_ID, 21, 6, ConstantIntProvider.create(2), true, 1, 33, Generator.DEFAULT, 7, lapis, new Color(8, 26, 189))); - ores.add(new Ore(Type.LAPIS, DimensionTypes.OVERWORLD_ID, 22, 6, ConstantIntProvider.create(4), 1F, false, -64, 65, Generator.DEFAULT, 7, 1F, lapis, new Color(8, 26, 189))); - ores.add(new Ore(Type.EMERALD, DimensionTypes.OVERWORLD_ID, emeraldIndex, 6, ConstantIntProvider.create(100), true, 233, 249, Generator.DEFAULT, 3, emerald, new Color(27, 209, 45))); - //This only generates near dripstone caves. I'll need propper biome detection to get this right - //ores.add(new Ore(Type.COPPER, "overworld", 23, 6, ConstantIntProvider.create(16), true, 49, 65, Generator.DEFAULT, 20, copper, new Color(239, 151, 0))); - ores.add(new Ore(Type.COPPER, DimensionTypes.OVERWORLD_ID, 24, 6, ConstantIntProvider.create(16), true, 49, 65, Generator.DEFAULT, 10, copper, new Color(239, 151, 0))); - ores.add(new Ore(Type.GOLD_NETHER, DimensionTypes.THE_NETHER_ID, Map.of("default", 19, "basalt_deltas", -1), 7, ConstantIntProvider.create(10), false, 10, 118, Generator.DEFAULT, 10, gold, new Color(247, 229, 30))); - ores.add(new Ore(Type.QUARTZ, DimensionTypes.THE_NETHER_ID, Map.of("default", 20, "basalt_deltas", -1), 7, ConstantIntProvider.create(16), false, 10, 118, Generator.DEFAULT, 14, quartz, new Color(205, 205, 205))); - ores.add(new Ore(Type.GOLD_NETHER, DimensionTypes.THE_NETHER_ID, Map.of("default", -1, "basalt_deltas", 13), 7, ConstantIntProvider.create(20), false, 10, 118, Generator.DEFAULT, 10, gold, new Color(247, 229, 30))); - ores.add(new Ore(Type.QUARTZ, DimensionTypes.THE_NETHER_ID, Map.of("default", -1, "basalt_deltas", 14), 7, ConstantIntProvider.create(32), false, 10, 118, Generator.DEFAULT, 14, quartz, new Color(205, 205, 205))); - ores.add(new Ore(Type.LDEBRIS, DimensionTypes.THE_NETHER_ID, 21, 7, ConstantIntProvider.create(1), true, 17, 9, Generator.NO_SURFACE, 3, debris, new Color(209, 27, 245))); - ores.add(new Ore(Type.SDEBRIS, DimensionTypes.THE_NETHER_ID, 22, 7, ConstantIntProvider.create(1), false, 8, 120, Generator.NO_SURFACE, 2, debris, new Color(209, 27, 245))); - return ores; + map.put(orePlacement, ore); } - private static List baseConfig() { - List ores = new ArrayList<>(); - HashMap emeraldIndexes = new HashMap<>(); - emeraldIndexes.put("default", -1); - String[] emeraldBiomes = new String[]{"mountains", "mountain_edge", "wooded_mountains", "gravelly_mountains", "modified_gravelly_mountains", "paper"}; - for (String emeraldBiome : emeraldBiomes) { - emeraldIndexes.put(emeraldBiome, 17); - } - HashMap LDebrisIndexes = new HashMap<>(); - LDebrisIndexes.put("default", 15); - LDebrisIndexes.put("crimson_forest", 12); - LDebrisIndexes.put("warped_forest", 13); - HashMap SDebrisIndexes = new HashMap<>(); - LDebrisIndexes.forEach((biome, index) -> SDebrisIndexes.put(biome, index + 1)); - HashMap extraGoldIndexes = new HashMap<>(); - extraGoldIndexes.put("default", -1); - String[] extraGoldBiomes = new String[]{"badlands", "badlands_plateau", "modified_badlands_plateau", "wooded_badlands_plateau", "modified_wooded_badlands_plateau", "eroded_badlands", "paper"}; - for (String extraGoldBiome : extraGoldBiomes) { - extraGoldIndexes.put(extraGoldBiome, 14); - } - ores.add(new Ore(Type.COAL, DimensionTypes.OVERWORLD_ID, 7, 6, ConstantIntProvider.create(20), false, 0, 128, Generator.DEFAULT, 20, coal, new Color(47, 44, 54))); - ores.add(new Ore(Type.IRON,DimensionTypes.OVERWORLD_ID, 8, 6, ConstantIntProvider.create(20), false, 0, 64, Generator.DEFAULT, 9, iron, new Color(236, 173, 119))); - ores.add(new Ore(Type.GOLD, DimensionTypes.OVERWORLD_ID, 9, 6, ConstantIntProvider.create(2), false, 0, 32, Generator.DEFAULT, 9, gold, new Color(247, 229, 30))); - ores.add(new Ore(Type.REDSTONE, DimensionTypes.OVERWORLD_ID, 10, 6, ConstantIntProvider.create(8), false, 0, 16, Generator.DEFAULT, 8, redstone, new Color(245, 7, 23))); - ores.add(new Ore(Type.DIAMOND, DimensionTypes.OVERWORLD_ID, 11, 6, ConstantIntProvider.create(1), false, 0, 16, Generator.DEFAULT, 8, diamond, new Color(33, 244, 255))); - ores.add(new Ore(Type.LAPIS, DimensionTypes.OVERWORLD_ID, 12, 6, ConstantIntProvider.create(1), true, 16, 16, Generator.DEFAULT, 7, lapis, new Color(8, 26, 189))); - ores.add(new Ore(Type.COPPER, DimensionTypes.OVERWORLD_ID, 13, 6, ConstantIntProvider.create(6), true, 49, 49, Generator.DEFAULT, 10, copper, new Color(239, 151, 0))); - ores.add(new Ore(Type.GOLD_EXTRA, DimensionTypes.OVERWORLD_ID, extraGoldIndexes, 6, ConstantIntProvider.create(20), false, 32, 80, Generator.DEFAULT, 9, gold, new Color(247, 229, 30))); - ores.add(new Ore(Type.EMERALD, DimensionTypes.OVERWORLD_ID, emeraldIndexes, 6, UniformIntProvider.create(6, 8), false, 4, 32, Generator.EMERALD, 1, emerald, new Color(27, 209, 45))); - ores.add(new Ore(Type.GOLD_NETHER, DimensionTypes.THE_NETHER_ID, Map.of("default", 13, "basalt_deltas", -1), 7, ConstantIntProvider.create(10), false, 10, 118, Generator.DEFAULT, 10, gold, new Color(247, 229, 30))); - ores.add(new Ore(Type.QUARTZ, DimensionTypes.THE_NETHER_ID, Map.of("default", 14, "basalt_deltas", -1), 7, ConstantIntProvider.create(16), false, 10, 118, Generator.DEFAULT, 14, quartz, new Color(205, 205, 205))); - ores.add(new Ore(Type.GOLD_NETHER, DimensionTypes.THE_NETHER_ID, Map.of("default", -1, "basalt_deltas", 13), 7, ConstantIntProvider.create(20), false, 10, 118, Generator.DEFAULT, 10, gold, new Color(247, 229, 30))); - ores.add(new Ore(Type.QUARTZ, DimensionTypes.THE_NETHER_ID, Map.of("default", -1, "basalt_deltas", 14), 7, ConstantIntProvider.create(32), false, 10, 118, Generator.DEFAULT, 14, quartz, new Color(205, 205, 205))); - ores.add(new Ore(Type.LDEBRIS, DimensionTypes.THE_NETHER_ID, LDebrisIndexes, 7, ConstantIntProvider.create(1), true, 17, 9, Generator.NO_SURFACE, 3, debris, new Color(209, 27, 245))); - ores.add(new Ore(Type.SDEBRIS, DimensionTypes.THE_NETHER_ID, SDebrisIndexes, 7, ConstantIntProvider.create(1), false, 8, 120, Generator.NO_SURFACE, 2, debris, new Color(209, 27, 245))); - return ores; - } + public int step; + public int index; + public Setting active; + public IntProvider count = ConstantIntProvider.create(1); + public HeightProvider heightProvider; + public HeightContext heightContext; + public float rarity = 1; + public float discardOnAirChance; + public int size; + public Color color; + public boolean scattered; + + private Ore(PlacedFeature feature, int step, int index, Setting active, Color color) { + this.step = step; + this.index = index; + this.active = active; + this.color = color; + int bottom = MinecraftClient.getInstance().world.getBottomY(); + int height = MinecraftClient.getInstance().world.getDimension().logicalHeight(); + this.heightContext = new HeightContext(null, HeightLimitView.create(bottom, height)); - private static List V1_17_1() { - return baseConfig(); - } + for (PlacementModifier modifier : feature.placementModifiers()) { + if (modifier instanceof CountPlacementModifier) { + this.count = ((CountPlacementModifierAccessor) modifier).getCount(); - private static List V1_17() { - List ores = baseConfig(); - for (Ore ore : ores) { - if (ore.type.equals(Type.DIAMOND)) { - ore.maxY = 17; - } - if (ore.type.equals(Type.EMERALD)) { - ore.count = UniformIntProvider.create(6, 24); - } - } - return ores; - } + } else if (modifier instanceof HeightRangePlacementModifier) { + this.heightProvider = ((HeightRangePlacementModifierAccessor) modifier).getHeight(); - private static List V1_16() { - List ores = baseConfig(); - ores.removeIf(ore -> ore.type.equals(Type.COPPER)); - for (Ore ore : ores) { - if (ore.type == Type.EMERALD || ore.type == Type.GOLD_EXTRA) { - ore.index.keySet().forEach(key -> ore.index.put(key, ore.index.get(key) - 3)); - } else if (ore.dimension == DimensionTypes.OVERWORLD_ID) { - ore.index.keySet().forEach(key -> ore.index.put(key, ore.index.get(key) - 2)); - } else if (ore.type == Type.LDEBRIS) { - ore.minY = 16; - ore.maxY = 8; + } else if (modifier instanceof RarityFilterPlacementModifier) { + this.rarity = ((RarityFilterPlacementModifierAccessor) modifier).getChance(); } } - return ores; - } - private static List V1_15() { - List ores = V1_16(); - ores.removeIf(ore -> ore.type == Type.SDEBRIS || ore.type == Type.LDEBRIS || ore.type == Type.GOLD_NETHER); - for (Ore ore : ores) { - ore.step -= 2; - } - return ores; - } + FeatureConfig featureConfig = feature.feature().value().config(); - public static List getConfig(MCVersion version) { - if (version.isNewerOrEqualTo(MCVersion.v1_19)) { - return V1_19(); - } else if (version.isNewerOrEqualTo(MCVersion.v1_18)) { - return V1_18(); - } else if (version.isNewerOrEqualTo(MCVersion.v1_17_1)) { - return V1_17_1(); - } else if (version.isNewerOrEqualTo(MCVersion.v1_17)) { - return V1_17(); - } else if (version.isNewerOrEqualTo(MCVersion.v1_16)) { - return V1_16(); - } else if (version.isNewerOrEqualTo(MCVersion.v1_14)) { - return V1_15(); + if (featureConfig instanceof OreFeatureConfig oreFeatureConfig) { + this.discardOnAirChance = oreFeatureConfig.discardOnAirChance; + this.size = oreFeatureConfig.size; } else { - return null; + throw new IllegalStateException("config for " + feature + "is not OreFeatureConfig.class"); } - } - - public enum Type { - DIAMOND, REDSTONE, GOLD, IRON, COAL, EMERALD, SDEBRIS, LDEBRIS, LAPIS, COPPER, QUARTZ, GOLD_NETHER, GOLD_EXTRA - } - public enum Generator { - DEFAULT, EMERALD, NO_SURFACE + if (feature.feature().value().feature() instanceof ScatteredOreFeature) { + this.scattered = true; + } } } diff --git a/src/main/resources/meteor-rejects.mixins.json b/src/main/resources/meteor-rejects.mixins.json index a349ba07..4ab9b308 100644 --- a/src/main/resources/meteor-rejects.mixins.json +++ b/src/main/resources/meteor-rejects.mixins.json @@ -7,16 +7,20 @@ "ClientPlayerInteractionManagerMixin", "ClientPlayNetworkHandlerMixin", "CommandSuggestorMixin", + "CountPlacementModifierAccessor", "Deadmau5FeatureRendererMixin", "EntityAccessor", "GameRendererMixin", "HandshakeC2SPacketAccessor", + "HeightContextMixin", + "HeightRangePlacementModifierAccessor", "LivingEntityMixin", "LivingEntityRendererMixin", "MultiplayerScreenAccessor", "MultiplayerScreenMixin", "PlayerEntityMixin", "PlayerMoveC2SPacketAccessor", + "RarityFilterPlacementModifierAccessor", "ServerListAccessor", "StructureVoidBlockMixin", "TexturedRenderLayersMixin", From 1f2f364de98bf1ce8cf89fbb31ab7fe7d1e0b5b9 Mon Sep 17 00:00:00 2001 From: 19MisterX98 <41451155+19MisterX98@users.noreply.github.com> Date: Sun, 10 Dec 2023 11:00:02 +0000 Subject: [PATCH 04/26] Oresim cleanup (#311) --- .../java/anticope/rejects/modules/OreSim.java | 92 ++++++------------- 1 file changed, 29 insertions(+), 63 deletions(-) diff --git a/src/main/java/anticope/rejects/modules/OreSim.java b/src/main/java/anticope/rejects/modules/OreSim.java index 3d0bbd24..d8f2e55a 100755 --- a/src/main/java/anticope/rejects/modules/OreSim.java +++ b/src/main/java/anticope/rejects/modules/OreSim.java @@ -8,14 +8,15 @@ import anticope.rejects.utils.seeds.Seeds; import baritone.api.BaritoneAPI; import meteordevelopment.meteorclient.events.render.Render3DEvent; +import meteordevelopment.meteorclient.events.world.BlockUpdateEvent; import meteordevelopment.meteorclient.events.world.ChunkDataEvent; import meteordevelopment.meteorclient.events.world.TickEvent; +import meteordevelopment.meteorclient.pathing.BaritoneUtils; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Module; +import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.player.PlayerUtils; import meteordevelopment.orbit.EventHandler; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; import net.minecraft.client.world.ClientWorld; import net.minecraft.registry.RegistryKey; import net.minecraft.util.math.*; @@ -36,7 +37,6 @@ public class OreSim extends Module { private Seed worldSeed = null; private Map, List> oreConfig; public List oreGoals = new ArrayList<>(); - private ChunkPos prevOffset = new ChunkPos(0, 0); public enum AirCheck { ON_LOAD, @@ -45,7 +45,6 @@ public enum AirCheck { } private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgOres = settings.createGroup("Ores"); private final Setting horizontalRadius = sgGeneral.add(new IntSetting.Builder() .name("chunk-range") @@ -73,11 +72,12 @@ public enum AirCheck { public OreSim() { super(MeteorRejectsAddon.CATEGORY, "ore-sim", "Xray on crack."); + SettingGroup sgOres = settings.createGroup("Ores"); Ore.oreSettings.forEach(sgOres::add); } public boolean baritone() { - return isActive() && baritone.get(); + return isActive() && baritone.get() && BaritoneUtils.IS_AVAILABLE; } @EventHandler @@ -119,47 +119,23 @@ private void renderChunk(int x, int z, Render3DEvent event) { } @EventHandler - private void onTick(TickEvent.Pre event) { - if (mc.player == null || mc.world == null || oreConfig == null) return; + private void onBlockUpdate(BlockUpdateEvent event) { + if (airCheck.get() != AirCheck.RECHECK || event.newState.isOpaque()) return; - if (airCheck.get() == AirCheck.RECHECK) { - int chunkX = mc.player.getChunkPos().x; - int chunkZ = mc.player.getChunkPos().z; - ClientWorld world = mc.world; - int renderdistance = mc.options.getViewDistance().getValue(); - - //maybe another config option? But its already crowded - int chunkCounter = 5; - - loop: - while (true) { - for (int offsetX = prevOffset.x; offsetX <= renderdistance; offsetX++) { - for (int offsetZ = prevOffset.z; offsetZ <= renderdistance; offsetZ++) { - prevOffset = new ChunkPos(offsetX, offsetZ); - if (chunkCounter <= 0) { - break loop; - } - long chunkKey = ChunkPos.toLong(chunkX + offsetX, chunkZ + offsetZ); - - Chunk chunk = world.getChunk(chunkX + offsetX, chunkZ + offsetZ, ChunkStatus.FULL, false); - if (chunk != null && chunkRenderers.containsKey(chunkKey)) { - chunkRenderers.get(chunkKey).values().forEach(oreSet -> - oreSet.removeIf(ore -> { - BlockState state = world.getBlockState(new BlockPos((int) ore.x, (int) ore.y, (int) ore.z)); - return state.isOpaque() && !state.isOf(Blocks.VOID_AIR); - }) - ); - } - - chunkCounter--; - } - prevOffset = new ChunkPos(offsetX, -renderdistance); - } - prevOffset = new ChunkPos(-renderdistance, -renderdistance); + long chunkKey = ChunkPos.toLong(event.pos); + if (chunkRenderers.containsKey(chunkKey)) { + Vec3d pos = Vec3d.of(event.pos); + for (var ore : chunkRenderers.get(chunkKey).values()) { + ore.remove(pos); } } + } - if (baritone.get() && BaritoneAPI.getProvider().getPrimaryBaritone().getMineProcess().isActive()) { + @EventHandler + private void onTick(TickEvent.Pre event) { + if (mc.player == null || mc.world == null || oreConfig == null) return; + + if (baritone() && BaritoneAPI.getProvider().getPrimaryBaritone().getMineProcess().isActive()) { oreGoals.clear(); var chunkPos = mc.player.getChunkPos(); int rangeVal = 4; @@ -199,7 +175,7 @@ public void onActivate() { @Override public void onDeactivate() { this.chunkRenderers.clear(); - this.oreConfig.clear(); + this.oreConfig = null; } @EventHandler @@ -213,18 +189,12 @@ private void onPlayerRespawn(PlayerRespawnEvent event) { } private void loadVisibleChunks() { - int renderdistance = mc.options.getViewDistance().getValue()+2; - if (mc.player == null) { return; } - int playerChunkX = mc.player.getChunkPos().x; - int playerChunkZ = mc.player.getChunkPos().z; - for (int i = playerChunkX - renderdistance; i < playerChunkX + renderdistance; i++) { - for (int j = playerChunkZ - renderdistance; j < playerChunkZ + renderdistance; j++) { - doMathOnChunk(i, j); - } + for (Chunk chunk : Utils.chunks(false)) { + doMathOnChunk(chunk); } } @@ -242,11 +212,13 @@ private void reload() { @EventHandler public void onChunkData(ChunkDataEvent event) { - doMathOnChunk(event.chunk.getPos().x, event.chunk.getPos().z); + doMathOnChunk(event.chunk); + ChunkDataEvent.returnChunkDataEvent(event); } - private void doMathOnChunk(int chunkX, int chunkZ) { - var chunkPos = new ChunkPos(chunkX, chunkZ); + private void doMathOnChunk(Chunk chunk) { + + var chunkPos = chunk.getPos(); long chunkKey = chunkPos.toLong(); ClientWorld world = mc.world; @@ -255,12 +227,6 @@ private void doMathOnChunk(int chunkX, int chunkZ) { return; } - Chunk chunk = world.getChunk(chunkX, chunkZ, ChunkStatus.FULL, false); - - if (chunk == null) { - return; - } - Set> biomes = new HashSet<>(); ChunkPos.stream(chunkPos, 1).forEach(chunkPosx -> { Chunk chunkxx = world.getChunk(chunkPosx.x, chunkPosx.z, ChunkStatus.BIOMES, false); @@ -272,8 +238,8 @@ private void doMathOnChunk(int chunkX, int chunkZ) { }); Set oreSet = biomes.stream().flatMap(b -> getDefaultOres(b).stream()).collect(Collectors.toSet()); - chunkX = chunkX << 4; - chunkZ = chunkZ << 4; + int chunkX = chunkPos.x << 4; + int chunkZ = chunkPos.z << 4; ChunkRandom random = new ChunkRandom(ChunkRandom.RandomProvider.XOROSHIRO.create(0)); long populationSeed = random.setPopulationSeed(worldSeed.seed, chunkX, chunkZ); @@ -289,7 +255,7 @@ private void doMathOnChunk(int chunkX, int chunkZ) { for (int i = 0; i < repeat; i++) { - if (ore.rarity != 1F && random.nextFloat() >= ore.rarity) { + if (ore.rarity != 1F && random.nextFloat() >= 1/ore.rarity) { continue; } From d848b2dd11e8f365bbe2df08aed73cb57e85c668 Mon Sep 17 00:00:00 2001 From: Patrick <73178245+Paddyk45@users.noreply.github.com> Date: Sun, 17 Dec 2023 21:31:28 +0100 Subject: [PATCH 05/26] Fix stuff (#287) Co-authored-by: Cloudburst <18114966+C10udburst@users.noreply.github.com> --- .../java/anticope/rejects/modules/AutoGrind.java | 2 +- .../anticope/rejects/modules/VehicleOneHit.java | 13 ++++--------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/main/java/anticope/rejects/modules/AutoGrind.java b/src/main/java/anticope/rejects/modules/AutoGrind.java index 483f1b87..25336d6a 100644 --- a/src/main/java/anticope/rejects/modules/AutoGrind.java +++ b/src/main/java/anticope/rejects/modules/AutoGrind.java @@ -63,7 +63,7 @@ private void onOpenScreen(OpenScreenEvent event) { if (mc.currentScreen == null) break; - InvUtils.quickSwap().slot(i); + InvUtils.shiftClick().slot(i); InvUtils.move().fromId(2).to(i); } } diff --git a/src/main/java/anticope/rejects/modules/VehicleOneHit.java b/src/main/java/anticope/rejects/modules/VehicleOneHit.java index ea8b4339..da88c031 100644 --- a/src/main/java/anticope/rejects/modules/VehicleOneHit.java +++ b/src/main/java/anticope/rejects/modules/VehicleOneHit.java @@ -25,24 +25,19 @@ public class VehicleOneHit extends Module { .build() ); - private boolean ignorePackets; - public VehicleOneHit() { super(MeteorRejectsAddon.CATEGORY, "vehicle-one-hit", "Destroy vehicles with one hit."); } @EventHandler private void onPacketSend(PacketEvent.Send event) { - if (ignorePackets - || !(event.packet instanceof PlayerInteractEntityC2SPacket) - || !(mc.crosshairTarget instanceof EntityHitResult ehr) - || (!(ehr.getEntity() instanceof AbstractMinecartEntity) && !(ehr.getEntity() instanceof BoatEntity)) + if (!(event.packet instanceof PlayerInteractEntityC2SPacket) + || !(mc.crosshairTarget instanceof EntityHitResult ehr) + || (!(ehr.getEntity() instanceof AbstractMinecartEntity) && !(ehr.getEntity() instanceof BoatEntity)) ) return; - ignorePackets = true; for (int i = 0; i < amount.get() - 1; i++) { - mc.player.networkHandler.sendPacket(event.packet); + mc.player.networkHandler.getConnection().send(event.packet, null); } - ignorePackets = false; } } \ No newline at end of file From bf6f7c5e648112d0e180c8306f37e1d1f5d72c5b Mon Sep 17 00:00:00 2001 From: qingshu <81049953+qingshu-ui@users.noreply.github.com> Date: Wed, 3 Jan 2024 17:43:01 +0800 Subject: [PATCH 06/26] Add module AutoEnchant (#314) --- README.md | 1 + .../anticope/rejects/MeteorRejectsAddon.java | 1 + .../anticope/rejects/modules/AutoEnchant.java | 135 ++++++++++++++++++ 3 files changed, 137 insertions(+) create mode 100644 src/main/java/anticope/rejects/modules/AutoEnchant.java diff --git a/README.md b/README.md index 2b499a75..406c2c53 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,7 @@ - ArrowDmg (Ported from [Wurst](https://github.com/Wurst-Imperium/Wurst7/tree)) - AutoBedTrap (Ported from [BleachHack-CupEdition](https://github.com/CUPZYY/BleachHack-CupEdition/blob/master/CupEdition-1.17/src/main/java/bleach/hack/module/mods/AutoBedtrap.java)) - AutoCraft (More generalized version of [AutoBedCraft](https://github.com/Anticope/orion/blob/main/src/main/java/me/ghosttypes/orion/modules/main/AutoBedCraft.java) from orion) +- AutoEnchant - AutoExtinguish - AutoFarm - AutoGrind diff --git a/src/main/java/anticope/rejects/MeteorRejectsAddon.java b/src/main/java/anticope/rejects/MeteorRejectsAddon.java index 7a0e9e73..21345b5e 100644 --- a/src/main/java/anticope/rejects/MeteorRejectsAddon.java +++ b/src/main/java/anticope/rejects/MeteorRejectsAddon.java @@ -83,6 +83,7 @@ public void onInitialize() { modules.add(new SoundLocator()); modules.add(new TreeAura()); modules.add(new VehicleOneHit()); + modules.add(new AutoEnchant()); // Commands Commands.add(new CenterCommand()); diff --git a/src/main/java/anticope/rejects/modules/AutoEnchant.java b/src/main/java/anticope/rejects/modules/AutoEnchant.java new file mode 100644 index 00000000..993192ce --- /dev/null +++ b/src/main/java/anticope/rejects/modules/AutoEnchant.java @@ -0,0 +1,135 @@ +package anticope.rejects.modules; + +import anticope.rejects.MeteorRejectsAddon; + +import meteordevelopment.meteorclient.events.game.OpenScreenEvent; +import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.utils.network.MeteorExecutor; +import meteordevelopment.meteorclient.utils.player.FindItemResult; +import meteordevelopment.meteorclient.utils.player.InvUtils; +import meteordevelopment.orbit.EventHandler; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.item.Item; +import net.minecraft.item.Items; +import net.minecraft.screen.EnchantmentScreenHandler; +import net.minecraft.screen.ScreenHandler; + +import java.util.List; +import java.util.Objects; + +public class AutoEnchant extends meteordevelopment.meteorclient.systems.modules.Module { + + public final SettingGroup sgGeneral = settings.getDefaultGroup(); + + private final Setting delay = sgGeneral.add(new IntSetting.Builder() + .name("delay") + .description("The tick delay between enchanting items.") + .defaultValue(50) + .sliderMax(500) + .min(0) + .build() + ); + + private final Setting level = sgGeneral.add(new IntSetting.Builder() + .name("level") + .description("Choose enchantment levels 1-3") + .defaultValue(3) + .max(3) + .min(1) + .build() + ); + + private final Setting drop = sgGeneral.add(new BoolSetting.Builder() + .name("drop") + .description("Automatically drops enchanted items (useful for when not enough inventory space)") + .defaultValue(false) + .build() + ); + + private final Setting> itemWhitelist = sgGeneral.add(new ItemListSetting.Builder() + .name("item-whitelist") + .description("Item that require enchantment.") + .defaultValue() + .filter(item -> item.equals(Items.BOOK) || item.isDamageable()) + .build() + ); + + public AutoEnchant() { + super(MeteorRejectsAddon.CATEGORY, "auto-enchant", "Automatically enchanting items."); + } + + @EventHandler + private void onOpenScreen(OpenScreenEvent event) { + if (!(Objects.requireNonNull(mc.player).currentScreenHandler instanceof EnchantmentScreenHandler)) + return; + MeteorExecutor.execute(this::autoEnchant); + } + + private void autoEnchant() { + if (!(Objects.requireNonNull(mc.player).currentScreenHandler instanceof EnchantmentScreenHandler handler)) + return; + if (mc.player.experienceLevel < 30) { + info("You don't have enough experience levels"); + return; + } + while (getEmptySlotCount(handler) > 2 || drop.get()) { + if (!(mc.player.currentScreenHandler instanceof EnchantmentScreenHandler)) { + info("Enchanting table is closed."); + break; + } + if (handler.getLapisCount() < level.get() && !fillLapisItem()) { + info("Lapis lazuli is not found."); + break; + } + if (!fillCanEnchantItem()) { + info("No items found to enchant."); + break; + } + Objects.requireNonNull(mc.interactionManager).clickButton(handler.syncId, level.get() - 1); + if (getEmptySlotCount(handler) > 2) { + InvUtils.shiftClick().slotId(0); + } else if (drop.get() && handler.getSlot(0).hasStack()) { + // I don't know why an exception LegacyRandomSource is thrown here, + // so I used the main thread to drop items. + mc.execute(() -> InvUtils.drop().slotId(0)); + } + + /* + Although the description here indicates that the tick is the unit, + the actual delay is not the tick unit, + but it does not affect the normal operation in the game. + Perhaps we can ignore it + */ + try { + Thread.sleep(delay.get()); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + } + + private boolean fillCanEnchantItem() { + FindItemResult res = InvUtils.find(stack -> itemWhitelist.get().contains(stack.getItem()) && EnchantmentHelper.get(stack).isEmpty()); + if (!res.found()) return false; + InvUtils.shiftClick().slot(res.slot()); + return true; + } + + private boolean fillLapisItem() { + FindItemResult res = InvUtils.find(Items.LAPIS_LAZULI); + if (!res.found()) return false; + InvUtils.shiftClick().slot(res.slot()); + return true; + } + + private int getEmptySlotCount(ScreenHandler handler) { + int emptySlotCount = 0; + for (int i = 0; i < handler.slots.size(); i++) { + if (!handler.slots.get(i).getStack().getItem().equals(Items.AIR)) + continue; + emptySlotCount++; + } + return emptySlotCount; + } + +} From 52bf7cce6ed7c8a97bd45c3f590fa5482d927c92 Mon Sep 17 00:00:00 2001 From: Avilad Date: Thu, 22 Feb 2024 12:41:08 -0600 Subject: [PATCH 07/26] 1.20.4 (#325) --- .github/workflows/gradle.yml | 4 +- build.gradle | 2 +- gradle.properties | 8 +-- .../rejects/commands/GiveCommand.java | 4 +- .../rejects/commands/ReconnectCommand.java | 2 +- .../rejects/gui/screens/StatsScreen.java | 6 +- .../anticope/rejects/modules/AutoFarm.java | 13 ++-- .../anticope/rejects/modules/CoordLogger.java | 2 +- .../anticope/rejects/modules/NewChunks.java | 5 +- .../anticope/rejects/modules/TreeAura.java | 2 +- .../utils/accounts/CustomYggdrasilLogin.java | 66 +++++++++++-------- 11 files changed, 63 insertions(+), 51 deletions(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 79bc30c1..055df603 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -34,9 +34,9 @@ jobs: - uses: "marvinpinto/action-automatic-releases@latest" with: repo_token: "${{ secrets.GITHUB_TOKEN }}" - automatic_release_tag: "latest-1.20.2" + automatic_release_tag: "latest-1.20.4" prerelease: false - title: "1.20.2 Build" + title: "1.20.4 Build" files: | ./build/libs/*.jar diff --git a/build.gradle b/build.gradle index 9b729a5b..951e56f6 100644 --- a/build.gradle +++ b/build.gradle @@ -30,7 +30,7 @@ dependencies { modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" modImplementation("meteordevelopment:meteor-client:${project.meteor_version}-SNAPSHOT") - modImplementation "baritone:fabric:${project.minecraft_version}-SNAPSHOT" + modImplementation "meteordevelopment:baritone:${project.minecraft_version}-SNAPSHOT" // seed .locate and ore sim extraLibs('com.seedfinding:mc_math:ffd2edcfcc0d18147549c88cc7d8ec6cf21b5b91') { transitive = false } diff --git a/gradle.properties b/gradle.properties index 36b4ffcc..73d9250f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,13 +2,13 @@ org.gradle.jvmargs=-Xmx2G # Fabric Properties -minecraft_version=1.20.2 -yarn_version=1.20.2+build.4 -loader_version=0.14.24 +minecraft_version=1.20.4 +yarn_version=1.20.4+build.3 +loader_version=0.15.2 # Mod Properties mod_version = 0.3 maven_group = anticope.rejects archives_base_name = meteor-rejects-addon -meteor_version=0.5.5 \ No newline at end of file +meteor_version=0.5.6 \ No newline at end of file diff --git a/src/main/java/anticope/rejects/commands/GiveCommand.java b/src/main/java/anticope/rejects/commands/GiveCommand.java index 2f95af23..d6d6d729 100644 --- a/src/main/java/anticope/rejects/commands/GiveCommand.java +++ b/src/main/java/anticope/rejects/commands/GiveCommand.java @@ -77,7 +77,7 @@ public void build(LiteralArgumentBuilder builder) { tag.putBoolean("Interpret", true); tag.putBoolean("NoGravity", true); tag.putBoolean("CustomNameVisible", true); - tag.putString("CustomName", Text.Serializer.toJson(Text.literal(message))); + tag.putString("CustomName", Text.Serialization.toJsonString(Text.literal(message))); tag.put("Pos", NbtList); stack.setSubNbt("EntityTag", tag); GiveUtils.giveItem(stack); @@ -88,7 +88,7 @@ public void build(LiteralArgumentBuilder builder) { String message = ctx.getArgument("message", String.class).replace("&", "\247"); ItemStack stack = new ItemStack(Items.BAT_SPAWN_EGG); NbtCompound tag = new NbtCompound(); - tag.putString("CustomName", Text.Serializer.toJson(Text.literal(message))); + tag.putString("CustomName", Text.Serialization.toJsonString(Text.literal(message))); tag.putBoolean("NoAI", true); tag.putBoolean("Silent", true); tag.putBoolean("PersistenceRequired", true); diff --git a/src/main/java/anticope/rejects/commands/ReconnectCommand.java b/src/main/java/anticope/rejects/commands/ReconnectCommand.java index 121f7e0a..1b4ed5ea 100644 --- a/src/main/java/anticope/rejects/commands/ReconnectCommand.java +++ b/src/main/java/anticope/rejects/commands/ReconnectCommand.java @@ -2,7 +2,7 @@ import com.mojang.brigadier.builder.LiteralArgumentBuilder; import meteordevelopment.meteorclient.commands.Command; -import net.minecraft.client.gui.screen.ConnectScreen; +import net.minecraft.client.gui.screen.multiplayer.ConnectScreen; import net.minecraft.client.gui.screen.TitleScreen; import net.minecraft.client.gui.screen.multiplayer.MultiplayerScreen; import net.minecraft.client.network.ServerAddress; diff --git a/src/main/java/anticope/rejects/gui/screens/StatsScreen.java b/src/main/java/anticope/rejects/gui/screens/StatsScreen.java index 57e846eb..17f7a8c9 100644 --- a/src/main/java/anticope/rejects/gui/screens/StatsScreen.java +++ b/src/main/java/anticope/rejects/gui/screens/StatsScreen.java @@ -10,6 +10,7 @@ import meteordevelopment.orbit.EventHandler; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.world.TickEvent; +import meteordevelopment.meteorclient.utils.world.TickRate; import meteordevelopment.meteorclient.gui.GuiTheme; import meteordevelopment.meteorclient.gui.GuiThemes; import meteordevelopment.meteorclient.gui.WindowScreen; @@ -48,10 +49,11 @@ private void updateData() { effectList.action = () -> effectListExpanded = effectList.isExpanded(); liv.getActiveStatusEffects().forEach((effect, instance) -> { String status = lang.get(effect.getTranslationKey()); + float tps = TickRate.INSTANCE.getTickRate(); if (instance.getAmplifier() != 0) { - status += (String.format(" %d (%s)", instance.getAmplifier()+1, StatusEffectUtil.getDurationText(instance, 1))); + status += (String.format(" %d (%s)", instance.getAmplifier()+1, StatusEffectUtil.getDurationText(instance, 1, tps))); } else { - status += (String.format(" (%s)", StatusEffectUtil.getDurationText(instance, 1))); + status += (String.format(" (%s)", StatusEffectUtil.getDurationText(instance, 1, tps))); } effectList.add(theme.label(status)).expandX(); }); diff --git a/src/main/java/anticope/rejects/modules/AutoFarm.java b/src/main/java/anticope/rejects/modules/AutoFarm.java index 5e86f58f..0765a5e1 100644 --- a/src/main/java/anticope/rejects/modules/AutoFarm.java +++ b/src/main/java/anticope/rejects/modules/AutoFarm.java @@ -270,19 +270,20 @@ private boolean isMature(BlockState state, Block block) { private boolean bonemealFilter(Block block) { return block instanceof CropBlock || - block instanceof CocoaBlock || block instanceof StemBlock || block instanceof MushroomPlantBlock || - block instanceof SweetBerryBushBlock || block instanceof AzaleaBlock || - block instanceof SaplingBlock; + block instanceof SaplingBlock || + block == Blocks.COCOA || + block == Blocks.SWEET_BERRY_BUSH; } private boolean harvestFilter(Block block) { return block instanceof CropBlock || - block instanceof GourdBlock || - block instanceof NetherWartBlock || - block instanceof SweetBerryBushBlock; + block == Blocks.PUMPKIN || + block == Blocks.MELON || + block == Blocks.NETHER_WART || + block == Blocks.SWEET_BERRY_BUSH; } private boolean plantFilter(Item item) { diff --git a/src/main/java/anticope/rejects/modules/CoordLogger.java b/src/main/java/anticope/rejects/modules/CoordLogger.java index 399f81a3..b2d89cdc 100644 --- a/src/main/java/anticope/rejects/modules/CoordLogger.java +++ b/src/main/java/anticope/rejects/modules/CoordLogger.java @@ -107,7 +107,7 @@ private void onPacketReceive(PacketEvent.Receive event) { Vec3d playerPosition = entity.getPos(); if (playerPosition.distanceTo(packetPosition) >= minDistance.get()) { - info(formatMessage("Player '" + entity.getEntityName() + "' has teleported to ", packetPosition)); + info(formatMessage("Player '" + entity.getNameForScoreboard() + "' has teleported to ", packetPosition)); } } diff --git a/src/main/java/anticope/rejects/modules/NewChunks.java b/src/main/java/anticope/rejects/modules/NewChunks.java index 715315f0..4ae8c962 100644 --- a/src/main/java/anticope/rejects/modules/NewChunks.java +++ b/src/main/java/anticope/rejects/modules/NewChunks.java @@ -17,6 +17,7 @@ import net.minecraft.util.math.Box; import net.minecraft.util.math.ChunkPos; import net.minecraft.util.math.Direction; +import net.minecraft.util.math.Vec3d; import net.minecraft.world.chunk.WorldChunk; import java.util.Collections; @@ -112,7 +113,7 @@ private void onRender(Render3DEvent event) { synchronized (newChunks) { for (ChunkPos c : newChunks) { if (mc.getCameraEntity().getBlockPos().isWithinDistance(c.getStartPos(), 1024)) { - render(new Box(c.getStartPos(), c.getStartPos().add(16, renderHeight.get(), 16)), newChunksSideColor.get(), newChunksLineColor.get(), shapeMode.get(), event); + render(new Box(Vec3d.of(c.getStartPos()), Vec3d.of(c.getStartPos().add(16, renderHeight.get(), 16))), newChunksSideColor.get(), newChunksLineColor.get(), shapeMode.get(), event); } } } @@ -122,7 +123,7 @@ private void onRender(Render3DEvent event) { synchronized (oldChunks) { for (ChunkPos c : oldChunks) { if (mc.getCameraEntity().getBlockPos().isWithinDistance(c.getStartPos(), 1024)) { - render(new Box(c.getStartPos(), c.getStartPos().add(16, renderHeight.get(), 16)), oldChunksSideColor.get(), oldChunksLineColor.get(), shapeMode.get(), event); + render(new Box(Vec3d.of(c.getStartPos()), Vec3d.of(c.getStartPos().add(16, renderHeight.get(), 16))), oldChunksSideColor.get(), oldChunksLineColor.get(), shapeMode.get(), event); } } } diff --git a/src/main/java/anticope/rejects/modules/TreeAura.java b/src/main/java/anticope/rejects/modules/TreeAura.java index e1d41331..559a7589 100644 --- a/src/main/java/anticope/rejects/modules/TreeAura.java +++ b/src/main/java/anticope/rejects/modules/TreeAura.java @@ -117,7 +117,7 @@ private void doBonemeal(BlockPos sapling) { private boolean canPlant(BlockPos pos) { Block b = mc.world.getBlockState(pos).getBlock(); - if (b.equals(Blocks.GRASS) || b.equals(Blocks.GRASS_BLOCK) || b.equals(Blocks.DIRT) || b.equals(Blocks.COARSE_DIRT)) { + if (b.equals(Blocks.SHORT_GRASS) || b.equals(Blocks.GRASS_BLOCK) || b.equals(Blocks.DIRT) || b.equals(Blocks.COARSE_DIRT)) { final AtomicBoolean plant = new AtomicBoolean(true); IntStream.rangeClosed(1, 5).forEach(i -> { // Check above diff --git a/src/main/java/anticope/rejects/utils/accounts/CustomYggdrasilLogin.java b/src/main/java/anticope/rejects/utils/accounts/CustomYggdrasilLogin.java index 9845a826..7ae52b0d 100644 --- a/src/main/java/anticope/rejects/utils/accounts/CustomYggdrasilLogin.java +++ b/src/main/java/anticope/rejects/utils/accounts/CustomYggdrasilLogin.java @@ -6,12 +6,17 @@ import com.google.gson.*; import com.mojang.authlib.Environment; import com.mojang.authlib.GameProfile; +import com.mojang.authlib.SignatureState; import com.mojang.authlib.exceptions.AuthenticationException; import com.mojang.authlib.minecraft.InsecurePublicKeyException; import com.mojang.authlib.minecraft.MinecraftProfileTexture; +import com.mojang.authlib.minecraft.MinecraftProfileTextures; import com.mojang.authlib.properties.Property; +import com.mojang.authlib.yggdrasil.TextureUrlChecker; +import com.mojang.authlib.yggdrasil.ServicesKeyInfo; import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService; import com.mojang.authlib.yggdrasil.YggdrasilMinecraftSessionService; +import com.mojang.authlib.yggdrasil.YggdrasilServicesKeyInfo; import com.mojang.authlib.yggdrasil.response.MinecraftTexturesPayload; import com.mojang.util.UUIDTypeAdapter; import meteordevelopment.meteorclient.utils.network.Http; @@ -31,7 +36,7 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; public class CustomYggdrasilLogin { - public static Environment localYggdrasilApi = new Environment("/api", "/sessionserver", "/minecraftservices", "Custom-Yggdrasil"); + public static Environment localYggdrasilApi = new Environment("/sessionserver", "/minecraftservices", "Custom-Yggdrasil"); public static Session login(String name, String password, String server) throws AuthenticationException { try { @@ -61,7 +66,7 @@ public static Session login(String name, String password, String server) throws public static class LocalYggdrasilMinecraftSessionService extends YggdrasilMinecraftSessionService { private static final Logger LOGGER = LogManager.getLogger(); - private final PublicKey publicKey; + private final ServicesKeyInfo publicKey; private final Gson gson = new GsonBuilder().registerTypeAdapter(UUID.class, new UUIDTypeAdapter()).create(); public LocalYggdrasilMinecraftSessionService(YggdrasilAuthenticationService service, String serverUrl) { @@ -71,50 +76,53 @@ public LocalYggdrasilMinecraftSessionService(YggdrasilAuthenticationService serv this.publicKey = getPublicKey(json.get("signaturePublickey").getAsString()); } - private static PublicKey getPublicKey(String key) { + private static ServicesKeyInfo getPublicKey(String key) { key = key.replace("-----BEGIN PUBLIC KEY-----", "").replace("-----END PUBLIC KEY-----", ""); try { byte[] byteKey = Base64.getDecoder().decode(key.replace("\n", "")); - X509EncodedKeySpec spec = new X509EncodedKeySpec(byteKey); - KeyFactory factory = KeyFactory.getInstance("RSA"); - return factory.generatePublic(spec); - } catch (NoSuchAlgorithmException | InvalidKeySpecException e) { + return YggdrasilServicesKeyInfo.parse(byteKey); + } catch (IllegalArgumentException e) { e.printStackTrace(); } return null; } - @Override - public Map getTextures(final GameProfile profile, final boolean requireSecure) { - final Property textureProperty = Iterables.getFirst(profile.getProperties().get("textures"), null); - - if (textureProperty == null) - return new HashMap<>(); - - if (requireSecure) { - if (!textureProperty.hasSignature()) { - LOGGER.error("Signature is missing from textures payload"); - throw new InsecurePublicKeyException("Signature is missing from textures payload"); - } - if (!textureProperty.isSignatureValid(publicKey)) { - LOGGER.error("Textures payload has been tampered with (signature invalid)"); - throw new InsecurePublicKeyException("Textures payload has been tampered with (signature invalid)"); - } + private SignatureState getPropertySignatureState(final Property property) { + if (!property.hasSignature()) { + return SignatureState.UNSIGNED; + } + if (!publicKey.validateProperty(property)) { + return SignatureState.INVALID; } + return SignatureState.SIGNED; + } + + @Override + public MinecraftProfileTextures unpackTextures(final Property packedTextures) { + final String value = packedTextures.value(); + final SignatureState signatureState = getPropertySignatureState(packedTextures); final MinecraftTexturesPayload result; try { - final String json = new String(org.apache.commons.codec.binary.Base64.decodeBase64(textureProperty.value()), StandardCharsets.UTF_8); + final String json = new String(Base64.getDecoder().decode(value), StandardCharsets.UTF_8); result = gson.fromJson(json, MinecraftTexturesPayload.class); - } catch (final JsonParseException e) { + } catch (final JsonParseException | IllegalArgumentException e) { LOGGER.error("Could not decode textures payload", e); - return new HashMap<>(); + return MinecraftProfileTextures.EMPTY; + } + + if (result == null || result.textures() == null || result.textures().isEmpty()) { + return MinecraftProfileTextures.EMPTY; } - if (result == null || result.textures() == null) - return new HashMap<>(); + final Map textures = result.textures(); - return result.textures(); + return new MinecraftProfileTextures( + textures.get(MinecraftProfileTexture.Type.SKIN), + textures.get(MinecraftProfileTexture.Type.CAPE), + textures.get(MinecraftProfileTexture.Type.ELYTRA), + signatureState + ); } } From cb27c81df8f80dcb9032cc9b4c705689247e8572 Mon Sep 17 00:00:00 2001 From: gptlang <121417512+gptlang@users.noreply.github.com> Date: Fri, 8 Mar 2024 09:27:56 +0000 Subject: [PATCH 08/26] fix: ChunkDataEvent breaking changes in meteor-client (#330) Co-authored-by: Antonio Cheong --- src/main/java/anticope/rejects/modules/OreSim.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/anticope/rejects/modules/OreSim.java b/src/main/java/anticope/rejects/modules/OreSim.java index d8f2e55a..6e137893 100755 --- a/src/main/java/anticope/rejects/modules/OreSim.java +++ b/src/main/java/anticope/rejects/modules/OreSim.java @@ -212,8 +212,7 @@ private void reload() { @EventHandler public void onChunkData(ChunkDataEvent event) { - doMathOnChunk(event.chunk); - ChunkDataEvent.returnChunkDataEvent(event); + doMathOnChunk(event.chunk()); } private void doMathOnChunk(Chunk chunk) { From 9fdb0c5f175a5355dec37ee153e05d3002669c79 Mon Sep 17 00:00:00 2001 From: gptlang <121417512+gptlang@users.noreply.github.com> Date: Fri, 8 Mar 2024 09:29:32 +0000 Subject: [PATCH 09/26] Add support for locate command on new versions from 1.18 to 1.20 (#318) Co-authored-by: Antonio Cheong --- build.gradle | 7 +- .../rejects/commands/LocateCommand.java | 109 ++++++++++++------ .../anticope/rejects/utils/WorldGenUtils.java | 17 ++- 3 files changed, 98 insertions(+), 35 deletions(-) diff --git a/build.gradle b/build.gradle index 951e56f6..d5fe24cf 100644 --- a/build.gradle +++ b/build.gradle @@ -16,14 +16,19 @@ repositories { maven { url "https://maven.seedfinding.com/" } maven { url "https://maven-snapshots.seedfinding.com/" } maven { url 'https://jitpack.io' } + maven { url 'https://maven.duti.dev/releases' } } - configurations { // configuration that holds jars to include in the jar extraLibs } dependencies { + // This will make it work on most platforms. It automatically chooses the right dependencies at runtime. + extraLibs('dev.duti.acheong:cubiomes:1.22.3') { transitive = false } + extraLibs('dev.duti.acheong:cubiomes:1.22.3:linux64') { transitive = false } + extraLibs('dev.duti.acheong:cubiomes:1.22.3:osx') { transitive = false } + extraLibs('dev.duti.acheong:cubiomes:1.22.3:windows64') { transitive = false } // To change the versions see the gradle.properties file minecraft "com.mojang:minecraft:${project.minecraft_version}" mappings "net.fabricmc:yarn:${project.yarn_version}:v2" diff --git a/src/main/java/anticope/rejects/commands/LocateCommand.java b/src/main/java/anticope/rejects/commands/LocateCommand.java index b1d131e2..0fb3e0e3 100644 --- a/src/main/java/anticope/rejects/commands/LocateCommand.java +++ b/src/main/java/anticope/rejects/commands/LocateCommand.java @@ -2,8 +2,12 @@ import anticope.rejects.arguments.EnumArgumentType; import anticope.rejects.utils.WorldGenUtils; +import anticope.rejects.utils.seeds.Seeds; + import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.exceptions.DynamicCommandExceptionType; +import com.seedfinding.mccore.version.MCVersion; + import meteordevelopment.meteorclient.commands.Command; import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.player.ChatUtils; @@ -12,43 +16,82 @@ import net.minecraft.text.Text; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; +import cubitect.Cubiomes; +import cubitect.Cubiomes.Pos; import static com.mojang.brigadier.Command.SINGLE_SUCCESS; import static meteordevelopment.meteorclient.MeteorClient.mc; public class LocateCommand extends Command { - private final static DynamicCommandExceptionType NOT_FOUND = new DynamicCommandExceptionType(o -> { - if (o instanceof WorldGenUtils.Feature) { - return Text.literal(String.format( - "%s not found.", - Utils.nameToTitle(o.toString().replaceAll("_", "-"))) - ); - } - return Text.literal("Not found."); - }); - - public LocateCommand() { - super("locate", "Locates structures.", "loc"); - } - - @Override - public void build(LiteralArgumentBuilder builder) { - builder.then(literal("feature").then(argument("feature", EnumArgumentType.enumArgument(WorldGenUtils.Feature.stronghold)).executes(ctx -> { - WorldGenUtils.Feature feature = EnumArgumentType.getEnum(ctx, "feature", WorldGenUtils.Feature.stronghold); - BlockPos pos = WorldGenUtils.locateFeature(feature, mc.player.getBlockPos()); - if (pos != null) { - MutableText text = Text.literal(String.format( - "%s located at ", - Utils.nameToTitle(feature.toString().replaceAll("_", "-")) - )); - Vec3d coords = new Vec3d(pos.getX(), pos.getY(), pos.getZ()); - text.append(ChatUtils.formatCoords(coords)); - text.append("."); - info(text); - return SINGLE_SUCCESS; - } - throw NOT_FOUND.create(feature); - }))); - } + private final static DynamicCommandExceptionType NOT_FOUND = new DynamicCommandExceptionType(o -> { + if (o instanceof Cubiomes.StructureType) { + return Text.literal(String.format( + "%s not found.", + Utils.nameToTitle(o.toString().replaceAll("_", "-")))); + } + return Text.literal("Not found."); + }); + + public LocateCommand() { + super("locate", "Locates structures.", "loc"); + } + + @Override + public void build(LiteralArgumentBuilder builder) { + builder.then(literal("feature") + .then(argument("feature", EnumArgumentType.enumArgument(Cubiomes.StructureType.Village)).executes(ctx -> { + Cubiomes.StructureType feature = EnumArgumentType.getEnum(ctx, "feature", Cubiomes.StructureType.Village); + BlockPos playerPos = mc.player.getBlockPos(); + long seed = Seeds.get().getSeed().seed; + MCVersion version = Seeds.get().getSeed().version; + Cubiomes.MCVersion cubiomesVersion = null; + if (version.isNewerOrEqualTo(MCVersion.v1_20)) { + cubiomesVersion = Cubiomes.MCVersion.MC_1_20; + } else if (version.isNewerOrEqualTo(MCVersion.v1_19)) { + switch (version) { + case v1_19: + case v1_19_1: + cubiomesVersion = Cubiomes.MCVersion.MC_1_19; + break; + case v1_19_2: + case v1_19_3: + case v1_19_4: + cubiomesVersion = Cubiomes.MCVersion.MC_1_19_2; + break; + default: + throw new IllegalStateException("Unexpected value: " + version); + } + } else if (version.isNewerOrEqualTo(MCVersion.v1_18)) { + cubiomesVersion = Cubiomes.MCVersion.MC_1_18; + } + Pos pos = null; + if (cubiomesVersion != null) { + pos = Cubiomes.GetNearestStructure(feature, playerPos.getX(), playerPos.getZ(), seed, + cubiomesVersion); + } else { + BlockPos bpos = WorldGenUtils.locateFeature(feature, playerPos); + pos = new Pos(); + pos.x = bpos.getX(); + pos.z = bpos.getZ(); + + } + if (pos != null) { + // Calculate distance + int distance = (int) Math.hypot(pos.x - playerPos.getX(), pos.z - playerPos.getZ()); + MutableText text = Text.literal(String.format( + "%s located at ", + Utils.nameToTitle(feature.toString().replaceAll("_", "-")))); + Vec3d coords = new Vec3d(pos.x, 0, pos.z); + text.append(ChatUtils.formatCoords(coords)); + text.append("."); + if (distance > 0) { + text.append(String.format(" (%d blocks away)", distance)); + } + info(text); + return SINGLE_SUCCESS; + } + throw NOT_FOUND.create(feature); + }))); + } } diff --git a/src/main/java/anticope/rejects/utils/WorldGenUtils.java b/src/main/java/anticope/rejects/utils/WorldGenUtils.java index d34ba83a..eae3db2b 100644 --- a/src/main/java/anticope/rejects/utils/WorldGenUtils.java +++ b/src/main/java/anticope/rejects/utils/WorldGenUtils.java @@ -3,6 +3,8 @@ import anticope.rejects.utils.seeds.Seed; import anticope.rejects.utils.seeds.Seeds; import baritone.api.BaritoneAPI; +import cubitect.Cubiomes; + import com.seedfinding.mcbiome.source.BiomeSource; import com.seedfinding.mcfeature.misc.SlimeChunk; import com.seedfinding.mcfeature.structure.*; @@ -126,7 +128,20 @@ public enum Feature { desert_pyramid } - public static BlockPos locateFeature(Feature feature, BlockPos center) { + public static BlockPos locateFeature(Cubiomes.StructureType cfeature, BlockPos center) { + Feature feature = switch (cfeature) { + case Treasure -> Feature.buried_treasure; + case Mansion -> Feature.mansion; + case Stronghold -> Feature.stronghold; + case Fortress -> Feature.nether_fortress; + case Monument -> Feature.ocean_monument; + case Bastion -> Feature.bastion_remnant; + case End_City -> Feature.end_city; + case Village -> Feature.village; + case Mineshaft -> Feature.mineshaft; + case Desert_Pyramid -> Feature.desert_pyramid; + default -> null; + }; Seed seed = Seeds.get().getSeed(); BlockPos pos = null; if (!checkIfInDimension(getDimension(feature))) { From 46cef0fe5e63f380d841e86e1257ea09e5906f56 Mon Sep 17 00:00:00 2001 From: Maxim Zhuchkov Date: Fri, 8 Mar 2024 12:30:51 +0300 Subject: [PATCH 10/26] Add auto rename module (#329) --- .../anticope/rejects/MeteorRejectsAddon.java | 1 + .../anticope/rejects/modules/AutoRename.java | 199 ++++++++++++++++++ 2 files changed, 200 insertions(+) create mode 100644 src/main/java/anticope/rejects/modules/AutoRename.java diff --git a/src/main/java/anticope/rejects/MeteorRejectsAddon.java b/src/main/java/anticope/rejects/MeteorRejectsAddon.java index 21345b5e..72196081 100644 --- a/src/main/java/anticope/rejects/MeteorRejectsAddon.java +++ b/src/main/java/anticope/rejects/MeteorRejectsAddon.java @@ -84,6 +84,7 @@ public void onInitialize() { modules.add(new TreeAura()); modules.add(new VehicleOneHit()); modules.add(new AutoEnchant()); + modules.add(new AutoRename()); // Commands Commands.add(new CenterCommand()); diff --git a/src/main/java/anticope/rejects/modules/AutoRename.java b/src/main/java/anticope/rejects/modules/AutoRename.java new file mode 100644 index 00000000..bcc66b40 --- /dev/null +++ b/src/main/java/anticope/rejects/modules/AutoRename.java @@ -0,0 +1,199 @@ +package anticope.rejects.modules; + +import anticope.rejects.MeteorRejectsAddon; +import meteordevelopment.meteorclient.events.world.TickEvent; +import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.systems.modules.Module; +import meteordevelopment.meteorclient.utils.player.InvUtils; +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.item.BlockItem; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.NbtElement; +import net.minecraft.screen.AnvilScreenHandler; + +import java.util.List; + +public class AutoRename extends Module { + private final SettingGroup sgGeneral = settings.getDefaultGroup(); + + private final Setting> items = sgGeneral.add(new ItemListSetting.Builder() + .name("items") + .description("Items you want to rename.") + .defaultValue(List.of()) + .build() + ); + + private final Setting delay = sgGeneral.add(new IntSetting.Builder() + .name("delay") + .description("How many ticks to wait between actions.") + .defaultValue(2) + .min(0) + .sliderMax(40) + .build() + ); + + private final Setting name = sgGeneral.add(new StringSetting.Builder() + .name("name") + .description("Name for an item, empty for reverting name to default.") + .defaultValue("") + .build() + ); + + private final Setting firstItemInContainer = sgGeneral.add(new BoolSetting.Builder() + .name("first-item-in-container") + .description("Will rename containers based on name of first item in it.") + .defaultValue(false) + .build() + ); + + private final Setting> containerItems = sgGeneral.add(new ItemListSetting.Builder() + .name("container-items") + .description("Items to treat as containers.") + .defaultValue(List.of()) + .build() + ); + + public AutoRename() { + super(MeteorRejectsAddon.CATEGORY, "auto-rename", "Automatically renames items."); + } + + private int delayLeft = 0; + @EventHandler + private void onTick(TickEvent.Post ignoredEvent) { + if (mc.interactionManager == null) return; + if (items.get().isEmpty()) return; + if (!(mc.player.currentScreenHandler instanceof AnvilScreenHandler)) return; + + if (delayLeft > 0) { + delayLeft--; + return; + } else { + delayLeft = delay.get(); + } + + var slot0 = mc.player.currentScreenHandler.getSlot(0); + var slot1 = mc.player.currentScreenHandler.getSlot(1); + var slot2 = mc.player.currentScreenHandler.getSlot(2); + if (slot1.hasStack()) { +// info("Slot 1 occupied"); + return; // touching anything + } + if (slot2.hasStack()) { + if (mc.player.experienceLevel < 1) { +// info("No exp"); + } else { +// info("Extracting named"); + extractNamed(); + } + } else { + if (slot0.hasStack()) { +// info("Renaming"); + renameItem(slot0.getStack()); + } else { +// info("Populating"); + populateAnvil(); + } + } + } + + private void renameItem(ItemStack s) { + var setname = ""; + if (firstItemInContainer.get() && containerItems.get().contains(s.getItem())) { + setname = getFirstItemName(s); + } else { + setname = name.get(); + } +// info("Renaming"); + if (mc.currentScreen == null || !(mc.currentScreen instanceof AnvilScreen)) { + error("Not anvil screen"); + toggle(); + return; + } + var widgets = mc.currentScreen.children(); + var input = (TextFieldWidget)widgets.get(0); + input.setText(setname); + } + + private String getFirstItemName(ItemStack stack) { + Item item = stack.getItem(); + if (!(item instanceof BlockItem && ((BlockItem) item).getBlock() instanceof ShulkerBoxBlock)) { + return ""; + } + NbtCompound compound = stack.getNbt(); + if (compound == null) { + return ""; + } + compound = compound.getCompound("BlockEntityTag"); + if (compound == null) { + return ""; + } + var list = compound.getList("Items", NbtElement.COMPOUND_TYPE); + if (list == null) { + return ""; + } + var minslot = Byte.MAX_VALUE; + var name = ""; + for (int i = 0; i < list.size(); i++) { + var invItem = list.getCompound(i); + var invSlot = invItem.getByte("Slot"); + if (minslot < invSlot) { + continue; + } + var itemId = invItem.getString("id"); + if (itemId == null) { + continue; + } + name = ItemStack.fromNbt(invItem).getName().getString(); + minslot = invSlot; + } + return name; + } + + private void extractNamed() { + var to = -1; + var inv = mc.player.currentScreenHandler; + for (int i = 3; i < 38; i++) { + var sl = inv.getSlot(i); + if (sl.hasStack()) { + to = i; + break; + } + } + if (to == -1) { +// info("No output slot"); + return; + } + var from = 2; +// info("Shift click %d %d", from, to); + InvUtils.shiftClick().fromId(from).toId(to); + } + + private void populateAnvil() { + var gItems = items.get(); + var from = -1; + var inv = mc.player.currentScreenHandler; + for (int i = 3; i < 38; i++) { + var sl = inv.getSlot(i); + if (!sl.hasStack()) { + continue; + } + var st = sl.getStack(); + if (gItems.contains(st.getItem()) && !st.hasCustomName()) { + from = i; + break; + } + } + if (from == -1) { +// info("Nothing to rename"); + return; + } + var to = 0; +// info("Shift click %d %d", from, to); + InvUtils.shiftClick().fromId(from).toId(to); + } +} From 12f9928bb818316e63d458d08d6e4958dc1d3958 Mon Sep 17 00:00:00 2001 From: Wide-Cat <74723656+Wide-Cat@users.noreply.github.com> Date: Sat, 30 Mar 2024 17:26:21 +0000 Subject: [PATCH 11/26] Remove instamine (#335) --- .../anticope/rejects/MeteorRejectsAddon.java | 1 - .../anticope/rejects/modules/InstaMine.java | 131 ------------------ 2 files changed, 132 deletions(-) delete mode 100644 src/main/java/anticope/rejects/modules/InstaMine.java diff --git a/src/main/java/anticope/rejects/MeteorRejectsAddon.java b/src/main/java/anticope/rejects/MeteorRejectsAddon.java index 72196081..e7e12116 100644 --- a/src/main/java/anticope/rejects/MeteorRejectsAddon.java +++ b/src/main/java/anticope/rejects/MeteorRejectsAddon.java @@ -62,7 +62,6 @@ public void onInitialize() { modules.add(new GamemodeNotifier()); modules.add(new GhostMode()); modules.add(new Glide()); - modules.add(new InstaMine()); modules.add(new ItemGenerator()); modules.add(new InteractionMenu()); modules.add(new Jetpack()); diff --git a/src/main/java/anticope/rejects/modules/InstaMine.java b/src/main/java/anticope/rejects/modules/InstaMine.java deleted file mode 100644 index d3a4f6e1..00000000 --- a/src/main/java/anticope/rejects/modules/InstaMine.java +++ /dev/null @@ -1,131 +0,0 @@ -package anticope.rejects.modules; - -import anticope.rejects.MeteorRejectsAddon; -import meteordevelopment.meteorclient.events.entity.player.StartBreakingBlockEvent; -import meteordevelopment.meteorclient.events.render.Render3DEvent; -import meteordevelopment.meteorclient.events.world.TickEvent; -import meteordevelopment.meteorclient.renderer.ShapeMode; -import meteordevelopment.meteorclient.settings.*; -import meteordevelopment.meteorclient.systems.modules.Module; -import meteordevelopment.meteorclient.utils.player.Rotations; -import meteordevelopment.meteorclient.utils.render.color.SettingColor; -import meteordevelopment.meteorclient.utils.world.BlockUtils; -import meteordevelopment.orbit.EventHandler; -import net.minecraft.item.Items; -import net.minecraft.network.packet.c2s.play.HandSwingC2SPacket; -import net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket; -import net.minecraft.util.Hand; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; - -public class InstaMine extends Module { - - private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgRender = settings.createGroup("Render"); - - private final Setting tickDelay = sgGeneral.add(new IntSetting.Builder() - .name("delay") - .description("The delay between breaks.") - .defaultValue(0) - .min(0) - .sliderMax(20) - .build() - ); - - private final Setting pick = sgGeneral.add(new BoolSetting.Builder() - .name("only-pick") - .description("Only tries to mine the block if you are holding a pickaxe.") - .defaultValue(true) - .build() - ); - - private final Setting rotate = sgGeneral.add(new BoolSetting.Builder() - .name("rotate") - .description("Faces the blocks being mined server side.") - .defaultValue(true) - .build() - ); - - // Render - - private final Setting render = sgRender.add(new BoolSetting.Builder() - .name("render") - .description("Renders a block overlay on the block being broken.") - .defaultValue(true) - .build() - ); - - private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() - .name("shape-mode") - .description("How the shapes are rendered.") - .defaultValue(ShapeMode.Both) - .build() - ); - - private final Setting sideColor = sgRender.add(new ColorSetting.Builder() - .name("side-color") - .description("The color of the sides of the blocks being rendered.") - .defaultValue(new SettingColor(204, 0, 0, 10)) - .build() - ); - - private final Setting lineColor = sgRender.add(new ColorSetting.Builder() - .name("line-color") - .description("The color of the lines of the blocks being rendered.") - .defaultValue(new SettingColor(204, 0, 0, 255)) - .build() - ); - - private int ticks; - - private final BlockPos.Mutable blockPos = new BlockPos.Mutable(0, -1, 0); - private Direction direction; - - public InstaMine() { - super(MeteorRejectsAddon.CATEGORY, "insta-mine", "Attempts to instantly mine blocks."); - } - - @Override - public void onActivate() { - ticks = 0; - blockPos.set(0, -128, 0); - } - - @EventHandler - private void onStartBreakingBlock(StartBreakingBlockEvent event) { - direction = event.direction; - blockPos.set(event.blockPos); - } - - @EventHandler - private void onTick(TickEvent.Pre event) { - if (ticks >= tickDelay.get()) { - ticks = 0; - - if (shouldMine()) { - if (rotate.get()) { - Rotations.rotate(Rotations.getYaw(blockPos), Rotations.getPitch(blockPos), () -> mc.getNetworkHandler().sendPacket(new PlayerActionC2SPacket(PlayerActionC2SPacket.Action.STOP_DESTROY_BLOCK, blockPos, direction))); - } else { - mc.getNetworkHandler().sendPacket(new PlayerActionC2SPacket(PlayerActionC2SPacket.Action.STOP_DESTROY_BLOCK, blockPos, direction)); - } - - mc.getNetworkHandler().sendPacket(new HandSwingC2SPacket(Hand.MAIN_HAND)); - - } - } else { - ticks++; - } - } - - private boolean shouldMine() { - if (blockPos.getY() == -128) return false; - if (!BlockUtils.canBreak(blockPos)) return false; - return !pick.get() || (mc.player.getMainHandStack().getItem() == Items.DIAMOND_PICKAXE || mc.player.getMainHandStack().getItem() == Items.NETHERITE_PICKAXE); - } - - @EventHandler - private void onRender(Render3DEvent event) { - if (!render.get() || !shouldMine()) return; - event.renderer.box(blockPos, sideColor.get(), lineColor.get(), shapeMode.get(), 0); - } -} From abb9663305954892772916662710f4d48d5b9654 Mon Sep 17 00:00:00 2001 From: Patrick <73178245+Paddyk45@users.noreply.github.com> Date: Mon, 1 Apr 2024 14:39:52 +0200 Subject: [PATCH 12/26] Fix wrong class for VehicleMoveC2SAccessor (#336) --- .../anticope/rejects/mixin/VehicleMoveC2SPacketAccessor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/anticope/rejects/mixin/VehicleMoveC2SPacketAccessor.java b/src/main/java/anticope/rejects/mixin/VehicleMoveC2SPacketAccessor.java index 0d3348f3..43eb7c89 100644 --- a/src/main/java/anticope/rejects/mixin/VehicleMoveC2SPacketAccessor.java +++ b/src/main/java/anticope/rejects/mixin/VehicleMoveC2SPacketAccessor.java @@ -1,11 +1,11 @@ package anticope.rejects.mixin; -import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket; +import net.minecraft.network.packet.c2s.play.VehicleMoveC2SPacket; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mutable; import org.spongepowered.asm.mixin.gen.Accessor; -@Mixin(PlayerMoveC2SPacket.class) +@Mixin(VehicleMoveC2SPacket.class) public interface VehicleMoveC2SPacketAccessor { @Mutable @Accessor("x") From f1a204e7ad9768fd0b182a774d79fbd504d27e1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Riba=20D=C3=A1niel?= <61618352+vitphire@users.noreply.github.com> Date: Tue, 9 Apr 2024 19:21:06 +0200 Subject: [PATCH 13/26] Added book color functionality to ColorSigns (#338) --- .../anticope/rejects/modules/ColorSigns.java | 52 ++++++++++++++++--- 1 file changed, 44 insertions(+), 8 deletions(-) diff --git a/src/main/java/anticope/rejects/modules/ColorSigns.java b/src/main/java/anticope/rejects/modules/ColorSigns.java index 87b80e92..a130ba9d 100644 --- a/src/main/java/anticope/rejects/modules/ColorSigns.java +++ b/src/main/java/anticope/rejects/modules/ColorSigns.java @@ -2,30 +2,63 @@ import anticope.rejects.MeteorRejectsAddon; import meteordevelopment.meteorclient.events.packets.PacketEvent; +import meteordevelopment.meteorclient.settings.BoolSetting; +import meteordevelopment.meteorclient.settings.Setting; +import meteordevelopment.meteorclient.settings.SettingGroup; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.orbit.EventHandler; +import net.minecraft.network.packet.c2s.play.BookUpdateC2SPacket; import net.minecraft.network.packet.c2s.play.UpdateSignC2SPacket; import net.minecraft.network.packet.s2c.play.GameJoinS2CPacket; +import net.minecraft.server.MinecraftServer; + +import java.util.List; public class ColorSigns extends Module { + private final SettingGroup sgGeneral = settings.getDefaultGroup(); + + private final Setting signs = sgGeneral.add(new BoolSetting.Builder() + .name("signs") + .description("Allows you to use colors in signs.") + .defaultValue(true) + .build() + ); + + private final Setting books = sgGeneral.add(new BoolSetting.Builder() + .name("books") + .description("Allows you to use colors in books.") + .defaultValue(false) + .build() + ); + public ColorSigns() { super(MeteorRejectsAddon.CATEGORY, "color-signs", "Allows you to use colors on signs on NON-PAPER servers (use \"&\" for color symbols)"); } - + @EventHandler private void onPacketSend(PacketEvent.Send event) { if (event.packet instanceof GameJoinS2CPacket) { checkWarning(); return; } - if (!(event.packet instanceof UpdateSignC2SPacket)) return; - UpdateSignC2SPacket p = (UpdateSignC2SPacket)event.packet; - for (int l = 0; l < p.getText().length; l++) { - String newText = p.getText()[l].replaceAll("(?i)\u00a7|&([0-9A-FK-OR])", "\u00a7\u00a7$1$1"); - p.getText()[l] = newText; + if (signs.get() && event.packet instanceof UpdateSignC2SPacket packet) { + for (int line = 0; line < packet.getText().length; line++) { + packet.getText()[line] = packet.getText()[line] + .replaceAll("(?i)(?:&|(? newPages = packet.getPages().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)) { + assert mc.getNetworkHandler() != null; + mc.getNetworkHandler().sendPacket(new BookUpdateC2SPacket( + packet.getSlot(), newPages, packet.getTitle())); + event.cancel(); + } } - event.packet = p; } @Override @@ -35,7 +68,10 @@ public void onActivate() { } private void checkWarning() { - String brand = mc.player.getServer().getServerModName(); + assert mc.player != null; + MinecraftServer server = mc.player.getServer(); + if (server == null) return; + String brand = server.getServerModName(); if (brand == null) return; if (brand.contains("Paper")) warning("You are on a paper server. Color signs won't work here"); } From f204244797f84301c3c759738d29bf5c78084d2b Mon Sep 17 00:00:00 2001 From: crazymoose77756 <52980616+crazymoose77756@users.noreply.github.com> Date: Wed, 15 May 2024 05:04:21 -0400 Subject: [PATCH 14/26] 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 --- .github/workflows/gradle.yml | 14 +- .github/workflows/pull_request.yml | 4 +- README.md | 2 +- build.gradle | 10 +- gradle.properties | 9 +- gradle/wrapper/gradle-wrapper.properties | 4 +- .../rejects/commands/GiveCommand.java | 40 ++-- .../rejects/commands/ReconnectCommand.java | 2 +- .../rejects/gui/screens/HeadScreen.java | 10 +- .../gui/screens/InteractionScreen.java | 13 +- .../rejects/gui/screens/StatsScreen.java | 12 +- .../mixin/LivingEntityRendererMixin.java | 4 +- .../anticope/rejects/modules/AntiVanish.java | 6 +- .../anticope/rejects/modules/AutoEnchant.java | 5 +- .../rejects/modules/AutoExtinguish.java | 6 +- .../anticope/rejects/modules/AutoFarm.java | 9 +- .../anticope/rejects/modules/AutoGrind.java | 7 +- .../anticope/rejects/modules/AutoPot.java | 68 +++---- .../anticope/rejects/modules/AutoRename.java | 8 +- .../rejects/modules/BungeeCordSpoof.java | 3 +- .../anticope/rejects/modules/ColorSigns.java | 6 +- .../rejects/modules/CustomPackets.java | 6 +- .../rejects/modules/ObsidianFarm.java | 10 +- .../anticope/rejects/utils/GiveUtils.java | 33 ++-- .../anticope/rejects/utils/WorldGenUtils.java | 34 ++-- .../utils/server/LegacyServerPinger.java | 11 +- .../utils/server/ServerListPinger.java | 177 +++++------------- .../meteor-rejects-meteor.mixins.json | 2 +- src/main/resources/meteor-rejects.mixins.json | 2 +- 29 files changed, 223 insertions(+), 294 deletions(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 055df603..04caf0a8 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 eb42b3d0..5bd6eeb4 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 406c2c53..d23e3527 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 d5fe24cf..20411612 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 73d9250f..46b26e2c 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 ef626410..48c0a02c 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 d6d6d729..c14fe400 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.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 void build(LiteralArgumentBuilder builder) { 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 void build(LiteralArgumentBuilder builder) { 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 void build(LiteralArgumentBuilder builder) { String message = ctx.getArgument("message", String.class).replace("&", "\247"); ItemStack stack = new ItemStack(Items.BAT_SPAWN_EGG); NbtCompound tag = new NbtCompound(); - tag.putString("CustomName", Text.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 void build(LiteralArgumentBuilder builder) { 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 1b4ed5ea..855fa680 100644 --- a/src/main/java/anticope/rejects/commands/ReconnectCommand.java +++ b/src/main/java/anticope/rejects/commands/ReconnectCommand.java @@ -24,7 +24,7 @@ public void build(LiteralArgumentBuilder builder) { 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 f3c7e711..2208ad00 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.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 @@ private void loadHeads() { 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 @@ private ItemStack createHeadStack(String uuid, String value, String name) { 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 e56c4d5a..f70d3b13 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.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 InteractionScreen(Entity entity, InteractionMenu module) { 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 @@ private ItemStack[] getInventory(Entity e) { 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 @@ private void onKey(KeyEvent event) { } } } -} \ 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 17f7a8c9..d5c8deb9 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 @@ private void updateData() { 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 @@ private void updateData() { 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 @@ private void updateData() { 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 @@ private void updateData() { 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 5ece6ba0..ed4cce6f 100644 --- a/src/main/java/anticope/rejects/mixin/LivingEntityRendererMixin.java +++ b/src/main/java/anticope/rejects/mixin/LivingEntityRendererMixin.java @@ -16,10 +16,10 @@ @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 e3af5566..f85a2cf5 100644 --- a/src/main/java/anticope/rejects/modules/AntiVanish.java +++ b/src/main/java/anticope/rejects/modules/AntiVanish.java @@ -75,7 +75,7 @@ public WWidget getWidget(GuiTheme theme) { @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 @@ private void onPacket(PacketEvent.Receive event) { } } - completionIDs.remove(Integer.valueOf(packet.getCompletionId())); + completionIDs.remove(Integer.valueOf(packet.id())); event.cancel(); } } @@ -143,4 +143,4 @@ public enum Mode { 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 993192ce..a633bcce 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.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 @@ private void autoEnchant() { } 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 a05cada5..bb858b36 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 @@ private void onTick(TickEvent.Pre event) { 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 0765a5e1..cd4cb9f6 100644 --- a/src/main/java/anticope/rejects/modules/AutoFarm.java +++ b/src/main/java/anticope/rejects/modules/AutoFarm.java @@ -257,13 +257,13 @@ private boolean isMature(BlockState state, Block block) { 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 @@ private boolean harvestFilter(Block block) { 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 25336d6a..c0463fe0 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.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 @@ private void onOpenScreen(OpenScreenEvent event) { 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 @@ private boolean canGrind(ItemStack stack) { 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 042a3426..771a46cb 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.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 @@ private int HealingpotionSlot() { 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 @@ private int HealingSplashpotionSlot() { 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 @@ private int StrengthSplashpotionSlot () { 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 @@ private int StrengthpotionSlot () { 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 @@ private boolean ShouldNotDrinkHealth(){ 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 bcc66b40..b3903aa0 100644 --- a/src/main/java/anticope/rejects/modules/AutoRename.java +++ b/src/main/java/anticope/rejects/modules/AutoRename.java @@ -9,6 +9,8 @@ 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 @@ private String getFirstItemName(ItemStack stack) { 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 @@ private String getFirstItemName(ItemStack stack) { if (itemId == null) { continue; } - name = ItemStack.fromNbt(invItem).getName().getString(); + name = String.valueOf(invItem.getCompound("Name")); minslot = invSlot; } return name; @@ -183,7 +185,7 @@ private void populateAnvil() { 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 b1e9bca3..d79eac88 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.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 BungeeCordSpoof() { @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 a130ba9d..708171c6 100644 --- a/src/main/java/anticope/rejects/modules/ColorSigns.java +++ b/src/main/java/anticope/rejects/modules/ColorSigns.java @@ -49,13 +49,13 @@ private void onPacketSend(PacketEvent.Send event) { } } 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 9cc649fc..0225a41f 100644 --- a/src/main/java/anticope/rejects/modules/CustomPackets.java +++ b/src/main/java/anticope/rejects/modules/CustomPackets.java @@ -54,7 +54,7 @@ public CustomPackets() { @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 @@ private void onCustomPayloadPacket(PacketEvent.Receive event) { 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 @@ private void onUnknownPacket(CustomPayloadS2CPacket packet) { 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 931c60b2..d628b755 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.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 @@ private void onTick(TickEvent.Post event) { 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 @@ private void onTick(TickEvent.Post event) { } } - private BlockPos findObsidian() { List blocksList = new ArrayList<>(); @@ -106,14 +106,12 @@ private BlockPos findObsidian() { 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 308ccd00..b5e2aed4 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 static void giveItem(ItemStack item) throws CommandSyntaxException { 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 static void giveItem(ItemStack item) throws CommandSyntaxException { 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 static void giveItem(ItemStack item) throws CommandSyntaxException { } 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 static void giveItem(ItemStack item) throws CommandSyntaxException { 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 static void giveItem(ItemStack item) throws CommandSyntaxException { 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 static void giveItem(ItemStack item) throws CommandSyntaxException { 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 static void giveItem(ItemStack item) throws CommandSyntaxException { 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 eae3db2b..26fee359 100644 --- a/src/main/java/anticope/rejects/utils/WorldGenUtils.java +++ b/src/main/java/anticope/rejects/utils/WorldGenUtils.java @@ -19,6 +19,10 @@ 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 @@ private static BlockPos toBlockPos(BPos pos) { 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 @@ private static boolean isValidMap(Feature feature, ItemStack stack) { } 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 d6e1daa1..3c45a092 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 void ping(String ip, int port) { 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 ffc7df80..ae5e0c4b 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.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 @@ private void notifyDisconnectListeners() { 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 void run() { public void onResponse(QueryResponseS2CPacket packet) { if (this.received) { clientConnection.disconnect(Text.translatable("multiplayer.status.unrequested")); - } else { - this.received = true; - ServerMetadata serverMetadata = packet.metadata(); + return; + } + this.received = true; + ServerMetadata serverMetadata = packet.metadata(); + if (serverMetadata.description() != null) { 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(); - } + } else { + entry.label = ""; + } - }, () -> entry.playerCountLabel = "multiplayer.status.unknown"); - serverMetadata.favicon().ifPresent((favicon) -> { - if (!Arrays.equals(favicon.iconBytes(), entry.getIcon())) { - entry.setIcon(favicon.iconBytes()); - runnable.run(); - } + 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(); + 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 boolean isConnectionOpen() { } }; - 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 boolean isConnectionOpen() { 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 void cancel() { } } } -} +} \ 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 4cb4a2fe..caa371f7 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 4ab9b308..da932cb4 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", From 3a6a0d80ef4b374752e507ce157e93937a55039e Mon Sep 17 00:00:00 2001 From: Marcos <98092901+chiteroman@users.noreply.github.com> Date: Wed, 15 May 2024 11:04:49 +0200 Subject: [PATCH 15/26] Ignore invalid nicknames in AntiVanish (#344) https://help.minecraft.net/hc/en-us/articles/4408950195341-Minecraft-Java-Edition-Username-VS-Gamertag-FAQ#h_01GE5JWW0210X02JZN2FP9CREC --- src/main/java/anticope/rejects/modules/AntiVanish.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/anticope/rejects/modules/AntiVanish.java b/src/main/java/anticope/rejects/modules/AntiVanish.java index f85a2cf5..aa6e84ae 100644 --- a/src/main/java/anticope/rejects/modules/AntiVanish.java +++ b/src/main/java/anticope/rejects/modules/AntiVanish.java @@ -88,6 +88,8 @@ private void onPacket(PacketEvent.Receive event) { for (String playerName : completionPlayerCache) { if (Objects.equals(playerName, mc.player.getName().getString())) continue; + if (playerName.contains(" ")) continue; + if (playerName.length() < 3 || playerName.length() > 16) continue; if (joinedOrQuit.test(playerName)) { info("Player joined: " + playerName); } @@ -95,6 +97,8 @@ private void onPacket(PacketEvent.Receive event) { for (String playerName : lastUsernames) { if (Objects.equals(playerName, mc.player.getName().getString())) continue; + if (playerName.contains(" ")) continue; + if (playerName.length() < 3 || playerName.length() > 16) continue; if (joinedOrQuit.test(playerName)) { info("Player left: " + playerName); } @@ -124,6 +128,8 @@ private void onTick(TickEvent.Post event) { for (UUID uuid : oldPlayers.keySet()) { if (playerCache.containsKey(uuid)) continue; String name = oldPlayers.get(uuid); + if (name.contains(" ")) continue; + if (name.length() < 3 || name.length() > 16) continue; if (messageCache.stream().noneMatch(s -> s.contains(name))) { warning(name + " has gone into vanish."); } From 7bdd1353d53186ea26af8f0ed3f4ddbd3437948d Mon Sep 17 00:00:00 2001 From: crazymoose77756 <52980616+crazymoose77756@users.noreply.github.com> Date: Fri, 17 May 2024 05:53:58 -0400 Subject: [PATCH 16/26] Nbt fixes (#349) * progress towards working nbt * update item nbt --- .../rejects/commands/GiveCommand.java | 96 ++++++----- .../anticope/rejects/utils/GiveUtils.java | 158 ++++++++++-------- .../rejects/utils/accounts/GetPlayerUUID.java | 48 ++++++ 3 files changed, 188 insertions(+), 114 deletions(-) create mode 100644 src/main/java/anticope/rejects/utils/accounts/GetPlayerUUID.java diff --git a/src/main/java/anticope/rejects/commands/GiveCommand.java b/src/main/java/anticope/rejects/commands/GiveCommand.java index c14fe400..7c51ed3f 100644 --- a/src/main/java/anticope/rejects/commands/GiveCommand.java +++ b/src/main/java/anticope/rejects/commands/GiveCommand.java @@ -2,12 +2,15 @@ import anticope.rejects.arguments.EnumStringArgumentType; import anticope.rejects.utils.GiveUtils; +import com.mojang.authlib.GameProfile; 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.ComponentChanges; import net.minecraft.component.DataComponentTypes; import net.minecraft.component.type.NbtComponent; +import net.minecraft.component.type.ProfileComponent; import net.minecraft.item.BlockItem; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; @@ -20,8 +23,7 @@ import java.util.Collection; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; -import static meteordevelopment.meteorclient.MeteorClient.mc; +import static anticope.rejects.utils.accounts.GetPlayerUUID.getUUID; public class GiveCommand extends Command { @@ -33,86 +35,98 @@ public GiveCommand() { @Override public void build(LiteralArgumentBuilder builder) { + // TODO : finish this builder.then(literal("egg").executes(ctx -> { 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) { - 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.set(DataComponentTypes.CUSTOM_DATA, NbtComponent.of(itemNbt)); + 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()); + } 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.getComponents().isEmpty()) { - it.put("tag", inHand.getOrDefault(DataComponentTypes.CUSTOM_DATA, NbtComponent.DEFAULT).copyNbt()); - } - ct.put("Item", it); + NbtCompound itemTag = new NbtCompound(); + itemTag.putString("id", Registries.ITEM.getId(inHand.getItem()).toString()); + itemTag.putInt("Count", inHand.getCount()); + + ct.put("Item", itemTag); } NbtCompound t = new NbtCompound(); t.put("EntityTag", ct); - item.set(DataComponentTypes.CUSTOM_DATA, NbtComponent.of(t)); - item.set(DataComponentTypes.CUSTOM_NAME, inHand.getName()); + + var changes = ComponentChanges.builder() + .add(DataComponentTypes.CUSTOM_NAME, inHand.getName()) + .add(DataComponentTypes.CUSTOM_DATA, NbtComponent.of(t)) + .build(); + + item.applyChanges(changes); GiveUtils.giveItem(item); return SINGLE_SUCCESS; })); - //TODO: allow for custom cords to place oob + //TODO: allow for custom cords to place oob, though optional args 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); + ItemStack stack = new ItemStack(Items.STRIDER_SPAWN_EGG); NbtCompound tag = new NbtCompound(); - NbtList NbtList = new NbtList(); - NbtList.add(NbtDouble.of(mc.player.getX())); - NbtList.add(NbtDouble.of(mc.player.getY())); - NbtList.add(NbtDouble.of(mc.player.getZ())); + NbtList pos = new NbtList(); + + pos.add(NbtDouble.of(mc.player.getX())); + pos.add(NbtDouble.of(mc.player.getY())); + pos.add(NbtDouble.of(mc.player.getZ())); + + tag.putString("id", "minecraft:armor_stand"); + tag.put("Pos", pos); tag.putBoolean("Invisible", true); tag.putBoolean("Invulnerable", true); - tag.putBoolean("Interpret", true); tag.putBoolean("NoGravity", true); tag.putBoolean("CustomNameVisible", true); - tag.putString("CustomName", Text.literal(message).toString()); - tag.put("Pos", NbtList); - stack.set(DataComponentTypes.ENTITY_DATA, NbtComponent.of(tag)); + + var changes = ComponentChanges.builder() + .add(DataComponentTypes.CUSTOM_NAME, Text.literal(message)) + .add(DataComponentTypes.ENTITY_DATA, NbtComponent.of(tag)) + .build(); + + stack.applyChanges(changes); GiveUtils.giveItem(stack); return SINGLE_SUCCESS; }))); + //TODO, make invisible through potion effect builder.then(literal("bossbar").then(argument("message", StringArgumentType.greedyString()).executes(ctx -> { 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.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.set(DataComponentTypes.ENTITY_DATA, NbtComponent.of(tag)); + + var changes = ComponentChanges.builder() + .add(DataComponentTypes.CUSTOM_NAME, Text.literal(message)) + .add(DataComponentTypes.ENTITY_DATA, NbtComponent.of(tag)) + .build(); + stack.applyChanges(changes); + GiveUtils.giveItem(stack); return SINGLE_SUCCESS; }))); + // TODO : resolve textures, should be easy now that UUID is resolved builder.then(literal("head").then(argument("owner", StringArgumentType.greedyString()).executes(ctx -> { String playerName = ctx.getArgument("owner", String.class); ItemStack itemStack = new ItemStack(Items.PLAYER_HEAD); - NbtCompound tag = new NbtCompound(); - tag.putString("SkullOwner", playerName); - itemStack.set(DataComponentTypes.CUSTOM_DATA, NbtComponent.of(tag)); + + var changes = ComponentChanges.builder() + .add(DataComponentTypes.PROFILE, new ProfileComponent(new GameProfile(getUUID(playerName), playerName))) + .build(); + + itemStack.applyChanges(changes); + GiveUtils.giveItem(itemStack); return SINGLE_SUCCESS; }))); diff --git a/src/main/java/anticope/rejects/utils/GiveUtils.java b/src/main/java/anticope/rejects/utils/GiveUtils.java index b5e2aed4..03cde95e 100644 --- a/src/main/java/anticope/rejects/utils/GiveUtils.java +++ b/src/main/java/anticope/rejects/utils/GiveUtils.java @@ -1,21 +1,25 @@ package anticope.rejects.utils; +import it.unimi.dsi.fastutil.ints.IntArrayList; +import it.unimi.dsi.fastutil.ints.IntList; +import net.minecraft.component.ComponentChanges; import net.minecraft.component.DataComponentTypes; -import net.minecraft.component.type.NbtComponent; +import net.minecraft.component.type.*; +import net.minecraft.enchantment.Enchantments; +import net.minecraft.entity.effect.StatusEffect; +import net.minecraft.entity.effect.StatusEffectInstance; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtList; import net.minecraft.nbt.StringNbtReader; +import net.minecraft.registry.Registries; +import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.text.Text; import net.minecraft.util.Identifier; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Random; +import java.util.*; import java.util.function.Function; import com.mojang.brigadier.exceptions.CommandSyntaxException; @@ -43,18 +47,21 @@ public class GiveUtils { new Identifier("lightning_bolt")); // Some ported from: https://github.com/BleachDrinker420/BleachHack/blob/master/BleachHack-Fabric-1.16/src/main/java/bleach/hack/command/commands/CmdGive.java - private static final List> STRING_PRESETS = Arrays.asList( - Triple.of("lag_spawner", Items.SPAWNER, "{BlockEntityTag:{MaxNearbyEntities:32767,RequiredPlayerRange:32767,SpawnCount:32767,MaxSpawnDelay:0,SpawnRange:32767,Delay:0,MinSpawnDelay:0}}"), - Triple.of("tnt_spawner", Items.SPAWNER, "{BlockEntityTag:{MaxNearbyEntities:32767,RequiredPlayerRange:32767,SpawnCount:50,SpawnData:{Fuse:1,id:\"minecraft:tnt\"},MaxSpawnDelay:0,SpawnRange:10,Delay:0,MinSpawnDelay:0}}"), - Triple.of("boat_spawner", Items.SPAWNER, "{BlockEntityTag:{SpawnData:{Type:\"jungle\",CustomName:'{\"text\":\"Boat\",\"color\":\"aqua\",\"bold\":true,\"italic\":true,\"underlined\":true}',Invulnerable:1b,id:\"minecraft:boat\",Glowing:1b,CustomNameVisible:1b},SpawnRange:10,SpawnCount:50}}"), - Triple.of("pigs_egg", Items.CHICKEN_SPAWN_EGG, "{EntityTag:{MaxNearbyEntities:1000,RequiredPlayerRange:100,CustomDisplayTile:1b,DisplayState:{Properties:{hinge:\"left\",half:\"upper\",open:\"true\"},Name:\"minecraft:acacia_door\"},SpawnData:{id:\"minecraft:minecart\"},id:\"minecraft:spawner_minecart\",MaxSpawnDelay:0,Delay:1,MinSpawnDelay:0}}"), - Triple.of("end_portal_arrow", Items.ELDER_GUARDIAN_SPAWN_EGG, "{EntityTag:{SoundEvent:\"block.end_portal.spawn\",pickup:1b,id:\"minecraft:arrow\"}}"), - Triple.of("wither_spawn_arrow", Items.ELDER_GUARDIAN_SPAWN_EGG, "{EntityTag:{SoundEvent:\"entity.wither.spawn\",pickup:1b,id:\"minecraft:arrow\"}}"), - Triple.of("eg_curse_arrow", Items.ELDER_GUARDIAN_SPAWN_EGG, "{EntityTag:{SoundEvent:\"entity.elder_guardian.curse\",pickup:1b,id:\"minecraft:arrow\"}}"), - Triple.of("big_slime", Items.SLIME_SPAWN_EGG, "{EntityTag:{Size:50,id:\"minecraft:slime\"}}"), - Triple.of("particle_area_expand", Items.SKELETON_SPAWN_EGG, "{EntityTag:{Particle:\"angry_villager\",Radius:1.0f,RadiusOnUse:1.0f,Duration:10000,id:\"minecraft:area_effect_cloud\",RadiusPerTick:10.0f}}"), - Triple.of("armor_stand_spawner_minecart", Items.BAT_SPAWN_EGG, "{EntityTag:{SpawnData:{id:\"minecraft:armor_stand\"},id:\"minecraft:spawner_minecart\"}}"), - Triple.of("dud_tnt", Items.DROWNED_SPAWN_EGG, "{EntityTag:{Fuse:30000,Invulnerable:1b,id:\"minecraft:tnt\"}}") + private static final List> ENTITY_PRESETS = Arrays.asList( + Triple.of("pigs_egg", Items.CHICKEN_SPAWN_EGG, "{MaxNearbyEntities:1000,RequiredPlayerRange:100,CustomDisplayTile:1b,DisplayState:{Properties:{hinge:\"left\",half:\"upper\",open:\"true\"},Name:\"minecraft:acacia_door\"},SpawnData:{id:\"minecraft:minecart\"},id:\"minecraft:spawner_minecart\",MaxSpawnDelay:0,Delay:1,MinSpawnDelay:0}"), + Triple.of("end_portal_arrow", Items.ELDER_GUARDIAN_SPAWN_EGG, "{SoundEvent:\"block.end_portal.spawn\",pickup:1b,id:\"minecraft:arrow\"}"), + Triple.of("wither_spawn_arrow", Items.ELDER_GUARDIAN_SPAWN_EGG, "{SoundEvent:\"entity.wither.spawn\",pickup:1b,id:\"minecraft:arrow\"}"), + Triple.of("eg_curse_arrow", Items.ELDER_GUARDIAN_SPAWN_EGG, "{SoundEvent:\"entity.elder_guardian.curse\",pickup:1b,id:\"minecraft:arrow\"}"), + Triple.of("big_slime", Items.SLIME_SPAWN_EGG, "{Size:50,id:\"minecraft:slime\"}"), + Triple.of("particle_area_expand", Items.SKELETON_SPAWN_EGG, "{Particle:\"angry_villager\",Radius:1.0f,RadiusOnUse:1.0f,Duration:10000,id:\"minecraft:area_effect_cloud\",RadiusPerTick:10.0f}"), + Triple.of("armor_stand_spawner_minecart", Items.BAT_SPAWN_EGG, "{SpawnData:{id:\"minecraft:armor_stand\"},id:\"minecraft:spawner_minecart\"}"), + Triple.of("dud_tnt", Items.DROWNED_SPAWN_EGG, "{Fuse:30000,Invulnerable:1b,id:\"minecraft:tnt\"}") + ); + + private static final List> BLOCK_PRESETS = Arrays.asList( + Triple.of("lag_spawner", Items.SPAWNER, "{MaxNearbyEntities:32767,RequiredPlayerRange:32767,SpawnCount:50,MaxSpawnDelay:0,id:\"minecraft:spawner\",SpawnRange:32767,Delay:0,MinSpawnDelay:0}"), + Triple.of("tnt_spawner", Items.SPAWNER, "{MaxNearbyEntities:32767,RequiredPlayerRange:32767,SpawnCount:50,SpawnData:{entity:{id:\"minecraft:tnt\",fuse:1}},MaxSpawnDelay:0,id:\"minecraft:mob_spawner\",SpawnRange:10,Delay:0,MinSpawnDelay:0}"), + Triple.of("boat_spawner", Items.SPAWNER, "{SpawnCount:50,SpawnData:{entity:{Type:\"jungle\",CustomName:'{\"bold\":true,\"color\":\"aqua\",\"italic\":true,\"text\":\"Boat\",\"underlined\":true}',Invulnerable:1b,id:\"minecraft:boat\",Glowing:1b,CustomNameVisible:1b}},id:\"minecraft:spawner\",SpawnRange:10}") ); private static final Random random = new Random(); @@ -68,64 +75,81 @@ public static void giveItem(ItemStack item) throws CommandSyntaxException { } static { - STRING_PRESETS.forEach((preset) -> { + ENTITY_PRESETS.forEach((preset) -> { PRESETS.put(preset.getLeft(), (preview) -> { if (preview) preset.getMiddle().getDefaultStack(); ItemStack item = preset.getMiddle().getDefaultStack(); try { - item.set(DataComponentTypes.CUSTOM_DATA, NbtComponent.of(StringNbtReader.parse(preset.getRight()))); + item.set(DataComponentTypes.ENTITY_DATA, NbtComponent.of(StringNbtReader.parse(preset.getRight()))); } catch (CommandSyntaxException e) { } item.set(DataComponentTypes.CUSTOM_NAME, Text.literal(toName(preset.getLeft()))); return item; }); }); + BLOCK_PRESETS.forEach((preset) -> { + PRESETS.put(preset.getLeft(), (preview) -> { + if (preview) preset.getMiddle().getDefaultStack(); + ItemStack item = preset.getMiddle().getDefaultStack(); + try { + item.set(DataComponentTypes.BLOCK_ENTITY_DATA, NbtComponent.of(StringNbtReader.parse(preset.getRight()))); + } catch (CommandSyntaxException e) { } + item.set(DataComponentTypes.CUSTOM_NAME, Text.literal(toName(preset.getLeft()))); + return item; + }); + }); + + // TODO update PRESETS.put("force_op", (preview) -> { if (preview) Items.SPIDER_SPAWN_EGG.getDefaultStack(); ItemStack item = Items.SPIDER_SPAWN_EGG.getDefaultStack(); String nick = mc.player.getName().getString(); try { - 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}}}"))); + item.set(DataComponentTypes.ENTITY_DATA, NbtComponent.of(StringNbtReader.parse("{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.set(DataComponentTypes.CUSTOM_NAME, Text.of("Force OP")); return item; }); + // Thanks wurst ! PRESETS.put("troll_potion", (preview) -> { if (preview) Items.LINGERING_POTION.getDefaultStack(); ItemStack stack = Items.LINGERING_POTION.getDefaultStack(); - NbtList effects = new NbtList(); + ArrayList effects = new ArrayList<>(); for(int i = 1; i <= 31; i++) { - NbtCompound effect = new NbtCompound(); - effect.putByte("Amplifier", (byte)127); - effect.putInt("Duration", Integer.MAX_VALUE); - effect.putInt("Id", i); - effects.add(effect); + StatusEffect effect = + Registries.STATUS_EFFECT.getEntry(i).get().value(); + RegistryEntry entry = + Registries.STATUS_EFFECT.getEntry(effect); + effects.add(new StatusEffectInstance(entry, Integer.MAX_VALUE, + Integer.MAX_VALUE)); } - NbtCompound nbt = new NbtCompound(); - nbt.put("CustomPotionEffects", effects); - stack.set(DataComponentTypes.CUSTOM_DATA, NbtComponent.of(nbt)); + + stack.set(DataComponentTypes.POTION_CONTENTS, new PotionContentsComponent(Optional.empty(), Optional.empty(), + effects)); stack.set(DataComponentTypes.CUSTOM_NAME, Text.literal("Lingering Potion of Trolling")); return stack; }); PRESETS.put("32k", (preview) -> { if (preview) return Items.DIAMOND_SWORD.getDefaultStack(); - ItemStack stack =Items.DIAMOND_SWORD.getDefaultStack(); - NbtList enchants = new NbtList(); - addEnchant(enchants, "minecraft:sharpness"); - addEnchant(enchants, "minecraft:knockback"); - addEnchant(enchants, "minecraft:fire_aspect"); - addEnchant(enchants, "minecraft:looting", (short)10); - addEnchant(enchants, "minecraft:sweeping", (short)3); - addEnchant(enchants, "minecraft:unbreaking"); - addEnchant(enchants, "minecraft:mending", (short)1); - addEnchant(enchants, "minecraft:vanishing_curse", (short)1); - NbtCompound nbt = new NbtCompound(); - nbt.put("Enchantments", enchants); - stack.set(DataComponentTypes.CUSTOM_DATA, NbtComponent.of(nbt)); + ItemStack stack = Items.DIAMOND_SWORD.getDefaultStack(); + + stack.apply(DataComponentTypes.ENCHANTMENTS, ItemEnchantmentsComponent.DEFAULT, component -> { + ItemEnchantmentsComponent.Builder builder = new ItemEnchantmentsComponent.Builder(component); + builder.add(Enchantments.SHARPNESS, 255); + builder.add(Enchantments.KNOCKBACK, 255); + builder.add(Enchantments.FIRE_ASPECT, 255); + builder.add(Enchantments.LOOTING, 10); + builder.add(Enchantments.SWEEPING_EDGE, 3); + builder.add(Enchantments.UNBREAKING, 255); + builder.add(Enchantments.MENDING, 1); + builder.add(Enchantments.VANISHING_CURSE, 1); + return builder.build(); + }); + stack.set(DataComponentTypes.CUSTOM_NAME, Text.literal("Bonk")); return stack; }); @@ -145,25 +169,19 @@ public static void giveItem(ItemStack item) throws CommandSyntaxException { PRESETS.put("firework", (preview) -> { if (preview) return Items.FIREWORK_ROCKET.getDefaultStack(); - ItemStack firework = new ItemStack(Items.FIREWORK_ROCKET); - NbtCompound baseCompound = new NbtCompound(); - NbtCompound tagCompound = new NbtCompound(); - NbtList explosionList = new NbtList(); - for(int i = 0; i < 5000; i++) - { - NbtCompound explosionCompound = new NbtCompound(); - explosionCompound.putByte("Type", (byte)random.nextInt(5)); + IntList colors = new IntArrayList(new int[]{1973019,11743532,3887386,5320730,2437522,8073150,2651799,11250603,4408131,14188952,4312372,14602026,6719955,12801229,15435844,15790320}); + ArrayList explosions = new ArrayList<>(); + for(int i = 0; i < 200; i++) { + explosions.add(new FireworkExplosionComponent(FireworkExplosionComponent.Type.byId(random.nextInt(5)), colors, colors, true, true)); + } - int colors[] = {1973019,11743532,3887386,5320730,2437522,8073150,2651799,11250603,4408131,14188952,4312372,14602026,6719955,12801229,15435844,15790320}; + var changes = ComponentChanges.builder() + .add(DataComponentTypes.FIREWORKS, new FireworksComponent(1, explosions)) + .build(); + + firework.applyChanges(changes); - explosionCompound.putIntArray("Colors", colors); - explosionList.add(explosionCompound); - } - tagCompound.putInt("Flight", 0); - tagCompound.put("Explosions", explosionList); - baseCompound.put("Fireworks", tagCompound); - firework.set(DataComponentTypes.CUSTOM_DATA, NbtComponent.of(baseCompound)); return firework; }); @@ -171,12 +189,16 @@ public static void giveItem(ItemStack item) throws CommandSyntaxException { PRESETS.put(id.getPath()+"_spawn_egg", (preview) -> { if (preview) return Items.PIG_SPAWN_EGG.getDefaultStack(); ItemStack egg = Items.PIG_SPAWN_EGG.getDefaultStack(); - NbtCompound tag = new NbtCompound(); + NbtCompound entityTag = new NbtCompound(); entityTag.putString("id", id.toString()); - tag.put("EntityTag", entityTag); - egg.set(DataComponentTypes.CUSTOM_DATA, NbtComponent.of(tag)); - egg.set(DataComponentTypes.CUSTOM_NAME, Text.literal(String.format("%s", toName(id.getPath())))); + + var changes = ComponentChanges.builder() + .add(DataComponentTypes.CUSTOM_NAME, Text.literal(String.format("%s", toName(id.getPath())))) + .add(DataComponentTypes.ENTITY_DATA, NbtComponent.of(entityTag)) + .build(); + + egg.applyChanges(changes); return egg; }); }); @@ -194,14 +216,4 @@ private static String toName(Object id) { return WordUtils.capitalizeFully(id.toString().replace("_", " ")); } - private static void addEnchant(NbtList tag, String id, short v) { - NbtCompound enchant = new NbtCompound(); - enchant.putShort("lvl", v); - enchant.putString("id", id); - tag.add(enchant); - } - - private static void addEnchant(NbtList tag, String id) { - addEnchant(tag, id, Short.MAX_VALUE); - } } diff --git a/src/main/java/anticope/rejects/utils/accounts/GetPlayerUUID.java b/src/main/java/anticope/rejects/utils/accounts/GetPlayerUUID.java new file mode 100644 index 00000000..030485c9 --- /dev/null +++ b/src/main/java/anticope/rejects/utils/accounts/GetPlayerUUID.java @@ -0,0 +1,48 @@ +package anticope.rejects.utils.accounts; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.UUID; +import java.util.stream.Collectors; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; + +public class GetPlayerUUID { + + public static UUID getUUID(String playerName) { + // Thanks Bento + try { + Gson gsonReader = new Gson(); + JsonObject jsonObject = gsonReader.fromJson( + getURLContent("https://api.mojang.com/users/profiles/minecraft/" + playerName), + JsonObject.class); + + String userIdString = jsonObject.get("id").toString().replace("\"", "") + .replaceFirst("(\\w{8})(\\w{4})(\\w{4})(\\w{4})(\\w{12})", "$1-$2-$3-$4-$5"); + + return UUID.fromString(userIdString); + } catch (Exception ignored) { + return UUID.randomUUID(); + } + } + + private static String getURLContent(String requestedUrl) { + String returnValue; + + try { + URL url = new URL(requestedUrl); + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); + returnValue = br.lines().collect(Collectors.joining()); + br.close(); + } catch (Exception e) { + returnValue = ""; + } + + return returnValue; + } + +} \ No newline at end of file From d4ad1c19efa32af8ea30247632721f485671a034 Mon Sep 17 00:00:00 2001 From: crazymoose77756 <52980616+crazymoose77756@users.noreply.github.com> Date: Sat, 1 Jun 2024 06:14:13 -0400 Subject: [PATCH 17/26] Fix AutoGrind.java (#355) --- src/main/java/anticope/rejects/modules/AutoGrind.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/anticope/rejects/modules/AutoGrind.java b/src/main/java/anticope/rejects/modules/AutoGrind.java index c0463fe0..34859996 100644 --- a/src/main/java/anticope/rejects/modules/AutoGrind.java +++ b/src/main/java/anticope/rejects/modules/AutoGrind.java @@ -8,14 +8,15 @@ import meteordevelopment.meteorclient.utils.player.InvUtils; import meteordevelopment.orbit.EventHandler; import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.ItemEnchantmentsComponent; import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.screen.GrindstoneScreenHandler; import java.util.List; -import java.util.Map; public class AutoGrind extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); @@ -74,14 +75,14 @@ private void onOpenScreen(OpenScreenEvent event) { private boolean canGrind(ItemStack stack) { if (itemBlacklist.get().contains(stack.getItem())) return false; - Map enchantments = (Map) EnchantmentHelper.getEnchantments(stack); + ItemEnchantmentsComponent enchantments = EnchantmentHelper.getEnchantments(stack); int availEnchs = 0; - for (Enchantment enchantment : enchantments.keySet()) { + for (RegistryEntry enchantment : enchantments.getEnchantments()) { availEnchs++; - if (enchantment.isCursed()) + if (enchantment.value().isCursed()) availEnchs--; - if (enchantmentBlacklist.get().contains(enchantment)) + if (enchantmentBlacklist.get().contains(enchantment.value())) return false; } From 83d4ea0e5736bcd1c1f71853593bdfb5becaad9c Mon Sep 17 00:00:00 2001 From: crazymoose77756 <52980616+crazymoose77756@users.noreply.github.com> Date: Mon, 1 Jul 2024 02:57:21 -0400 Subject: [PATCH 18/26] improve AutoPot.java (#353) --- .../anticope/rejects/modules/AutoPot.java | 349 ++++-------------- 1 file changed, 80 insertions(+), 269 deletions(-) diff --git a/src/main/java/anticope/rejects/modules/AutoPot.java b/src/main/java/anticope/rejects/modules/AutoPot.java index 771a46cb..f44ba702 100644 --- a/src/main/java/anticope/rejects/modules/AutoPot.java +++ b/src/main/java/anticope/rejects/modules/AutoPot.java @@ -6,10 +6,7 @@ import baritone.api.BaritoneAPI; import meteordevelopment.meteorclient.events.entity.player.ItemUseCrosshairTargetEvent; import meteordevelopment.meteorclient.events.world.TickEvent; -import meteordevelopment.meteorclient.settings.BoolSetting; -import meteordevelopment.meteorclient.settings.IntSetting; -import meteordevelopment.meteorclient.settings.Setting; -import meteordevelopment.meteorclient.settings.SettingGroup; +import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.combat.AnchorAura; @@ -20,51 +17,49 @@ import meteordevelopment.meteorclient.utils.player.Rotations; import meteordevelopment.orbit.EventHandler; import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.PotionContentsComponent; 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.registry.Registries; import net.minecraft.registry.entry.RegistryEntry; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; -import java.util.Map; public class AutoPot extends Module { - private static final Class[] AURAS = new Class[] { KillAura.class, CrystalAura.class, AnchorAura.class, BedAura.class }; - + private static final Class[] AURAS = new Class[]{KillAura.class, CrystalAura.class, AnchorAura.class, BedAura.class}; private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final Setting Healing = sgGeneral.add(new BoolSetting.Builder() - .name("Healing") - .description("Enables healing potions.") - .defaultValue(true) - .build() - ); - private final Setting Strength = sgGeneral.add(new BoolSetting.Builder() - .name("Strength") - .description("Enables strength potions.") - .defaultValue(true) + private final Setting> usablePotions = sgGeneral.add(new StatusEffectListSetting.Builder() + .name("potions-to-use") + .description("The potions to use.") + .defaultValue( + StatusEffects.INSTANT_HEALTH.value(), + StatusEffects.STRENGTH.value() + ) .build() ); + private final Setting useSplashPots = sgGeneral.add(new BoolSetting.Builder() - .name("Splash-Pots") - .description("Allow the use of splash pots") + .name("splash-potions") + .description("Allow the use of splash potions") .defaultValue(true) .build() ); + private final Setting health = sgGeneral.add(new IntSetting.Builder() .name("health") - .description("If health goes below this point, Healing Pot will trigger.") + .description("If health goes below this point, Healing potions will trigger.") .defaultValue(15) .min(0) .sliderMax(20) .build() ); + private final Setting pauseAuras = sgGeneral.add(new BoolSetting.Builder() .name("pause-auras") .description("Pauses all auras when eating.") @@ -78,12 +73,14 @@ public class AutoPot extends Module { .defaultValue(true) .build() ); + private final Setting lookDown = sgGeneral.add(new BoolSetting.Builder() .name("rotate") - .description("Forces you to rotate downwards when throwing bottles.") + .description("Forces you to rotate downwards when throwing splash potions.") .defaultValue(true) .build() ); + private int slot, prevSlot; private boolean drinking, splashing; private final List> wasAura = new ArrayList<>(); @@ -92,168 +89,43 @@ public class AutoPot extends Module { public AutoPot() { super(MeteorRejectsAddon.CATEGORY, "auto-pot", "Automatically Drinks Potions"); } - //Gilded's first module, lets see how much i'll die making this - //TODO:Rework everything to accept all pots - //TODO: Does strength work better if you throw it up? will check. + + // TODO : Add option to scan whole inv - then either swap item to hotbar if full or just place in first empty slot + // Note, Sometimes two or multiple splash pots are thrown - since the effect is not instant, the second pot is thrown before the effect of first is applied @Override public void onDeactivate() { - if (drinking) stopDrinking(); - if (splashing) stopSplashing(); + stopPotionUsage(); } + @EventHandler private void onTick(TickEvent.Pre event) { - if (Healing.get()) { - if (ShouldDrinkHealth()) { - //Heal Pot Slot - int slot = HealingpotionSlot(); - //Slot Not Invalid + if (mc.player.isUsingItem()) return; + for (StatusEffect statusEffect : usablePotions.get()) { + RegistryEntry registryEntry = Registries.STATUS_EFFECT.getEntry(statusEffect); + if (!mc.player.hasStatusEffect(registryEntry)) { + slot = potionSlot(statusEffect); if (slot != -1) { - startDrinking(); - } else if (HealingpotionSlot() == -1 && useSplashPots.get()) { - slot = HealingSplashpotionSlot(); - if (slot != -1) { - startSplashing(); - } - } - } - if (drinking) { - if (ShouldDrinkHealth()) { - if (isNotPotion(mc.player.getInventory().getStack(slot))) { - slot = HealingpotionSlot(); - if (slot == -1) { - info("Ran out of Pots while drinking"); - stopDrinking(); - return; - } - } else changeSlot(slot); - } - drink(); - if (ShouldNotDrinkHealth()) { - info("Health Full"); - stopDrinking(); - return; - } - } - if (splashing) { - if (ShouldDrinkHealth()) { - if (isNotSplashPotion(mc.player.getInventory().getStack(slot))) { - slot = HealingSplashpotionSlot(); - if (slot == -1) { - info("Ran out of Pots while splashing"); - stopSplashing(); - return; - } else changeSlot(slot); - } - splash(); - if (ShouldNotDrinkHealth()) { - info("Health Full"); - stopSplashing(); + if (registryEntry == StatusEffects.INSTANT_HEALTH && ShouldDrinkHealth()) { + startPotionUse(); + return; + } else if (registryEntry == StatusEffects.INSTANT_HEALTH) { return; } - } - } - } - if (Strength.get()) { - if (ShouldDrinkStrength()) { - //Strength Pot Slot - int slot = StrengthpotionSlot(); - //Slot Not Invalid - if (slot != -1) { - startDrinking(); - } - else if (StrengthpotionSlot() == -1 && useSplashPots.get()) { - slot = StrengthSplashpotionSlot(); - if (slot != -1) { - startSplashing(); - } - } - } - if (drinking) { - if (ShouldDrinkStrength()) { - if (isNotPotion(mc.player.getInventory().getStack(slot))) { - slot = StrengthpotionSlot(); - if (slot == -1) { - stopDrinking(); - info("Out of Pots"); - return; - } else changeSlot(slot); - } - drink(); - } else { - stopDrinking(); - } - } - if (splashing) { - if (ShouldDrinkStrength()) { - if (isNotSplashPotion(mc.player.getInventory().getStack(slot))) { - slot = StrengthSplashpotionSlot(); - if (slot == -1) { - info("Ran out of Pots while splashing"); - stopSplashing(); - return; - } else changeSlot(slot); - } - splash(); - } else { - stopSplashing(); + startPotionUse(); } } } } + @EventHandler private void onItemUseCrosshairTarget(ItemUseCrosshairTargetEvent event) { if (drinking) event.target = null; } + private void setPressed(boolean pressed) { mc.options.useKey.setPressed(pressed); } - private void startDrinking() { - prevSlot = mc.player.getInventory().selectedSlot; - drink(); - // Pause auras - wasAura.clear(); - if (pauseAuras.get()) { - for (Class klass : AURAS) { - Module module = Modules.get().get(klass); - - if (module.isActive()) { - wasAura.add(klass); - module.toggle(); - } - } - } - // Pause baritone - wasBaritone = false; - if (pauseBaritone.get() && BaritoneAPI.getProvider().getPrimaryBaritone().getPathingBehavior().isPathing()) { - wasBaritone = true; - BaritoneAPI.getProvider().getPrimaryBaritone().getCommandManager().execute("pause"); - } - } - private void startSplashing() { - prevSlot = mc.player.getInventory().selectedSlot; - if (lookDown.get()){ - Rotations.rotate(mc.player.getYaw(), 90); splash(); - } - splash(); - // Pause auras - wasAura.clear(); - if (pauseAuras.get()) { - for (Class klass : AURAS) { - Module module = Modules.get().get(klass); - if (module.isActive()) { - wasAura.add(klass); - module.toggle(); - } - } - } - // Pause baritone - wasBaritone = false; - if (pauseBaritone.get() && BaritoneAPI.getProvider().getPrimaryBaritone().getPathingBehavior().isPathing()) { - wasBaritone = true; - BaritoneAPI.getProvider().getPrimaryBaritone().getCommandManager().execute("pause"); - } - } private void drink() { changeSlot(slot); setPressed(true); @@ -261,38 +133,19 @@ private void drink() { drinking = true; } + private void splash() { changeSlot(slot); setPressed(true); splashing = true; } - private void stopDrinking() { - changeSlot(prevSlot); - setPressed(false); - drinking = false; - - // Resume auras - if (pauseAuras.get()) { - for (Class klass : AURAS) { - Module module = Modules.get().get(klass); - if (wasAura.contains(klass) && !module.isActive()) { - module.toggle(); - } - } - } - // Resume baritone - if (pauseBaritone.get() && wasBaritone) { - BaritoneAPI.getProvider().getPrimaryBaritone().getCommandManager().execute("resume"); - } - } - private void stopSplashing() { + private void stopPotionUsage() { changeSlot(prevSlot); setPressed(false); - + drinking = false; splashing = false; - // Resume auras if (pauseAuras.get()) { for (Class klass : AURAS) { Module module = Modules.get().get(klass); @@ -302,114 +155,72 @@ private void stopSplashing() { } } } - // Resume baritone if (pauseBaritone.get() && wasBaritone) { - BaritoneAPI.getProvider().getPrimaryBaritone().getCommandManager().execute("resume"); + BaritoneAPI.getProvider().getPrimaryBaritone().getCommandManager().execute("resume"); } } - private double truehealth() { + + private double trueHealth() { assert mc.player != null; return mc.player.getHealth(); } + private void changeSlot(int slot) { mc.player.getInventory().selectedSlot = slot; this.slot = slot; } + //Sunk 7 hours into these checks, if i die blame checks - //Heal pot checks - private int HealingpotionSlot() { + private int potionSlot(StatusEffect statusEffect) { int slot = -1; for (int i = 0; i < 9; i++) { - // Skip if item stack is empty ItemStack stack = mc.player.getInventory().getStack(i); if (stack.isEmpty()) continue; - if (stack.getItem() != Items.POTION) continue; - 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; + if (stack.getItem() == Items.POTION || (stack.getItem() == Items.SPLASH_POTION && useSplashPots.get())) { + PotionContentsComponent effects = stack.getComponents().getOrDefault(DataComponentTypes.POTION_CONTENTS, PotionContentsComponent.DEFAULT); + for (StatusEffectInstance effectInstance : effects.getEffects()) { + if (effectInstance.getTranslationKey().equals(statusEffect.getTranslationKey())) { + slot = i; + break; + } } } } return slot; } - private int HealingSplashpotionSlot() { - int slot = -1; - for (int i = 0; i < 9; i++) { - // Skip if item stack is empty - ItemStack stack = mc.player.getInventory().getStack(i); - if (stack.isEmpty()) continue; - if (stack.getItem() != Items.SPLASH_POTION) continue; - 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; - } + + private void startPotionUse() { + prevSlot = mc.player.getInventory().selectedSlot; + + if (useSplashPots.get()) { + if (lookDown.get()) { + Rotations.rotate(mc.player.getYaw(), 90); + splash(); + } else { + splash(); } + } else { + drink(); } - return slot; - } - //Strength Pot Checks - private int StrengthSplashpotionSlot () { - int slot = -1; - for (int i = 0; i < 9; i++) { - // Skip if item stack is empty - ItemStack stack = mc.player.getInventory().getStack(i); - if (stack.isEmpty()) continue; - if (stack.getItem() != Items.SPLASH_POTION) continue; - 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; - } - } + wasAura.clear(); + if (pauseAuras.get()) { + for (Class klass : AURAS) { + Module module = Modules.get().get(klass); - } - return slot; - } - private int StrengthpotionSlot () { - int slot = -1; - for (int i = 0; i < 9; i++) { - // Skip if item stack is empty - ItemStack stack = mc.player.getInventory().getStack(i); - if (stack.isEmpty()) continue; - if (stack.getItem() != Items.POTION) continue; - 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; + if (module.isActive()) { + wasAura.add(klass); + module.toggle(); } } - } - return slot; - } - private boolean isNotPotion(ItemStack stack) { - Item item = stack.getItem(); - return item != Items.POTION; - } - private boolean isNotSplashPotion(ItemStack stack) { - Item item = stack.getItem(); - return item != Items.SPLASH_POTION; - } - private boolean ShouldDrinkHealth(){ - if (truehealth() < health.get()) return true; - return false; - } - private boolean ShouldNotDrinkHealth(){ - if (truehealth() >= health.get()) return true; - return false; + wasBaritone = false; + if (pauseBaritone.get() && BaritoneAPI.getProvider().getPrimaryBaritone().getPathingBehavior().isPathing()) { + wasBaritone = true; + BaritoneAPI.getProvider().getPrimaryBaritone().getCommandManager().execute("pause"); + } } - private boolean ShouldDrinkStrength(){ - Map, StatusEffectInstance> effects = mc.player.getActiveStatusEffects(); - return !effects.containsKey(StatusEffects.STRENGTH); + + private boolean ShouldDrinkHealth() { + return trueHealth() < health.get(); } } From 164b6a11f9f471468891b07e828aaf0296063255 Mon Sep 17 00:00:00 2001 From: crazymoose77756 <52980616+crazymoose77756@users.noreply.github.com> Date: Mon, 1 Jul 2024 02:57:41 -0400 Subject: [PATCH 19/26] Update Auto Farm (#363) --- .../java/anticope/rejects/modules/AutoFarm.java | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/main/java/anticope/rejects/modules/AutoFarm.java b/src/main/java/anticope/rejects/modules/AutoFarm.java index cd4cb9f6..2109f2db 100644 --- a/src/main/java/anticope/rejects/modules/AutoFarm.java +++ b/src/main/java/anticope/rejects/modules/AutoFarm.java @@ -151,6 +151,8 @@ private void onBreakBlock(BreakBlockEvent event) { else if (block == Blocks.POTATOES) item = Items.POTATO; else if (block == Blocks.BEETROOTS) item = Items.BEETROOT_SEEDS; else if (block == Blocks.NETHER_WART) item = Items.NETHER_WART; + else if (block == Blocks.PITCHER_CROP) item = Items.PITCHER_POD; + else if (block == Blocks.TORCHFLOWER) item = Items.TORCHFLOWER_SEEDS; if (item != null) replantMap.put(event.blockPos, item); } } @@ -264,6 +266,8 @@ private boolean isMature(BlockState state, Block block) { return state.get(sweetBerryBushBlock.AGE) >= 2; } else if (block instanceof NetherWartBlock netherWartBlock) { return state.get(netherWartBlock.AGE) >= 3; + } else if (block instanceof PitcherCropBlock pitcherCropBlock) { + return state.get(pitcherCropBlock.AGE) >= 4; } return true; } @@ -275,7 +279,9 @@ private boolean bonemealFilter(Block block) { block instanceof AzaleaBlock || block instanceof SaplingBlock || block == Blocks.COCOA || - block == Blocks.SWEET_BERRY_BUSH; + block == Blocks.SWEET_BERRY_BUSH || + block == Blocks.PITCHER_CROP || + block == Blocks.TORCHFLOWER; } private boolean harvestFilter(Block block) { @@ -284,7 +290,9 @@ private boolean harvestFilter(Block block) { block == Blocks.MELON || block == Blocks.NETHER_WART || block == Blocks.SWEET_BERRY_BUSH || - block == Blocks.COCOA; + block == Blocks.COCOA || + block == Blocks.PITCHER_CROP || + block == Blocks.TORCHFLOWER; } private boolean plantFilter(Item item) { @@ -294,6 +302,8 @@ private boolean plantFilter(Item item) { item == Items.BEETROOT_SEEDS || item == Items.PUMPKIN_SEEDS || item == Items.MELON_SEEDS || - item == Items.NETHER_WART; + item == Items.NETHER_WART || + item == Items.PITCHER_POD || + item == Items.TORCHFLOWER_SEEDS; } } From f5c8bdc1de3161e70f5852e8663b89a933347583 Mon Sep 17 00:00:00 2001 From: Maksim Straus <74616162+cqb13@users.noreply.github.com> Date: Mon, 1 Jul 2024 02:58:05 -0400 Subject: [PATCH 20/26] fix new-chunks crash with sodium (#366) --- src/main/java/anticope/rejects/modules/NewChunks.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/anticope/rejects/modules/NewChunks.java b/src/main/java/anticope/rejects/modules/NewChunks.java index 4ae8c962..8834251c 100644 --- a/src/main/java/anticope/rejects/modules/NewChunks.java +++ b/src/main/java/anticope/rejects/modules/NewChunks.java @@ -23,6 +23,8 @@ import java.util.Collections; import java.util.HashSet; import java.util.Set; +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; /* Ported from: https://github.com/BleachDrinker420/BleachHack/blob/master/BleachHack-Fabric-1.16/src/main/java/bleach/hack/module/mods/NewChunks.java @@ -93,6 +95,7 @@ public class NewChunks extends Module { private final Set newChunks = Collections.synchronizedSet(new HashSet<>()); private final Set oldChunks = Collections.synchronizedSet(new HashSet<>()); private static final Direction[] searchDirs = new Direction[] { Direction.EAST, Direction.NORTH, Direction.WEST, Direction.SOUTH, Direction.UP }; + private final Executor taskExecutor = Executors.newSingleThreadExecutor(); public NewChunks() { super(MeteorRejectsAddon.CATEGORY,"new-chunks", "Detects completely new chunks using certain traits of them"); @@ -177,7 +180,7 @@ else if (event.packet instanceof ChunkDataS2CPacket && mc.world != null) { if (!newChunks.contains(pos) && mc.world.getChunkManager().getChunk(packet.getChunkX(), packet.getChunkZ()) == null) { WorldChunk chunk = new WorldChunk(mc.world, pos); try { - chunk.loadFromPacket(packet.getChunkData().getSectionsDataBuf(), new NbtCompound(), packet.getChunkData().getBlockEntities(packet.getChunkX(), packet.getChunkZ())); + taskExecutor.execute(() -> chunk.loadFromPacket(packet.getChunkData().getSectionsDataBuf(), new NbtCompound(), packet.getChunkData().getBlockEntities(packet.getChunkX(), packet.getChunkZ()))); } catch (ArrayIndexOutOfBoundsException e) { return; } From 19f74e88e16c9ff8ccd7d69aa10ab24eb82adfd0 Mon Sep 17 00:00:00 2001 From: crazymoose77756 <52980616+crazymoose77756@users.noreply.github.com> Date: Mon, 1 Jul 2024 02:58:58 -0400 Subject: [PATCH 21/26] LawnBot (#360) --- .../anticope/rejects/MeteorRejectsAddon.java | 1 + .../anticope/rejects/modules/LawnBot.java | 98 +++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 src/main/java/anticope/rejects/modules/LawnBot.java diff --git a/src/main/java/anticope/rejects/MeteorRejectsAddon.java b/src/main/java/anticope/rejects/MeteorRejectsAddon.java index e7e12116..6098d03f 100644 --- a/src/main/java/anticope/rejects/MeteorRejectsAddon.java +++ b/src/main/java/anticope/rejects/MeteorRejectsAddon.java @@ -66,6 +66,7 @@ public void onInitialize() { modules.add(new InteractionMenu()); modules.add(new Jetpack()); modules.add(new KnockbackPlus()); + modules.add(new LawnBot()); modules.add(new Lavacast()); modules.add(new MossBot()); modules.add(new NewChunks()); diff --git a/src/main/java/anticope/rejects/modules/LawnBot.java b/src/main/java/anticope/rejects/modules/LawnBot.java new file mode 100644 index 00000000..d2d0c11c --- /dev/null +++ b/src/main/java/anticope/rejects/modules/LawnBot.java @@ -0,0 +1,98 @@ +package anticope.rejects.modules; + +import anticope.rejects.MeteorRejectsAddon; +import meteordevelopment.meteorclient.events.world.TickEvent; +import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.systems.modules.Module; +import meteordevelopment.meteorclient.utils.player.InvUtils; +import meteordevelopment.orbit.EventHandler; +import net.minecraft.block.*; +import net.minecraft.item.Item; +import net.minecraft.item.Items; +import net.minecraft.screen.slot.SlotActionType; +import net.minecraft.util.Hand; +import net.minecraft.util.hit.BlockHitResult; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.util.math.Vec3d; + +import java.util.ArrayList; +import java.util.List; + +//TODO: add settings to find/use shovel, delay, range ? +//https://github.com/DustinRepo/JexClient/blob/main/src/main/java/me/dustin/jex/feature/mod/impl/world/LawnBot.java +public class LawnBot extends Module { + private final ArrayList myceliumSpots = new ArrayList<>(); + private final SettingGroup sgGeneral = settings.getDefaultGroup(); + + private final Setting> blockWhitelist = sgGeneral.add(new BlockListSetting.Builder() + .name("block-whitelist") + .description("Which blocks to replace with grass.") + .defaultValue() + .filter(this::grassFilter) + .build() + ); + + public LawnBot() { + super(MeteorRejectsAddon.CATEGORY, "lawnbot", "Replace a variety of dirt-type blocks with grass"); + } + + @EventHandler + private void onTick(TickEvent.Post event) { + Item grassBlockItem = Items.GRASS_BLOCK; + int grassCount = InvUtils.find(grassBlockItem).count(); + if (grassCount == 0) { + return; + } + + int grassHotbarSlot = InvUtils.findInHotbar((itemStack -> itemStack.getItem() == grassBlockItem)).slot(); + if (grassHotbarSlot == -1) { + int grassInvSlot = InvUtils.find((itemStack -> itemStack.getItem() == grassBlockItem)).slot(); + if (grassInvSlot == -1) + return; + + mc.interactionManager.clickSlot(mc.player.currentScreenHandler.syncId, grassInvSlot < 9 ? grassInvSlot + 36 : grassInvSlot, 8, SlotActionType.SWAP, mc.player); + return; + } + for (int i = 0; i < myceliumSpots.size(); i++) { + BlockPos pos = myceliumSpots.get(i); + Block block = mc.world.getBlockState(pos).getBlock(); + double distance = mc.player.getPos().distanceTo(new Vec3d(pos.getX(), pos.getY(), pos.getZ())); + if (block == Blocks.AIR && distance <= 5) { + mc.player.getInventory().selectedSlot = grassHotbarSlot; + mc.interactionManager.interactBlock(mc.player, Hand.MAIN_HAND, new BlockHitResult(new Vec3d(pos.getX(), pos.getY(), pos.getZ()), Direction.UP, pos, false)); + return; + } else if (!blockWhitelist.get().contains(block)) { + myceliumSpots.remove(i); + } + } + for (int i = 0; i < myceliumSpots.size(); i++) { + BlockPos pos = myceliumSpots.get(i); + Block block = mc.world.getBlockState(pos).getBlock(); + double distance = mc.player.getPos().distanceTo(new Vec3d(pos.getX(), pos.getY(), pos.getZ())); + if (blockWhitelist.get().contains(block) && distance <= 5) { + mc.interactionManager.updateBlockBreakingProgress(pos, Direction.UP); + return; + } + } + myceliumSpots.clear(); + for (int x = -5; x < 5; x++) { + for (int y = -3; y < 3; y++) { + for (int z = -5; z < 5; z++) { + BlockPos pos = mc.player.getBlockPos().add(x, y, z); + if (blockWhitelist.get().contains(mc.world.getBlockState(pos).getBlock())) { + myceliumSpots.add(pos); + } + } + } + } + } + + private boolean grassFilter(Block block) { + return block == Blocks.MYCELIUM || + block == Blocks.PODZOL || + block == Blocks.DIRT_PATH || + block == Blocks.COARSE_DIRT || + block == Blocks.ROOTED_DIRT; + } +} From a90e79fb58a13d271b815fa7359856483183e4e3 Mon Sep 17 00:00:00 2001 From: Cloudburst <18114966+C10udburst@users.noreply.github.com> Date: Mon, 1 Jul 2024 09:01:07 +0200 Subject: [PATCH 22/26] [skip ci] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index d23e3527..eafb1c4a 100644 --- a/README.md +++ b/README.md @@ -70,6 +70,7 @@ - Jetpack - KnockbackPlus - Lavacast +- LawnBot (Ported from [JexClient](https://github.com/DustinRepo/JexClient/blob/main/src/main/java/me/dustin/jex/feature/mod/impl/world/LawnBot.java)) - MossBot (Ported from [BleachHack](https://github.com/BleachDrinker420/BleachHack/pull/211)) - NewChunks (Ported from [BleachHack](https://github.com/BleachDrinker420/BleachHack/blob/master/BleachHack-Fabric-1.17/src/main/java/bleach/hack/module/mods/NewChunks.java)) - NoJumpDelay From fef076ad205bf0dd21ff5518c3aefdd7f2cf04ca Mon Sep 17 00:00:00 2001 From: crazymoose77756 <52980616+crazymoose77756@users.noreply.github.com> Date: Mon, 1 Jul 2024 03:04:40 -0400 Subject: [PATCH 23/26] Update 1.21 (#365) --- .github/workflows/gradle.yml | 4 +- build.gradle | 2 +- gradle.properties | 8 ++-- gradle/wrapper/gradle-wrapper.properties | 2 +- .../arguments/ClientPosArgumentType.java | 1 - .../rejects/commands/CenterCommand.java | 3 -- .../rejects/commands/ClearChatCommand.java | 3 -- .../rejects/commands/GhostCommand.java | 3 -- .../rejects/commands/HeadsCommand.java | 2 - .../rejects/commands/KickCommand.java | 3 -- .../rejects/commands/LocateCommand.java | 3 -- .../rejects/commands/PanicCommand.java | 2 - .../rejects/commands/ReconnectCommand.java | 3 -- .../rejects/commands/SaveSkinCommand.java | 2 - .../rejects/commands/SeedCommand.java | 2 - .../rejects/commands/ServerCommand.java | 3 -- .../rejects/commands/SetBlockCommand.java | 3 -- .../rejects/commands/SetVelocityCommand.java | 3 -- .../rejects/commands/TeleportCommand.java | 3 -- .../rejects/commands/TerrainExport.java | 3 -- .../gui/screens/InteractionScreen.java | 2 +- .../mixin/ClientCommonNetwokHandlerMixin.java | 7 ++-- .../rejects/mixin/CommandSuggestorMixin.java | 1 - .../rejects/mixin/GameRendererMixin.java | 5 ++- .../anticope/rejects/modules/AutoCraft.java | 1 - .../rejects/modules/AutoExtinguish.java | 2 +- .../anticope/rejects/modules/AutoGrind.java | 7 +++- .../anticope/rejects/modules/AutoSoup.java | 8 +++- .../rejects/modules/BungeeCordSpoof.java | 1 - .../anticope/rejects/modules/NoJumpDelay.java | 5 --- .../anticope/rejects/modules/Rendering.java | 2 +- .../anticope/rejects/modules/SkeletonESP.java | 38 +++++++++---------- .../anticope/rejects/utils/GiveUtils.java | 38 +++++++++++-------- .../anticope/rejects/utils/WorldGenUtils.java | 3 -- .../utils/accounts/CustomYggdrasilLogin.java | 9 ----- .../utils/server/ServerListPinger.java | 7 +++- 36 files changed, 76 insertions(+), 118 deletions(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 04caf0a8..81b798ea 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -34,9 +34,9 @@ jobs: - uses: "marvinpinto/action-automatic-releases@latest" with: repo_token: "${{ secrets.GITHUB_TOKEN }}" - automatic_release_tag: "latest-1.20.6" + automatic_release_tag: "latest-1.21" prerelease: false - title: "1.20.6 Build" + title: "1.21 Build" files: | ./build/libs/*.jar diff --git a/build.gradle b/build.gradle index 20411612..30d2476d 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'fabric-loom' version '1.6-SNAPSHOT' + id 'fabric-loom' version '1.7-SNAPSHOT' } sourceCompatibility = targetCompatibility = JavaVersion.VERSION_21 diff --git a/gradle.properties b/gradle.properties index 46b26e2c..60b3865d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,8 +2,8 @@ org.gradle.jvmargs=-Xmx2G # Fabric Properties -minecraft_version=1.20.6 -yarn_version=1.20.6+build.1 +minecraft_version=1.21 +yarn_version=1.21+build.2 loader_version=0.15.11 # Mod Properties @@ -11,5 +11,5 @@ mod_version = 0.3 maven_group = anticope.rejects archives_base_name = meteor-rejects-addon -meteor_version=0.5.7 -baritone_version=1.20.4 +meteor_version=0.5.8 +baritone_version=1.20.6 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 48c0a02c..0d184210 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/main/java/anticope/rejects/arguments/ClientPosArgumentType.java b/src/main/java/anticope/rejects/arguments/ClientPosArgumentType.java index 12a79e60..5ae460a2 100644 --- a/src/main/java/anticope/rejects/arguments/ClientPosArgumentType.java +++ b/src/main/java/anticope/rejects/arguments/ClientPosArgumentType.java @@ -13,7 +13,6 @@ import net.minecraft.server.command.CommandManager; import net.minecraft.util.math.Vec3d; -import java.util.Arrays; import java.util.Collection; import java.util.concurrent.CompletableFuture; diff --git a/src/main/java/anticope/rejects/commands/CenterCommand.java b/src/main/java/anticope/rejects/commands/CenterCommand.java index 5ddf84f1..bf11c56e 100644 --- a/src/main/java/anticope/rejects/commands/CenterCommand.java +++ b/src/main/java/anticope/rejects/commands/CenterCommand.java @@ -6,9 +6,6 @@ import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket; import net.minecraft.util.math.MathHelper; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; -import static meteordevelopment.meteorclient.MeteorClient.mc; - public class CenterCommand extends Command { public CenterCommand() { super("center", "Centers the player on a block."); diff --git a/src/main/java/anticope/rejects/commands/ClearChatCommand.java b/src/main/java/anticope/rejects/commands/ClearChatCommand.java index 94be30c6..a8d15b3e 100644 --- a/src/main/java/anticope/rejects/commands/ClearChatCommand.java +++ b/src/main/java/anticope/rejects/commands/ClearChatCommand.java @@ -4,9 +4,6 @@ import meteordevelopment.meteorclient.commands.Command; import net.minecraft.command.CommandSource; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; -import static meteordevelopment.meteorclient.MeteorClient.mc; - public class ClearChatCommand extends Command { public ClearChatCommand() { super("clear-chat", "Clears your chat.", "clear", "cls"); diff --git a/src/main/java/anticope/rejects/commands/GhostCommand.java b/src/main/java/anticope/rejects/commands/GhostCommand.java index 6b033d1a..b37b58f2 100644 --- a/src/main/java/anticope/rejects/commands/GhostCommand.java +++ b/src/main/java/anticope/rejects/commands/GhostCommand.java @@ -9,9 +9,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; -import static meteordevelopment.meteorclient.MeteorClient.mc; - public class GhostCommand extends Command { public GhostCommand() { super("ghost", "Remove ghost blocks & bypass AntiXray", "aax", "anti-anti-xray"); diff --git a/src/main/java/anticope/rejects/commands/HeadsCommand.java b/src/main/java/anticope/rejects/commands/HeadsCommand.java index 2101860c..7cc3f375 100644 --- a/src/main/java/anticope/rejects/commands/HeadsCommand.java +++ b/src/main/java/anticope/rejects/commands/HeadsCommand.java @@ -7,8 +7,6 @@ import meteordevelopment.meteorclient.utils.Utils; import net.minecraft.command.CommandSource; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; - public class HeadsCommand extends Command { public HeadsCommand() { diff --git a/src/main/java/anticope/rejects/commands/KickCommand.java b/src/main/java/anticope/rejects/commands/KickCommand.java index 3ee57d21..19a54d0e 100644 --- a/src/main/java/anticope/rejects/commands/KickCommand.java +++ b/src/main/java/anticope/rejects/commands/KickCommand.java @@ -11,9 +11,6 @@ import net.minecraft.text.Text; import org.apache.commons.lang3.SystemUtils; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; -import static meteordevelopment.meteorclient.MeteorClient.mc; - public class KickCommand extends Command { public KickCommand() { diff --git a/src/main/java/anticope/rejects/commands/LocateCommand.java b/src/main/java/anticope/rejects/commands/LocateCommand.java index 0fb3e0e3..0b1c1290 100644 --- a/src/main/java/anticope/rejects/commands/LocateCommand.java +++ b/src/main/java/anticope/rejects/commands/LocateCommand.java @@ -19,9 +19,6 @@ import cubitect.Cubiomes; import cubitect.Cubiomes.Pos; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; -import static meteordevelopment.meteorclient.MeteorClient.mc; - public class LocateCommand extends Command { private final static DynamicCommandExceptionType NOT_FOUND = new DynamicCommandExceptionType(o -> { diff --git a/src/main/java/anticope/rejects/commands/PanicCommand.java b/src/main/java/anticope/rejects/commands/PanicCommand.java index a8025055..c2967505 100644 --- a/src/main/java/anticope/rejects/commands/PanicCommand.java +++ b/src/main/java/anticope/rejects/commands/PanicCommand.java @@ -8,8 +8,6 @@ import java.util.ArrayList; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; - public class PanicCommand extends Command { public PanicCommand() { super("panic", "Disables all modules.", "disable-all"); diff --git a/src/main/java/anticope/rejects/commands/ReconnectCommand.java b/src/main/java/anticope/rejects/commands/ReconnectCommand.java index 855fa680..30fa33d0 100644 --- a/src/main/java/anticope/rejects/commands/ReconnectCommand.java +++ b/src/main/java/anticope/rejects/commands/ReconnectCommand.java @@ -9,9 +9,6 @@ import net.minecraft.client.network.ServerInfo; import net.minecraft.command.CommandSource; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; -import static meteordevelopment.meteorclient.MeteorClient.mc; - public class ReconnectCommand extends Command { public ReconnectCommand() { super("reconnect", "Reconnects server."); diff --git a/src/main/java/anticope/rejects/commands/SaveSkinCommand.java b/src/main/java/anticope/rejects/commands/SaveSkinCommand.java index b220a5c6..b0ce77a0 100644 --- a/src/main/java/anticope/rejects/commands/SaveSkinCommand.java +++ b/src/main/java/anticope/rejects/commands/SaveSkinCommand.java @@ -23,8 +23,6 @@ import java.nio.charset.StandardCharsets; import java.util.UUID; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; - public class SaveSkinCommand extends Command { private final static SimpleCommandExceptionType IO_EXCEPTION = new SimpleCommandExceptionType(Text.literal("An exception occurred")); diff --git a/src/main/java/anticope/rejects/commands/SeedCommand.java b/src/main/java/anticope/rejects/commands/SeedCommand.java index 1e66390f..995b5b96 100644 --- a/src/main/java/anticope/rejects/commands/SeedCommand.java +++ b/src/main/java/anticope/rejects/commands/SeedCommand.java @@ -13,8 +13,6 @@ import net.minecraft.text.MutableText; import net.minecraft.text.Text; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; - public class SeedCommand extends Command { private final static SimpleCommandExceptionType NO_SEED = new SimpleCommandExceptionType(Text.literal("No seed for current world saved.")); diff --git a/src/main/java/anticope/rejects/commands/ServerCommand.java b/src/main/java/anticope/rejects/commands/ServerCommand.java index 67f51aa8..f783a7fd 100644 --- a/src/main/java/anticope/rejects/commands/ServerCommand.java +++ b/src/main/java/anticope/rejects/commands/ServerCommand.java @@ -20,9 +20,6 @@ import java.net.UnknownHostException; import java.util.*; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; -import static meteordevelopment.meteorclient.MeteorClient.mc; - /* Ported from Cornos https://github.com/cornos/Cornos/blob/master/src/main/java/me/zeroX150/cornos/features/command/impl/Scan.java diff --git a/src/main/java/anticope/rejects/commands/SetBlockCommand.java b/src/main/java/anticope/rejects/commands/SetBlockCommand.java index 48aeb81e..b835a9cf 100644 --- a/src/main/java/anticope/rejects/commands/SetBlockCommand.java +++ b/src/main/java/anticope/rejects/commands/SetBlockCommand.java @@ -10,9 +10,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; -import static meteordevelopment.meteorclient.MeteorClient.mc; - public class SetBlockCommand extends Command { public SetBlockCommand() { super("setblock", "Sets client side blocks", "sblk"); diff --git a/src/main/java/anticope/rejects/commands/SetVelocityCommand.java b/src/main/java/anticope/rejects/commands/SetVelocityCommand.java index d96779cd..71b6d3b7 100644 --- a/src/main/java/anticope/rejects/commands/SetVelocityCommand.java +++ b/src/main/java/anticope/rejects/commands/SetVelocityCommand.java @@ -5,9 +5,6 @@ import meteordevelopment.meteorclient.commands.Command; import net.minecraft.command.CommandSource; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; -import static meteordevelopment.meteorclient.MeteorClient.mc; - public class SetVelocityCommand extends Command { public SetVelocityCommand() { super("set-velocity", "Sets player velocity", "velocity", "vel"); diff --git a/src/main/java/anticope/rejects/commands/TeleportCommand.java b/src/main/java/anticope/rejects/commands/TeleportCommand.java index d45f9c1e..3dbcd9fe 100644 --- a/src/main/java/anticope/rejects/commands/TeleportCommand.java +++ b/src/main/java/anticope/rejects/commands/TeleportCommand.java @@ -7,9 +7,6 @@ import net.minecraft.command.CommandSource; import net.minecraft.util.math.Vec3d; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; -import static meteordevelopment.meteorclient.MeteorClient.mc; - public class TeleportCommand extends Command { diff --git a/src/main/java/anticope/rejects/commands/TerrainExport.java b/src/main/java/anticope/rejects/commands/TerrainExport.java index 3debfd83..2fdbf0a2 100644 --- a/src/main/java/anticope/rejects/commands/TerrainExport.java +++ b/src/main/java/anticope/rejects/commands/TerrainExport.java @@ -16,9 +16,6 @@ import java.io.IOException; import java.nio.ByteBuffer; -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; -import static meteordevelopment.meteorclient.MeteorClient.mc; - public class TerrainExport extends Command { private final static SimpleCommandExceptionType IO_EXCEPTION = new SimpleCommandExceptionType(Text.literal("An IOException occurred")); diff --git a/src/main/java/anticope/rejects/gui/screens/InteractionScreen.java b/src/main/java/anticope/rejects/gui/screens/InteractionScreen.java index f70d3b13..6f50f03e 100644 --- a/src/main/java/anticope/rejects/gui/screens/InteractionScreen.java +++ b/src/main/java/anticope/rejects/gui/screens/InteractionScreen.java @@ -62,7 +62,7 @@ public class InteractionScreen extends Screen { private final Map> functions; private final Map msgs; - private final Identifier GUI_ICONS_TEXTURE = new Identifier("textures/gui/icons.png"); + private final Identifier GUI_ICONS_TEXTURE = Identifier.of("textures/gui/icons.png"); private final StaticListener shiftListener = new StaticListener(); diff --git a/src/main/java/anticope/rejects/mixin/ClientCommonNetwokHandlerMixin.java b/src/main/java/anticope/rejects/mixin/ClientCommonNetwokHandlerMixin.java index c8905537..8bb97073 100644 --- a/src/main/java/anticope/rejects/mixin/ClientCommonNetwokHandlerMixin.java +++ b/src/main/java/anticope/rejects/mixin/ClientCommonNetwokHandlerMixin.java @@ -4,6 +4,7 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.utils.player.ChatUtils; import net.minecraft.client.network.ClientCommonNetworkHandler; +import net.minecraft.network.DisconnectionInfo; import net.minecraft.text.Text; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -15,11 +16,11 @@ @Mixin(ClientCommonNetworkHandler.class) public class ClientCommonNetwokHandlerMixin { @Inject(method = "onDisconnected", at = @At("HEAD"), cancellable = true) - private void onDisconnected(Text reason, CallbackInfo info) { + private void onDisconnected(DisconnectionInfo info, CallbackInfo ci) { if (Modules.get().isActive(SilentDisconnect.class) && mc.world != null && mc.player != null) { ChatUtils.info(Text.translatable("disconnect.lost").getString() + ":"); - ChatUtils.sendMsg(reason); - info.cancel(); + ChatUtils.sendMsg(info.reason()); + ci.cancel(); } } } diff --git a/src/main/java/anticope/rejects/mixin/CommandSuggestorMixin.java b/src/main/java/anticope/rejects/mixin/CommandSuggestorMixin.java index c9aee4ed..934e62d1 100644 --- a/src/main/java/anticope/rejects/mixin/CommandSuggestorMixin.java +++ b/src/main/java/anticope/rejects/mixin/CommandSuggestorMixin.java @@ -5,7 +5,6 @@ import meteordevelopment.meteorclient.systems.modules.render.NoRender; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.ChatInputSuggestor; -import net.minecraft.client.util.math.MatrixStack; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; diff --git a/src/main/java/anticope/rejects/mixin/GameRendererMixin.java b/src/main/java/anticope/rejects/mixin/GameRendererMixin.java index 97cb76e4..f1f18231 100644 --- a/src/main/java/anticope/rejects/mixin/GameRendererMixin.java +++ b/src/main/java/anticope/rejects/mixin/GameRendererMixin.java @@ -4,6 +4,7 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import net.minecraft.client.gl.PostEffectProcessor; +import net.minecraft.client.render.RenderTickCounter; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -19,14 +20,14 @@ public class GameRendererMixin { @Shadow @Final MinecraftClient client; @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/WorldRenderer;drawEntityOutlinesFramebuffer()V", ordinal = 0)) - private void renderShader(float tickDelta, long startTime, boolean tick, CallbackInfo ci) { + private void renderShader(RenderTickCounter tickCounter, boolean tick, CallbackInfo ci) { Rendering renderingModule = Modules.get().get(Rendering.class); if (renderingModule == null) return; PostEffectProcessor shader = renderingModule.getShaderEffect(); if (shader != null) { shader.setupDimensions(client.getWindow().getFramebufferWidth(), client.getWindow().getFramebufferHeight()); - shader.render(tickDelta); + shader.render(tickCounter.getTickDelta(tick)); } } } diff --git a/src/main/java/anticope/rejects/modules/AutoCraft.java b/src/main/java/anticope/rejects/modules/AutoCraft.java index 5551e830..f87e5823 100644 --- a/src/main/java/anticope/rejects/modules/AutoCraft.java +++ b/src/main/java/anticope/rejects/modules/AutoCraft.java @@ -10,7 +10,6 @@ import meteordevelopment.orbit.EventHandler; import net.minecraft.client.gui.screen.recipebook.RecipeResultCollection; import net.minecraft.item.Item; -import net.minecraft.recipe.Recipe; import net.minecraft.recipe.RecipeEntry; import net.minecraft.screen.CraftingScreenHandler; import net.minecraft.screen.slot.SlotActionType; diff --git a/src/main/java/anticope/rejects/modules/AutoExtinguish.java b/src/main/java/anticope/rejects/modules/AutoExtinguish.java index bb858b36..d4c0f9da 100644 --- a/src/main/java/anticope/rejects/modules/AutoExtinguish.java +++ b/src/main/java/anticope/rejects/modules/AutoExtinguish.java @@ -83,7 +83,7 @@ public class AutoExtinguish extends Module { private BlockPos blockPos = null; private boolean doesWaterBucketWork = true; - private static final StatusEffect FIRE_RESISTANCE = Registries.STATUS_EFFECT.get(new Identifier("fire_resistance")); + private static final StatusEffect FIRE_RESISTANCE = Registries.STATUS_EFFECT.get(Identifier.of("fire_resistance")); public AutoExtinguish() { super(MeteorRejectsAddon.CATEGORY, "auto-extinguish", "Automatically extinguishes fire around you"); diff --git a/src/main/java/anticope/rejects/modules/AutoGrind.java b/src/main/java/anticope/rejects/modules/AutoGrind.java index 34859996..2075f0e0 100644 --- a/src/main/java/anticope/rejects/modules/AutoGrind.java +++ b/src/main/java/anticope/rejects/modules/AutoGrind.java @@ -13,10 +13,13 @@ import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.registry.RegistryKey; import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.registry.tag.EnchantmentTags; import net.minecraft.screen.GrindstoneScreenHandler; import java.util.List; +import java.util.Set; public class AutoGrind extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); @@ -38,7 +41,7 @@ public class AutoGrind extends Module { .build() ); - private final Setting> enchantmentBlacklist = sgGeneral.add(new EnchantmentListSetting.Builder() + private final Setting>> enchantmentBlacklist = sgGeneral.add(new EnchantmentListSetting.Builder() .name("enchantment-blacklist") .description("Enchantments that should be ignored.") .defaultValue() @@ -80,7 +83,7 @@ private boolean canGrind(ItemStack stack) { for (RegistryEntry enchantment : enchantments.getEnchantments()) { availEnchs++; - if (enchantment.value().isCursed()) + if (EnchantmentHelper.hasAnyEnchantmentsIn(stack, EnchantmentTags.CURSE)) availEnchs--; if (enchantmentBlacklist.get().contains(enchantment.value())) return false; diff --git a/src/main/java/anticope/rejects/modules/AutoSoup.java b/src/main/java/anticope/rejects/modules/AutoSoup.java index 3e5fc8f4..b33db9e4 100644 --- a/src/main/java/anticope/rejects/modules/AutoSoup.java +++ b/src/main/java/anticope/rejects/modules/AutoSoup.java @@ -14,15 +14,17 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.passive.TameableEntity; import net.minecraft.entity.passive.VillagerEntity; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; -import net.minecraft.item.StewItem; import net.minecraft.util.Hand; import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.hit.EntityHitResult; import net.minecraft.util.hit.HitResult; import net.minecraft.util.math.BlockPos; +import java.util.List; + public class AutoSoup extends Module { private static final String desc = "Automatically eats soup when your health is low on some servers."; @@ -108,10 +110,12 @@ private void onTick(TickEvent.Post event) { } private int findSoup(int startSlot, int endSlot) { + List stews = List.of(Items.RABBIT_STEW, Items.MUSHROOM_STEW, Items.BEETROOT_SOUP); + for (int i = startSlot; i < endSlot; i++) { ItemStack stack = mc.player.getInventory().getStack(i); - if (stack != null && stack.getItem() instanceof StewItem) + if (stack != null && stews.contains(stack.getItem())) return i; } diff --git a/src/main/java/anticope/rejects/modules/BungeeCordSpoof.java b/src/main/java/anticope/rejects/modules/BungeeCordSpoof.java index d79eac88..4a6b0f7d 100644 --- a/src/main/java/anticope/rejects/modules/BungeeCordSpoof.java +++ b/src/main/java/anticope/rejects/modules/BungeeCordSpoof.java @@ -9,7 +9,6 @@ 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; diff --git a/src/main/java/anticope/rejects/modules/NoJumpDelay.java b/src/main/java/anticope/rejects/modules/NoJumpDelay.java index 6776ac1e..4f381416 100644 --- a/src/main/java/anticope/rejects/modules/NoJumpDelay.java +++ b/src/main/java/anticope/rejects/modules/NoJumpDelay.java @@ -4,13 +4,8 @@ import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.mixin.LivingEntityAccessor; import meteordevelopment.orbit.EventHandler; -import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - public class NoJumpDelay extends Module { public NoJumpDelay() { diff --git a/src/main/java/anticope/rejects/modules/Rendering.java b/src/main/java/anticope/rejects/modules/Rendering.java index a6186fd0..960ad3f3 100644 --- a/src/main/java/anticope/rejects/modules/Rendering.java +++ b/src/main/java/anticope/rejects/modules/Rendering.java @@ -106,7 +106,7 @@ public void onChanged(Shader s) { if (s == Shader.Vibrant) name = "color_convolve"; else if (s == Shader.Scanline) name = "scan_pincushion"; else name = s.toString().toLowerCase(); - Identifier shaderID = new Identifier(String.format("shaders/post/%s.json", name)); + Identifier shaderID = Identifier.of(String.format("shaders/post/%s.json", name)); try { PostEffectProcessor shader = new PostEffectProcessor(mc.getTextureManager(), mc.getResourceManager(), mc.getFramebuffer(), shaderID); this.shader = shader; diff --git a/src/main/java/anticope/rejects/modules/SkeletonESP.java b/src/main/java/anticope/rejects/modules/SkeletonESP.java index 22731eb8..c56ad1dc 100644 --- a/src/main/java/anticope/rejects/modules/SkeletonESP.java +++ b/src/main/java/anticope/rejects/modules/SkeletonESP.java @@ -115,26 +115,26 @@ private void onRender(Render3DEvent event) { matrixStack.multiply(new Quaternionf().setAngleAxis((90 + m) * Math.PI / 180F, -1, 0, 0)); if (swimming) matrixStack.translate(0, -0.95f, 0); - BufferBuilder bufferBuilder = Tessellator.getInstance().getBuffer(); - bufferBuilder.begin(VertexFormat.DrawMode.DEBUG_LINES, VertexFormats.POSITION_COLOR); + Tessellator tessellator = Tessellator.getInstance(); + BufferBuilder bufferBuilder = tessellator.begin(VertexFormat.DrawMode.DEBUG_LINES, VertexFormats.POSITION_COLOR); Matrix4f matrix4f = matrixStack.peek().getPositionMatrix(); - bufferBuilder.vertex(matrix4f, 0, sneaking ? 0.6f : 0.7f, sneaking ? 0.23f : 0).color(skeletonColor.r, skeletonColor.g, skeletonColor.b, skeletonColor.a).next(); - bufferBuilder.vertex(matrix4f, 0, sneaking ? 1.05f : 1.4f, 0).color(skeletonColor.r, skeletonColor.g, skeletonColor.b, skeletonColor.a).next();//spine + bufferBuilder.vertex(matrix4f, 0, sneaking ? 0.6f : 0.7f, sneaking ? 0.23f : 0).color(skeletonColor.r, skeletonColor.g, skeletonColor.b, skeletonColor.a); + bufferBuilder.vertex(matrix4f, 0, sneaking ? 1.05f : 1.4f, 0).color(skeletonColor.r, skeletonColor.g, skeletonColor.b, skeletonColor.a);//spine - bufferBuilder.vertex(matrix4f, -0.37f, sneaking ? 1.05f : 1.35f, 0).color(skeletonColor.r, skeletonColor.g, skeletonColor.b, skeletonColor.a).next();//shoulders - bufferBuilder.vertex(matrix4f, 0.37f, sneaking ? 1.05f : 1.35f, 0).color(skeletonColor.r, skeletonColor.g, skeletonColor.b, skeletonColor.a).next(); + bufferBuilder.vertex(matrix4f, -0.37f, sneaking ? 1.05f : 1.35f, 0).color(skeletonColor.r, skeletonColor.g, skeletonColor.b, skeletonColor.a);//shoulders + bufferBuilder.vertex(matrix4f, 0.37f, sneaking ? 1.05f : 1.35f, 0).color(skeletonColor.r, skeletonColor.g, skeletonColor.b, skeletonColor.a); - bufferBuilder.vertex(matrix4f, -0.15f, sneaking ? 0.6f : 0.7f, sneaking ? 0.23f : 0).color(skeletonColor.r, skeletonColor.g, skeletonColor.b, skeletonColor.a).next();//pelvis - bufferBuilder.vertex(matrix4f, 0.15f, sneaking ? 0.6f : 0.7f, sneaking ? 0.23f : 0).color(skeletonColor.r, skeletonColor.g, skeletonColor.b, skeletonColor.a).next(); + bufferBuilder.vertex(matrix4f, -0.15f, sneaking ? 0.6f : 0.7f, sneaking ? 0.23f : 0).color(skeletonColor.r, skeletonColor.g, skeletonColor.b, skeletonColor.a);//pelvis + bufferBuilder.vertex(matrix4f, 0.15f, sneaking ? 0.6f : 0.7f, sneaking ? 0.23f : 0).color(skeletonColor.r, skeletonColor.g, skeletonColor.b, skeletonColor.a); // Head matrixStack.push(); matrixStack.translate(0, sneaking ? 1.05f : 1.4f, 0); rotate(matrixStack, head); matrix4f = matrixStack.peek().getPositionMatrix(); - bufferBuilder.vertex(matrix4f, 0, 0, 0).color(skeletonColor.r, skeletonColor.g, skeletonColor.b, skeletonColor.a).next(); - bufferBuilder.vertex(matrix4f, 0, 0.15f, 0).color(skeletonColor.r, skeletonColor.g, skeletonColor.b, skeletonColor.a).next(); + bufferBuilder.vertex(matrix4f, 0, 0, 0).color(skeletonColor.r, skeletonColor.g, skeletonColor.b, skeletonColor.a); + bufferBuilder.vertex(matrix4f, 0, 0.15f, 0).color(skeletonColor.r, skeletonColor.g, skeletonColor.b, skeletonColor.a); matrixStack.pop(); // Right Leg @@ -142,8 +142,8 @@ private void onRender(Render3DEvent event) { matrixStack.translate(0.15f, sneaking ? 0.6f : 0.7f, sneaking ? 0.23f : 0); rotate(matrixStack, rightLeg); matrix4f = matrixStack.peek().getPositionMatrix(); - bufferBuilder.vertex(matrix4f, 0, 0, 0).color(skeletonColor.r, skeletonColor.g, skeletonColor.b, skeletonColor.a).next(); - bufferBuilder.vertex(matrix4f, 0, -0.6f, 0).color(skeletonColor.r, skeletonColor.g, skeletonColor.b, skeletonColor.a).next(); + bufferBuilder.vertex(matrix4f, 0, 0, 0).color(skeletonColor.r, skeletonColor.g, skeletonColor.b, skeletonColor.a); + bufferBuilder.vertex(matrix4f, 0, -0.6f, 0).color(skeletonColor.r, skeletonColor.g, skeletonColor.b, skeletonColor.a); matrixStack.pop(); // Left Leg @@ -151,8 +151,8 @@ private void onRender(Render3DEvent event) { matrixStack.translate(-0.15f, sneaking ? 0.6f : 0.7f, sneaking ? 0.23f : 0); rotate(matrixStack, leftLeg); matrix4f = matrixStack.peek().getPositionMatrix(); - bufferBuilder.vertex(matrix4f, 0, 0, 0).color(skeletonColor.r, skeletonColor.g, skeletonColor.b, skeletonColor.a).next(); - bufferBuilder.vertex(matrix4f, 0, -0.6f, 0).color(skeletonColor.r, skeletonColor.g, skeletonColor.b, skeletonColor.a).next(); + bufferBuilder.vertex(matrix4f, 0, 0, 0).color(skeletonColor.r, skeletonColor.g, skeletonColor.b, skeletonColor.a); + bufferBuilder.vertex(matrix4f, 0, -0.6f, 0).color(skeletonColor.r, skeletonColor.g, skeletonColor.b, skeletonColor.a); matrixStack.pop(); // Right Arm @@ -160,8 +160,8 @@ private void onRender(Render3DEvent event) { matrixStack.translate(0.37f, sneaking ? 1.05f : 1.35f, 0); rotate(matrixStack, rightArm); matrix4f = matrixStack.peek().getPositionMatrix(); - bufferBuilder.vertex(matrix4f, 0, 0, 0).color(skeletonColor.r, skeletonColor.g, skeletonColor.b, skeletonColor.a).next(); - bufferBuilder.vertex(matrix4f, 0, -0.55f, 0).color(skeletonColor.r, skeletonColor.g, skeletonColor.b, skeletonColor.a).next(); + bufferBuilder.vertex(matrix4f, 0, 0, 0).color(skeletonColor.r, skeletonColor.g, skeletonColor.b, skeletonColor.a); + bufferBuilder.vertex(matrix4f, 0, -0.55f, 0).color(skeletonColor.r, skeletonColor.g, skeletonColor.b, skeletonColor.a); matrixStack.pop(); // Left Arm @@ -169,11 +169,11 @@ private void onRender(Render3DEvent event) { matrixStack.translate(-0.37f, sneaking ? 1.05f : 1.35f, 0); rotate(matrixStack, leftArm); matrix4f = matrixStack.peek().getPositionMatrix(); - bufferBuilder.vertex(matrix4f, 0, 0, 0).color(skeletonColor.r, skeletonColor.g, skeletonColor.b, skeletonColor.a).next(); - bufferBuilder.vertex(matrix4f, 0, -0.55f, 0).color(skeletonColor.r, skeletonColor.g, skeletonColor.b, skeletonColor.a).next(); + bufferBuilder.vertex(matrix4f, 0, 0, 0).color(skeletonColor.r, skeletonColor.g, skeletonColor.b, skeletonColor.a); + bufferBuilder.vertex(matrix4f, 0, -0.55f, 0).color(skeletonColor.r, skeletonColor.g, skeletonColor.b, skeletonColor.a); matrixStack.pop(); - bufferBuilder.clear(); + tessellator.clear(); BufferRenderer.drawWithGlobalProgram(bufferBuilder.end()); if (swimming) matrixStack.translate(0, 0.95f, 0); diff --git a/src/main/java/anticope/rejects/utils/GiveUtils.java b/src/main/java/anticope/rejects/utils/GiveUtils.java index 03cde95e..b49742c3 100644 --- a/src/main/java/anticope/rejects/utils/GiveUtils.java +++ b/src/main/java/anticope/rejects/utils/GiveUtils.java @@ -5,6 +5,7 @@ import net.minecraft.component.ComponentChanges; import net.minecraft.component.DataComponentTypes; import net.minecraft.component.type.*; +import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.Enchantments; import net.minecraft.entity.effect.StatusEffect; import net.minecraft.entity.effect.StatusEffectInstance; @@ -15,6 +16,8 @@ import net.minecraft.nbt.NbtList; import net.minecraft.nbt.StringNbtReader; import net.minecraft.registry.Registries; +import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.text.Text; import net.minecraft.util.Identifier; @@ -38,13 +41,13 @@ public class GiveUtils { private final static SimpleCommandExceptionType NO_SPACE = new SimpleCommandExceptionType(Text.literal("No space in hotbar.")); private static final List HIDDEN_ENTITIES = Arrays.asList( - new Identifier("giant"), - new Identifier("ender_dragon"), - new Identifier("wither"), - new Identifier("iron_golem"), - new Identifier("ender_dragon"), - new Identifier("tnt_minecart"), - new Identifier("lightning_bolt")); + Identifier.of("giant"), + Identifier.of("ender_dragon"), + Identifier.of("wither"), + Identifier.of("iron_golem"), + Identifier.of("ender_dragon"), + Identifier.of("tnt_minecart"), + Identifier.of("lightning_bolt")); // Some ported from: https://github.com/BleachDrinker420/BleachHack/blob/master/BleachHack-Fabric-1.16/src/main/java/bleach/hack/command/commands/CmdGive.java private static final List> ENTITY_PRESETS = Arrays.asList( @@ -65,6 +68,7 @@ public class GiveUtils { ); private static final Random random = new Random(); + private static Registry enchantmentRegistry; public static void giveItem(ItemStack item) throws CommandSyntaxException { if (!mc.player.getAbilities().creativeMode) throw NOT_IN_CREATIVE.create(); @@ -134,19 +138,21 @@ public static void giveItem(ItemStack item) throws CommandSyntaxException { }); PRESETS.put("32k", (preview) -> { - if (preview) return Items.DIAMOND_SWORD.getDefaultStack(); + enchantmentRegistry = mc.world.getRegistryManager().get(RegistryKeys.ENCHANTMENT); + + if (preview || enchantmentRegistry == null) return Items.DIAMOND_SWORD.getDefaultStack(); ItemStack stack = Items.DIAMOND_SWORD.getDefaultStack(); stack.apply(DataComponentTypes.ENCHANTMENTS, ItemEnchantmentsComponent.DEFAULT, component -> { ItemEnchantmentsComponent.Builder builder = new ItemEnchantmentsComponent.Builder(component); - builder.add(Enchantments.SHARPNESS, 255); - builder.add(Enchantments.KNOCKBACK, 255); - builder.add(Enchantments.FIRE_ASPECT, 255); - builder.add(Enchantments.LOOTING, 10); - builder.add(Enchantments.SWEEPING_EDGE, 3); - builder.add(Enchantments.UNBREAKING, 255); - builder.add(Enchantments.MENDING, 1); - builder.add(Enchantments.VANISHING_CURSE, 1); + builder.add(enchantmentRegistry.entryOf(Enchantments.SHARPNESS), 255); + builder.add(enchantmentRegistry.entryOf(Enchantments.KNOCKBACK), 255); + builder.add(enchantmentRegistry.entryOf(Enchantments.FIRE_ASPECT), 255); + builder.add(enchantmentRegistry.entryOf(Enchantments.LOOTING), 10); + builder.add(enchantmentRegistry.entryOf(Enchantments.SWEEPING_EDGE), 3); + builder.add(enchantmentRegistry.entryOf(Enchantments.UNBREAKING), 255); + builder.add(enchantmentRegistry.entryOf(Enchantments.MENDING), 1); + builder.add(enchantmentRegistry.entryOf(Enchantments.VANISHING_CURSE), 1); return builder.build(); }); diff --git a/src/main/java/anticope/rejects/utils/WorldGenUtils.java b/src/main/java/anticope/rejects/utils/WorldGenUtils.java index 26fee359..947830df 100644 --- a/src/main/java/anticope/rejects/utils/WorldGenUtils.java +++ b/src/main/java/anticope/rejects/utils/WorldGenUtils.java @@ -19,10 +19,8 @@ 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; @@ -30,7 +28,6 @@ import net.minecraft.entity.vehicle.ChestMinecartEntity; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; -import net.minecraft.nbt.*; import net.minecraft.util.Hand; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/anticope/rejects/utils/accounts/CustomYggdrasilLogin.java b/src/main/java/anticope/rejects/utils/accounts/CustomYggdrasilLogin.java index 7ae52b0d..c505df3a 100644 --- a/src/main/java/anticope/rejects/utils/accounts/CustomYggdrasilLogin.java +++ b/src/main/java/anticope/rejects/utils/accounts/CustomYggdrasilLogin.java @@ -2,17 +2,13 @@ package anticope.rejects.utils.accounts; -import com.google.common.collect.Iterables; import com.google.gson.*; import com.mojang.authlib.Environment; -import com.mojang.authlib.GameProfile; import com.mojang.authlib.SignatureState; import com.mojang.authlib.exceptions.AuthenticationException; -import com.mojang.authlib.minecraft.InsecurePublicKeyException; import com.mojang.authlib.minecraft.MinecraftProfileTexture; import com.mojang.authlib.minecraft.MinecraftProfileTextures; import com.mojang.authlib.properties.Property; -import com.mojang.authlib.yggdrasil.TextureUrlChecker; import com.mojang.authlib.yggdrasil.ServicesKeyInfo; import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService; import com.mojang.authlib.yggdrasil.YggdrasilMinecraftSessionService; @@ -26,11 +22,6 @@ import java.net.Proxy; import java.nio.charset.StandardCharsets; -import java.security.KeyFactory; -import java.security.NoSuchAlgorithmException; -import java.security.PublicKey; -import java.security.spec.InvalidKeySpecException; -import java.security.spec.X509EncodedKeySpec; import java.util.*; import static meteordevelopment.meteorclient.MeteorClient.mc; diff --git a/src/main/java/anticope/rejects/utils/server/ServerListPinger.java b/src/main/java/anticope/rejects/utils/server/ServerListPinger.java index ae5e0c4b..b0eeb2f7 100644 --- a/src/main/java/anticope/rejects/utils/server/ServerListPinger.java +++ b/src/main/java/anticope/rejects/utils/server/ServerListPinger.java @@ -1,6 +1,5 @@ package anticope.rejects.utils.server; -import com.google.common.base.Splitter; import com.google.common.collect.Lists; import io.netty.bootstrap.Bootstrap; import io.netty.channel.*; @@ -9,6 +8,7 @@ import net.minecraft.client.network.LegacyServerPinger; import net.minecraft.client.network.ServerAddress; import net.minecraft.network.ClientConnection; +import net.minecraft.network.DisconnectionInfo; import net.minecraft.network.listener.ClientQueryPacketListener; import net.minecraft.network.packet.c2s.query.QueryPingC2SPacket; import net.minecraft.network.packet.c2s.query.QueryRequestC2SPacket; @@ -123,6 +123,11 @@ public void onDisconnected(Text reason) { notifyDisconnectListeners(); } + @Override + public void onDisconnected(DisconnectionInfo info) { + + } + public boolean isConnectionOpen() { return clientConnection.isOpen(); } From 5049f5fbebfab6f2d5fe865732f0d933885c0c38 Mon Sep 17 00:00:00 2001 From: ruriyoshinova Date: Fri, 25 Oct 2024 23:37:40 +0800 Subject: [PATCH 24/26] Fix mixin mismatch descriptor --- src/main/java/anticope/rejects/mixin/meteor/ModuleMixin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/anticope/rejects/mixin/meteor/ModuleMixin.java b/src/main/java/anticope/rejects/mixin/meteor/ModuleMixin.java index 2cc1eb41..5f612771 100644 --- a/src/main/java/anticope/rejects/mixin/meteor/ModuleMixin.java +++ b/src/main/java/anticope/rejects/mixin/meteor/ModuleMixin.java @@ -19,7 +19,7 @@ public class ModuleMixin { @Mutable @Shadow public String title; @Inject(method = "", at = @At("TAIL")) - private void onInit(Category category, String name, String description, CallbackInfo info) { + private void onInit(Category category, String name, String description, String[] aliases, CallbackInfo info) { if (RejectsConfig.get().duplicateModuleNames) { this.name = RejectsUtils.getModuleName(name); this.title = Utils.nameToTitle(this.name); From 0dcf1a26d03f4d85f0f45cc68156a92739677caa Mon Sep 17 00:00:00 2001 From: Ashray Shah Date: Fri, 24 Jan 2025 18:44:35 -0600 Subject: [PATCH 25/26] Update to 1.21.3/1.21.4 (#399) * Update to 1.21.3 part 1 Don't expect it to work anytime soon. * Update to 1.21.3 part 2 * Gradle 8.8 -> 8.12 * Working Build 1.21.3 Had to revert gradle to 8.10 due to unforseen issues. * Removed Unused Imports * Small rendering fixes (hopefully) * 1.21.4 port * Use Utils.canUpdate in AutoCraft * Intellij code fixes --------- Co-authored-by: crazymoose77756 Co-authored-by: SByte --- build.gradle | 15 +- gradle.properties | 9 +- gradle/wrapper/gradle-wrapper.jar | Bin 59536 -> 43583 bytes gradle/wrapper/gradle-wrapper.properties | 4 +- gradlew | 286 +++++++++++------- gradlew.bat | 39 +-- .../anticope/rejects/MeteorRejectsAddon.java | 2 +- .../rejects/arguments/EnumArgumentType.java | 2 + .../rejects/commands/CenterCommand.java | 4 +- .../rejects/commands/KickCommand.java | 2 +- .../anticope/rejects/gui/hud/RadarHud.java | 2 +- .../gui/screens/InteractionScreen.java | 29 +- .../gui/servers/LegacyServerFinderScreen.java | 2 +- .../gui/servers/ServerFinderScreen.java | 4 +- .../widgets/pressable/WMeteorCheckbox.java | 2 +- .../rejects/mixin/GameRendererMixin.java | 7 +- .../mixin/LivingEntityRendererMixin.java | 12 +- .../mixin/VehicleMoveC2SPacketAccessor.java | 15 +- .../rejects/mixin/meteor/ModuleMixin.java | 4 +- .../anticope/rejects/modules/AntiBot.java | 2 +- .../anticope/rejects/modules/AntiCrash.java | 20 +- .../anticope/rejects/modules/ArrowDmg.java | 4 +- .../anticope/rejects/modules/AutoBedTrap.java | 2 +- .../anticope/rejects/modules/AutoCraft.java | 30 +- .../anticope/rejects/modules/AutoPot.java | 1 + .../anticope/rejects/modules/AutoSoup.java | 35 ++- .../anticope/rejects/modules/AutoTNT.java | 2 +- .../anticope/rejects/modules/AutoWither.java | 8 +- .../anticope/rejects/modules/BoatPhase.java | 2 +- .../rejects/modules/ChorusExploit.java | 7 +- .../anticope/rejects/modules/Confuse.java | 6 +- .../anticope/rejects/modules/CoordLogger.java | 8 +- .../rejects/modules/CustomPackets.java | 7 +- .../anticope/rejects/modules/ExtraElytra.java | 6 +- .../anticope/rejects/modules/FullFlight.java | 18 +- .../anticope/rejects/modules/Jetpack.java | 2 +- .../rejects/modules/KnockbackPlus.java | 4 +- .../anticope/rejects/modules/NewChunks.java | 5 +- .../anticope/rejects/modules/PacketFly.java | 19 +- .../anticope/rejects/modules/Rendering.java | 44 +-- .../anticope/rejects/modules/RoboWalk.java | 9 +- .../rejects/modules/ShieldBypass.java | 4 +- .../anticope/rejects/modules/SkeletonESP.java | 21 +- .../rejects/modules/SoundLocator.java | 2 +- .../anticope/rejects/modules/TreeAura.java | 18 +- .../anticope/rejects/utils/GiveUtils.java | 20 +- src/main/java/anticope/rejects/utils/Ore.java | 4 +- .../anticope/rejects/utils/RejectsUtils.java | 6 +- .../anticope/rejects/utils/WorldUtils.java | 6 +- src/main/resources/fabric.mod.json | 2 +- .../resources/meteor-rejects.accesswidener | 2 +- 51 files changed, 425 insertions(+), 341 deletions(-) diff --git a/build.gradle b/build.gradle index 30d2476d..6016269c 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'fabric-loom' version '1.7-SNAPSHOT' + id 'fabric-loom' version '1.9-SNAPSHOT' } sourceCompatibility = targetCompatibility = JavaVersion.VERSION_21 @@ -18,6 +18,11 @@ repositories { maven { url 'https://jitpack.io' } maven { url 'https://maven.duti.dev/releases' } } + +loom { + accessWidenerPath = file("src/main/resources/meteor-rejects.accesswidener") +} + configurations { // configuration that holds jars to include in the jar extraLibs @@ -34,7 +39,7 @@ dependencies { mappings "net.fabricmc:yarn:${project.yarn_version}:v2" modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" - modImplementation("meteordevelopment:meteor-client:${project.meteor_version}-SNAPSHOT") + modImplementation("meteordevelopment:meteor-client:${project.minecraft_version}-SNAPSHOT") modCompileOnly "meteordevelopment:baritone:${project.baritone_version}-SNAPSHOT" // seed .locate and ore sim @@ -53,10 +58,6 @@ dependencies { configurations.implementation.extendsFrom(configurations.extraLibs) } -loom { - accessWidenerPath = file("src/main/resources/meteor-rejects.accesswidener") -} - processResources { inputs.property "version", project.version @@ -70,7 +71,7 @@ processResources { jar { from("LICENSE") { - rename { "${it}_${project.archivesBaseName}"} + rename { "${it}_${project.archivesBaseName}" } } from { configurations.extraLibs.collect { it.isDirectory() ? it : zipTree(it) } diff --git a/gradle.properties b/gradle.properties index 60b3865d..84389b6d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,14 +2,13 @@ org.gradle.jvmargs=-Xmx2G # Fabric Properties -minecraft_version=1.21 -yarn_version=1.21+build.2 -loader_version=0.15.11 +minecraft_version=1.21.4 +yarn_version=1.21.4+build.8 +loader_version=0.16.9 # Mod Properties mod_version = 0.3 maven_group = anticope.rejects archives_base_name = meteor-rejects-addon -meteor_version=0.5.8 -baritone_version=1.20.6 +baritone_version=1.21.4 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 7454180f2ae8848c63b8b4dea2cb829da983f2fa..a4b76b9530d66f5e68d973ea569d8e19de379189 100644 GIT binary patch literal 43583 zcma&N1CXTcmMvW9vTb(Rwr$&4wr$(C?dmSu>@vG-+vuvg^_??!{yS%8zW-#zn-LkA z5&1^$^{lnmUON?}LBF8_K|(?T0Ra(xUH{($5eN!MR#ZihR#HxkUPe+_R8Cn`RRs(P z_^*#_XlXmGv7!4;*Y%p4nw?{bNp@UZHv1?Um8r6)Fei3p@ClJn0ECfg1hkeuUU@Or zDaPa;U3fE=3L}DooL;8f;P0ipPt0Z~9P0)lbStMS)ag54=uL9ia-Lm3nh|@(Y?B`; zx_#arJIpXH!U{fbCbI^17}6Ri*H<>OLR%c|^mh8+)*h~K8Z!9)DPf zR2h?lbDZQ`p9P;&DQ4F0sur@TMa!Y}S8irn(%d-gi0*WxxCSk*A?3lGh=gcYN?FGl z7D=Js!i~0=u3rox^eO3i@$0=n{K1lPNU zwmfjRVmLOCRfe=seV&P*1Iq=^i`502keY8Uy-WNPwVNNtJFx?IwAyRPZo2Wo1+S(xF37LJZ~%i)kpFQ3Fw=mXfd@>%+)RpYQLnr}B~~zoof(JVm^^&f zxKV^+3D3$A1G;qh4gPVjhrC8e(VYUHv#dy^)(RoUFM?o%W-EHxufuWf(l*@-l+7vt z=l`qmR56K~F|v<^Pd*p~1_y^P0P^aPC##d8+HqX4IR1gu+7w#~TBFphJxF)T$2WEa zxa?H&6=Qe7d(#tha?_1uQys2KtHQ{)Qco)qwGjrdNL7thd^G5i8Os)CHqc>iOidS} z%nFEDdm=GXBw=yXe1W-ShHHFb?Cc70+$W~z_+}nAoHFYI1MV1wZegw*0y^tC*s%3h zhD3tN8b=Gv&rj}!SUM6|ajSPp*58KR7MPpI{oAJCtY~JECm)*m_x>AZEu>DFgUcby z1Qaw8lU4jZpQ_$;*7RME+gq1KySGG#Wql>aL~k9tLrSO()LWn*q&YxHEuzmwd1?aAtI zBJ>P=&$=l1efe1CDU;`Fd+_;&wI07?V0aAIgc(!{a z0Jg6Y=inXc3^n!U0Atk`iCFIQooHqcWhO(qrieUOW8X(x?(RD}iYDLMjSwffH2~tB z)oDgNBLB^AJBM1M^c5HdRx6fBfka`(LD-qrlh5jqH~);#nw|iyp)()xVYak3;Ybik z0j`(+69aK*B>)e_p%=wu8XC&9e{AO4c~O1U`5X9}?0mrd*m$_EUek{R?DNSh(=br# z#Q61gBzEpmy`$pA*6!87 zSDD+=@fTY7<4A?GLqpA?Pb2z$pbCc4B4zL{BeZ?F-8`s$?>*lXXtn*NC61>|*w7J* z$?!iB{6R-0=KFmyp1nnEmLsA-H0a6l+1uaH^g%c(p{iT&YFrbQ$&PRb8Up#X3@Zsk zD^^&LK~111%cqlP%!_gFNa^dTYT?rhkGl}5=fL{a`UViaXWI$k-UcHJwmaH1s=S$4 z%4)PdWJX;hh5UoK?6aWoyLxX&NhNRqKam7tcOkLh{%j3K^4Mgx1@i|Pi&}<^5>hs5 zm8?uOS>%)NzT(%PjVPGa?X%`N2TQCKbeH2l;cTnHiHppPSJ<7y-yEIiC!P*ikl&!B z%+?>VttCOQM@ShFguHVjxX^?mHX^hSaO_;pnyh^v9EumqSZTi+#f&_Vaija0Q-e*| z7ulQj6Fs*bbmsWp{`auM04gGwsYYdNNZcg|ph0OgD>7O}Asn7^Z=eI>`$2*v78;sj-}oMoEj&@)9+ycEOo92xSyY344^ z11Hb8^kdOvbf^GNAK++bYioknrpdN>+u8R?JxG=!2Kd9r=YWCOJYXYuM0cOq^FhEd zBg2puKy__7VT3-r*dG4c62Wgxi52EMCQ`bKgf*#*ou(D4-ZN$+mg&7$u!! z-^+Z%;-3IDwqZ|K=ah85OLwkO zKxNBh+4QHh)u9D?MFtpbl)us}9+V!D%w9jfAMYEb>%$A;u)rrI zuBudh;5PN}_6J_}l55P3l_)&RMlH{m!)ai-i$g)&*M`eN$XQMw{v^r@-125^RRCF0 z^2>|DxhQw(mtNEI2Kj(;KblC7x=JlK$@78`O~>V!`|1Lm-^JR$-5pUANAnb(5}B}JGjBsliK4& zk6y(;$e&h)lh2)L=bvZKbvh@>vLlreBdH8No2>$#%_Wp1U0N7Ank!6$dFSi#xzh|( zRi{Uw%-4W!{IXZ)fWx@XX6;&(m_F%c6~X8hx=BN1&q}*( zoaNjWabE{oUPb!Bt$eyd#$5j9rItB-h*5JiNi(v^e|XKAj*8(k<5-2$&ZBR5fF|JA z9&m4fbzNQnAU}r8ab>fFV%J0z5awe#UZ|bz?Ur)U9bCIKWEzi2%A+5CLqh?}K4JHi z4vtM;+uPsVz{Lfr;78W78gC;z*yTch~4YkLr&m-7%-xc ztw6Mh2d>_iO*$Rd8(-Cr1_V8EO1f*^@wRoSozS) zy1UoC@pruAaC8Z_7~_w4Q6n*&B0AjOmMWa;sIav&gu z|J5&|{=a@vR!~k-OjKEgPFCzcJ>#A1uL&7xTDn;{XBdeM}V=l3B8fE1--DHjSaxoSjNKEM9|U9#m2<3>n{Iuo`r3UZp;>GkT2YBNAh|b z^jTq-hJp(ebZh#Lk8hVBP%qXwv-@vbvoREX$TqRGTgEi$%_F9tZES@z8Bx}$#5eeG zk^UsLBH{bc2VBW)*EdS({yw=?qmevwi?BL6*=12k9zM5gJv1>y#ML4!)iiPzVaH9% zgSImetD@dam~e>{LvVh!phhzpW+iFvWpGT#CVE5TQ40n%F|p(sP5mXxna+Ev7PDwA zamaV4m*^~*xV+&p;W749xhb_X=$|LD;FHuB&JL5?*Y2-oIT(wYY2;73<^#46S~Gx| z^cez%V7x$81}UWqS13Gz80379Rj;6~WdiXWOSsdmzY39L;Hg3MH43o*y8ibNBBH`(av4|u;YPq%{R;IuYow<+GEsf@R?=@tT@!}?#>zIIn0CoyV!hq3mw zHj>OOjfJM3F{RG#6ujzo?y32m^tgSXf@v=J$ELdJ+=5j|=F-~hP$G&}tDZsZE?5rX ztGj`!S>)CFmdkccxM9eGIcGnS2AfK#gXwj%esuIBNJQP1WV~b~+D7PJTmWGTSDrR` zEAu4B8l>NPuhsk5a`rReSya2nfV1EK01+G!x8aBdTs3Io$u5!6n6KX%uv@DxAp3F@{4UYg4SWJtQ-W~0MDb|j-$lwVn znAm*Pl!?Ps&3wO=R115RWKb*JKoexo*)uhhHBncEDMSVa_PyA>k{Zm2(wMQ(5NM3# z)jkza|GoWEQo4^s*wE(gHz?Xsg4`}HUAcs42cM1-qq_=+=!Gk^y710j=66(cSWqUe zklbm8+zB_syQv5A2rj!Vbw8;|$@C!vfNmNV!yJIWDQ>{+2x zKjuFX`~~HKG~^6h5FntRpnnHt=D&rq0>IJ9#F0eM)Y-)GpRjiN7gkA8wvnG#K=q{q z9dBn8_~wm4J<3J_vl|9H{7q6u2A!cW{bp#r*-f{gOV^e=8S{nc1DxMHFwuM$;aVI^ zz6A*}m8N-&x8;aunp1w7_vtB*pa+OYBw=TMc6QK=mbA-|Cf* zvyh8D4LRJImooUaSb7t*fVfih<97Gf@VE0|z>NcBwBQze);Rh!k3K_sfunToZY;f2 z^HmC4KjHRVg+eKYj;PRN^|E0>Gj_zagfRbrki68I^#~6-HaHg3BUW%+clM1xQEdPYt_g<2K+z!$>*$9nQ>; zf9Bei{?zY^-e{q_*|W#2rJG`2fy@{%6u0i_VEWTq$*(ZN37|8lFFFt)nCG({r!q#9 z5VK_kkSJ3?zOH)OezMT{!YkCuSSn!K#-Rhl$uUM(bq*jY? zi1xbMVthJ`E>d>(f3)~fozjg^@eheMF6<)I`oeJYx4*+M&%c9VArn(OM-wp%M<-`x z7sLP1&3^%Nld9Dhm@$3f2}87!quhI@nwd@3~fZl_3LYW-B?Ia>ui`ELg z&Qfe!7m6ze=mZ`Ia9$z|ARSw|IdMpooY4YiPN8K z4B(ts3p%2i(Td=tgEHX z0UQ_>URBtG+-?0E;E7Ld^dyZ;jjw0}XZ(}-QzC6+NN=40oDb2^v!L1g9xRvE#@IBR zO!b-2N7wVfLV;mhEaXQ9XAU+>=XVA6f&T4Z-@AX!leJ8obP^P^wP0aICND?~w&NykJ#54x3_@r7IDMdRNy4Hh;h*!u(Ol(#0bJdwEo$5437-UBjQ+j=Ic>Q2z` zJNDf0yO6@mr6y1#n3)s(W|$iE_i8r@Gd@!DWDqZ7J&~gAm1#~maIGJ1sls^gxL9LLG_NhU!pTGty!TbhzQnu)I*S^54U6Yu%ZeCg`R>Q zhBv$n5j0v%O_j{QYWG!R9W?5_b&67KB$t}&e2LdMvd(PxN6Ir!H4>PNlerpBL>Zvyy!yw z-SOo8caEpDt(}|gKPBd$qND5#a5nju^O>V&;f890?yEOfkSG^HQVmEbM3Ugzu+UtH zC(INPDdraBN?P%kE;*Ae%Wto&sgw(crfZ#Qy(<4nk;S|hD3j{IQRI6Yq|f^basLY; z-HB&Je%Gg}Jt@={_C{L$!RM;$$|iD6vu#3w?v?*;&()uB|I-XqEKqZPS!reW9JkLewLb!70T7n`i!gNtb1%vN- zySZj{8-1>6E%H&=V}LM#xmt`J3XQoaD|@XygXjdZ1+P77-=;=eYpoEQ01B@L*a(uW zrZeZz?HJsw_4g0vhUgkg@VF8<-X$B8pOqCuWAl28uB|@r`19DTUQQsb^pfqB6QtiT z*`_UZ`fT}vtUY#%sq2{rchyfu*pCg;uec2$-$N_xgjZcoumE5vSI{+s@iLWoz^Mf; zuI8kDP{!XY6OP~q5}%1&L}CtfH^N<3o4L@J@zg1-mt{9L`s^z$Vgb|mr{@WiwAqKg zp#t-lhrU>F8o0s1q_9y`gQNf~Vb!F%70f}$>i7o4ho$`uciNf=xgJ>&!gSt0g;M>*x4-`U)ysFW&Vs^Vk6m%?iuWU+o&m(2Jm26Y(3%TL; zA7T)BP{WS!&xmxNw%J=$MPfn(9*^*TV;$JwRy8Zl*yUZi8jWYF>==j~&S|Xinsb%c z2?B+kpet*muEW7@AzjBA^wAJBY8i|#C{WtO_or&Nj2{=6JTTX05}|H>N2B|Wf!*3_ z7hW*j6p3TvpghEc6-wufFiY!%-GvOx*bZrhZu+7?iSrZL5q9}igiF^*R3%DE4aCHZ zqu>xS8LkW+Auv%z-<1Xs92u23R$nk@Pk}MU5!gT|c7vGlEA%G^2th&Q*zfg%-D^=f z&J_}jskj|Q;73NP4<4k*Y%pXPU2Thoqr+5uH1yEYM|VtBPW6lXaetokD0u z9qVek6Q&wk)tFbQ8(^HGf3Wp16gKmr>G;#G(HRBx?F`9AIRboK+;OfHaLJ(P>IP0w zyTbTkx_THEOs%Q&aPrxbZrJlio+hCC_HK<4%f3ZoSAyG7Dn`=X=&h@m*|UYO-4Hq0 z-Bq&+Ie!S##4A6OGoC~>ZW`Y5J)*ouaFl_e9GA*VSL!O_@xGiBw!AF}1{tB)z(w%c zS1Hmrb9OC8>0a_$BzeiN?rkPLc9%&;1CZW*4}CDDNr2gcl_3z+WC15&H1Zc2{o~i) z)LLW=WQ{?ricmC`G1GfJ0Yp4Dy~Ba;j6ZV4r{8xRs`13{dD!xXmr^Aga|C=iSmor% z8hi|pTXH)5Yf&v~exp3o+sY4B^^b*eYkkCYl*T{*=-0HniSA_1F53eCb{x~1k3*`W zr~};p1A`k{1DV9=UPnLDgz{aJH=-LQo<5%+Em!DNN252xwIf*wF_zS^!(XSm(9eoj z=*dXG&n0>)_)N5oc6v!>-bd(2ragD8O=M|wGW z!xJQS<)u70m&6OmrF0WSsr@I%T*c#Qo#Ha4d3COcX+9}hM5!7JIGF>7<~C(Ear^Sn zm^ZFkV6~Ula6+8S?oOROOA6$C&q&dp`>oR-2Ym3(HT@O7Sd5c~+kjrmM)YmgPH*tL zX+znN>`tv;5eOfX?h{AuX^LK~V#gPCu=)Tigtq9&?7Xh$qN|%A$?V*v=&-2F$zTUv z`C#WyIrChS5|Kgm_GeudCFf;)!WH7FI60j^0o#65o6`w*S7R@)88n$1nrgU(oU0M9 zx+EuMkC>(4j1;m6NoGqEkpJYJ?vc|B zOlwT3t&UgL!pX_P*6g36`ZXQ; z9~Cv}ANFnJGp(;ZhS(@FT;3e)0)Kp;h^x;$*xZn*k0U6-&FwI=uOGaODdrsp-!K$Ac32^c{+FhI-HkYd5v=`PGsg%6I`4d9Jy)uW0y%) zm&j^9WBAp*P8#kGJUhB!L?a%h$hJgQrx!6KCB_TRo%9{t0J7KW8!o1B!NC)VGLM5! zpZy5Jc{`r{1e(jd%jsG7k%I+m#CGS*BPA65ZVW~fLYw0dA-H_}O zrkGFL&P1PG9p2(%QiEWm6x;U-U&I#;Em$nx-_I^wtgw3xUPVVu zqSuKnx&dIT-XT+T10p;yjo1Y)z(x1fb8Dzfn8e yu?e%!_ptzGB|8GrCfu%p?(_ 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 GZ~q4|mN%#X literal 59536 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 QuEJmfE|#`Dqx|px0L@K;Y5)KL diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 0d184210..cea7a793 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index fe1f4e62..f3b75f3b 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ -#!/usr/bin/env sh +#!/bin/sh # -# Copyright 2015 the original author or authors. +# Copyright © 2015-2021 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -15,69 +15,103 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## # Attempt to set APP_HOME + # Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MSYS* | MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar @@ -87,9 +121,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -98,88 +132,120 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac fi -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. # For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) fi - i=`expr $i + 1` + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' -exec "$JAVACMD" "$@" \ No newline at end of file +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index 477c8966..9d21a218 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,8 +13,10 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +27,8 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,13 +43,13 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute +if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -56,11 +59,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -75,15 +78,17 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal -:omega \ No newline at end of file +:omega diff --git a/src/main/java/anticope/rejects/MeteorRejectsAddon.java b/src/main/java/anticope/rejects/MeteorRejectsAddon.java index 6098d03f..c20d8399 100644 --- a/src/main/java/anticope/rejects/MeteorRejectsAddon.java +++ b/src/main/java/anticope/rejects/MeteorRejectsAddon.java @@ -135,7 +135,7 @@ public String getCommit() { .get().getMetadata() .getCustomValue("github:sha") .getAsString(); - LOG.info(String.format("Rejects version: %s", commit)); + LOG.info("Rejects version: {}", commit); return commit.isEmpty() ? null : commit.trim(); } diff --git a/src/main/java/anticope/rejects/arguments/EnumArgumentType.java b/src/main/java/anticope/rejects/arguments/EnumArgumentType.java index 32b7f5da..b2821f58 100644 --- a/src/main/java/anticope/rejects/arguments/EnumArgumentType.java +++ b/src/main/java/anticope/rejects/arguments/EnumArgumentType.java @@ -24,6 +24,7 @@ public EnumArgumentType(T defaultValue) { super(); try { + //noinspection unchecked values = (T[]) defaultValue.getClass().getMethod("values").invoke(null); } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { e.printStackTrace(); @@ -34,6 +35,7 @@ public static > EnumArgumentType enumArgument(T defaultValu return new EnumArgumentType<>(defaultValue); } + @SuppressWarnings("unchecked") public static > T getEnum(CommandContext context, String name, T defaultValue) { return (T) context.getArgument(name, defaultValue.getClass()); } diff --git a/src/main/java/anticope/rejects/commands/CenterCommand.java b/src/main/java/anticope/rejects/commands/CenterCommand.java index bf11c56e..7ca7aff1 100644 --- a/src/main/java/anticope/rejects/commands/CenterCommand.java +++ b/src/main/java/anticope/rejects/commands/CenterCommand.java @@ -17,7 +17,7 @@ public void build(LiteralArgumentBuilder builder) { double x = MathHelper.floor(mc.player.getX()) + 0.5; double z = MathHelper.floor(mc.player.getZ()) + 0.5; mc.player.setPosition(x, mc.player.getY(), z); - mc.player.networkHandler.sendPacket(new PlayerMoveC2SPacket.PositionAndOnGround(mc.player.getX(), mc.player.getY(), mc.player.getZ(), mc.player.isOnGround())); + mc.player.networkHandler.sendPacket(new PlayerMoveC2SPacket.PositionAndOnGround(mc.player.getX(), mc.player.getY(), mc.player.getZ(), mc.player.isOnGround(), mc.player.horizontalCollision)); return SINGLE_SUCCESS; })); @@ -26,7 +26,7 @@ public void build(LiteralArgumentBuilder builder) { double x = MathHelper.floor(mc.player.getX()); double z = MathHelper.floor(mc.player.getZ()); mc.player.setPosition(x, mc.player.getY(), z); - mc.player.networkHandler.sendPacket(new PlayerMoveC2SPacket.PositionAndOnGround(mc.player.getX(), mc.player.getY(), mc.player.getZ(), mc.player.isOnGround())); + mc.player.networkHandler.sendPacket(new PlayerMoveC2SPacket.PositionAndOnGround(mc.player.getX(), mc.player.getY(), mc.player.getZ(), mc.player.isOnGround(), mc.player.horizontalCollision)); return SINGLE_SUCCESS; })); diff --git a/src/main/java/anticope/rejects/commands/KickCommand.java b/src/main/java/anticope/rejects/commands/KickCommand.java index 19a54d0e..6272eb2d 100644 --- a/src/main/java/anticope/rejects/commands/KickCommand.java +++ b/src/main/java/anticope/rejects/commands/KickCommand.java @@ -44,7 +44,7 @@ public void build(LiteralArgumentBuilder builder) { return SINGLE_SUCCESS; })); builder.then(literal("pos").executes(ctx -> { - mc.player.networkHandler.sendPacket(new PlayerMoveC2SPacket.PositionAndOnGround(Double.NaN, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, !mc.player.isOnGround())); + mc.player.networkHandler.sendPacket(new PlayerMoveC2SPacket.PositionAndOnGround(Double.NaN, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, !mc.player.isOnGround(), mc.player.horizontalCollision)); return SINGLE_SUCCESS; })); builder.then(literal("hurt").executes(ctx -> { diff --git a/src/main/java/anticope/rejects/gui/hud/RadarHud.java b/src/main/java/anticope/rejects/gui/hud/RadarHud.java index 44d23f77..296722d3 100644 --- a/src/main/java/anticope/rejects/gui/hud/RadarHud.java +++ b/src/main/java/anticope/rejects/gui/hud/RadarHud.java @@ -116,7 +116,7 @@ public void render(HudRenderer renderer) { double yPos = ((coords.getZ() - mc.player.getZ()) * scale.get() * zoom.get() + height / 2); if (xPos < 0 || yPos < 0 || xPos > width - scale.get() || yPos > height - scale.get()) continue; String icon = "*"; - if (letters.get() && waypoint.name.get().length() > 0) + if (letters.get() && !waypoint.name.get().isEmpty()) icon = waypoint.name.get().substring(0, 1); renderer.text(icon, xPos + x, yPos + y, waypoint.color.get(), false); } diff --git a/src/main/java/anticope/rejects/gui/screens/InteractionScreen.java b/src/main/java/anticope/rejects/gui/screens/InteractionScreen.java index 6f50f03e..41cba2b5 100644 --- a/src/main/java/anticope/rejects/gui/screens/InteractionScreen.java +++ b/src/main/java/anticope/rejects/gui/screens/InteractionScreen.java @@ -15,12 +15,13 @@ import meteordevelopment.starscript.utils.Error; import meteordevelopment.starscript.utils.StarscriptError; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gl.ShaderProgramKeys; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.ChatScreen; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.InventoryScreen; import net.minecraft.client.option.KeyBinding; -import net.minecraft.client.render.GameRenderer; +import net.minecraft.client.render.RenderLayer; import net.minecraft.client.util.InputUtil; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.component.DataComponentTypes; @@ -38,6 +39,7 @@ import net.minecraft.text.Text; import net.minecraft.util.Hand; import net.minecraft.util.Identifier; +import net.minecraft.util.PlayerInput; import net.minecraft.util.math.MathHelper; import org.joml.Vector2f; import org.lwjgl.glfw.GLFW; @@ -93,27 +95,26 @@ public InteractionScreen(Entity entity, InteractionMenu module) { closeScreen(); client.setScreen(new StatsScreen(e)); }); - if (entity instanceof PlayerEntity) { - functions.put("Open Inventory", (Entity e) -> { + switch (entity) { + case PlayerEntity playerEntity -> functions.put("Open Inventory", (Entity e) -> { closeScreen(); client.setScreen(new InventoryScreen((PlayerEntity) e)); }); - } else if (entity instanceof AbstractHorseEntity) { - functions.put("Open Inventory", (Entity e) -> { + case AbstractHorseEntity abstractHorseEntity -> functions.put("Open Inventory", (Entity e) -> { closeScreen(); if (client.player.isRiding()) { - client.player.networkHandler.sendPacket(new PlayerInputC2SPacket(0, 0, false, true)); +// client.player.networkHandler.sendPacket(new PlayerInputC2SPacket(0, 0, false, true)); + client.player.networkHandler.sendPacket(new PlayerInputC2SPacket(new PlayerInput(false, false, false, false, false, true, false))); + } client.player.networkHandler.sendPacket(PlayerInteractEntityC2SPacket.interact(entity, true, Hand.MAIN_HAND)); client.player.setSneaking(false); }); - } else if (entity instanceof StorageMinecartEntity) { - functions.put("Open Inventory", (Entity e) -> { + case StorageMinecartEntity storageMinecartEntity -> functions.put("Open Inventory", (Entity e) -> { closeScreen(); client.player.networkHandler.sendPacket(PlayerInteractEntityC2SPacket.interact(entity, true, Hand.MAIN_HAND)); }); - } else { - functions.put("Open Inventory", (Entity e) -> { + case null, default -> functions.put("Open Inventory", (Entity e) -> { closeScreen(); ItemStack container = new ItemStack(Items.CHEST); container.set(DataComponentTypes.CUSTOM_NAME, e.getName()); @@ -186,7 +187,7 @@ private ItemStack[] getInventory(Entity e) { } catch (NullPointerException ex) { } } - if (Saddleable.class.isInstance(e)) { + if (e instanceof Saddleable) { if (((Saddleable) e).isSaddled()) { stack[index[0]] = Items.SADDLE.getDefaultStack(); index[0]++; @@ -251,12 +252,12 @@ public void render(DrawContext context, int mouseX, int mouseY, float delta) { MatrixStack matrix = context.getMatrices(); // Fake crosshair stuff RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); - RenderSystem.setShader(GameRenderer::getPositionTexProgram); + RenderSystem.setShader(ShaderProgramKeys.POSITION_TEX); RenderSystem.enableBlend(); RenderSystem.blendFuncSeparate(GlStateManager.SrcFactor.ONE_MINUS_DST_COLOR, GlStateManager.DstFactor.ONE_MINUS_SRC_COLOR, GlStateManager.SrcFactor.ONE, GlStateManager.DstFactor.ZERO); - context.drawTexture(GUI_ICONS_TEXTURE, crosshairX - 8, crosshairY - 8, 0, 0, 15, 15); + context.drawTexture(RenderLayer::getGuiTextured, GUI_ICONS_TEXTURE, crosshairX - 8, crosshairY - 8, 0, 0, 15, 15, 256, 256); drawDots(context, (int) (Math.min(height, width) / 2 * 0.75), mouseX, mouseY); matrix.scale(2f, 2f, 1f); @@ -290,7 +291,7 @@ private Vector2f getMouseVecs(int mouseX, int mouseY) { private void drawDots(DrawContext context, int radius, int mouseX, int mouseY) { ArrayList pointList = new ArrayList(); - String cache[] = new String[functions.size()]; + String[] cache = new String[functions.size()]; double lowestDistance = Double.MAX_VALUE; int i = 0; diff --git a/src/main/java/anticope/rejects/gui/servers/LegacyServerFinderScreen.java b/src/main/java/anticope/rejects/gui/servers/LegacyServerFinderScreen.java index 938a8960..aeeddade 100644 --- a/src/main/java/anticope/rejects/gui/servers/LegacyServerFinderScreen.java +++ b/src/main/java/anticope/rejects/gui/servers/LegacyServerFinderScreen.java @@ -108,7 +108,7 @@ private void findServers() { updatePingers(pingers); } } - while (pingers.size() > 0) { + while (!pingers.isEmpty()) { if (state == ServerFinderState.CANCELLED) return; diff --git a/src/main/java/anticope/rejects/gui/servers/ServerFinderScreen.java b/src/main/java/anticope/rejects/gui/servers/ServerFinderScreen.java index 564edee1..26b8ac26 100644 --- a/src/main/java/anticope/rejects/gui/servers/ServerFinderScreen.java +++ b/src/main/java/anticope/rejects/gui/servers/ServerFinderScreen.java @@ -136,7 +136,7 @@ private void parseVersionFilters() { versionFilters.clear(); for (String version : versions) { String trimmed = version.trim(); - if (trimmed.length() > 0) + if (!trimmed.isEmpty()) versionFilters.add(version.trim()); } } @@ -177,7 +177,7 @@ private void findServers() { private boolean pingNewIP() { synchronized (serverFinderLock) { - if (ipsToPing.size() > 0) { + if (!ipsToPing.isEmpty()) { String ip = ipsToPing.pop(); ServerPinger pinger = new ServerPinger(scanPortsBox.checked, searchNumber); pinger.addServerFinderDoneListener(this); diff --git a/src/main/java/anticope/rejects/gui/themes/rounded/widgets/pressable/WMeteorCheckbox.java b/src/main/java/anticope/rejects/gui/themes/rounded/widgets/pressable/WMeteorCheckbox.java index e0e47f88..56feffbf 100644 --- a/src/main/java/anticope/rejects/gui/themes/rounded/widgets/pressable/WMeteorCheckbox.java +++ b/src/main/java/anticope/rejects/gui/themes/rounded/widgets/pressable/WMeteorCheckbox.java @@ -31,7 +31,7 @@ protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, doub if (animProgress > 0) { double cs = (width - theme.scale(2)) / 1.75 * animProgress; - GuiUtils.quadRounded(renderer, x + (width - cs) / 2, y + (height - cs) / 2, cs, cs, theme.checkboxColor.get(), ((MeteorRoundedGuiTheme)theme).roundAmount()); + GuiUtils.quadRounded(renderer, x + (width - cs) / 2, y + (height - cs) / 2, cs, cs, theme.checkboxColor.get(), theme.roundAmount()); } } } diff --git a/src/main/java/anticope/rejects/mixin/GameRendererMixin.java b/src/main/java/anticope/rejects/mixin/GameRendererMixin.java index f1f18231..21b541f1 100644 --- a/src/main/java/anticope/rejects/mixin/GameRendererMixin.java +++ b/src/main/java/anticope/rejects/mixin/GameRendererMixin.java @@ -5,6 +5,7 @@ import net.minecraft.client.gl.PostEffectProcessor; import net.minecraft.client.render.RenderTickCounter; +import net.minecraft.client.util.Pool; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -18,6 +19,8 @@ @Mixin(GameRenderer.class) public class GameRendererMixin { @Shadow @Final MinecraftClient client; + @Shadow @Final + Pool pool; @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/WorldRenderer;drawEntityOutlinesFramebuffer()V", ordinal = 0)) private void renderShader(RenderTickCounter tickCounter, boolean tick, CallbackInfo ci) { @@ -26,8 +29,8 @@ private void renderShader(RenderTickCounter tickCounter, boolean tick, CallbackI PostEffectProcessor shader = renderingModule.getShaderEffect(); if (shader != null) { - shader.setupDimensions(client.getWindow().getFramebufferWidth(), client.getWindow().getFramebufferHeight()); - shader.render(tickCounter.getTickDelta(tick)); +// shader.setupDimensions(client.getWindow().getFramebufferWidth(), client.getWindow().getFramebufferHeight()); + shader.render(this.client.getFramebuffer(), this.pool); } } } diff --git a/src/main/java/anticope/rejects/mixin/LivingEntityRendererMixin.java b/src/main/java/anticope/rejects/mixin/LivingEntityRendererMixin.java index ed4cce6f..ff6b00f7 100644 --- a/src/main/java/anticope/rejects/mixin/LivingEntityRendererMixin.java +++ b/src/main/java/anticope/rejects/mixin/LivingEntityRendererMixin.java @@ -5,9 +5,11 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.render.entity.LivingEntityRenderer; +import net.minecraft.client.render.entity.model.EntityModel; +import net.minecraft.client.render.entity.state.LivingEntityRenderState; +import net.minecraft.client.render.entity.state.PlayerEntityRenderState; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.math.RotationAxis; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -16,14 +18,14 @@ @Environment(EnvType.CLIENT) @Mixin(LivingEntityRenderer.class) -public class LivingEntityRendererMixin { +public class LivingEntityRendererMixin> { @Inject(method = "setupTransforms", at = @At(value = "TAIL")) - private void dinnerboneEntities(T entity, MatrixStack matrices, float animationProgress, float bodyYaw, float tickDelta, float scale, CallbackInfo ci) { + private void dinnerboneEntities(S state, MatrixStack matrices, float animationProgress, float bodyYaw, CallbackInfo ci) { Rendering renderingModule = Modules.get().get(Rendering.class); if (renderingModule == null) return; - if ((!(entity instanceof PlayerEntity)) && renderingModule.dinnerboneEnabled()) { - matrices.translate(0.0D, entity.getHeight() + 0.1F, 0.0D); + if ((!(state instanceof PlayerEntityRenderState)) && renderingModule.dinnerboneEnabled()) { + matrices.translate(0.0D, state.height + 0.1F, 0.0D); matrices.multiply(RotationAxis.POSITIVE_Z.rotationDegrees(180.0F)); } } diff --git a/src/main/java/anticope/rejects/mixin/VehicleMoveC2SPacketAccessor.java b/src/main/java/anticope/rejects/mixin/VehicleMoveC2SPacketAccessor.java index 43eb7c89..fff39c12 100644 --- a/src/main/java/anticope/rejects/mixin/VehicleMoveC2SPacketAccessor.java +++ b/src/main/java/anticope/rejects/mixin/VehicleMoveC2SPacketAccessor.java @@ -1,17 +1,18 @@ package anticope.rejects.mixin; import net.minecraft.network.packet.c2s.play.VehicleMoveC2SPacket; +import net.minecraft.util.math.Vec3d; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Mutable; import org.spongepowered.asm.mixin.gen.Accessor; +import org.spongepowered.asm.mixin.gen.Invoker; @Mixin(VehicleMoveC2SPacket.class) public interface VehicleMoveC2SPacketAccessor { - @Mutable - @Accessor("x") - void setX(double x); + @Accessor("position") + Vec3d getPosition(); - @Mutable - @Accessor("z") - void setZ(double z); + @Invoker("") + static VehicleMoveC2SPacket create(Vec3d position, float yaw, float pitch, boolean onGround) { + throw new AssertionError(); + } } diff --git a/src/main/java/anticope/rejects/mixin/meteor/ModuleMixin.java b/src/main/java/anticope/rejects/mixin/meteor/ModuleMixin.java index 5f612771..6f90acfa 100644 --- a/src/main/java/anticope/rejects/mixin/meteor/ModuleMixin.java +++ b/src/main/java/anticope/rejects/mixin/meteor/ModuleMixin.java @@ -17,8 +17,8 @@ public class ModuleMixin { @Mutable @Shadow public String name; @Mutable @Shadow public String title; - - @Inject(method = "", at = @At("TAIL")) + + @Inject(method = "*", at = @At("TAIL")) private void onInit(Category category, String name, String description, String[] aliases, CallbackInfo info) { if (RejectsConfig.get().duplicateModuleNames) { this.name = RejectsUtils.getModuleName(name); diff --git a/src/main/java/anticope/rejects/modules/AntiBot.java b/src/main/java/anticope/rejects/modules/AntiBot.java index 4c28345b..b9c15788 100644 --- a/src/main/java/anticope/rejects/modules/AntiBot.java +++ b/src/main/java/anticope/rejects/modules/AntiBot.java @@ -66,7 +66,7 @@ public AntiBot() { @EventHandler public void onTick(TickEvent.Post tickEvent) { for (Entity entity : mc.world.getEntities()) { - if (entity == null || !(entity instanceof PlayerEntity playerEntity)) continue; + if (!(entity instanceof PlayerEntity playerEntity)) continue; if (removeInvisible.get() && !entity.isInvisible()) continue; if (isBot(playerEntity)) entity.remove(Entity.RemovalReason.DISCARDED); diff --git a/src/main/java/anticope/rejects/modules/AntiCrash.java b/src/main/java/anticope/rejects/modules/AntiCrash.java index 166ea913..f3c049cf 100644 --- a/src/main/java/anticope/rejects/modules/AntiCrash.java +++ b/src/main/java/anticope/rejects/modules/AntiCrash.java @@ -11,6 +11,7 @@ import net.minecraft.network.packet.s2c.play.ExplosionS2CPacket; import net.minecraft.network.packet.s2c.play.ParticleS2CPacket; import net.minecraft.network.packet.s2c.play.PlayerPositionLookS2CPacket; +import net.minecraft.util.math.Vec3d; public class AntiCrash extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); @@ -29,22 +30,25 @@ public AntiCrash() { @EventHandler private void onPacketReceive(PacketEvent.Receive event) { if (event.packet instanceof ExplosionS2CPacket packet) { - if (/* outside of world */ packet.getX() > 30_000_000 || packet.getY() > 30_000_000 || packet.getZ() > 30_000_000 || packet.getX() < -30_000_000 || packet.getY() < -30_000_000 || packet.getZ() < -30_000_000 || - // power too high - packet.getRadius() > 1000 || - // too many blocks - packet.getAffectedBlocks().size() > 100_000 || + Vec3d explodePos = packet.center(); + // TODO: 1.21.3 + Vec3d playerKnockback = new Vec3d(0, 0, 0); + if(packet.playerKnockback().isPresent()) { + playerKnockback = packet.playerKnockback().get(); + } + if (/* outside of world */ explodePos.getX() > 30_000_000 || explodePos.getY() > 30_000_000 || explodePos.getZ() > 30_000_000 || explodePos.getX() < -30_000_000 || explodePos.getY() < -30_000_000 || explodePos.getZ() < -30_000_000 || // too much knockback - packet.getPlayerVelocityX() > 30_000_000 || packet.getPlayerVelocityY() > 30_000_000 || packet.getPlayerVelocityZ() > 30_000_000 + playerKnockback.x > 30_000_000 || playerKnockback.y > 30_000_000 || playerKnockback.z > 30_000_000 // knockback can be negative? - || packet.getPlayerVelocityX() < -30_000_000 || packet.getPlayerVelocityY() < -30_000_000 || packet.getPlayerVelocityZ() < -30_000_000 + || playerKnockback.x < -30_000_000 || playerKnockback.y < -30_000_000 || playerKnockback.z < -30_000_000 ) cancel(event); } else if (event.packet instanceof ParticleS2CPacket packet) { // too many particles if (packet.getCount() > 100_000) cancel(event); } else if (event.packet instanceof PlayerPositionLookS2CPacket packet) { + Vec3d playerPos = packet.change().position(); // out of world movement - if (packet.getX() > 30_000_000 || packet.getY() > 30_000_000 || packet.getZ() > 30_000_000 || packet.getX() < -30_000_000 || packet.getY() < -30_000_000 || packet.getZ() < -30_000_000) + if (playerPos.x > 30_000_000 || playerPos.y > 30_000_000 || playerPos.z > 30_000_000 || playerPos.x < -30_000_000 || playerPos.y < -30_000_000 || playerPos.z < -30_000_000) cancel(event); } else if (event.packet instanceof EntityVelocityUpdateS2CPacket packet) { // velocity diff --git a/src/main/java/anticope/rejects/modules/ArrowDmg.java b/src/main/java/anticope/rejects/modules/ArrowDmg.java index 02c8488f..95587087 100644 --- a/src/main/java/anticope/rejects/modules/ArrowDmg.java +++ b/src/main/java/anticope/rejects/modules/ArrowDmg.java @@ -54,9 +54,9 @@ private void onStopUsingItem(StopUsingItemEvent event) { for (int i = 0; i < packets.get() / 2; i++) { p.networkHandler.sendPacket(new PlayerMoveC2SPacket.PositionAndOnGround(x, - y - 1e-10, z, true)); + y - 1e-10, z, true, mc.player.horizontalCollision)); p.networkHandler.sendPacket(new PlayerMoveC2SPacket.PositionAndOnGround(x, - y + 1e-10, z, false)); + y + 1e-10, z, false, mc.player.horizontalCollision)); } } diff --git a/src/main/java/anticope/rejects/modules/AutoBedTrap.java b/src/main/java/anticope/rejects/modules/AutoBedTrap.java index 5aa08cd2..b5d1db16 100644 --- a/src/main/java/anticope/rejects/modules/AutoBedTrap.java +++ b/src/main/java/anticope/rejects/modules/AutoBedTrap.java @@ -124,7 +124,7 @@ public boolean placeTickAround(BlockPos block) { if (cap >= bpt.get()) { return true; } - }; + } } cap = 0; return true; diff --git a/src/main/java/anticope/rejects/modules/AutoCraft.java b/src/main/java/anticope/rejects/modules/AutoCraft.java index f87e5823..d19993b0 100644 --- a/src/main/java/anticope/rejects/modules/AutoCraft.java +++ b/src/main/java/anticope/rejects/modules/AutoCraft.java @@ -7,10 +7,14 @@ import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.settings.SettingGroup; import meteordevelopment.meteorclient.systems.modules.Module; +import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.orbit.EventHandler; import net.minecraft.client.gui.screen.recipebook.RecipeResultCollection; import net.minecraft.item.Item; -import net.minecraft.recipe.RecipeEntry; +import net.minecraft.item.ItemStack; +import net.minecraft.recipe.RecipeDisplayEntry; +import net.minecraft.recipe.display.RecipeDisplay; +import net.minecraft.recipe.display.SlotDisplayContexts; import net.minecraft.screen.CraftingScreenHandler; import net.minecraft.screen.slot.SlotActionType; @@ -24,7 +28,7 @@ public class AutoCraft extends Module { private final Setting> items = sgGeneral.add(new ItemListSetting.Builder() .name("items") .description("Items you want to get crafted.") - .defaultValue(Arrays.asList()) + .defaultValue(List.of()) .build() ); @@ -55,11 +59,11 @@ public AutoCraft() { @EventHandler private void onTick(TickEvent.Post event) { - if (mc.interactionManager == null) return; + if (!Utils.canUpdate() || mc.interactionManager == null) return; + if (items.get().isEmpty()) return; if (!(mc.player.currentScreenHandler instanceof CraftingScreenHandler)) return; - if (antiDesync.get()) mc.player.getInventory().updateItems(); @@ -70,11 +74,19 @@ private void onTick(TickEvent.Post event) { List itemList = items.get(); List recipeResultCollectionList = mc.player.getRecipeBook().getOrderedResults(); for (RecipeResultCollection recipeResultCollection : recipeResultCollectionList) { - for (RecipeEntry recipe : recipeResultCollection.getRecipes(true)) { - if (!itemList.contains(recipe.value().getResult(mc.world.getRegistryManager()).getItem())) continue; - mc.interactionManager.clickRecipe(currentScreenHandler.syncId, recipe, craftAll.get()); - mc.interactionManager.clickSlot(currentScreenHandler.syncId, 0, 1, - drop.get() ? SlotActionType.THROW : SlotActionType.QUICK_MOVE, mc.player); + // Get craftable recipes only + List craftRecipes = recipeResultCollection.filter(RecipeResultCollection.RecipeFilterMode.CRAFTABLE); + for (RecipeDisplayEntry recipe : craftRecipes) { + RecipeDisplay recipeDisplay = recipe.display(); + List resultStacks = recipeDisplay.result().getStacks(SlotDisplayContexts.createParameters(mc.world)); + for (ItemStack resultStack : resultStacks) { + // Check if the result item is in the item list + if (!itemList.contains(resultStack.getItem())) continue; + + mc.interactionManager.clickRecipe(currentScreenHandler.syncId, recipe.id(), craftAll.get()); + mc.interactionManager.clickSlot(currentScreenHandler.syncId, 0, 1, + drop.get() ? SlotActionType.THROW : SlotActionType.QUICK_MOVE, mc.player); + } } } } diff --git a/src/main/java/anticope/rejects/modules/AutoPot.java b/src/main/java/anticope/rejects/modules/AutoPot.java index f44ba702..c6b2df5b 100644 --- a/src/main/java/anticope/rejects/modules/AutoPot.java +++ b/src/main/java/anticope/rejects/modules/AutoPot.java @@ -30,6 +30,7 @@ import java.util.List; public class AutoPot extends Module { + @SuppressWarnings("unchecked") private static final Class[] AURAS = new Class[]{KillAura.class, CrystalAura.class, AnchorAura.class, BedAura.class}; private final SettingGroup sgGeneral = settings.getDefaultGroup(); diff --git a/src/main/java/anticope/rejects/modules/AutoSoup.java b/src/main/java/anticope/rejects/modules/AutoSoup.java index b33db9e4..cf1a9332 100644 --- a/src/main/java/anticope/rejects/modules/AutoSoup.java +++ b/src/main/java/anticope/rejects/modules/AutoSoup.java @@ -132,23 +132,26 @@ private boolean shouldEatSoup() { } private boolean isClickable(HitResult hitResult) { - if (hitResult == null) - return false; - - if (hitResult instanceof EntityHitResult) { - Entity entity = ((EntityHitResult) mc.crosshairTarget).getEntity(); - return entity instanceof VillagerEntity - || entity instanceof TameableEntity; - } - - if (hitResult instanceof BlockHitResult) { - BlockPos pos = ((BlockHitResult) mc.crosshairTarget).getBlockPos(); - if (pos == null) + switch (hitResult) { + case null -> { return false; - - Block block = mc.world.getBlockState(pos).getBlock(); - return block instanceof BlockWithEntity - || block instanceof CraftingTableBlock; + } + case EntityHitResult entityHitResult -> { + Entity entity = ((EntityHitResult) mc.crosshairTarget).getEntity(); + return entity instanceof VillagerEntity + || entity instanceof TameableEntity; + } + case BlockHitResult blockHitResult -> { + BlockPos pos = ((BlockHitResult) mc.crosshairTarget).getBlockPos(); + if (pos == null) + return false; + + Block block = mc.world.getBlockState(pos).getBlock(); + return block instanceof BlockWithEntity + || block instanceof CraftingTableBlock; + } + default -> { + } } return false; diff --git a/src/main/java/anticope/rejects/modules/AutoTNT.java b/src/main/java/anticope/rejects/modules/AutoTNT.java index 82ffb8d9..45156ee6 100644 --- a/src/main/java/anticope/rejects/modules/AutoTNT.java +++ b/src/main/java/anticope/rejects/modules/AutoTNT.java @@ -113,7 +113,7 @@ private void onPreTick(TickEvent.Pre event) { @EventHandler private void onPostTick(TickEvent.Post event) { // Ignition - if (ignite.get() && blocksToIgnite.size() > 0) { + if (ignite.get() && !blocksToIgnite.isEmpty()) { if (igniteTick > igniteDelay.get()) { // Sort based on closest tnt blocksToIgnite.sort(Comparator.comparingDouble(PlayerUtils::distanceTo)); diff --git a/src/main/java/anticope/rejects/modules/AutoWither.java b/src/main/java/anticope/rejects/modules/AutoWither.java index ab5185ae..fb8e98bc 100644 --- a/src/main/java/anticope/rejects/modules/AutoWither.java +++ b/src/main/java/anticope/rejects/modules/AutoWither.java @@ -139,7 +139,7 @@ private void onTick(TickEvent.Pre event) { // Register BlockIterator.register(horizontalRadius.get(), verticalRadius.get(), (blockPos, blockState) -> { - Direction dir = Direction.fromRotation(Rotations.getYaw(blockPos)).getOpposite(); + Direction dir = Direction.fromHorizontalDegrees(Rotations.getYaw(blockPos)).getOpposite(); if (isValidSpawn(blockPos, dir)) withers.add(witherPool.get().set(blockPos, dir)); }); } @@ -267,15 +267,15 @@ private void onRender(Render3DEvent event) { BlockPos leftHead = wither.foot.up().up().offset(wither.axis, -1); BlockPos rightHead = wither.foot.up().up().offset(wither.axis, 1); - event.renderer.box((double) midHead.getX() + 0.2, (double) midHead.getX(), (double) midHead.getX() + 0.2, + event.renderer.box((double) midHead.getX() + 0.2, midHead.getX(), (double) midHead.getX() + 0.2, (double) midHead.getX() + 0.8, (double) midHead.getX() + 0.7, (double) midHead.getX() + 0.8, sideColor.get(), lineColor.get(), shapeMode.get(), 0); - event.renderer.box((double) leftHead.getX() + 0.2, (double) leftHead.getX(), (double) leftHead.getX() + 0.2, + event.renderer.box((double) leftHead.getX() + 0.2, leftHead.getX(), (double) leftHead.getX() + 0.2, (double) leftHead.getX() + 0.8, (double) leftHead.getX() + 0.7, (double) leftHead.getX() + 0.8, sideColor.get(), lineColor.get(), shapeMode.get(), 0); - event.renderer.box((double) rightHead.getX() + 0.2, (double) rightHead.getX(), (double) rightHead.getX() + 0.2, + event.renderer.box((double) rightHead.getX() + 0.2, rightHead.getX(), (double) rightHead.getX() + 0.2, (double) rightHead.getX() + 0.8, (double) rightHead.getX() + 0.7, (double) rightHead.getX() + 0.8, sideColor.get(), lineColor.get(), shapeMode.get(), 0); } diff --git a/src/main/java/anticope/rejects/modules/BoatPhase.java b/src/main/java/anticope/rejects/modules/BoatPhase.java index adf54a17..0bce19ed 100644 --- a/src/main/java/anticope/rejects/modules/BoatPhase.java +++ b/src/main/java/anticope/rejects/modules/BoatPhase.java @@ -130,7 +130,7 @@ private void onBoatMove(BoatMoveEvent event) { else if (fall.get()) velY -= fallSpeed.get() / 20; } else if (fall.get()) velY -= fallSpeed.get() / 20; - ((IVec3d) boat.getVelocity()).set(velX,velY,velZ); + ((IVec3d) boat.getVelocity()).meteor$set(velX,velY,velZ); } } } diff --git a/src/main/java/anticope/rejects/modules/ChorusExploit.java b/src/main/java/anticope/rejects/modules/ChorusExploit.java index 54555ad8..7486aa79 100644 --- a/src/main/java/anticope/rejects/modules/ChorusExploit.java +++ b/src/main/java/anticope/rejects/modules/ChorusExploit.java @@ -142,9 +142,10 @@ private void onPacketRecieve(PacketEvent.Receive event) { if (event.packet instanceof PlayerPositionLookS2CPacket posPacket && ateChorus) { event.setCancelled(true); if (positionMode.get() == PositionMode.PosLook) { - cposX = posPacket.getX(); - cposY = posPacket.getY(); - cposZ = posPacket.getZ(); + Vec3d pos = posPacket.change().position(); + cposX = pos.x; + cposY = pos.y; + cposZ = pos.z; gotPosition = true; } } diff --git a/src/main/java/anticope/rejects/modules/Confuse.java b/src/main/java/anticope/rejects/modules/Confuse.java index 7484e612..473f045b 100644 --- a/src/main/java/anticope/rejects/modules/Confuse.java +++ b/src/main/java/anticope/rejects/modules/Confuse.java @@ -144,12 +144,12 @@ private void onTick(TickEvent.Pre event) { if (mc.world.getBlockState(BlockPos.ofFloored(goal.x, goal.y, goal.z)).getBlock() == Blocks.AIR) { hit = mc.world.raycast(new RaycastContext(mc.player.getPos(), goal, RaycastContext.ShapeType.COLLIDER, RaycastContext.FluidHandling.ANY, mc.player)); if (!moveThroughBlocks.get() && hit.isInsideBlock()) { - delayWaited = (int) (delay.get() - 1); + delayWaited = delay.get() - 1; break; } mc.player.updatePosition(goal.x, goal.y, goal.z); } else { - delayWaited = (int) (delay.get() - 1); + delayWaited = delay.get() - 1; } break; @@ -159,7 +159,7 @@ private void onTick(TickEvent.Pre event) { Vec3d goal2 = entityPos.add(diff1); hit = mc.world.raycast(new RaycastContext(mc.player.getPos(), goal2, RaycastContext.ShapeType.COLLIDER, RaycastContext.FluidHandling.ANY, mc.player)); if (!moveThroughBlocks.get() && hit.isInsideBlock()) { - delayWaited = (int) (delay.get() - 1); + delayWaited = delay.get() - 1; break; } mc.player.updatePosition(goal2.x, goal2.y, goal2.z); diff --git a/src/main/java/anticope/rejects/modules/CoordLogger.java b/src/main/java/anticope/rejects/modules/CoordLogger.java index b2d89cdc..9e498bce 100644 --- a/src/main/java/anticope/rejects/modules/CoordLogger.java +++ b/src/main/java/anticope/rejects/modules/CoordLogger.java @@ -99,11 +99,11 @@ private void onPacketReceive(PacketEvent.Receive event) { EntityPositionS2CPacket packet = (EntityPositionS2CPacket) event.packet; try { - Entity entity = mc.world.getEntityById(packet.getId()); + Entity entity = mc.world.getEntityById(packet.entityId()); // Player teleport if (entity.getType().equals(EntityType.PLAYER) && players.get()) { - Vec3d packetPosition = new Vec3d(packet.getX(), packet.getY(), packet.getZ()); + Vec3d packetPosition = packet.change().position(); Vec3d playerPosition = entity.getPos(); if (playerPosition.distanceTo(packetPosition) >= minDistance.get()) { @@ -113,7 +113,7 @@ private void onPacketReceive(PacketEvent.Receive event) { // World teleport else if (entity.getType().equals(EntityType.WOLF) && wolves.get()) { - Vec3d packetPosition = new Vec3d(packet.getX(), packet.getY(), packet.getZ()); + Vec3d packetPosition = packet.change().position(); Vec3d wolfPosition = entity.getPos(); UUID ownerUuid = ((TameableEntity) entity).getOwnerUuid(); @@ -152,7 +152,7 @@ else if (entity.getType().equals(EntityType.WOLF) && wolves.get()) { public MutableText formatMessage(String message, Vec3d coords) { MutableText text = Text.literal(message); text.append(ChatUtils.formatCoords(coords)); - text.append(Formatting.GRAY.toString()+"."); + text.append(Formatting.GRAY +"."); return text; } diff --git a/src/main/java/anticope/rejects/modules/CustomPackets.java b/src/main/java/anticope/rejects/modules/CustomPackets.java index 0225a41f..2d3c948d 100644 --- a/src/main/java/anticope/rejects/modules/CustomPackets.java +++ b/src/main/java/anticope/rejects/modules/CustomPackets.java @@ -54,9 +54,10 @@ public CustomPackets() { @EventHandler private void onCustomPayloadPacket(PacketEvent.Receive event) { if (event.packet instanceof CustomPayloadS2CPacket packet) { - switch (packet.payload().getId().toString()) { - case "badlion:mods" -> event.setCancelled(onBadlionModsPacket(packet)); - default -> onUnknownPacket(packet); + if (packet.payload().getId().toString().equals("badlion:mods")) { + event.setCancelled(onBadlionModsPacket(packet)); + } else { + onUnknownPacket(packet); } } } diff --git a/src/main/java/anticope/rejects/modules/ExtraElytra.java b/src/main/java/anticope/rejects/modules/ExtraElytra.java index a2fdb16f..d5862910 100644 --- a/src/main/java/anticope/rejects/modules/ExtraElytra.java +++ b/src/main/java/anticope/rejects/modules/ExtraElytra.java @@ -8,7 +8,6 @@ import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.orbit.EventHandler; import net.minecraft.entity.EquipmentSlot; -import net.minecraft.item.ElytraItem; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.network.packet.c2s.play.ClientCommandC2SPacket; @@ -72,18 +71,17 @@ private void onTick(TickEvent.Post event) { if (chest.getItem() != Items.ELYTRA) return; - if (mc.player.isFallFlying()) { + if (mc.player.isGliding()) { if (stopInWater.get() && mc.player.isTouchingWater()) { sendStartStopPacket(); return; } - controlSpeed(); controlHeight(); return; } - if (ElytraItem.isUsable(chest) && mc.options.jumpKey.isPressed()) + if (chest.getDamage() < chest.getMaxDamage() - 1 && mc.options.jumpKey.isPressed()) doInstantFly(); } diff --git a/src/main/java/anticope/rejects/modules/FullFlight.java b/src/main/java/anticope/rejects/modules/FullFlight.java index f20e723d..023aa627 100644 --- a/src/main/java/anticope/rejects/modules/FullFlight.java +++ b/src/main/java/anticope/rejects/modules/FullFlight.java @@ -112,14 +112,16 @@ private void onSendPacket(PacketEvent.Send event) { mc.player.getZ(), packet.getYaw(0), packet.getPitch(0), - packet.isOnGround() + packet.isOnGround(), + packet.horizontalCollision() ); } else { fullPacket = new PlayerMoveC2SPacket.PositionAndOnGround( mc.player.getX(), mc.player.getY(), mc.player.getZ(), - packet.isOnGround() + packet.isOnGround(), + packet.horizontalCollision() ); } event.cancel(); @@ -146,8 +148,8 @@ private void onPlayerMove(PlayerMoveEvent event) { if (blockCollisions.findAny().isPresent()) break; - mc.getNetworkHandler().sendPacket(new PlayerMoveC2SPacket.PositionAndOnGround(mc.player.getX(), mc.player.getY() - 0.4, mc.player.getZ(), mc.player.isOnGround())); - mc.getNetworkHandler().sendPacket(new PlayerMoveC2SPacket.PositionAndOnGround(mc.player.getX(), mc.player.getY(), mc.player.getZ(), mc.player.isOnGround())); + mc.getNetworkHandler().sendPacket(new PlayerMoveC2SPacket.PositionAndOnGround(mc.player.getX(), mc.player.getY() - 0.4, mc.player.getZ(), mc.player.isOnGround(), mc.player.horizontalCollision)); + mc.getNetworkHandler().sendPacket(new PlayerMoveC2SPacket.PositionAndOnGround(mc.player.getX(), mc.player.getY(), mc.player.getZ(), mc.player.isOnGround(), mc.player.horizontalCollision)); } case Old -> { Box box = mc.player.getBoundingBox(); @@ -161,20 +163,20 @@ private void onPlayerMove(PlayerMoveEvent event) { double groundExtra = ground + 0.1D; for (double posY = mc.player.getY(); posY > groundExtra; posY -= 4D) { - mc.getNetworkHandler().sendPacket(new PlayerMoveC2SPacket.PositionAndOnGround(mc.player.getX(), posY, mc.player.getZ(), true)); + mc.getNetworkHandler().sendPacket(new PlayerMoveC2SPacket.PositionAndOnGround(mc.player.getX(), posY, mc.player.getZ(), true, mc.player.horizontalCollision)); if (posY - 4D < groundExtra) break; // Prevent next step } - mc.getNetworkHandler().sendPacket(new PlayerMoveC2SPacket.PositionAndOnGround(mc.player.getX(), groundExtra, mc.player.getZ(), true)); + mc.getNetworkHandler().sendPacket(new PlayerMoveC2SPacket.PositionAndOnGround(mc.player.getX(), groundExtra, mc.player.getZ(), true, mc.player.horizontalCollision)); for (double posY = groundExtra; posY < mc.player.getY(); posY += 4D) { - mc.getNetworkHandler().sendPacket(new PlayerMoveC2SPacket.PositionAndOnGround(mc.player.getX(), posY, mc.player.getZ(), mc.player.isOnGround())); + mc.getNetworkHandler().sendPacket(new PlayerMoveC2SPacket.PositionAndOnGround(mc.player.getX(), posY, mc.player.getZ(), mc.player.isOnGround(), mc.player.horizontalCollision)); if (posY + 4D > mc.player.getY()) break; // Prevent next step } - mc.getNetworkHandler().sendPacket(new PlayerMoveC2SPacket.PositionAndOnGround(mc.player.getX(), mc.player.getY(), mc.player.getZ(), mc.player.isOnGround())); + mc.getNetworkHandler().sendPacket(new PlayerMoveC2SPacket.PositionAndOnGround(mc.player.getX(), mc.player.getY(), mc.player.getZ(), mc.player.isOnGround(), mc.player.horizontalCollision)); } } diff --git a/src/main/java/anticope/rejects/modules/Jetpack.java b/src/main/java/anticope/rejects/modules/Jetpack.java index 93ca1b32..b22a2dc6 100644 --- a/src/main/java/anticope/rejects/modules/Jetpack.java +++ b/src/main/java/anticope/rejects/modules/Jetpack.java @@ -29,7 +29,7 @@ public Jetpack() { @EventHandler private void onTick(TickEvent.Pre event) { if (mc.options.jumpKey.isPressed()) { - ((IVec3d) mc.player.getVelocity()).setY(jetpackSpeed.get()); + ((IVec3d) mc.player.getVelocity()).meteor$setY(jetpackSpeed.get()); } } diff --git a/src/main/java/anticope/rejects/modules/KnockbackPlus.java b/src/main/java/anticope/rejects/modules/KnockbackPlus.java index 4e73513b..b53e5e6d 100644 --- a/src/main/java/anticope/rejects/modules/KnockbackPlus.java +++ b/src/main/java/anticope/rejects/modules/KnockbackPlus.java @@ -31,8 +31,8 @@ public KnockbackPlus() { @EventHandler private void onSendPacket(PacketEvent.Send event) { - if (event.packet instanceof IPlayerInteractEntityC2SPacket packet && packet.getType() == PlayerInteractEntityC2SPacket.InteractType.ATTACK) { - Entity entity = packet.getEntity(); + if (event.packet instanceof IPlayerInteractEntityC2SPacket packet && packet.meteor$getType() == PlayerInteractEntityC2SPacket.InteractType.ATTACK) { + Entity entity = packet.meteor$getEntity(); if (!(entity instanceof LivingEntity) || (entity != Modules.get().get(KillAura.class).getTarget() && ka.get())) return; diff --git a/src/main/java/anticope/rejects/modules/NewChunks.java b/src/main/java/anticope/rejects/modules/NewChunks.java index 8834251c..87f4c783 100644 --- a/src/main/java/anticope/rejects/modules/NewChunks.java +++ b/src/main/java/anticope/rejects/modules/NewChunks.java @@ -18,6 +18,7 @@ import net.minecraft.util.math.ChunkPos; import net.minecraft.util.math.Direction; import net.minecraft.util.math.Vec3d; +import net.minecraft.world.Heightmap; import net.minecraft.world.chunk.WorldChunk; import java.util.Collections; @@ -187,8 +188,8 @@ else if (event.packet instanceof ChunkDataS2CPacket && mc.world != null) { for (int x = 0; x < 16; x++) { - for (int y = mc.world.getBottomY(); y < mc.world.getTopY(); y++) { - for (int z = 0; z < 16; z++) { + for (int z = 0; z < 16; z++) { + for (int y = mc.world.getBottomY(); y < mc.world.getTopY(Heightmap.Type.MOTION_BLOCKING, x, z); y++) { FluidState fluid = chunk.getFluidState(x, y, z); if (!fluid.isEmpty() && !fluid.isStill()) { diff --git a/src/main/java/anticope/rejects/modules/PacketFly.java b/src/main/java/anticope/rejects/modules/PacketFly.java index 16339740..6f8fa705 100644 --- a/src/main/java/anticope/rejects/modules/PacketFly.java +++ b/src/main/java/anticope/rejects/modules/PacketFly.java @@ -4,11 +4,11 @@ import meteordevelopment.meteorclient.events.entity.player.PlayerMoveEvent; import meteordevelopment.meteorclient.events.entity.player.SendMovementPacketsEvent; import meteordevelopment.meteorclient.events.packets.PacketEvent; -import meteordevelopment.meteorclient.mixin.PlayerPositionLookS2CPacketAccessor; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.player.PlayerUtils; import meteordevelopment.orbit.EventHandler; +import net.minecraft.entity.player.PlayerPosition; import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket; import net.minecraft.network.packet.c2s.play.TeleportConfirmC2SPacket; import net.minecraft.network.packet.s2c.play.PlayerPositionLookS2CPacket; @@ -128,7 +128,7 @@ public void onSendMovementPackets(SendMovementPacketsEvent.Pre event) { double speed = 0.0; boolean checkCollisionBoxes = checkHitBoxes(); - speed = mc.player.input.jumping && (checkCollisionBoxes || !(mc.player.input.movementForward != 0.0 || mc.player.input.movementSideways != 0.0)) ? (antiKick.get() && !checkCollisionBoxes ? (resetCounter(downDelayFlying.get()) ? -0.032 : verticalSpeed.get()/20) : verticalSpeed.get()/20) : (mc.player.input.sneaking ? verticalSpeed.get()/-20 : (!checkCollisionBoxes ? (resetCounter(downDelay.get()) ? (antiKick.get() ? -0.04 : 0.0) : 0.0) : 0.0)); + speed = mc.player.input.playerInput.jump() && (checkCollisionBoxes || !(mc.player.input.movementForward != 0.0 || mc.player.input.movementSideways != 0.0)) ? (antiKick.get() && !checkCollisionBoxes ? (resetCounter(downDelayFlying.get()) ? -0.032 : verticalSpeed.get()/20) : verticalSpeed.get()/20) : (mc.player.input.playerInput.sneak() ? verticalSpeed.get()/-20 : (!checkCollisionBoxes ? (resetCounter(downDelay.get()) ? (antiKick.get() ? -0.04 : 0.0) : 0.0) : 0.0)); Vec3d horizontal = PlayerUtils.getHorizontalVelocity(horizontalSpeed.get()); @@ -154,12 +154,17 @@ public void onPacketSent(PacketEvent.Send event) { public void onPacketReceive(PacketEvent.Receive event) { if (event.packet instanceof PlayerPositionLookS2CPacket && !(mc.player == null || mc.world == null)) { PlayerPositionLookS2CPacket packet = (PlayerPositionLookS2CPacket) event.packet; + PlayerPosition oldPos = packet.change(); if (setYaw.get()) { - ((PlayerPositionLookS2CPacketAccessor) event.packet).setPitch(mc.player.getPitch()); - ((PlayerPositionLookS2CPacketAccessor) event.packet).setYaw(mc.player.getYaw()); + PlayerPosition newPos = new PlayerPosition(oldPos.position(), oldPos.deltaMovement(), mc.player.getYaw(), mc.player.getPitch()); + event.packet = PlayerPositionLookS2CPacket.of( + packet.teleportId(), + newPos, + packet.relatives() + ); } if (setID.get()) { - teleportID = packet.getTeleportId(); + teleportID = packet.teleportId(); } } } @@ -180,9 +185,9 @@ private void sendPackets(double x, double y, double z, boolean teleport) { Vec3d vec = new Vec3d(x, y, z); Vec3d position = mc.player.getPos().add(vec); Vec3d outOfBoundsVec = outOfBoundsVec(vec, position); - packetSender(new PlayerMoveC2SPacket.PositionAndOnGround(position.x, position.y, position.z, mc.player.isOnGround())); + packetSender(new PlayerMoveC2SPacket.PositionAndOnGround(position.x, position.y, position.z, mc.player.isOnGround(), mc.player.horizontalCollision)); if (invalidPacket.get()) { - packetSender(new PlayerMoveC2SPacket.PositionAndOnGround(outOfBoundsVec.x, outOfBoundsVec.y, outOfBoundsVec.z, mc.player.isOnGround())); + packetSender(new PlayerMoveC2SPacket.PositionAndOnGround(outOfBoundsVec.x, outOfBoundsVec.y, outOfBoundsVec.z, mc.player.isOnGround(), mc.player.horizontalCollision)); } if (setPos.get()) { mc.player.setPos(position.x, position.y, position.z); diff --git a/src/main/java/anticope/rejects/modules/Rendering.java b/src/main/java/anticope/rejects/modules/Rendering.java index 960ad3f3..bbc7c85b 100644 --- a/src/main/java/anticope/rejects/modules/Rendering.java +++ b/src/main/java/anticope/rejects/modules/Rendering.java @@ -7,38 +7,17 @@ import meteordevelopment.meteorclient.settings.SettingGroup; import meteordevelopment.meteorclient.systems.modules.Module; import net.minecraft.client.gl.PostEffectProcessor; +import net.minecraft.client.render.DefaultFramebufferSet; import net.minecraft.util.Identifier; -import java.io.IOException; - public class Rendering extends Module { public enum Shader { None, - Notch, - FXAA, - Art, - Bumpy, - Blobs, - Blobs2, - Pencil, - Vibrant, - Deconverge, - Flip, - Invert, - NTSC, - Outline, - Phosphor, - Scanline, - Sobel, - Bits, - Desaturate, - Green, Blur, - Wobble, - Antialias, Creeper, - Spider + Invert, + Spider, } private final SettingGroup sgInvisible = settings.createGroup("Invisible"); @@ -102,17 +81,16 @@ public void onDeactivate() { } public void onChanged(Shader s) { - String name; - if (s == Shader.Vibrant) name = "color_convolve"; - else if (s == Shader.Scanline) name = "scan_pincushion"; - else name = s.toString().toLowerCase(); - Identifier shaderID = Identifier.of(String.format("shaders/post/%s.json", name)); - try { - PostEffectProcessor shader = new PostEffectProcessor(mc.getTextureManager(), mc.getResourceManager(), mc.getFramebuffer(), shaderID); - this.shader = shader; - } catch (IOException e) { + if (mc.world == null) return; + String name = s.toString().toLowerCase(); + + if (name.equals("none")) { this.shader = null; + return; } + + Identifier shaderID = Identifier.ofVanilla(name); + this.shader = mc.getShaderLoader().loadPostEffect(shaderID, DefaultFramebufferSet.MAIN_ONLY); } public boolean renderStructureVoid() { diff --git a/src/main/java/anticope/rejects/modules/RoboWalk.java b/src/main/java/anticope/rejects/modules/RoboWalk.java index 23208cbe..50d317d9 100644 --- a/src/main/java/anticope/rejects/modules/RoboWalk.java +++ b/src/main/java/anticope/rejects/modules/RoboWalk.java @@ -8,6 +8,7 @@ import meteordevelopment.orbit.EventHandler; import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket; import net.minecraft.network.packet.c2s.play.VehicleMoveC2SPacket; +import net.minecraft.util.math.Vec3d; public class RoboWalk extends Module { public RoboWalk() { @@ -30,11 +31,11 @@ private void onPacketSend(PacketEvent.Send event) { ((PlayerMoveC2SPacketAccessor) packet).setX(x); ((PlayerMoveC2SPacketAccessor) packet).setZ(z); } else if (event.packet instanceof VehicleMoveC2SPacket packet) { - double x = smooth(packet.getX()); - double z = smooth(packet.getZ()); + Vec3d pos = ((VehicleMoveC2SPacketAccessor) (Object) packet).getPosition(); + double x = smooth(pos.getX()); + double z = smooth(pos.getZ()); - ((VehicleMoveC2SPacketAccessor) packet).setX(x); - ((VehicleMoveC2SPacketAccessor) packet).setZ(z); + event.packet = VehicleMoveC2SPacketAccessor.create(new Vec3d(x, pos.getY(), z), packet.yaw(), packet.pitch(), packet.onGround()); } } } diff --git a/src/main/java/anticope/rejects/modules/ShieldBypass.java b/src/main/java/anticope/rejects/modules/ShieldBypass.java index 36e8f2b1..4cbec7d7 100644 --- a/src/main/java/anticope/rejects/modules/ShieldBypass.java +++ b/src/main/java/anticope/rejects/modules/ShieldBypass.java @@ -81,13 +81,13 @@ public void bypass(Entity target, Cancellable event) { event.cancel(); - mc.getNetworkHandler().sendPacket(new PlayerMoveC2SPacket.PositionAndOnGround(newPos.getX(), newPos.getY(), newPos.getZ(), true)); + mc.getNetworkHandler().sendPacket(new PlayerMoveC2SPacket.PositionAndOnGround(newPos.getX(), newPos.getY(), newPos.getZ(), true, false)); mc.getNetworkHandler().sendPacket(PlayerInteractEntityC2SPacket.attack(e, mc.player.isSneaking())); mc.getNetworkHandler().sendPacket(new HandSwingC2SPacket(mc.player.getActiveHand())); mc.player.resetLastAttackedTicks(); - mc.getNetworkHandler().sendPacket(new PlayerMoveC2SPacket.PositionAndOnGround(mc.player.getX(), mc.player.getY(), mc.player.getZ(), true)); + mc.getNetworkHandler().sendPacket(new PlayerMoveC2SPacket.PositionAndOnGround(mc.player.getX(), mc.player.getY(), mc.player.getZ(), true, mc.player.horizontalCollision)); } } } diff --git a/src/main/java/anticope/rejects/modules/SkeletonESP.java b/src/main/java/anticope/rejects/modules/SkeletonESP.java index c56ad1dc..b293bf16 100644 --- a/src/main/java/anticope/rejects/modules/SkeletonESP.java +++ b/src/main/java/anticope/rejects/modules/SkeletonESP.java @@ -17,12 +17,14 @@ import meteordevelopment.meteorclient.utils.render.color.SettingColor; import meteordevelopment.orbit.EventHandler; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gl.ShaderProgramKeys; import net.minecraft.client.model.ModelPart; import net.minecraft.client.option.Perspective; import net.minecraft.client.render.*; import net.minecraft.client.render.entity.LivingEntityRenderer; import net.minecraft.client.render.entity.PlayerEntityRenderer; import net.minecraft.client.render.entity.model.PlayerEntityModel; +import net.minecraft.client.render.entity.state.PlayerEntityRenderState; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.Entity; import net.minecraft.entity.player.PlayerEntity; @@ -61,7 +63,7 @@ private void onRender(Render3DEvent event) { MatrixStack matrixStack = event.matrices; float g = event.tickDelta; - RenderSystem.setShader(GameRenderer::getPositionColorProgram); + RenderSystem.setShader(ShaderProgramKeys.POSITION_COLOR); RenderSystem.enableBlend(); RenderSystem.defaultBlendFunc(); RenderSystem.disableDepthTest(); @@ -79,8 +81,8 @@ private void onRender(Render3DEvent event) { PlayerEntity playerEntity = (PlayerEntity) entity; Vec3d footPos = getEntityRenderPosition(playerEntity, g); - PlayerEntityRenderer livingEntityRenderer = (PlayerEntityRenderer) (LivingEntityRenderer) mc.getEntityRenderDispatcher().getRenderer(playerEntity); - PlayerEntityModel playerEntityModel = (PlayerEntityModel) livingEntityRenderer.getModel(); + PlayerEntityRenderer livingEntityRenderer = (PlayerEntityRenderer) (LivingEntityRenderer) mc.getEntityRenderDispatcher().getRenderer(playerEntity); + PlayerEntityModel playerEntityModel = livingEntityRenderer.getModel(); float h = MathHelper.lerpAngleDegrees(g, playerEntity.prevBodyYaw, playerEntity.bodyYaw); if (mc.player == entity && Rotations.rotationTimer < rotationHoldTicks) h = Rotations.serverYaw; @@ -94,12 +96,17 @@ private void onRender(Render3DEvent event) { float m = playerEntity.getPitch(g); if (mc.player == entity && Rotations.rotationTimer < rotationHoldTicks) m = Rotations.serverPitch; - playerEntityModel.animateModel(playerEntity, q, p, g); - playerEntityModel.setAngles(playerEntity, q, p, o, k, m); + PlayerEntityRenderState renderState = new PlayerEntityRenderState(); + renderState.limbFrequency = q; + renderState.limbAmplitudeMultiplier = p; + renderState.age = o; + renderState.yawDegrees = k; + renderState.pitch = m; + playerEntityModel.setAngles(renderState); boolean swimming = playerEntity.isInSwimmingPose(); boolean sneaking = playerEntity.isSneaking(); - boolean flying = playerEntity.isFallFlying(); + boolean flying = playerEntity.isGliding(); ModelPart head = playerEntityModel.head; ModelPart leftArm = playerEntityModel.leftArm; @@ -189,7 +196,7 @@ private void onRender(Render3DEvent event) { RenderSystem.disableBlend(); RenderSystem.enableDepthTest(); RenderSystem.depthMask(true); - RenderSystem.setShader(GameRenderer::getPositionColorProgram); + RenderSystem.setShader(ShaderProgramKeys.POSITION_COLOR); } private void rotate(MatrixStack matrix, ModelPart modelPart) { diff --git a/src/main/java/anticope/rejects/modules/SoundLocator.java b/src/main/java/anticope/rejects/modules/SoundLocator.java index cb3b8783..9532b8f8 100644 --- a/src/main/java/anticope/rejects/modules/SoundLocator.java +++ b/src/main/java/anticope/rejects/modules/SoundLocator.java @@ -114,7 +114,7 @@ private void onPlaySound(PlaySoundEvent event) { if(whitelist.get()) { // Whitelist ON for (SoundEvent sound : sounds.get()) { - if (sound.getId().equals(event.sound.getId())) { + if (sound.id().equals(event.sound.getId())) { printSound(event.sound); break; } diff --git a/src/main/java/anticope/rejects/modules/TreeAura.java b/src/main/java/anticope/rejects/modules/TreeAura.java index 559a7589..3507dd9f 100644 --- a/src/main/java/anticope/rejects/modules/TreeAura.java +++ b/src/main/java/anticope/rejects/modules/TreeAura.java @@ -1,6 +1,7 @@ package anticope.rejects.modules; import anticope.rejects.MeteorRejectsAddon; +import anticope.rejects.utils.WorldUtils; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Module; @@ -139,22 +140,9 @@ private boolean canPlant(BlockPos pos) { return false; } - private List getBlocks(BlockPos centerPos, int radius, int height) { - ArrayList blocks = new ArrayList<>(); - for (int i = centerPos.getX() - radius; i < centerPos.getX() + radius; i++) { - for (int j = centerPos.getY() - height; j < centerPos.getY() + height; j++) { - for (int k = centerPos.getZ() - radius; k < centerPos.getZ() + radius; k++) { - BlockPos pos = new BlockPos(i, j, k); - if (distanceBetween(centerPos, pos) <= radius && !blocks.contains(pos)) blocks.add(pos); - } - } - } - return blocks; - } - private List findSaplings(BlockPos centerPos, int radius, int height) { ArrayList blocc = new ArrayList<>(); - List blocks = getBlocks(centerPos, radius, height); + List blocks = WorldUtils.getSphere(centerPos, radius, height); for (BlockPos b : blocks) if (isSapling(b)) blocc.add(b); return blocc; } @@ -169,7 +157,7 @@ private BlockPos findPlantedSapling() { private List getPlantLocations(BlockPos centerPos, int radius, int height) { ArrayList blocc = new ArrayList<>(); - List blocks = getBlocks(centerPos, radius, height); + List blocks = WorldUtils.getSphere(centerPos, radius, height); for (BlockPos b : blocks) if (canPlant(b)) blocc.add(b); return blocc; } diff --git a/src/main/java/anticope/rejects/utils/GiveUtils.java b/src/main/java/anticope/rejects/utils/GiveUtils.java index b49742c3..22065c85 100644 --- a/src/main/java/anticope/rejects/utils/GiveUtils.java +++ b/src/main/java/anticope/rejects/utils/GiveUtils.java @@ -132,27 +132,27 @@ public static void giveItem(ItemStack item) throws CommandSyntaxException { } stack.set(DataComponentTypes.POTION_CONTENTS, new PotionContentsComponent(Optional.empty(), Optional.empty(), - effects)); + effects, Optional.empty())); stack.set(DataComponentTypes.CUSTOM_NAME, Text.literal("Lingering Potion of Trolling")); return stack; }); PRESETS.put("32k", (preview) -> { - enchantmentRegistry = mc.world.getRegistryManager().get(RegistryKeys.ENCHANTMENT); + enchantmentRegistry = mc.world.getRegistryManager().getOrThrow(RegistryKeys.ENCHANTMENT); if (preview || enchantmentRegistry == null) return Items.DIAMOND_SWORD.getDefaultStack(); ItemStack stack = Items.DIAMOND_SWORD.getDefaultStack(); stack.apply(DataComponentTypes.ENCHANTMENTS, ItemEnchantmentsComponent.DEFAULT, component -> { ItemEnchantmentsComponent.Builder builder = new ItemEnchantmentsComponent.Builder(component); - builder.add(enchantmentRegistry.entryOf(Enchantments.SHARPNESS), 255); - builder.add(enchantmentRegistry.entryOf(Enchantments.KNOCKBACK), 255); - builder.add(enchantmentRegistry.entryOf(Enchantments.FIRE_ASPECT), 255); - builder.add(enchantmentRegistry.entryOf(Enchantments.LOOTING), 10); - builder.add(enchantmentRegistry.entryOf(Enchantments.SWEEPING_EDGE), 3); - builder.add(enchantmentRegistry.entryOf(Enchantments.UNBREAKING), 255); - builder.add(enchantmentRegistry.entryOf(Enchantments.MENDING), 1); - builder.add(enchantmentRegistry.entryOf(Enchantments.VANISHING_CURSE), 1); + builder.add(enchantmentRegistry.getOrThrow(Enchantments.SHARPNESS), 255); + builder.add(enchantmentRegistry.getOrThrow(Enchantments.KNOCKBACK), 255); + builder.add(enchantmentRegistry.getOrThrow(Enchantments.FIRE_ASPECT), 255); + builder.add(enchantmentRegistry.getOrThrow(Enchantments.LOOTING), 10); + builder.add(enchantmentRegistry.getOrThrow(Enchantments.SWEEPING_EDGE), 3); + builder.add(enchantmentRegistry.getOrThrow(Enchantments.UNBREAKING), 255); + builder.add(enchantmentRegistry.getOrThrow(Enchantments.MENDING), 1); + builder.add(enchantmentRegistry.getOrThrow(Enchantments.VANISHING_CURSE), 1); return builder.build(); }); diff --git a/src/main/java/anticope/rejects/utils/Ore.java b/src/main/java/anticope/rejects/utils/Ore.java index 762679bb..311b3830 100755 --- a/src/main/java/anticope/rejects/utils/Ore.java +++ b/src/main/java/anticope/rejects/utils/Ore.java @@ -48,8 +48,8 @@ public class Ore { public static Map, List> getRegistry(Dimension dimension) { RegistryWrapper.WrapperLookup registry = BuiltinRegistries.createWrapperLookup(); - RegistryWrapper.Impl features = registry.getWrapperOrThrow(RegistryKeys.PLACED_FEATURE); - var reg = registry.getWrapperOrThrow(RegistryKeys.WORLD_PRESET).getOrThrow(WorldPresets.DEFAULT).value().createDimensionsRegistryHolder().dimensions(); + RegistryWrapper.Impl features = registry.getOrThrow(RegistryKeys.PLACED_FEATURE); + var reg = registry.getOrThrow(RegistryKeys.WORLD_PRESET).getOrThrow(WorldPresets.DEFAULT).value().createDimensionsRegistryHolder().dimensions(); var dim = switch (dimension) { case Overworld -> reg.get(DimensionOptions.OVERWORLD); diff --git a/src/main/java/anticope/rejects/utils/RejectsUtils.java b/src/main/java/anticope/rejects/utils/RejectsUtils.java index 3cc55586..0bb8c71e 100644 --- a/src/main/java/anticope/rejects/utils/RejectsUtils.java +++ b/src/main/java/anticope/rejects/utils/RejectsUtils.java @@ -70,9 +70,9 @@ public static float fullFlightMove(PlayerMoveEvent event, double speed, boolean double xDir = Math.cos(Math.toRadians(dir + 90)); double zDir = Math.sin(Math.toRadians(dir + 90)); - ((IVec3d) event.movement).setXZ(xDir * speed, zDir * speed); + ((IVec3d) event.movement).meteor$setXZ(xDir * speed, zDir * speed); } else { - ((IVec3d) event.movement).setXZ(0, 0); + ((IVec3d) event.movement).meteor$setXZ(0, 0); } float ySpeed = 0; @@ -81,7 +81,7 @@ public static float fullFlightMove(PlayerMoveEvent event, double speed, boolean ySpeed += speed; if (mc.options.sneakKey.isPressed()) ySpeed -= speed; - ((IVec3d) event.movement).setY(verticalSpeedMatch ? ySpeed : ySpeed / 2); + ((IVec3d) event.movement).meteor$setY(verticalSpeedMatch ? ySpeed : ySpeed / 2); return ySpeed; } diff --git a/src/main/java/anticope/rejects/utils/WorldUtils.java b/src/main/java/anticope/rejects/utils/WorldUtils.java index 7d01c8f5..a2e2040e 100644 --- a/src/main/java/anticope/rejects/utils/WorldUtils.java +++ b/src/main/java/anticope/rejects/utils/WorldUtils.java @@ -41,13 +41,13 @@ public static double distanceBetween(BlockPos pos1, BlockPos pos2) { public static boolean interact(BlockPos pos, FindItemResult findItemResult, boolean rotate) { if (!findItemResult.found()) return false; Runnable action = () -> { - boolean wasSneaking = mc.player.input.sneaking; - mc.player.input.sneaking = false; + boolean wasSneaking = mc.player.isSneaking(); + mc.player.setSneaking(false); InvUtils.swap(findItemResult.slot(), true); mc.interactionManager.interactBlock(mc.player, Hand.MAIN_HAND, new BlockHitResult(Vec3d.ofCenter(pos), Direction.UP, pos, false)); mc.player.swingHand(Hand.MAIN_HAND); InvUtils.swapBack(); - mc.player.input.sneaking = wasSneaking; + mc.player.setSneaking(wasSneaking); }; if (rotate) Rotations.rotate(Rotations.getYaw(pos), Rotations.getPitch(pos), -100, action); else action.run(); diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 5b8ab2bb..9d16aea7 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -36,7 +36,7 @@ "github:sha": "${gh_hash}" }, "depends": { - "java": ">=16", + "java": ">=21", "minecraft": "~${mc_version}", "meteor-client": "*" } diff --git a/src/main/resources/meteor-rejects.accesswidener b/src/main/resources/meteor-rejects.accesswidener index 9d83c2af..459332f2 100644 --- a/src/main/resources/meteor-rejects.accesswidener +++ b/src/main/resources/meteor-rejects.accesswidener @@ -1,3 +1,3 @@ -accessWidener v1 named +accessWidener v2 named accessible class net/minecraft/network/packet/c2s/play/PlayerInteractEntityC2SPacket$InteractType \ No newline at end of file From 2947dd7df8c4133b102f3ffdef433738b31c6e3a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 25 Jan 2025 08:59:36 +0700 Subject: [PATCH 26/26] github-actions(deps): bump actions/checkout from 3 to 4 (#288) Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: SByte --- .github/workflows/gradle.yml | 2 +- .github/workflows/pull_request.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 81b798ea..16767770 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -19,7 +19,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up JDK 21 uses: actions/setup-java@v3.10.0 with: diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 5bd6eeb4..b40d83e3 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up JDK 21 uses: actions/setup-java@v3.10.0 with: