From 76e9c46c675472b424ce211c793d365c610d81b1 Mon Sep 17 00:00:00 2001 From: etianl <115842502+etianl@users.noreply.github.com> Date: Sun, 4 Feb 2024 04:28:11 -0800 Subject: [PATCH] 0.8.2 AutoTitles module added + .autovaultclip added **0.8.2** - Added the AutoTitles module which can display text (such as advertisements) across the screen of all the individuals who are online on a server at the time. Requires OP status. Credits to [ogmur](https://www.youtube.com/@Ogmur) for figuring out these commands, and to etianl for writing a module for it. - Added AutoVaultClip command which is accessable by doing .autovaultclip and choosing either up, down, or highest. The highest option will tp you to the highest possible block above you. Credits to [agreed31579](https://github.com/agreed31579) who based it off of the .autovclip command and Meteor Client's vclip command. - Fixed a bug with BetterAutoSign where it was spamming a chain of hanging signs when trying to place one with the "Both Sides" option enabled. - Fixed BetterAutoSign sometimes not writing the backside of hanging signs. - Added an error message to BetterAutoSign mentioning a bug when using SignAura and holding a hanging sign. - Added a message to CrashCommand telling you what player you are crashing when you run it. - Made the "/fill Around All Other Players" option in HandOfGod actually /fill all the players on a server, instead of just the ones within render distance. A new option has been added if you just want to do the players within render. - Added a "Max Targets" option for LavaAura instead of just targeting every entity within range. - Order priority for targeting entities with LavaAura is now ordered from closest to furthest. - Fixed the math in LavaAura used for checking for obstructions when picking up the lava --- README.md | 1 + gradle.properties | 2 +- .../java/pwn/noobs/trouserstreak/Trouser.java | 3 +- .../commands/AutoVaultClipCommand.java | 208 ++++++------- .../commands/AutoVclipCommand.java | 2 +- .../trouserstreak/commands/CrashCommand.java | 2 + .../trouserstreak/modules/AutoTitles.java | 284 ++++++++++++++++++ .../trouserstreak/modules/BetterAutoSign.java | 31 +- .../trouserstreak/modules/HandOfGod.java | 76 +++-- .../noobs/trouserstreak/modules/LavaAura.java | 44 ++- src/main/resources/fabric.mod.json | 2 +- 11 files changed, 509 insertions(+), 146 deletions(-) create mode 100644 src/main/java/pwn/noobs/trouserstreak/modules/AutoTitles.java diff --git a/README.md b/README.md index 3bbadd6aa..b8402043b 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,7 @@ This will return the lowest block placed with AutoMountain until AutoLavacast is - Start building, then hold SneakKey and also hold Left or RightKey as well to build stairs diagonally. Release left or right key first to continue building in the direction you were prior. - **AutoScoreboard:** Automates the creation of a custom scoreboard. Useful for advertising on griefed servers. Requires OP status. Credits to [aaaasdfghjkllll](https://github.com/aaaasdfghjkllll) - **AutoStaircase:** Builds stairs upward in the direction you are facing by running forward and jumping. (Credits to etianl for bringing it to life! As well as Credits to Frostburn for writing the original. <3) I just had to fix up some stuff for this one but Frostburn had the base code there. I believe this is the first publicly available automatic staircase builder in a Meteor addon, correct me if I'm wrong maybe I didn't have to learn some Java to do this. +- **AutoTitles:** Displays text (such as advertisements) across the screen of all the individuals who are online on a server at the time. Requires OP status. Credits to [ogmur](https://www.youtube.com/@Ogmur) for figuring out these commands, and to etianl for writing a module for it. - **AutoVclipCommand** Automatically selects the nearest two block gap going either up or down to vclip into. (Credits to etianl, and credits to the original [AutoVclip](https://github.com/kittenvr/AutoVclip) for minecraft 1.19.2 which inspired me to make this one. :D) - **BaseFinder:** Automatically detects if a Base or Build could be in a chunk by checking every block in each chunk to see if there are "Un-natural" blocks within them. (Credits to etianl :D, and to Meteor-Rejects for some code from newchunks.) - *BaseFinder Notes:* diff --git a/gradle.properties b/gradle.properties index 2e6d0c33b..f5202aa3f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ yarn_mappings=1.20.4+build.3 loader_version=0.15.3 # Mod Properties -mod_version=0.8.1-1.20.4 +mod_version=0.8.2-1.20.4 maven_group=pwn.noobs archives_base_name=1trouser-streak diff --git a/src/main/java/pwn/noobs/trouserstreak/Trouser.java b/src/main/java/pwn/noobs/trouserstreak/Trouser.java index 72a87cbbb..5f00935b6 100644 --- a/src/main/java/pwn/noobs/trouserstreak/Trouser.java +++ b/src/main/java/pwn/noobs/trouserstreak/Trouser.java @@ -50,6 +50,7 @@ public void onInitialize() { Modules.get().add(new BlockListMineCommand()); Modules.get().add(new AutoCommand()); Modules.get().add(new AutoScoreboard()); + Modules.get().add(new AutoTitles()); Commands.add(new LavaTimeCalculator()); Commands.add(new CasterTimer()); Commands.add(new NewChunkCounter()); @@ -70,4 +71,4 @@ public String getPackage() { return "pwn.noobs.trouserstreak"; } -} +} \ No newline at end of file diff --git a/src/main/java/pwn/noobs/trouserstreak/commands/AutoVaultClipCommand.java b/src/main/java/pwn/noobs/trouserstreak/commands/AutoVaultClipCommand.java index febda354f..f60a08d10 100644 --- a/src/main/java/pwn/noobs/trouserstreak/commands/AutoVaultClipCommand.java +++ b/src/main/java/pwn/noobs/trouserstreak/commands/AutoVaultClipCommand.java @@ -1,104 +1,104 @@ -package pwn.noobs.trouserstreak.commands; - -import com.mojang.brigadier.builder.LiteralArgumentBuilder; -import meteordevelopment.meteorclient.commands.Command; -import net.minecraft.block.Blocks; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.command.CommandSource; -import net.minecraft.entity.Entity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket; -import net.minecraft.network.packet.c2s.play.VehicleMoveC2SPacket; - -import static com.mojang.brigadier.Command.SINGLE_SUCCESS; -import static meteordevelopment.meteorclient.MeteorClient.mc; - -public class AutoVaultClipCommand extends Command { - public AutoVaultClipCommand() { - super("autovaultclip", "Lets you clip through blocks vertically automatically, with vault clip bypass implemented. Works on Paper, Spigot, but not always on Vanilla."); - } - @Override - public void build(LiteralArgumentBuilder builder) { - builder.executes(ctx -> { - error("Choose Up, Down or Highest"); - return SINGLE_SUCCESS; - }); - builder.then(literal("up").executes(ctx -> { - ClientPlayerEntity player = mc.player; - assert player != null; - for (int i = 0; i < 199; i++) { - BlockPos isopenair1 = (player.getBlockPos().add(0,i+2,0)); - BlockPos isopenair2 = (player.getBlockPos().add(0,i+3,0)); - if (mc.world.getBlockState(isopenair1).isReplaceable() && mc.world.getFluidState(isopenair1).isEmpty() && !mc.world.getBlockState(isopenair1).isOf(Blocks.POWDER_SNOW) && mc.world.getBlockState(isopenair2).isReplaceable() && mc.world.getFluidState(isopenair2).isEmpty() && !mc.world.getBlockState(isopenair2).isOf(Blocks.POWDER_SNOW)){ - int packetsRequired = 20; - if (player.hasVehicle()) { - Entity vehicle = player.getVehicle(); - for (int packetNumber = 0; packetNumber < (packetsRequired - 1); packetNumber++) { - mc.player.networkHandler.sendPacket(new VehicleMoveC2SPacket(mc.player.getVehicle())); - } - vehicle.setPosition(vehicle.getX(), isopenair1.getY(), vehicle.getZ()); - } - for (int packetNumber = 0; packetNumber < (packetsRequired - 1); packetNumber++) { - mc.player.networkHandler.sendPacket(new PlayerMoveC2SPacket.OnGroundOnly(true)); - } - player.setPosition(player.getX(), isopenair1.getY(), player.getZ()); - return SINGLE_SUCCESS; - } - } - error("No gap found to vclip into"); - return SINGLE_SUCCESS; - })); - builder.then(literal("down").executes(ctx -> { - ClientPlayerEntity player = mc.player; - assert player != null; - for (int i = 0; i > -199; i--) { - BlockPos isopenair1 = (player.getBlockPos().add(0,i,0)); - BlockPos isopenair2 = (player.getBlockPos().add(0,i-1,0)); - if (mc.world.getBlockState(isopenair1).isReplaceable() && mc.world.getFluidState(isopenair1).isEmpty() && !mc.world.getBlockState(isopenair1).isOf(Blocks.POWDER_SNOW) && mc.world.getBlockState(isopenair2).isReplaceable() && mc.world.getFluidState(isopenair2).isEmpty() && !mc.world.getBlockState(isopenair2).isOf(Blocks.POWDER_SNOW)){ - int packetsRequired = 20; - if (player.hasVehicle()) { - Entity vehicle = player.getVehicle(); - for (int packetNumber = 0; packetNumber < (packetsRequired - 1); packetNumber++) { - mc.player.networkHandler.sendPacket(new VehicleMoveC2SPacket(mc.player.getVehicle())); - } - vehicle.setPosition(vehicle.getX(), isopenair2.getY(), vehicle.getZ()); - } - for (int packetNumber = 0; packetNumber < (packetsRequired - 1); packetNumber++) { - mc.player.networkHandler.sendPacket(new PlayerMoveC2SPacket.OnGroundOnly(true)); - } - player.setPosition(player.getX(), isopenair2.getY(), player.getZ()); - return SINGLE_SUCCESS; - } - } - error("No gap found to vclip into"); - return SINGLE_SUCCESS; - })); - builder.then(literal("highest").executes(ctx -> { - ClientPlayerEntity player = mc.player; - assert player != null; - - for (int i = 199; i > 0; i--) { - BlockPos isopenair1 = (player.getBlockPos().add(0,i,0)); - BlockPos newopenair2 = isopenair1.up(1); - if (!mc.world.getBlockState(isopenair1).isReplaceable() && !mc.world.getBlockState(isopenair1).isOf(Blocks.POWDER_SNOW) && mc.world.getFluidState(isopenair1).isEmpty()) { - int packetsRequired = 20; - if (player.hasVehicle()) { - Entity vehicle = player.getVehicle(); - for (int packetNumber = 0; packetNumber < (packetsRequired - 1); packetNumber++) { - mc.player.networkHandler.sendPacket(new VehicleMoveC2SPacket(mc.player.getVehicle())); - } - - vehicle.setPosition(vehicle.getX(), newopenair2.getY(), vehicle.getZ()); - } - for (int packetNumber = 0; packetNumber < (packetsRequired - 1); packetNumber++) { - mc.player.networkHandler.sendPacket(new PlayerMoveC2SPacket.OnGroundOnly(true)); - } - player.setPosition(player.getX(), newopenair2.getY(), player.getZ()); - return SINGLE_SUCCESS; - } - } - error("No blocks above you found!"); - return SINGLE_SUCCESS; - })); - } -} +package pwn.noobs.trouserstreak.commands; + +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import meteordevelopment.meteorclient.commands.Command; +import net.minecraft.block.Blocks; +import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.command.CommandSource; +import net.minecraft.entity.Entity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket; +import net.minecraft.network.packet.c2s.play.VehicleMoveC2SPacket; + +import static com.mojang.brigadier.Command.SINGLE_SUCCESS; +import static meteordevelopment.meteorclient.MeteorClient.mc; + +public class AutoVaultClipCommand extends Command { + public AutoVaultClipCommand() { + super("autovaultclip", "Lets you clip through blocks vertically automatically, with vault clip bypass implemented. Works on Paper, Spigot, but not always on Vanilla."); + } + @Override + public void build(LiteralArgumentBuilder builder) { + builder.executes(ctx -> { + error("Choose Up, Down or Highest"); + return SINGLE_SUCCESS; + }); + builder.then(literal("up").executes(ctx -> { + ClientPlayerEntity player = mc.player; + assert player != null; + for (int i = 0; i < 199; i++) { + BlockPos isopenair1 = (player.getBlockPos().add(0,i+2,0)); + BlockPos isopenair2 = (player.getBlockPos().add(0,i+3,0)); + if (mc.world.getBlockState(isopenair1).isReplaceable() && mc.world.getFluidState(isopenair1).isEmpty() && !mc.world.getBlockState(isopenair1).isOf(Blocks.POWDER_SNOW) && mc.world.getBlockState(isopenair2).isReplaceable() && mc.world.getFluidState(isopenair2).isEmpty() && !mc.world.getBlockState(isopenair2).isOf(Blocks.POWDER_SNOW)){ + int packetsRequired = 20; + if (player.hasVehicle()) { + Entity vehicle = player.getVehicle(); + for (int packetNumber = 0; packetNumber < (packetsRequired - 1); packetNumber++) { + mc.player.networkHandler.sendPacket(new VehicleMoveC2SPacket(mc.player.getVehicle())); + } + vehicle.setPosition(vehicle.getX(), isopenair1.getY(), vehicle.getZ()); + } + for (int packetNumber = 0; packetNumber < (packetsRequired - 1); packetNumber++) { + mc.player.networkHandler.sendPacket(new PlayerMoveC2SPacket.OnGroundOnly(true)); + } + player.setPosition(player.getX(), isopenair1.getY(), player.getZ()); + return SINGLE_SUCCESS; + } + } + error("No gap found to vclip into"); + return SINGLE_SUCCESS; + })); + builder.then(literal("down").executes(ctx -> { + ClientPlayerEntity player = mc.player; + assert player != null; + for (int i = 0; i > -199; i--) { + BlockPos isopenair1 = (player.getBlockPos().add(0,i,0)); + BlockPos isopenair2 = (player.getBlockPos().add(0,i-1,0)); + if (mc.world.getBlockState(isopenair1).isReplaceable() && mc.world.getFluidState(isopenair1).isEmpty() && !mc.world.getBlockState(isopenair1).isOf(Blocks.POWDER_SNOW) && mc.world.getBlockState(isopenair2).isReplaceable() && mc.world.getFluidState(isopenair2).isEmpty() && !mc.world.getBlockState(isopenair2).isOf(Blocks.POWDER_SNOW)){ + int packetsRequired = 20; + if (player.hasVehicle()) { + Entity vehicle = player.getVehicle(); + for (int packetNumber = 0; packetNumber < (packetsRequired - 1); packetNumber++) { + mc.player.networkHandler.sendPacket(new VehicleMoveC2SPacket(mc.player.getVehicle())); + } + vehicle.setPosition(vehicle.getX(), isopenair2.getY(), vehicle.getZ()); + } + for (int packetNumber = 0; packetNumber < (packetsRequired - 1); packetNumber++) { + mc.player.networkHandler.sendPacket(new PlayerMoveC2SPacket.OnGroundOnly(true)); + } + player.setPosition(player.getX(), isopenair2.getY(), player.getZ()); + return SINGLE_SUCCESS; + } + } + error("No gap found to vclip into"); + return SINGLE_SUCCESS; + })); + builder.then(literal("highest").executes(ctx -> { + ClientPlayerEntity player = mc.player; + assert player != null; + + for (int i = 199; i > 0; i--) { + BlockPos isopenair1 = (player.getBlockPos().add(0,i,0)); + BlockPos newopenair2 = isopenair1.up(1); + if (!mc.world.getBlockState(isopenair1).isReplaceable() && !mc.world.getBlockState(isopenair1).isOf(Blocks.POWDER_SNOW) && mc.world.getFluidState(isopenair1).isEmpty()) { + int packetsRequired = 20; + if (player.hasVehicle()) { + Entity vehicle = player.getVehicle(); + for (int packetNumber = 0; packetNumber < (packetsRequired - 1); packetNumber++) { + mc.player.networkHandler.sendPacket(new VehicleMoveC2SPacket(mc.player.getVehicle())); + } + + vehicle.setPosition(vehicle.getX(), newopenair2.getY(), vehicle.getZ()); + } + for (int packetNumber = 0; packetNumber < (packetsRequired - 1); packetNumber++) { + mc.player.networkHandler.sendPacket(new PlayerMoveC2SPacket.OnGroundOnly(true)); + } + player.setPosition(player.getX(), newopenair2.getY(), player.getZ()); + return SINGLE_SUCCESS; + } + } + error("No blocks above you found!"); + return SINGLE_SUCCESS; + })); + } +} \ No newline at end of file diff --git a/src/main/java/pwn/noobs/trouserstreak/commands/AutoVclipCommand.java b/src/main/java/pwn/noobs/trouserstreak/commands/AutoVclipCommand.java index e9e439642..f917c3806 100644 --- a/src/main/java/pwn/noobs/trouserstreak/commands/AutoVclipCommand.java +++ b/src/main/java/pwn/noobs/trouserstreak/commands/AutoVclipCommand.java @@ -58,4 +58,4 @@ public void build(LiteralArgumentBuilder builder) { return SINGLE_SUCCESS; })); } -} +} \ No newline at end of file diff --git a/src/main/java/pwn/noobs/trouserstreak/commands/CrashCommand.java b/src/main/java/pwn/noobs/trouserstreak/commands/CrashCommand.java index 5746b69bc..3bafba17c 100644 --- a/src/main/java/pwn/noobs/trouserstreak/commands/CrashCommand.java +++ b/src/main/java/pwn/noobs/trouserstreak/commands/CrashCommand.java @@ -6,6 +6,7 @@ import meteordevelopment.meteorclient.commands.arguments.PlayerListEntryArgumentType; import meteordevelopment.meteorclient.utils.player.ChatUtils; import net.minecraft.command.CommandSource; +import net.minecraft.text.Text; import static com.mojang.brigadier.Command.SINGLE_SUCCESS; import static meteordevelopment.meteorclient.MeteorClient.mc; @@ -20,6 +21,7 @@ public void build(LiteralArgumentBuilder builder) { builder.then(argument("player", PlayerListEntryArgumentType.create()).executes(context -> { GameProfile profile = PlayerListEntryArgumentType.get(context).getProfile(); if(mc.player.hasPermissionLevel(2)) ChatUtils.sendPlayerMsg("/execute at " + profile.getName() + " run particle ash ~ ~ ~ 1 1 1 1 2147483647 force " + profile.getName()); + ChatUtils.sendMsg(Text.of("Crashing player: "+profile.getName())); return SINGLE_SUCCESS; })); } diff --git a/src/main/java/pwn/noobs/trouserstreak/modules/AutoTitles.java b/src/main/java/pwn/noobs/trouserstreak/modules/AutoTitles.java new file mode 100644 index 000000000..dc562e83e --- /dev/null +++ b/src/main/java/pwn/noobs/trouserstreak/modules/AutoTitles.java @@ -0,0 +1,284 @@ +//Credits to ogmur (youtube.com/@ogmur) for figuring out these commands, credits to etianl for writing a module for it +// /title @a times 5s 9999d 9999d +// /title @a title {"text":"Mojang Loss Prevention Inc", "bold":true, "italic":true, "color":"red"} +// /title @a subtitle {"text":"discord.gg/vXSpKgU2ms", "bold":true, "italic":true, "color":"green"} +// /title @a actionbar {"text":"youtube.com/@ogmur", "bold":true, "italic":true, "color":"green"} + +package pwn.noobs.trouserstreak.modules; + +import meteordevelopment.meteorclient.events.world.TickEvent; +import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.systems.friends.Friends; +import meteordevelopment.meteorclient.systems.modules.Module; +import meteordevelopment.meteorclient.utils.player.ChatUtils; +import meteordevelopment.orbit.EventHandler; +import net.minecraft.client.network.PlayerListEntry; +import pwn.noobs.trouserstreak.Trouser; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +public class AutoTitles extends Module { + private final SettingGroup sgGeneral = settings.getDefaultGroup(); + private final SettingGroup sgTitle = settings.createGroup("Title Options"); + private final SettingGroup sgsubTitle = settings.createGroup("Subitle Options"); + private final SettingGroup sgActionbar = settings.createGroup("Actionbar Options"); + + + public final Setting notOP = sgGeneral.add(new BoolSetting.Builder() + .name("Toggle Module if not OP") + .description("Turn this off to prevent the bug of module always being turned off when you join server.") + .defaultValue(false) + .build() + ); + private final Setting notitleself = sgGeneral.add(new BoolSetting.Builder() + .name("dont-title-yourself") + .description("Don't set a title for yourself.") + .defaultValue(true) + .build() + ); + private final Setting notitlefrend = sgGeneral.add(new BoolSetting.Builder() + .name("dont-title-friends") + .description("Don't set a title for friend.") + .defaultValue(true) + .build() + ); + private final Setting title = sgTitle.add(new StringSetting.Builder() + .name("title-text") + .description("title text") + .defaultValue("Mountains Of Lava Inc.") + .wide() + .build() + ); + private final Setting titleitalic = sgTitle.add(new BoolSetting.Builder() + .name("Italicized Title") + .description("Title is in italics.") + .defaultValue(false) + .build() + ); + private final Setting titlebold = sgTitle.add(new BoolSetting.Builder() + .name("Bold Title") + .description("Title is bold.") + .defaultValue(true) + .build() + ); + private final Setting titlecolour = sgTitle.add(new StringSetting.Builder() + .name("title-colour") + .description("title colour") + .defaultValue("white") + .wide() + .build() + ); + private final Setting makesubtitle = sgsubTitle.add(new BoolSetting.Builder() + .name("Make Subitle Line") + .description("Makes the Subitle text display") + .defaultValue(true) + .build() + ); + private final Setting subtitle = sgsubTitle.add(new StringSetting.Builder() + .name("subtitle-text") + .description("subtitle text") + .defaultValue("https://www.youtube.com/@mountainsoflavainc.6913") + .wide() + .visible(() -> makesubtitle.get()) + .build() + ); + private final Setting subtitleitalic = sgsubTitle.add(new BoolSetting.Builder() + .name("Italicized Subtitle") + .description("Title is in italics.") + .defaultValue(true) + .visible(() -> makesubtitle.get()) + .build() + ); + private final Setting subtitlebold = sgsubTitle.add(new BoolSetting.Builder() + .name("Bold Subtitle") + .description("Title is bold.") + .defaultValue(true) + .visible(() -> makesubtitle.get()) + .build() + ); + private final Setting subtitlecolour = sgsubTitle.add(new StringSetting.Builder() + .name("subtitle-colour") + .description("title colour") + .defaultValue("green") + .wide() + .visible(() -> makesubtitle.get()) + .build() + ); + private final Setting makeactionbar = sgActionbar.add(new BoolSetting.Builder() + .name("Make Actionbar Line") + .description("Makes the Actionbar text display") + .defaultValue(true) + .build() + ); + private final Setting actionbar = sgActionbar.add(new StringSetting.Builder() + .name("actionbar-text") + .description("actionbar text") + .defaultValue("Renovations in progress.") + .wide() + .visible(() -> makeactionbar.get()) + .build() + ); + private final Setting actionbaritalic = sgActionbar.add(new BoolSetting.Builder() + .name("Italicized Actionbar") + .description("Actionbar is in italics.") + .defaultValue(false) + .visible(() -> makeactionbar.get()) + .build() + ); + private final Setting actionbarbold = sgActionbar.add(new BoolSetting.Builder() + .name("Bold Actionbar") + .description("Actionbar is bold.") + .defaultValue(true) + .visible(() -> makeactionbar.get()) + .build() + ); + private final Setting actionbarcolour = sgActionbar.add(new StringSetting.Builder() + .name("actionbar-colour") + .description("actionbar colour") + .defaultValue("yellow") + .wide() + .visible(() -> makeactionbar.get()) + .build() + ); + private final Setting fadeinmode = sgGeneral.add(new EnumSetting.Builder() + .name("FadeIn Mode") + .description("the FadeIn value mode") + .defaultValue(fadeinModes.seconds) + .build()); + private final Setting fadeinseconds = sgGeneral.add(new IntSetting.Builder() + .name("FadeIn Seconds") + .description("How long for the title to fadein, in seconds") + .defaultValue(2) + .min(1) + .sliderRange(1,999999999) + .visible(() -> fadeinmode.get() == fadeinModes.seconds) + .build() + ); + private final Setting fadeindays = sgGeneral.add(new IntSetting.Builder() + .name("FadeIn Days") + .description("How long for the title to fadein, in days") + .defaultValue(1) + .min(1) + .sliderRange(1,9999) + .visible(() -> fadeinmode.get() == fadeinModes.days) + .build() + ); + private final Setting durationmode = sgGeneral.add(new EnumSetting.Builder() + .name("Duration Mode") + .description("the Duration value mode") + .defaultValue(durationModes.days) + .build()); + private final Setting durationseconds = sgGeneral.add(new IntSetting.Builder() + .name("Duration Seconds") + .description("How long for the title to stay for, in seconds") + .defaultValue(999999999) + .min(1) + .sliderRange(1,999999999) + .visible(() -> durationmode.get() == durationModes.seconds) + .build() + ); + private final Setting durationdays = sgGeneral.add(new IntSetting.Builder() + .name("Duration Days") + .description("How long for the title to stay for, in days") + .defaultValue(9999) + .min(1) + .sliderRange(1,9999) + .visible(() -> durationmode.get() == durationModes.days) + .build() + ); + private final Setting fadeoutmode = sgGeneral.add(new EnumSetting.Builder() + .name("FadeOut Mode") + .description("the FadeOut value mode") + .defaultValue(fadeoutModes.days) + .build()); + private final Setting fadeoutseconds = sgGeneral.add(new IntSetting.Builder() + .name("FadeOut Seconds") + .description("How long for the title to fadeout, in seconds") + .defaultValue(999999999) + .min(1) + .sliderRange(1,999999999) + .visible(() -> fadeoutmode.get() == fadeoutModes.seconds) + .build() + ); + private final Setting fadeoutdays = sgGeneral.add(new IntSetting.Builder() + .name("FadeOut Days") + .description("How long for the title to fadeout, in days") + .defaultValue(9999) + .min(1) + .sliderRange(1,9999) + .visible(() -> fadeoutmode.get() == fadeoutModes.days) + .build() + ); + public AutoTitles() { + super(Trouser.Main, "AutoTitles", "Creates text across the screens for online players. Requires OP."); + } + + private CopyOnWriteArrayList players; + private String fadein; + private String duration; + private String fadeout; + + + @Override + public void onActivate() { + if (notOP.get() && !(mc.player.hasPermissionLevel(2)) && mc.world.isChunkLoaded(mc.player.getChunkPos().x, mc.player.getChunkPos().z)) { + toggle(); + error("Must have permission level 2 or higher"); + } + switch (fadeinmode.get()) { + case seconds -> fadein=fadeinseconds.get()+"s"; + case days -> fadein=fadeindays.get()+"d"; + } + switch (durationmode.get()) { + case seconds -> duration=durationseconds.get()+"s"; + case days -> duration=durationdays.get()+"d"; + } + switch (fadeoutmode.get()) { + case seconds -> fadeout=fadeoutseconds.get()+"s"; + case days -> fadeout=fadeoutdays.get()+"d"; + } + + if (!notitlefrend.get()) { + if (notitleself.get()){ + ChatUtils.sendPlayerMsg("/title @a[name=!" + mc.player.getName().getLiteralString() + "] times " + fadein + " " + duration + " " + fadeout); + ChatUtils.sendPlayerMsg("/title @a[name=!" + mc.player.getName().getLiteralString() + "] title {\"text\":\"" + title.get() + "\", \"bold\":" + titlebold.get() + ", \"italic\":" + titleitalic.get() + ", \"color\":\"" + titlecolour.get() + "\"}"); + if (makesubtitle.get())ChatUtils.sendPlayerMsg("/title @a[name=!" + mc.player.getName().getLiteralString() + "] subtitle {\"text\":\"" + subtitle.get() + "\", \"bold\":" + subtitlebold.get() + ", \"italic\":" + subtitleitalic.get() + ", \"color\":\"" + subtitlecolour.get() + "\"}"); + if (makeactionbar.get())ChatUtils.sendPlayerMsg("/title @a[name=!" + mc.player.getName().getLiteralString() + "] actionbar {\"text\":\"" + actionbar.get() + "\", \"bold\":" + actionbarbold.get() + ", \"italic\":" + actionbaritalic.get() + ", \"color\":\"" + actionbarcolour.get() + "\"}"); + } else if (!notitleself.get()){ + ChatUtils.sendPlayerMsg("/title @a times " + fadein + " " + duration + " " + fadeout); + ChatUtils.sendPlayerMsg("/title @a title {\"text\":\"" + title.get() + "\", \"bold\":" + titlebold.get() + ", \"italic\":" + titleitalic.get() + ", \"color\":\"" + titlecolour.get() + "\"}"); + if (makesubtitle.get())ChatUtils.sendPlayerMsg("/title @a subtitle {\"text\":\"" + subtitle.get() + "\", \"bold\":" + subtitlebold.get() + ", \"italic\":" + subtitleitalic.get() + ", \"color\":\"" + subtitlecolour.get() + "\"}"); + if (makeactionbar.get())ChatUtils.sendPlayerMsg("/title @a actionbar {\"text\":\"" + actionbar.get() + "\", \"bold\":" + actionbarbold.get() + ", \"italic\":" + actionbaritalic.get() + ", \"color\":\"" + actionbarcolour.get() + "\"}"); + } + } else if (notitlefrend.get()) { + players = new CopyOnWriteArrayList<>(mc.getNetworkHandler().getPlayerList()); + List friendNames = new ArrayList<>(); + if (notitleself.get())friendNames.add("name=!" + mc.player.getName().getLiteralString()); + for(PlayerListEntry player : players) { + if(Friends.get().isFriend(player) && notitlefrend.get()) friendNames.add("name=!" + player.getProfile().getName()); + } + String friendsString = String.join(",", friendNames); + ChatUtils.sendPlayerMsg("/title @a[" + friendsString + "] times " + fadein + " " + duration + " " + fadeout); + ChatUtils.sendPlayerMsg("/title @a[" + friendsString + "] title {\"text\":\"" + title.get() + "\", \"bold\":" + titlebold.get() + ", \"italic\":" + titleitalic.get() + ", \"color\":\"" + titlecolour.get() + "\"}"); + if (makesubtitle.get())ChatUtils.sendPlayerMsg("/title @a[" + friendsString + "] subtitle {\"text\":\"" + subtitle.get() + "\", \"bold\":" + subtitlebold.get() + ", \"italic\":" + subtitleitalic.get() + ", \"color\":\"" + subtitlecolour.get() + "\"}"); + if (makeactionbar.get())ChatUtils.sendPlayerMsg("/title @a[" + friendsString + "] actionbar {\"text\":\"" + actionbar.get() + "\", \"bold\":" + actionbarbold.get() + ", \"italic\":" + actionbaritalic.get() + ", \"color\":\"" + actionbarcolour.get() + "\"}"); + } + toggle(); + } + + @EventHandler + public void onTick(TickEvent.Post event) { + toggle(); + } + public enum fadeinModes { + seconds, days + } + public enum fadeoutModes { + days, seconds + } + public enum durationModes { + days, seconds + } +} \ No newline at end of file diff --git a/src/main/java/pwn/noobs/trouserstreak/modules/BetterAutoSign.java b/src/main/java/pwn/noobs/trouserstreak/modules/BetterAutoSign.java index 616c5d88c..01f0e7f42 100644 --- a/src/main/java/pwn/noobs/trouserstreak/modules/BetterAutoSign.java +++ b/src/main/java/pwn/noobs/trouserstreak/modules/BetterAutoSign.java @@ -16,8 +16,8 @@ import meteordevelopment.meteorclient.utils.player.InvUtils; import meteordevelopment.meteorclient.utils.player.Rotations; import meteordevelopment.orbit.EventHandler; +import net.minecraft.block.*; import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.entity.HangingSignBlockEntity; import net.minecraft.block.entity.SignBlockEntity; import net.minecraft.client.gui.screen.ingame.HangingSignEditScreen; import net.minecraft.client.gui.screen.ingame.SignEditScreen; @@ -164,6 +164,7 @@ public class BetterAutoSign extends Module { private BlockPos prevsignPos = new BlockPos(99999999,99999999,99999999); private final ArrayList openedSigns = new ArrayList<>(); private int timer = 0; + private int warningticks = 0; public BetterAutoSign() { super(Trouser.Main, "Better-auto-sign", "Automatically writes signs and can dye them as well. Credits to MeteorTweaks."); @@ -171,6 +172,7 @@ public BetterAutoSign() { @Override public void onActivate() { + warningticks = 0; timer = 0; openedSigns.clear(); editrear=false; @@ -178,6 +180,10 @@ public void onActivate() { @EventHandler private void onPreTick(TickEvent.Pre event) { + if (signAura.get() && mc.player.getMainHandStack().getItem() instanceof HangingSignItem && warningticks<=3){ + warningticks++; + if (warningticks==2)error("Sign Aura does not work properly with hanging signs when holding a hanging sign."); + } timer--; if(!signAura.get() || timer > 0) return; @@ -289,15 +295,22 @@ private void onPostTick(TickEvent.Post event) { editrear=false; } else if (mc.world.getBlockState(signPos).getBlock().asItem() instanceof HangingSignItem){ - mc.interactionManager.interactBlock(mc.player, Hand.MAIN_HAND, new BlockHitResult(new Vec3d(signPos.getX(), signPos.getY(), signPos.getZ()), Direction.DOWN, signPos, false)); - mc.player.networkHandler.sendPacket(new UpdateSignC2SPacket(signPos,false, - HlineOne.get(), - HlineTwo.get(), - HlineThree.get(), - HlineFour.get() - )); + BlockState blockState = mc.world.getBlockState(signPos); + if (blockState.getBlock() instanceof WallHangingSignBlock) { + Direction facing = blockState.get(WallHangingSignBlock.FACING); + mc.interactionManager.interactBlock(mc.player, Hand.MAIN_HAND, new BlockHitResult(new Vec3d(signPos.getX(), signPos.getY(), signPos.getZ()), facing, signPos, false)); + } else if (blockState.getBlock() instanceof HangingSignBlock) { + int rotation = blockState.get(HangingSignBlock.ROTATION); + Direction direction = Direction.fromHorizontal(rotation); + mc.interactionManager.interactBlock(mc.player, Hand.MAIN_HAND, new BlockHitResult(new Vec3d(signPos.getX(), signPos.getY(), signPos.getZ()), direction, signPos, false)); + } + mc.player.networkHandler.sendPacket(new UpdateSignC2SPacket(signPos,false, + HlineOne.get(), + HlineTwo.get(), + HlineThree.get(), + HlineFour.get() + )); prevsignPos = signPos; - editrear=false; } } diff --git a/src/main/java/pwn/noobs/trouserstreak/modules/HandOfGod.java b/src/main/java/pwn/noobs/trouserstreak/modules/HandOfGod.java index 05acb18f5..c51a90f2a 100644 --- a/src/main/java/pwn/noobs/trouserstreak/modules/HandOfGod.java +++ b/src/main/java/pwn/noobs/trouserstreak/modules/HandOfGod.java @@ -11,6 +11,7 @@ import meteordevelopment.orbit.EventHandler; import net.minecraft.block.Block; import net.minecraft.block.Blocks; +import net.minecraft.client.network.PlayerListEntry; import net.minecraft.entity.Entity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; @@ -26,6 +27,10 @@ import net.minecraft.util.math.Vec3d; import pwn.noobs.trouserstreak.Trouser; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + public class HandOfGod extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); private final SettingGroup sgClick = settings.createGroup("Click Options"); @@ -287,6 +292,13 @@ public class HandOfGod extends Module { .defaultValue(false) .build() ); + public final Setting trollrenderdist = sgTroll.add(new BoolSetting.Builder() + .name("Only Render Distance") + .description("Run /fill on players only within render distance.") + .defaultValue(false) + .visible(() -> troll.get()) + .build() + ); public final Setting trollfriends = sgTroll.add(new BoolSetting.Builder() .name("/fill Friends") .description("Runs /fill around friends too") @@ -352,7 +364,7 @@ public class HandOfGod extends Module { public HandOfGod() { super(Trouser.Main, "HandOfGod", "Modify the world and troll players with automated /fill commands. (Must have OP status)"); } - + private CopyOnWriteArrayList players; private int ticks=0; private int swpr=0; private boolean sweep=false; @@ -725,27 +737,51 @@ public void onTick(TickEvent.Pre event) { if (trollticks<=trolltickdelay.get()){ trollticks++; } else if (trollticks>trolltickdelay.get()){ - for (Entity entity : mc.world.getEntities()) { - if (entity instanceof PlayerEntity && entity != mc.player){ - if (!trollfriends.get() && entity instanceof PlayerEntity && Friends.get().isFriend((PlayerEntity) entity)) { - return; + String tfullString = trollblock.get().toString(); + String[] tparts = tfullString.split(":"); + String tblock = tparts[1]; + String tBlockName = tblock.replace("}", ""); + String trepfullString = trollblocktoreplace.get().toString(); + String[] trepparts = trepfullString.split(":"); + String trepblock = trepparts[1]; + String tRepblockName = trepblock.replace("}", ""); + if (!trollrenderdist.get()) { + //every player in server, default + if (trollfriends.get()) { + if (!trollreplace.get()) + ChatUtils.sendPlayerMsg("/execute at @a[name=!" + mc.player.getName().getLiteralString() + "] run fill " + "~" + trollwidth.get() + " " + "~" + trollheight.get() + " " + "~" + trolldepth.get() + " " + "~-" + trollwidth.get() + " " + "~-" + trollheight.get() + " " + "~-" + trolldepth.get() + " " + tBlockName); + else if (trollreplace.get()) + ChatUtils.sendPlayerMsg("/execute at @a[name=!" + mc.player.getName().getLiteralString() + "] run fill " + "~" + trollwidth.get() + " " + "~" + trollheight.get() + " " + "~" + trolldepth.get() + " " + "~-" + trollwidth.get() + " " + "~-" + trollheight.get() + " " + "~-" + trolldepth.get() + " " + tBlockName + " replace " + tRepblockName); + } else if (!trollfriends.get()) { + players = new CopyOnWriteArrayList<>(mc.getNetworkHandler().getPlayerList()); + List friendNames = new ArrayList<>(); + friendNames.add("name=!" + mc.player.getName().getLiteralString()); + for (PlayerListEntry player : players) { + if (Friends.get().isFriend(player) && !trollfriends.get()) + friendNames.add("name=!" + player.getProfile().getName()); } - String tfullString = trollblock.get().toString(); - String[] tparts = tfullString.split(":"); - String tblock = tparts[1]; - String tBlockName = tblock.replace("}", ""); - String trepfullString = trollblocktoreplace.get().toString(); - String[] trepparts = trepfullString.split(":"); - String trepblock = trepparts[1]; - String tRepblockName = trepblock.replace("}", ""); - switch (entity.getHorizontalFacing()){ - case NORTH, SOUTH -> { - if (!trollreplace.get()) ChatUtils.sendPlayerMsg("/fill "+(entity.getBlockPos().getX()+trollwidth.get())+" "+(entity.getBlockPos().getY()+trollheight.get())+" "+(entity.getBlockPos().getZ()+trolldepth.get())+" "+(entity.getBlockPos().getX()-trollwidth.get())+" "+(entity.getBlockPos().getY()-trollheight.get())+" "+(entity.getBlockPos().getZ()-trolldepth.get())+" "+tBlockName); - else if (trollreplace.get()) ChatUtils.sendPlayerMsg("/fill "+(entity.getBlockPos().getX()+trollwidth.get())+" "+(entity.getBlockPos().getY()+trollheight.get())+" "+(entity.getBlockPos().getZ()+trolldepth.get())+" "+(entity.getBlockPos().getX()-trollwidth.get())+" "+(entity.getBlockPos().getY()-trollheight.get())+" "+(entity.getBlockPos().getZ()-trolldepth.get())+" "+tBlockName+" replace "+tRepblockName); + String friendsString = String.join(",", friendNames); + if (!trollreplace.get()) + ChatUtils.sendPlayerMsg("/execute at @a[" + friendsString + "] run fill " + "~" + trollwidth.get() + " " + "~" + trollheight.get() + " " + "~" + trolldepth.get() + " " + "~-" + trollwidth.get() + " " + "~-" + trollheight.get() + " " + "~-" + trolldepth.get() + " " + tBlockName); + else if (trollreplace.get()) + ChatUtils.sendPlayerMsg("/execute at @a[" + friendsString + "] run fill " + "~" + trollwidth.get() + " " + "~" + trollheight.get() + " " + "~" + trolldepth.get() + " " + "~-" + trollwidth.get() + " " + "~-" + trollheight.get() + " " + "~-" + trolldepth.get() + " " + tBlockName + " replace " + tRepblockName); + } + } else if (trollrenderdist.get()){ + //every player in render distance + for (Entity entity : mc.world.getEntities()) { + if (entity instanceof PlayerEntity && entity != mc.player){ + if (!trollfriends.get() && entity instanceof PlayerEntity && Friends.get().isFriend((PlayerEntity) entity)) { + return; } - case EAST, WEST -> { - if (!trollreplace.get()) ChatUtils.sendPlayerMsg("/fill "+(entity.getBlockPos().getX()+trolldepth.get())+" "+(entity.getBlockPos().getY()+trollheight.get())+" "+(entity.getBlockPos().getZ()+trollwidth.get())+" "+(entity.getBlockPos().getX()-trolldepth.get())+" "+(entity.getBlockPos().getY()-trollheight.get())+" "+(entity.getBlockPos().getZ()-trollwidth.get())+" "+tBlockName); - else if (trollreplace.get()) ChatUtils.sendPlayerMsg("/fill "+(entity.getBlockPos().getX()+trolldepth.get())+" "+(entity.getBlockPos().getY()+trollheight.get())+" "+(entity.getBlockPos().getZ()+trollwidth.get())+" "+(entity.getBlockPos().getX()-trolldepth.get())+" "+(entity.getBlockPos().getY()-trollheight.get())+" "+(entity.getBlockPos().getZ()-trollwidth.get())+" "+tBlockName+" replace "+tRepblockName); + switch (entity.getHorizontalFacing()){ + case NORTH, SOUTH -> { + if (!trollreplace.get()) ChatUtils.sendPlayerMsg("/fill "+(entity.getBlockPos().getX()+trollwidth.get())+" "+(entity.getBlockPos().getY()+trollheight.get())+" "+(entity.getBlockPos().getZ()+trolldepth.get())+" "+(entity.getBlockPos().getX()-trollwidth.get())+" "+(entity.getBlockPos().getY()-trollheight.get())+" "+(entity.getBlockPos().getZ()-trolldepth.get())+" "+tBlockName); + else if (trollreplace.get()) ChatUtils.sendPlayerMsg("/fill "+(entity.getBlockPos().getX()+trollwidth.get())+" "+(entity.getBlockPos().getY()+trollheight.get())+" "+(entity.getBlockPos().getZ()+trolldepth.get())+" "+(entity.getBlockPos().getX()-trollwidth.get())+" "+(entity.getBlockPos().getY()-trollheight.get())+" "+(entity.getBlockPos().getZ()-trolldepth.get())+" "+tBlockName+" replace "+tRepblockName); + } + case EAST, WEST -> { + if (!trollreplace.get()) ChatUtils.sendPlayerMsg("/fill "+(entity.getBlockPos().getX()+trolldepth.get())+" "+(entity.getBlockPos().getY()+trollheight.get())+" "+(entity.getBlockPos().getZ()+trollwidth.get())+" "+(entity.getBlockPos().getX()-trolldepth.get())+" "+(entity.getBlockPos().getY()-trollheight.get())+" "+(entity.getBlockPos().getZ()-trollwidth.get())+" "+tBlockName); + else if (trollreplace.get()) ChatUtils.sendPlayerMsg("/fill "+(entity.getBlockPos().getX()+trolldepth.get())+" "+(entity.getBlockPos().getY()+trollheight.get())+" "+(entity.getBlockPos().getZ()+trollwidth.get())+" "+(entity.getBlockPos().getX()-trolldepth.get())+" "+(entity.getBlockPos().getY()-trollheight.get())+" "+(entity.getBlockPos().getZ()-trollwidth.get())+" "+tBlockName+" replace "+tRepblockName); + } } } } diff --git a/src/main/java/pwn/noobs/trouserstreak/modules/LavaAura.java b/src/main/java/pwn/noobs/trouserstreak/modules/LavaAura.java index 5962c5bd8..33efe5c6c 100644 --- a/src/main/java/pwn/noobs/trouserstreak/modules/LavaAura.java +++ b/src/main/java/pwn/noobs/trouserstreak/modules/LavaAura.java @@ -26,8 +26,8 @@ import net.minecraft.world.RaycastContext; import pwn.noobs.trouserstreak.Trouser; -import java.util.HashSet; -import java.util.Set; +import java.util.*; +import java.util.stream.Collectors; public class LavaAura extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); @@ -68,7 +68,14 @@ public class LavaAura extends Module { .visible(() -> pickup.get()) .build() ); - + public final Setting maxtargets = sgGeneral.add(new IntSetting.Builder() + .name("Max Targets") + .description("Maximum targets to lava at a time") + .defaultValue(6) + .min(1) + .sliderMax(20) + .build() + ); private final Setting lavaeverything = sgGeneral.add(new BoolSetting.Builder() .name("Lava-Everything") .description("Lava all the blocks. Creative mode recommended.") @@ -93,7 +100,26 @@ private void onTick(TickEvent.Pre event) { if (pauseOnLag.get() && TickRate.INSTANCE.getTimeSinceLastTick() >= 1f) return; float originalYaw = mc.player.getYaw(); float originalPitch = mc.player.getPitch(); + + // Convert the Iterable to a List and then stream it + List targetedEntities = new ArrayList<>(); for (Entity entity : this.mc.world.getEntities()) { + targetedEntities.add(entity); + } + + // Sort entities based on distance to the player + List sortedEntities = targetedEntities.stream() + .filter(entity -> entity instanceof LivingEntity && entity != mc.player + && (entities.get().contains(entity.getType()) || (trollfriends.get() && entity instanceof PlayerEntity && !Friends.get().isFriend((PlayerEntity) entity)))) + .sorted(Comparator.comparingDouble(entity -> mc.player.getPos().distanceTo(entity.getPos()))) + .collect(Collectors.toList()); + + // Limit the number of targets based on the maxtargets setting + int targets = 0; + for (Entity entity : sortedEntities) { + if (targets >= maxtargets.get()) { + break; + } if (entity instanceof LivingEntity && entity != mc.player) { if (!entities.get().contains(entity.getType()) || (!trollfriends.get() && entity instanceof PlayerEntity && Friends.get().isFriend((PlayerEntity) entity))) continue; LivingEntity livingEntity = (LivingEntity) entity; @@ -178,6 +204,7 @@ private void onTick(TickEvent.Pre event) { } } } + targets++; } if (lavaeverything.get()) { @@ -226,9 +253,9 @@ private void placeLava() { private void pickUpLavaOnTick() { BlockPos playerPos = mc.player.getBlockPos(); - for (int x = (int) -Math.round(range.get()); x <= range.get(); x++) { - for (int y = (int) -Math.round(range.get()); y <= range.get(); y++) { - for (int z = (int) -Math.round(range.get()); z <= range.get(); z++) { + for (int x = (int) -Math.round(range.get()+1); x <= range.get()+1; x++) { + for (int y = (int) -Math.round(range.get()+1); y <= range.get()+1; y++) { + for (int z = (int) -Math.round(range.get()+1); z <= range.get()+1; z++) { BlockPos blockPos = playerPos.add(x, y, z); BlockState blockState = mc.world.getBlockState(blockPos); @@ -236,7 +263,7 @@ private void pickUpLavaOnTick() { // Perform a raycast to check for obstructions BlockHitResult blockHitResult = mc.world.raycast(new RaycastContext( mc.player.getCameraPosVec(1.0f), - new Vec3d(blockPos.getX() + 0.5, blockPos.getY() + 0.5, blockPos.getZ() + 0.5), + new Vec3d(blockPos.getX(), blockPos.getY()+0.25, blockPos.getZ()), RaycastContext.ShapeType.COLLIDER, RaycastContext.FluidHandling.NONE, mc.player @@ -261,5 +288,4 @@ private void pickupLiquid() { mc.interactionManager.interactItem(mc.player, Hand.MAIN_HAND); mc.player.getInventory().selectedSlot = prevSlot; } - -} +} \ No newline at end of file diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 98e0580f9..0d326b0b8 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -1,7 +1,7 @@ { "schemaVersion": 1, "id": "streak-addon", - "version": "0.8.1", + "version": "0.8.2", "name": "TrouserStreak", "description": "Trouser-Streak is a compilation of modules, updated to the latest version and optimized for maximum grief. I did not make all of these.", "authors": [