diff --git a/build.gradle b/build.gradle index 05cf664cf7..f09b401d66 100644 --- a/build.gradle +++ b/build.gradle @@ -125,6 +125,7 @@ task github(dependsOn: moveDevLibs) { def ghRelease = repository.getReleaseByTagName(ghVersion as String) if(ghRelease == null) { def releaseBuilder = new GHReleaseBuilder(repository, ghVersion as String) + releaseBuilder.prerelease(ghVersion.contains("pre")) ghRelease = releaseBuilder.create() } diff --git a/gradle.properties b/gradle.properties index 0ce4b512ec..67ae41bf9e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,16 +4,16 @@ org.gradle.parallel=true # Fabric Properties # check these at https://fabricmc.net/develop/ and -# https://www.curseforge.com/minecraft/mc-mods/fabric-api +# https://modrinth.com/mod/fabric-api/versions minecraft_version=1.20.6 yarn_mappings=1.20.6+build.1 -loader_version=0.15.10 +loader_version=0.15.11 -#Fabric api -fabric_version=0.97.8+1.20.6 +# Fabric API +fabric_version=0.98.0+1.20.6 # Mod Properties -mod_version = v7.41.2-MC1.20.6 +mod_version = v7.42-MC1.20.6 maven_group = net.wurstclient archives_base_name = Wurst-Client diff --git a/src/main/java/net/wurstclient/WurstClient.java b/src/main/java/net/wurstclient/WurstClient.java index c901b895df..4c083f3b2d 100644 --- a/src/main/java/net/wurstclient/WurstClient.java +++ b/src/main/java/net/wurstclient/WurstClient.java @@ -58,7 +58,7 @@ public enum WurstClient public static MinecraftClient MC; public static IMinecraftClient IMC; - public static final String VERSION = "7.41.2"; + public static final String VERSION = "7.42"; public static final String MC_VERSION = "1.20.6"; private WurstAnalytics analytics; diff --git a/src/main/java/net/wurstclient/ai/PathProcessor.java b/src/main/java/net/wurstclient/ai/PathProcessor.java index 0ad42fd72d..c78f535d08 100644 --- a/src/main/java/net/wurstclient/ai/PathProcessor.java +++ b/src/main/java/net/wurstclient/ai/PathProcessor.java @@ -77,6 +77,6 @@ public static final void releaseControls() { // reset keys for(KeyBinding key : CONTROLS) - ((IKeyBinding)key).resetPressedState(); + IKeyBinding.get(key).resetPressedState(); } } diff --git a/src/main/java/net/wurstclient/hacks/AimAssistHack.java b/src/main/java/net/wurstclient/hacks/AimAssistHack.java index ef9c8a81fa..7659268ac8 100644 --- a/src/main/java/net/wurstclient/hacks/AimAssistHack.java +++ b/src/main/java/net/wurstclient/hacks/AimAssistHack.java @@ -48,6 +48,11 @@ public final class AimAssistHack extends Hack private final CheckboxSetting checkLOS = new CheckboxSetting( "Check line of sight", "Won't aim at entities behind blocks.", true); + private final CheckboxSetting aimWhileBlocking = new CheckboxSetting( + "Aim while blocking", "Keeps aiming at entities while you're blocking" + + " with a shield or using items.", + false); + private final EntityFilterList entityFilters = new EntityFilterList(FilterPlayersSetting.genericCombat(false), FilterSleepingSetting.genericCombat(false), @@ -90,6 +95,7 @@ public AimAssistHack() addSetting(rotationSpeed); addSetting(fov); addSetting(checkLOS); + addSetting(aimWhileBlocking); entityFilters.forEach(this::addSetting); } @@ -123,10 +129,15 @@ protected void onDisable() @Override public void onUpdate() { + target = null; + // don't aim when a container/inventory screen is open if(MC.currentScreen instanceof HandledScreen) return; + if(!aimWhileBlocking.isChecked() && MC.player.isUsingItem()) + return; + Stream stream = EntityUtils.getAttackableEntities(); double rangeSq = Math.pow(range.getValue(), 2); stream = stream.filter(e -> MC.player.squaredDistanceTo(e) <= rangeSq); diff --git a/src/main/java/net/wurstclient/hacks/AnchorAuraHack.java b/src/main/java/net/wurstclient/hacks/AnchorAuraHack.java index 27b3eb154d..f4b2c685d9 100644 --- a/src/main/java/net/wurstclient/hacks/AnchorAuraHack.java +++ b/src/main/java/net/wurstclient/hacks/AnchorAuraHack.java @@ -35,6 +35,8 @@ import net.wurstclient.settings.FacingSetting.Facing; import net.wurstclient.settings.SliderSetting; import net.wurstclient.settings.SliderSetting.ValueDisplay; +import net.wurstclient.settings.SwingHandSetting; +import net.wurstclient.settings.SwingHandSetting.SwingHand; import net.wurstclient.settings.filterlists.AnchorAuraFilterList; import net.wurstclient.settings.filterlists.EntityFilterList; import net.wurstclient.util.BlockUtils; @@ -69,6 +71,11 @@ public final class AnchorAuraHack extends Hack implements UpdateListener + "Slower but can help with anti-cheat plugins.", false); + private final SwingHandSetting swingHand = new SwingHandSetting( + "How AnchorAura should swing your hand when placing, charging and" + + " detonating respawn anchors.", + SwingHand.CLIENT); + private final EnumSetting takeItemsFrom = new EnumSetting<>( "Take items from", "Where to look for respawn anchors and glowstone.", TakeItemsFrom.values(), TakeItemsFrom.INVENTORY); @@ -85,6 +92,7 @@ public AnchorAuraHack() addSetting(autoPlace); addSetting(faceBlocks); addSetting(checkLOS); + addSetting(swingHand); addSetting(takeItemsFrom); entityFilters.forEach(this::addSetting); @@ -174,7 +182,7 @@ private ArrayList placeAnchorsNear(ArrayList targets) } if(shouldSwing) - MC.player.swingHand(Hand.MAIN_HAND); + swingHand.swing(Hand.MAIN_HAND); return newAnchors; } @@ -196,7 +204,7 @@ private void detonate(ArrayList chargedAnchors) shouldSwing = true; if(shouldSwing) - MC.player.swingHand(Hand.MAIN_HAND); + swingHand.swing(Hand.MAIN_HAND); } private void charge(ArrayList unchargedAnchors) @@ -216,7 +224,7 @@ private void charge(ArrayList unchargedAnchors) shouldSwing = true; if(shouldSwing) - MC.player.swingHand(Hand.MAIN_HAND); + swingHand.swing(Hand.MAIN_HAND); } private boolean rightClickBlock(BlockPos pos) diff --git a/src/main/java/net/wurstclient/hacks/AntiAfkHack.java b/src/main/java/net/wurstclient/hacks/AntiAfkHack.java index 8a24de863a..8c5814eb0a 100644 --- a/src/main/java/net/wurstclient/hacks/AntiAfkHack.java +++ b/src/main/java/net/wurstclient/hacks/AntiAfkHack.java @@ -28,13 +28,39 @@ import net.wurstclient.hack.Hack; import net.wurstclient.mixinterface.IKeyBinding; import net.wurstclient.settings.CheckboxSetting; +import net.wurstclient.settings.SliderSetting; +import net.wurstclient.settings.SliderSetting.ValueDisplay; @SearchTags({"anti afk", "AFKBot", "afk bot"}) @DontSaveState public final class AntiAfkHack extends Hack implements UpdateListener, RenderListener { - private final CheckboxSetting useAi = new CheckboxSetting("Use AI", true); + private final CheckboxSetting useAi = new CheckboxSetting("Use AI", + "Uses a pathfinding AI to move around naturally and avoid hazards.\n" + + "Can sometimes get stuck.", + true); + + private final SliderSetting aiRange = new SliderSetting("AI range", + "The area in which AntiAFK can move when Use AI is turned on.", 16, 1, + 64, 1, ValueDisplay.AREA_FROM_RADIUS); + + private final SliderSetting nonAiRange = new SliderSetting("Non-AI range", + "The area in which AntiAFK can move when Use AI is turned off.\n\n" + + "\u00a7c\u00a7lWARNING:\u00a7r This area must be completely" + + " unobstructed and free of hazards.", + 1, 1, 64, 1, ValueDisplay.AREA_FROM_RADIUS); + + private final SliderSetting waitTime = + new SliderSetting("Wait time", "Time between movements in seconds.", + 2.5, 0, 60, 0.05, ValueDisplay.DECIMAL.withSuffix("s")); + + private final SliderSetting waitTimeRand = + new SliderSetting("Wait time randomization", + "How much time can be randomly added or subtracted from the wait" + + " time, in seconds.", + 0.5, 0, 60, 0.05, + ValueDisplay.DECIMAL.withPrefix("\u00b1").withSuffix("s")); private int timer; private Random random = new Random(); @@ -51,6 +77,10 @@ public AntiAfkHack() setCategory(Category.OTHER); addSetting(useAi); + addSetting(aiRange); + addSetting(nonAiRange); + addSetting(waitTime); + addSetting(waitTimeRand); } @Override @@ -58,7 +88,8 @@ protected void onEnable() { start = BlockPos.ofFloored(MC.player.getPos()); nextBlock = null; - pathFinder = new RandomPathFinder(start); + pathFinder = + new RandomPathFinder(randomize(start, aiRange.getValueI(), true)); creativeFlying = MC.player.getAbilities().flying; WURST.getHax().autoFishHack.setEnabled(false); @@ -73,14 +104,23 @@ protected void onDisable() EVENTS.remove(UpdateListener.class, this); EVENTS.remove(RenderListener.class, this); - ((IKeyBinding)MC.options.forwardKey).resetPressedState(); - ((IKeyBinding)MC.options.jumpKey).resetPressedState(); + IKeyBinding.get(MC.options.forwardKey).resetPressedState(); + IKeyBinding.get(MC.options.jumpKey).resetPressedState(); pathFinder = null; processor = null; PathProcessor.releaseControls(); } + private void setTimer() + { + int baseTime = (int)(waitTime.getValue() * 20); + int randTime = (int)(waitTimeRand.getValue() * 20); + int randOffset = random.nextInt(randTime * 2 + 1) - randTime; + randOffset = Math.max(randOffset, -baseTime); + timer = baseTime + randOffset; + } + @Override public void onUpdate() { @@ -132,22 +172,22 @@ public void onUpdate() if(!processor.isDone()) processor.process(); else - pathFinder = new RandomPathFinder(start); + pathFinder = new RandomPathFinder( + randomize(start, aiRange.getValueI(), true)); // wait 2 - 3 seconds (40 - 60 ticks) if(processor.isDone()) { PathProcessor.releaseControls(); - timer = 40 + random.nextInt(21); + setTimer(); } }else { // set next block if(timer <= 0 || nextBlock == null) { - nextBlock = - start.add(random.nextInt(3) - 1, 0, random.nextInt(3) - 1); - timer = 40 + random.nextInt(21); + nextBlock = randomize(start, nonAiRange.getValueI(), false); + setTimer(); } // face block @@ -181,12 +221,19 @@ public void onRender(MatrixStack matrixStack, float partialTicks) pathCmd.isDepthTest()); } + private BlockPos randomize(BlockPos pos, int range, boolean includeY) + { + int x = random.nextInt(2 * range + 1) - range; + int y = includeY ? random.nextInt(2 * range + 1) - range : 0; + int z = random.nextInt(2 * range + 1) - range; + return pos.add(x, y, z); + } + private class RandomPathFinder extends PathFinder { public RandomPathFinder(BlockPos goal) { - super(goal.add(random.nextInt(33) - 16, random.nextInt(33) - 16, - random.nextInt(33) - 16)); + super(goal); setThinkTime(10); setFallingAllowed(false); setDivingAllowed(false); diff --git a/src/main/java/net/wurstclient/hacks/AutoCompleteHack.java b/src/main/java/net/wurstclient/hacks/AutoCompleteHack.java index 98a7db80b5..0ed38e2329 100644 --- a/src/main/java/net/wurstclient/hacks/AutoCompleteHack.java +++ b/src/main/java/net/wurstclient/hacks/AutoCompleteHack.java @@ -17,10 +17,8 @@ import net.wurstclient.events.ChatOutputListener; import net.wurstclient.events.UpdateListener; import net.wurstclient.hack.Hack; -import net.wurstclient.hacks.autocomplete.ApiProviderSetting; import net.wurstclient.hacks.autocomplete.MessageCompleter; import net.wurstclient.hacks.autocomplete.ModelSettings; -import net.wurstclient.hacks.autocomplete.OobaboogaMessageCompleter; import net.wurstclient.hacks.autocomplete.OpenAiMessageCompleter; import net.wurstclient.hacks.autocomplete.SuggestionHandler; import net.wurstclient.util.ChatUtils; @@ -32,7 +30,6 @@ public final class AutoCompleteHack extends Hack { private final ModelSettings modelSettings = new ModelSettings(); private final SuggestionHandler suggestionHandler = new SuggestionHandler(); - private final ApiProviderSetting apiProvider = new ApiProviderSetting(); private MessageCompleter completer; private String draftMessage; @@ -47,7 +44,6 @@ public AutoCompleteHack() super("AutoComplete"); setCategory(Category.CHAT); - addSetting(apiProvider); modelSettings.forEach(this::addSetting); suggestionHandler.getSettings().forEach(this::addSetting); } @@ -55,11 +51,7 @@ public AutoCompleteHack() @Override protected void onEnable() { - completer = switch(apiProvider.getSelected()) - { - case OPENAI -> new OpenAiMessageCompleter(modelSettings); - case OOBABOOGA -> new OobaboogaMessageCompleter(modelSettings); - }; + completer = new OpenAiMessageCompleter(modelSettings); if(completer instanceof OpenAiMessageCompleter && System.getenv("WURST_OPENAI_KEY") == null) @@ -117,7 +109,9 @@ public void onUpdate() return; // check if we already have a suggestion for the current draft message - if(suggestionHandler.hasEnoughSuggestionFor(draftMessage)) + int maxSuggestions = + suggestionHandler.getMaxSuggestionsFor(draftMessage); + if(maxSuggestions < 1) return; // copy fields to local variables, in case they change @@ -129,14 +123,21 @@ public void onUpdate() // build thread apiCallThread = new Thread(() -> { - // get suggestion - String suggestion = completer.completeChatMessage(draftMessage2); - if(suggestion.isEmpty()) + // get suggestions + String[] suggestions = + completer.completeChatMessage(draftMessage2, maxSuggestions); + if(suggestions.length < 1) return; - // apply suggestion - suggestionHandler.addSuggestion(suggestion, draftMessage2, - suggestionsUpdater2); + for(String suggestion : suggestions) + { + if(suggestion.isEmpty()) + continue; + + // apply suggestion + suggestionHandler.addSuggestion(suggestion, draftMessage2, + suggestionsUpdater2); + } }); apiCallThread.setName("AutoComplete API Call"); apiCallThread.setPriority(Thread.MIN_PRIORITY); diff --git a/src/main/java/net/wurstclient/hacks/AutoEatHack.java b/src/main/java/net/wurstclient/hacks/AutoEatHack.java index edff4edfb8..7cb5074cac 100644 --- a/src/main/java/net/wurstclient/hacks/AutoEatHack.java +++ b/src/main/java/net/wurstclient/hacks/AutoEatHack.java @@ -110,6 +110,7 @@ public AutoEatHack() @Override protected void onEnable() { + WURST.getHax().autoSoupHack.setEnabled(false); EVENTS.add(UpdateListener.class, this); } diff --git a/src/main/java/net/wurstclient/hacks/AutoLibrarianHack.java b/src/main/java/net/wurstclient/hacks/AutoLibrarianHack.java index 77836a7761..46278bdfe9 100644 --- a/src/main/java/net/wurstclient/hacks/AutoLibrarianHack.java +++ b/src/main/java/net/wurstclient/hacks/AutoLibrarianHack.java @@ -337,7 +337,8 @@ private void placeJobSite() ? Hand.MAIN_HAND : Hand.OFF_HAND; // sneak-place to avoid activating trapdoors/chests/etc. - MC.options.sneakKey.setPressed(true); + IKeyBinding sneakKey = IKeyBinding.get(MC.options.sneakKey); + sneakKey.setPressed(true); if(!MC.player.isSneaking()) return; @@ -345,7 +346,7 @@ private void placeJobSite() BlockPlacingParams params = BlockPlacer.getBlockPlacingParams(jobSite); if(params == null) { - ((IKeyBinding)MC.options.sneakKey).resetPressedState(); + sneakKey.resetPressedState(); return; } @@ -361,7 +362,7 @@ private void placeJobSite() swingHand.swing(hand); // reset sneak - ((IKeyBinding)MC.options.sneakKey).resetPressedState(); + sneakKey.resetPressedState(); } private void openTradeScreen() diff --git a/src/main/java/net/wurstclient/hacks/AutoSoupHack.java b/src/main/java/net/wurstclient/hacks/AutoSoupHack.java index d49d10caec..db49acab34 100644 --- a/src/main/java/net/wurstclient/hacks/AutoSoupHack.java +++ b/src/main/java/net/wurstclient/hacks/AutoSoupHack.java @@ -47,6 +47,7 @@ public AutoSoupHack() @Override protected void onEnable() { + WURST.getHax().autoEatHack.setEnabled(false); EVENTS.add(UpdateListener.class, this); } diff --git a/src/main/java/net/wurstclient/hacks/AutoWalkHack.java b/src/main/java/net/wurstclient/hacks/AutoWalkHack.java index 2004e586ed..5a27def003 100644 --- a/src/main/java/net/wurstclient/hacks/AutoWalkHack.java +++ b/src/main/java/net/wurstclient/hacks/AutoWalkHack.java @@ -32,7 +32,7 @@ protected void onEnable() protected void onDisable() { EVENTS.remove(UpdateListener.class, this); - ((IKeyBinding)MC.options.forwardKey).resetPressedState(); + IKeyBinding.get(MC.options.forwardKey).resetPressedState(); } @Override diff --git a/src/main/java/net/wurstclient/hacks/BonemealAuraHack.java b/src/main/java/net/wurstclient/hacks/BonemealAuraHack.java index fb2e577105..a01e758479 100644 --- a/src/main/java/net/wurstclient/hacks/BonemealAuraHack.java +++ b/src/main/java/net/wurstclient/hacks/BonemealAuraHack.java @@ -9,31 +9,33 @@ import java.util.ArrayList; import java.util.Comparator; -import java.util.function.Predicate; import java.util.stream.Collectors; import net.minecraft.block.*; -import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.client.world.ClientWorld; -import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.util.Hand; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; import net.minecraft.util.math.Vec3d; import net.wurstclient.Category; import net.wurstclient.SearchTags; -import net.wurstclient.events.UpdateListener; +import net.wurstclient.events.PostMotionListener; import net.wurstclient.hack.Hack; import net.wurstclient.settings.CheckboxSetting; import net.wurstclient.settings.EnumSetting; import net.wurstclient.settings.SliderSetting; import net.wurstclient.settings.SliderSetting.ValueDisplay; +import net.wurstclient.settings.SwingHandSetting.SwingHand; +import net.wurstclient.util.BlockBreaker; +import net.wurstclient.util.BlockBreaker.BlockBreakingParams; import net.wurstclient.util.BlockUtils; +import net.wurstclient.util.InteractionSimulator; +import net.wurstclient.util.InventoryUtils; import net.wurstclient.util.RotationUtils; -@SearchTags({"bonemeal aura", "bone meal aura", "AutoBone", "auto bone"}) -public final class BonemealAuraHack extends Hack implements UpdateListener +@SearchTags({"bonemeal aura", "bone meal aura", "AutoBonemeal", "auto bonemeal", + "auto bone meal", "fertilizer"}) +public final class BonemealAuraHack extends Hack implements PostMotionListener { private final SliderSetting range = new SliderSetting("Range", 4.25, 1, 6, 0.05, ValueDisplay.DECIMAL); @@ -53,22 +55,24 @@ public final class BonemealAuraHack extends Hack implements UpdateListener private final CheckboxSetting saplings = new CheckboxSetting("Saplings", true); + private final CheckboxSetting crops = new CheckboxSetting("Crops", "Wheat, carrots, potatoes and beetroots.", true); + private final CheckboxSetting stems = new CheckboxSetting("Stems", "Pumpkins and melons.", true); + private final CheckboxSetting cocoa = new CheckboxSetting("Cocoa", true); + private final CheckboxSetting other = new CheckboxSetting("Other", false); public BonemealAuraHack() { super("BonemealAura"); - setCategory(Category.BLOCKS); addSetting(range); addSetting(mode); addSetting(automationLevel); - addSetting(saplings); addSetting(crops); addSetting(stems); @@ -79,25 +83,24 @@ public BonemealAuraHack() @Override protected void onEnable() { - EVENTS.add(UpdateListener.class, this); + EVENTS.add(PostMotionListener.class, this); } @Override protected void onDisable() { - EVENTS.remove(UpdateListener.class, this); + EVENTS.remove(PostMotionListener.class, this); } @Override - public void onUpdate() + public void onPostMotion() { // wait for right click timer if(MC.itemUseCooldown > 0) return; // get valid blocks - ArrayList validBlocks = - getValidBlocks(range.getValue(), this::isCorrectBlock); + ArrayList validBlocks = getValidBlocks(); if(validBlocks.isEmpty()) return; @@ -107,10 +110,10 @@ public void onUpdate() return; // check held item - ItemStack stack = MC.player.getInventory().getMainHandStack(); - if(stack.isEmpty() || stack.getItem() != Items.BONE_MEAL) + if(!MC.player.isHolding(Items.BONE_MEAL)) { - selectBonemeal(); + InventoryUtils.selectItem(Items.BONE_MEAL, + automationLevel.getSelected().maxInvSlot); return; } @@ -140,59 +143,23 @@ public void onUpdate() } } - private void selectBonemeal() + private ArrayList getValidBlocks() { - ClientPlayerEntity player = MC.player; - int maxInvSlot = automationLevel.getSelected().maxInvSlot; + Vec3d eyesVec = RotationUtils.getEyesPos(); + BlockPos eyesBlock = BlockPos.ofFloored(eyesVec); + double rangeSq = range.getValueSq(); + int blockRange = range.getValueCeil(); - for(int slot = 0; slot < maxInvSlot; slot++) - { - if(slot == player.getInventory().selectedSlot) - continue; - - ItemStack stack = player.getInventory().getStack(slot); - if(stack.isEmpty() || stack.getItem() != Items.BONE_MEAL) - continue; - - if(slot < 9) - player.getInventory().selectedSlot = slot; - else if(player.getInventory().getEmptySlot() < 9) - IMC.getInteractionManager().windowClick_QUICK_MOVE(slot); - else if(player.getInventory().getEmptySlot() != -1) - { - IMC.getInteractionManager().windowClick_QUICK_MOVE( - player.getInventory().selectedSlot + 36); - IMC.getInteractionManager().windowClick_QUICK_MOVE(slot); - }else - { - IMC.getInteractionManager().windowClick_PICKUP( - player.getInventory().selectedSlot + 36); - IMC.getInteractionManager().windowClick_PICKUP(slot); - IMC.getInteractionManager().windowClick_PICKUP( - player.getInventory().selectedSlot + 36); - } - - return; - } - } - - private ArrayList getValidBlocks(double range, - Predicate validator) - { - Vec3d eyesVec = RotationUtils.getEyesPos().subtract(0.5, 0.5, 0.5); - double rangeSq = Math.pow(range + 0.5, 2); - int rangeI = (int)Math.ceil(range); + // As plants are bone-mealed, they will grow larger and prevent line of + // sight to other plants behind them. That's why we need to bone-meal + // the farthest plants first. + Comparator farthestFirst = Comparator + .comparingDouble((BlockPos pos) -> pos.getSquaredDistance(eyesVec)) + .reversed(); - BlockPos center = BlockPos.ofFloored(RotationUtils.getEyesPos()); - BlockPos min = center.add(-rangeI, -rangeI, -rangeI); - BlockPos max = center.add(rangeI, rangeI, rangeI); - - Comparator c = Comparator. comparingDouble( - pos -> eyesVec.squaredDistanceTo(Vec3d.of(pos))).reversed(); - - return BlockUtils.getAllInBox(min, max).stream() - .filter(pos -> eyesVec.squaredDistanceTo(Vec3d.of(pos)) <= rangeSq) - .filter(validator).sorted(c) + return BlockUtils.getAllInBoxStream(eyesBlock, blockRange) + .filter(pos -> pos.getSquaredDistance(eyesVec) <= rangeSq) + .filter(this::isCorrectBlock).sorted(farthestFirst) .collect(Collectors.toCollection(ArrayList::new)); } @@ -202,95 +169,67 @@ private boolean isCorrectBlock(BlockPos pos) BlockState state = BlockUtils.getState(pos); ClientWorld world = MC.world; - if(!(block instanceof Fertilizable) || block instanceof GrassBlock - || !((Fertilizable)block).canGrow(world, MC.world.random, pos, - state)) + if(!(block instanceof Fertilizable fBlock) + || !fBlock.canGrow(world, world.random, pos, state)) return false; - if(block instanceof SaplingBlock - && ((SaplingBlock)block).isFertilizable(world, pos, state)) + if(block instanceof GrassBlock) + return false; + + if(block instanceof SaplingBlock sapling + && sapling.isFertilizable(world, pos, state)) return saplings.isChecked(); - if(block instanceof CropBlock - && ((CropBlock)block).isFertilizable(world, pos, state)) + + if(block instanceof CropBlock crop + && crop.isFertilizable(world, pos, state)) return crops.isChecked(); - if(block instanceof StemBlock - && ((StemBlock)block).isFertilizable(world, pos, state)) + + if(block instanceof StemBlock stem + && stem.isFertilizable(world, pos, state)) return stems.isChecked(); - if(block instanceof CocoaBlock - && ((CocoaBlock)block).isFertilizable(world, pos, state)) + + if(block instanceof CocoaBlock cocoaBlock + && cocoaBlock.isFertilizable(world, pos, state)) return cocoa.isChecked(); + return other.isChecked(); } private boolean rightClickBlockLegit(BlockPos pos) { - Vec3d eyesPos = RotationUtils.getEyesPos(); - Vec3d posVec = Vec3d.ofCenter(pos); - double distanceSqPosVec = eyesPos.squaredDistanceTo(posVec); - - for(Direction side : Direction.values()) - { - Vec3d hitVec = posVec.add(Vec3d.of(side.getVector()).multiply(0.5)); - double distanceSqHitVec = eyesPos.squaredDistanceTo(hitVec); - - // check if hitVec is within range (4.25 blocks) - if(distanceSqHitVec > 18.0625) - continue; - - // check if side is facing towards player - if(distanceSqHitVec >= distanceSqPosVec) - continue; - - // check line of sight - if(!BlockUtils.hasLineOfSight(eyesPos, hitVec)) - continue; - - // face block - WURST.getRotationFaker().faceVectorPacket(hitVec); - - // place block - IMC.getInteractionManager().rightClickBlock(pos, side, hitVec); - MC.player.swingHand(Hand.MAIN_HAND); - MC.itemUseCooldown = 4; - + // if breaking or riding, stop and don't try other blocks + if(MC.interactionManager.isBreakingBlock() || MC.player.isRiding()) return true; - } - return false; + // if this block is unreachable, try the next one + BlockBreakingParams params = BlockBreaker.getBlockBreakingParams(pos); + if(params == null || params.distanceSq() > range.getValueSq() + || !params.lineOfSight()) + return false; + + // face and right click the block + MC.itemUseCooldown = 4; + WURST.getRotationFaker().faceVectorPacket(params.hitVec()); + InteractionSimulator.rightClickBlock(params.toHitResult()); + return true; } private boolean rightClickBlockSimple(BlockPos pos) { - Vec3d eyesPos = RotationUtils.getEyesPos(); - Vec3d posVec = Vec3d.ofCenter(pos); - double distanceSqPosVec = eyesPos.squaredDistanceTo(posVec); - - for(Direction side : Direction.values()) - { - Vec3d hitVec = posVec.add(Vec3d.of(side.getVector()).multiply(0.5)); - double distanceSqHitVec = eyesPos.squaredDistanceTo(hitVec); - - // check if hitVec is within range (6 blocks) - if(distanceSqHitVec > 36) - continue; - - // check if side is facing towards player - if(distanceSqHitVec >= distanceSqPosVec) - continue; - - // place block - IMC.getInteractionManager().rightClickBlock(pos, side, hitVec); - - return true; - } + // if this block is unreachable, try the next one + BlockBreakingParams params = BlockBreaker.getBlockBreakingParams(pos); + if(params == null) + return false; - return false; + // right click the block + InteractionSimulator.rightClickBlock(params.toHitResult(), + SwingHand.OFF); + return true; } private enum Mode { FAST("Fast"), - LEGIT("Legit"); private final String name; @@ -310,9 +249,7 @@ public String toString() private enum AutomationLevel { RIGHT_CLICK("Right Click", 0), - HOTBAR("Hotbar", 9), - INVENTORY("Inventory", 36); private final String name; diff --git a/src/main/java/net/wurstclient/hacks/CreativeFlightHack.java b/src/main/java/net/wurstclient/hacks/CreativeFlightHack.java index 7966ff1895..557c6f56b3 100644 --- a/src/main/java/net/wurstclient/hacks/CreativeFlightHack.java +++ b/src/main/java/net/wurstclient/hacks/CreativeFlightHack.java @@ -124,9 +124,9 @@ private void setMotionY(double motionY) private void restoreKeyPresses() { - KeyBinding[] bindings = {MC.options.jumpKey, MC.options.sneakKey}; + KeyBinding[] keys = {MC.options.jumpKey, MC.options.sneakKey}; - for(KeyBinding binding : bindings) - ((IKeyBinding)binding).resetPressedState(); + for(KeyBinding key : keys) + IKeyBinding.get(key).resetPressedState(); } } diff --git a/src/main/java/net/wurstclient/hacks/CrystalAuraHack.java b/src/main/java/net/wurstclient/hacks/CrystalAuraHack.java index aa0f5e7079..223ee71f11 100644 --- a/src/main/java/net/wurstclient/hacks/CrystalAuraHack.java +++ b/src/main/java/net/wurstclient/hacks/CrystalAuraHack.java @@ -35,6 +35,8 @@ import net.wurstclient.settings.FacingSetting.Facing; import net.wurstclient.settings.SliderSetting; import net.wurstclient.settings.SliderSetting.ValueDisplay; +import net.wurstclient.settings.SwingHandSetting; +import net.wurstclient.settings.SwingHandSetting.SwingHand; import net.wurstclient.settings.filterlists.CrystalAuraFilterList; import net.wurstclient.settings.filterlists.EntityFilterList; import net.wurstclient.util.BlockUtils; @@ -68,6 +70,11 @@ public final class CrystalAuraHack extends Hack implements UpdateListener + "Slower but can help with anti-cheat plugins.", false); + private final SwingHandSetting swingHand = new SwingHandSetting( + "How CrystalAura should swing your hand when placing and detonating" + + " end crystals.", + SwingHand.CLIENT); + private final EnumSetting takeItemsFrom = new EnumSetting<>("Take items from", "Where to look for end crystals.", TakeItemsFrom.values(), TakeItemsFrom.INVENTORY); @@ -84,6 +91,7 @@ public CrystalAuraHack() addSetting(autoPlace); addSetting(faceBlocks); addSetting(checkLOS); + addSetting(swingHand); addSetting(takeItemsFrom); entityFilters.forEach(this::addSetting); @@ -155,7 +163,7 @@ private ArrayList placeCrystalsNear(ArrayList targets) } if(shouldSwing) - MC.player.swingHand(Hand.MAIN_HAND); + swingHand.swing(Hand.MAIN_HAND); return newCrystals; } @@ -169,7 +177,7 @@ private void detonate(ArrayList crystals) } if(!crystals.isEmpty()) - MC.player.swingHand(Hand.MAIN_HAND); + swingHand.swing(Hand.MAIN_HAND); } private boolean placeCrystal(BlockPos pos) diff --git a/src/main/java/net/wurstclient/hacks/FastBreakHack.java b/src/main/java/net/wurstclient/hacks/FastBreakHack.java index 3476428839..290fb2b6c9 100644 --- a/src/main/java/net/wurstclient/hacks/FastBreakHack.java +++ b/src/main/java/net/wurstclient/hacks/FastBreakHack.java @@ -100,6 +100,10 @@ public void onBlockBreakingProgress(BlockBreakingProgressEvent event) fastBreakBlock = random.nextDouble() <= activationChance.getValue(); } + // Ignore unbreakable blocks to avoid slowdown issue + if(MC.world.getBlockState(blockPos).getBlock().getHardness() < 0) + return; + if(!fastBreakBlock) return; diff --git a/src/main/java/net/wurstclient/hacks/FeedAuraHack.java b/src/main/java/net/wurstclient/hacks/FeedAuraHack.java index 0e74c98299..c4b1de4b81 100644 --- a/src/main/java/net/wurstclient/hacks/FeedAuraHack.java +++ b/src/main/java/net/wurstclient/hacks/FeedAuraHack.java @@ -67,8 +67,9 @@ public final class FeedAuraHack extends Hack private final CheckboxSetting filterHorses = new CheckboxSetting( "Filter horse-like animals", "Won't feed horses, llamas, donkeys, etc.\n" - + "Recommended due to Minecraft bug MC-233276, which causes these animals to consume items indefinitely.", - true); + + "Recommended in Minecraft versions before 1.20.3 due to MC-233276," + + "which causes these animals to consume items indefinitely.", + false); private final Random random = new Random(); private AnimalEntity target; diff --git a/src/main/java/net/wurstclient/hacks/FightBotHack.java b/src/main/java/net/wurstclient/hacks/FightBotHack.java index d7353ffafe..c36ac15339 100644 --- a/src/main/java/net/wurstclient/hacks/FightBotHack.java +++ b/src/main/java/net/wurstclient/hacks/FightBotHack.java @@ -34,6 +34,8 @@ import net.wurstclient.settings.PauseAttackOnContainersSetting; import net.wurstclient.settings.SliderSetting; import net.wurstclient.settings.SliderSetting.ValueDisplay; +import net.wurstclient.settings.SwingHandSetting; +import net.wurstclient.settings.SwingHandSetting.SwingHand; import net.wurstclient.settings.filterlists.EntityFilterList; import net.wurstclient.util.EntityUtils; @@ -48,6 +50,10 @@ public final class FightBotHack extends Hack private final AttackSpeedSliderSetting speed = new AttackSpeedSliderSetting(); + private final SwingHandSetting swingHand = new SwingHandSetting( + "How FightBot should swing your hand when attacking.", + SwingHand.CLIENT); + private final SliderSetting distance = new SliderSetting("Distance", "How closely to follow the target.\n" + "This should be set to a lower value than Range.", @@ -73,6 +79,7 @@ public FightBotHack() setCategory(Category.COMBAT); addSetting(range); addSetting(speed); + addSetting(swingHand); addSetting(distance); addSetting(useAi); addSetting(pauseOnContainers); @@ -211,7 +218,7 @@ else if(MC.player.getY() < entity.getY() - 1D) // attack entity WURST.getHax().criticalsHack.doCritical(); MC.interactionManager.attackEntity(MC.player, entity); - MC.player.swingHand(Hand.MAIN_HAND); + swingHand.swing(Hand.MAIN_HAND); speed.resetTimer(); } diff --git a/src/main/java/net/wurstclient/hacks/FreecamHack.java b/src/main/java/net/wurstclient/hacks/FreecamHack.java index f6527745d0..dd86ee48c4 100644 --- a/src/main/java/net/wurstclient/hacks/FreecamHack.java +++ b/src/main/java/net/wurstclient/hacks/FreecamHack.java @@ -83,12 +83,12 @@ protected void onEnable() fakePlayer = new FakePlayerEntity(); - GameOptions gs = MC.options; - KeyBinding[] bindings = {gs.forwardKey, gs.backKey, gs.leftKey, - gs.rightKey, gs.jumpKey, gs.sneakKey}; + GameOptions opt = MC.options; + KeyBinding[] bindings = {opt.forwardKey, opt.backKey, opt.leftKey, + opt.rightKey, opt.jumpKey, opt.sneakKey}; for(KeyBinding binding : bindings) - ((IKeyBinding)binding).resetPressedState(); + IKeyBinding.get(binding).resetPressedState(); } @Override diff --git a/src/main/java/net/wurstclient/hacks/InvWalkHack.java b/src/main/java/net/wurstclient/hacks/InvWalkHack.java index 95af300f79..4a71aa57bf 100644 --- a/src/main/java/net/wurstclient/hacks/InvWalkHack.java +++ b/src/main/java/net/wurstclient/hacks/InvWalkHack.java @@ -93,7 +93,7 @@ public void onUpdate() keys.add(MC.options.jumpKey); for(KeyBinding key : keys) - ((IKeyBinding)key).resetPressedState(); + IKeyBinding.get(key).resetPressedState(); } private boolean isAllowedScreen(Screen screen) diff --git a/src/main/java/net/wurstclient/hacks/KillauraHack.java b/src/main/java/net/wurstclient/hacks/KillauraHack.java index cb06046bd1..58c7c24423 100644 --- a/src/main/java/net/wurstclient/hacks/KillauraHack.java +++ b/src/main/java/net/wurstclient/hacks/KillauraHack.java @@ -15,7 +15,6 @@ import com.mojang.blaze3d.systems.RenderSystem; -import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.client.render.GameRenderer; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.Entity; @@ -36,6 +35,8 @@ import net.wurstclient.settings.PauseAttackOnContainersSetting; import net.wurstclient.settings.SliderSetting; import net.wurstclient.settings.SliderSetting.ValueDisplay; +import net.wurstclient.settings.SwingHandSetting; +import net.wurstclient.settings.SwingHandSetting.SwingHand; import net.wurstclient.settings.filterlists.EntityFilterList; import net.wurstclient.util.BlockUtils; import net.wurstclient.util.EntityUtils; @@ -66,6 +67,10 @@ public final class KillauraHack extends Hack private final SliderSetting fov = new SliderSetting("FOV", 360, 30, 360, 10, ValueDisplay.DEGREES); + private final SwingHandSetting swingHand = new SwingHandSetting( + "How Killaura should swing your hand when attacking.", + SwingHand.CLIENT); + private final CheckboxSetting damageIndicator = new CheckboxSetting( "Damage indicator", "Renders a colored box within the target, inversely proportional to its remaining health.", @@ -95,6 +100,7 @@ public KillauraHack() addSetting(speed); addSetting(priority); addSetting(fov); + addSetting(swingHand); addSetting(damageIndicator); addSetting(pauseOnContainers); addSetting(checkLOS); @@ -144,7 +150,7 @@ public void onUpdate() return; Stream stream = EntityUtils.getAttackableEntities(); - double rangeSq = Math.pow(range.getValue(), 2); + double rangeSq = range.getValueSq(); stream = stream.filter(e -> MC.player.squaredDistanceTo(e) <= rangeSq); if(fov.getValue() < 360.0) @@ -177,9 +183,8 @@ public void onPostMotion() return; WURST.getHax().criticalsHack.doCritical(); - ClientPlayerEntity player = MC.player; - MC.interactionManager.attackEntity(player, target); - player.swingHand(Hand.MAIN_HAND); + MC.interactionManager.attackEntity(MC.player, target); + swingHand.swing(Hand.MAIN_HAND); target = null; speed.resetTimer(); diff --git a/src/main/java/net/wurstclient/hacks/KillauraLegitHack.java b/src/main/java/net/wurstclient/hacks/KillauraLegitHack.java index 1145b60615..7245e35aa6 100644 --- a/src/main/java/net/wurstclient/hacks/KillauraLegitHack.java +++ b/src/main/java/net/wurstclient/hacks/KillauraLegitHack.java @@ -16,7 +16,6 @@ import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.gui.screen.ingame.HandledScreen; -import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.client.render.GameRenderer; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.Entity; @@ -35,6 +34,8 @@ import net.wurstclient.settings.EnumSetting; import net.wurstclient.settings.SliderSetting; import net.wurstclient.settings.SliderSetting.ValueDisplay; +import net.wurstclient.settings.SwingHandSetting; +import net.wurstclient.settings.SwingHandSetting.SwingHand; import net.wurstclient.settings.filterlists.EntityFilterList; import net.wurstclient.settings.filters.*; import net.wurstclient.util.BlockUtils; @@ -69,6 +70,11 @@ public final class KillauraLegitHack extends Hack + "360\u00b0 = entities can be attacked all around you.", 360, 30, 360, 10, ValueDisplay.DEGREES); + private final SwingHandSetting swingHand = + SwingHandSetting.withoutOffOption( + "How KillauraLegit should swing your hand when attacking.", + SwingHand.CLIENT); + private final CheckboxSetting damageIndicator = new CheckboxSetting( "Damage indicator", "Renders a colored box within the target, inversely proportional to its remaining health.", @@ -119,6 +125,7 @@ public KillauraLegitHack() addSetting(rotationSpeed); addSetting(priority); addSetting(fov); + addSetting(swingHand); addSetting(damageIndicator); entityFilters.forEach(this::addSetting); @@ -162,8 +169,6 @@ public void onUpdate() if(MC.currentScreen instanceof HandledScreen) return; - ClientPlayerEntity player = MC.player; - Stream stream = EntityUtils.getAttackableEntities(); double rangeSq = Math.pow(range.getValue(), 2); stream = stream.filter(e -> MC.player.squaredDistanceTo(e) <= rangeSq); @@ -193,8 +198,8 @@ public void onUpdate() // attack entity WURST.getHax().criticalsHack.doCritical(); - MC.interactionManager.attackEntity(player, target); - player.swingHand(Hand.MAIN_HAND); + MC.interactionManager.attackEntity(MC.player, target); + swingHand.swing(Hand.MAIN_HAND); speed.resetTimer(); } diff --git a/src/main/java/net/wurstclient/hacks/LsdHack.java b/src/main/java/net/wurstclient/hacks/LsdHack.java index 6905c592e6..8f33242b0d 100644 --- a/src/main/java/net/wurstclient/hacks/LsdHack.java +++ b/src/main/java/net/wurstclient/hacks/LsdHack.java @@ -35,7 +35,7 @@ protected void onEnable() MC.gameRenderer.disablePostProcessor(); MC.gameRenderer - .loadPostProcessor(new Identifier("shaders/post/wobble.json")); + .loadPostProcessor(new Identifier("shaders/post/lsd.json")); } @Override diff --git a/src/main/java/net/wurstclient/hacks/MileyCyrusHack.java b/src/main/java/net/wurstclient/hacks/MileyCyrusHack.java index 5a87395178..8bb8a3451e 100644 --- a/src/main/java/net/wurstclient/hacks/MileyCyrusHack.java +++ b/src/main/java/net/wurstclient/hacks/MileyCyrusHack.java @@ -43,7 +43,7 @@ protected void onEnable() protected void onDisable() { EVENTS.remove(UpdateListener.class, this); - ((IKeyBinding)MC.options.sneakKey).resetPressedState(); + IKeyBinding.get(MC.options.sneakKey).resetPressedState(); } @Override diff --git a/src/main/java/net/wurstclient/hacks/MultiAuraHack.java b/src/main/java/net/wurstclient/hacks/MultiAuraHack.java index e812a9a53a..2809c7cc6e 100644 --- a/src/main/java/net/wurstclient/hacks/MultiAuraHack.java +++ b/src/main/java/net/wurstclient/hacks/MultiAuraHack.java @@ -11,7 +11,6 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.entity.Entity; import net.minecraft.util.Hand; import net.wurstclient.Category; @@ -22,6 +21,8 @@ import net.wurstclient.settings.PauseAttackOnContainersSetting; import net.wurstclient.settings.SliderSetting; import net.wurstclient.settings.SliderSetting.ValueDisplay; +import net.wurstclient.settings.SwingHandSetting; +import net.wurstclient.settings.SwingHandSetting.SwingHand; import net.wurstclient.settings.filterlists.EntityFilterList; import net.wurstclient.util.EntityUtils; import net.wurstclient.util.RotationUtils; @@ -38,6 +39,10 @@ public final class MultiAuraHack extends Hack implements UpdateListener private final SliderSetting fov = new SliderSetting("FOV", 360, 30, 360, 10, ValueDisplay.DEGREES); + private final SwingHandSetting swingHand = new SwingHandSetting( + "How MultiAura should swing your hand when attacking.", + SwingHand.CLIENT); + private final PauseAttackOnContainersSetting pauseOnContainers = new PauseAttackOnContainersSetting(false); @@ -52,6 +57,7 @@ public MultiAuraHack() addSetting(range); addSetting(speed); addSetting(fov); + addSetting(swingHand); addSetting(pauseOnContainers); entityFilters.forEach(this::addSetting); @@ -91,8 +97,6 @@ public void onUpdate() if(pauseOnContainers.shouldPause()) return; - ClientPlayerEntity player = MC.player; - // get entities Stream stream = EntityUtils.getAttackableEntities(); double rangeSq = Math.pow(range.getValue(), 2); @@ -119,10 +123,10 @@ public void onUpdate() .sendPlayerLookPacket(); WURST.getHax().criticalsHack.doCritical(); - MC.interactionManager.attackEntity(player, entity); + MC.interactionManager.attackEntity(MC.player, entity); } - player.swingHand(Hand.MAIN_HAND); + swingHand.swing(Hand.MAIN_HAND); speed.resetTimer(); } } diff --git a/src/main/java/net/wurstclient/hacks/ProtectHack.java b/src/main/java/net/wurstclient/hacks/ProtectHack.java index 87dc006208..b3d3132bd7 100644 --- a/src/main/java/net/wurstclient/hacks/ProtectHack.java +++ b/src/main/java/net/wurstclient/hacks/ProtectHack.java @@ -30,6 +30,8 @@ import net.wurstclient.settings.AttackSpeedSliderSetting; import net.wurstclient.settings.CheckboxSetting; import net.wurstclient.settings.PauseAttackOnContainersSetting; +import net.wurstclient.settings.SwingHandSetting; +import net.wurstclient.settings.SwingHandSetting.SwingHand; import net.wurstclient.settings.filterlists.EntityFilterList; import net.wurstclient.settings.filters.*; import net.wurstclient.util.EntityUtils; @@ -42,6 +44,9 @@ public final class ProtectHack extends Hack private final AttackSpeedSliderSetting speed = new AttackSpeedSliderSetting(); + private final SwingHandSetting swingHand = new SwingHandSetting( + "How Protect should swing your hand when attacking.", SwingHand.CLIENT); + private final CheckboxSetting useAi = new CheckboxSetting("Use AI (experimental)", false); @@ -94,6 +99,7 @@ public ProtectHack() setCategory(Category.COMBAT); addSetting(speed); + addSetting(swingHand); addSetting(useAi); addSetting(pauseOnContainers); @@ -281,7 +287,7 @@ else if(MC.player.getY() < target.getY() - 1D) // attack enemy WURST.getHax().criticalsHack.doCritical(); MC.interactionManager.attackEntity(MC.player, enemy); - MC.player.swingHand(Hand.MAIN_HAND); + swingHand.swing(Hand.MAIN_HAND); speed.resetTimer(); } } diff --git a/src/main/java/net/wurstclient/hacks/SafeWalkHack.java b/src/main/java/net/wurstclient/hacks/SafeWalkHack.java index 4e5267191c..03d959434a 100644 --- a/src/main/java/net/wurstclient/hacks/SafeWalkHack.java +++ b/src/main/java/net/wurstclient/hacks/SafeWalkHack.java @@ -8,7 +8,6 @@ package net.wurstclient.hacks; import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.client.option.KeyBinding; import net.minecraft.util.math.Box; import net.wurstclient.Category; import net.wurstclient.SearchTags; @@ -18,7 +17,8 @@ import net.wurstclient.settings.SliderSetting; import net.wurstclient.settings.SliderSetting.ValueDisplay; -@SearchTags({"safe walk"}) +@SearchTags({"safe walk", "SneakSafety", "sneak safety", "SpeedBridgeHelper", + "speed bridge helper"}) public final class SafeWalkHack extends Hack { private final CheckboxSetting sneak = @@ -78,12 +78,12 @@ public void onClipAtLedge(boolean clipping) private void setSneaking(boolean sneaking) { - KeyBinding sneakKey = MC.options.sneakKey; + IKeyBinding sneakKey = IKeyBinding.get(MC.options.sneakKey); if(sneaking) sneakKey.setPressed(true); else - ((IKeyBinding)sneakKey).resetPressedState(); + sneakKey.resetPressedState(); this.sneaking = sneaking; } diff --git a/src/main/java/net/wurstclient/hacks/SneakHack.java b/src/main/java/net/wurstclient/hacks/SneakHack.java index 5deb8cf1d7..ed3d12b03c 100644 --- a/src/main/java/net/wurstclient/hacks/SneakHack.java +++ b/src/main/java/net/wurstclient/hacks/SneakHack.java @@ -8,7 +8,6 @@ package net.wurstclient.hacks; import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.client.option.KeyBinding; import net.minecraft.network.packet.c2s.play.ClientCommandC2SPacket; import net.minecraft.network.packet.c2s.play.ClientCommandC2SPacket.Mode; import net.wurstclient.Category; @@ -67,8 +66,7 @@ protected void onDisable() switch(mode.getSelected()) { case LEGIT: - IKeyBinding sneakKey = (IKeyBinding)MC.options.sneakKey; - sneakKey.resetPressedState(); + IKeyBinding.get(MC.options.sneakKey).resetPressedState(); break; case PACKET: @@ -80,19 +78,19 @@ protected void onDisable() @Override public void onPreMotion() { - KeyBinding sneakKey = MC.options.sneakKey; + IKeyBinding sneakKey = IKeyBinding.get(MC.options.sneakKey); switch(mode.getSelected()) { case LEGIT: if(offWhileFlying.isChecked() && isFlying()) - ((IKeyBinding)sneakKey).resetPressedState(); + sneakKey.resetPressedState(); else sneakKey.setPressed(true); break; case PACKET: - ((IKeyBinding)sneakKey).resetPressedState(); + sneakKey.resetPressedState(); sendSneakPacket(Mode.PRESS_SHIFT_KEY); sendSneakPacket(Mode.RELEASE_SHIFT_KEY); break; diff --git a/src/main/java/net/wurstclient/hacks/TillauraHack.java b/src/main/java/net/wurstclient/hacks/TillauraHack.java index 3586bbd3f6..a30be4f474 100644 --- a/src/main/java/net/wurstclient/hacks/TillauraHack.java +++ b/src/main/java/net/wurstclient/hacks/TillauraHack.java @@ -8,34 +8,34 @@ package net.wurstclient.hacks; import java.util.ArrayList; -import java.util.Arrays; import java.util.Comparator; import java.util.List; -import java.util.function.Predicate; import java.util.stream.Collectors; import net.minecraft.block.Block; import net.minecraft.block.Blocks; import net.minecraft.item.HoeItem; -import net.minecraft.item.ItemStack; import net.minecraft.util.Hand; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; import net.minecraft.util.math.Vec3d; import net.wurstclient.Category; import net.wurstclient.SearchTags; -import net.wurstclient.events.UpdateListener; +import net.wurstclient.events.PostMotionListener; import net.wurstclient.hack.Hack; import net.wurstclient.settings.CheckboxSetting; import net.wurstclient.settings.SliderSetting; import net.wurstclient.settings.SliderSetting.ValueDisplay; +import net.wurstclient.settings.SwingHandSetting.SwingHand; +import net.wurstclient.util.BlockBreaker; +import net.wurstclient.util.BlockBreaker.BlockBreakingParams; import net.wurstclient.util.BlockUtils; +import net.wurstclient.util.InteractionSimulator; import net.wurstclient.util.RotationUtils; @SearchTags({"till aura", "HoeAura", "hoe aura", "FarmlandAura", "farmland aura", "farm land aura", "AutoTill", "auto till", "AutoHoe", "auto hoe"}) -public final class TillauraHack extends Hack implements UpdateListener +public final class TillauraHack extends Hack implements PostMotionListener { private final SliderSetting range = new SliderSetting("Range", "How far Tillaura will reach to till blocks.", 5, 1, 6, 0.05, @@ -51,7 +51,7 @@ public final class TillauraHack extends Hack implements UpdateListener + "Good for NoCheat+ servers, but unnecessary in vanilla.", true); - private final List tillableBlocks = Arrays.asList(Blocks.GRASS_BLOCK, + private final List tillableBlocks = List.of(Blocks.GRASS_BLOCK, Blocks.DIRT_PATH, Blocks.DIRT, Blocks.COARSE_DIRT); public TillauraHack() @@ -67,30 +67,32 @@ public TillauraHack() @Override protected void onEnable() { - EVENTS.add(UpdateListener.class, this); + EVENTS.add(PostMotionListener.class, this); } @Override protected void onDisable() { - EVENTS.remove(UpdateListener.class, this); + EVENTS.remove(PostMotionListener.class, this); } @Override - public void onUpdate() + public void onPostMotion() { // wait for right click timer if(MC.itemUseCooldown > 0) return; + // don't till while breaking or riding + if(MC.interactionManager.isBreakingBlock() || MC.player.isRiding()) + return; + // check held item - ItemStack stack = MC.player.getInventory().getMainHandStack(); - if(stack.isEmpty() || !(stack.getItem() instanceof HoeItem)) + if(!MC.player.isHolding(stack -> stack.getItem() instanceof HoeItem)) return; // get valid blocks - ArrayList validBlocks = - getValidBlocks(range.getValue(), this::isCorrectBlock); + ArrayList validBlocks = getValidBlocks(); if(multiTill.isChecked()) { @@ -111,22 +113,18 @@ public void onUpdate() break; } - private ArrayList getValidBlocks(double range, - Predicate validator) + private ArrayList getValidBlocks() { - Vec3d eyesVec = RotationUtils.getEyesPos().subtract(0.5, 0.5, 0.5); - double rangeSq = Math.pow(range + 0.5, 2); - int rangeI = (int)Math.ceil(range); - - BlockPos center = BlockPos.ofFloored(RotationUtils.getEyesPos()); - BlockPos min = center.add(-rangeI, -rangeI, -rangeI); - BlockPos max = center.add(rangeI, rangeI, rangeI); + Vec3d eyesVec = RotationUtils.getEyesPos(); + BlockPos eyesBlock = BlockPos.ofFloored(eyesVec); + double rangeSq = range.getValueSq(); + int blockRange = range.getValueCeil(); - return BlockUtils.getAllInBox(min, max).stream() - .filter(pos -> eyesVec.squaredDistanceTo(Vec3d.of(pos)) <= rangeSq) - .filter(validator) - .sorted(Comparator.comparingDouble( - pos -> eyesVec.squaredDistanceTo(Vec3d.of(pos)))) + return BlockUtils.getAllInBoxStream(eyesBlock, blockRange) + .filter(pos -> pos.getSquaredDistance(eyesVec) <= rangeSq) + .filter(this::isCorrectBlock) + .sorted(Comparator + .comparingDouble(pos -> pos.getSquaredDistance(eyesVec))) .collect(Collectors.toCollection(ArrayList::new)); } @@ -143,69 +141,32 @@ private boolean isCorrectBlock(BlockPos pos) private boolean rightClickBlockLegit(BlockPos pos) { - Vec3d eyesPos = RotationUtils.getEyesPos(); - Vec3d posVec = Vec3d.ofCenter(pos); - double distanceSqPosVec = eyesPos.squaredDistanceTo(posVec); - double rangeSq = Math.pow(range.getValue(), 2); - - for(Direction side : Direction.values()) - { - Vec3d hitVec = posVec.add(Vec3d.of(side.getVector()).multiply(0.5)); - double distanceSqHitVec = eyesPos.squaredDistanceTo(hitVec); - - // check if hitVec is within range - if(distanceSqHitVec > rangeSq) - continue; - - // check if side is facing towards player - if(distanceSqHitVec >= distanceSqPosVec) - continue; - - if(checkLOS.isChecked() - && !BlockUtils.hasLineOfSight(eyesPos, hitVec)) - continue; - - // face block - WURST.getRotationFaker().faceVectorPacket(hitVec); - - // right click block - IMC.getInteractionManager().rightClickBlock(pos, side, hitVec); - MC.player.swingHand(Hand.MAIN_HAND); - MC.itemUseCooldown = 4; - return true; - } + // if this block is unreachable, try the next one + BlockBreakingParams params = BlockBreaker.getBlockBreakingParams(pos); + if(params == null || params.distanceSq() > range.getValueSq()) + return false; + if(checkLOS.isChecked() && !params.lineOfSight()) + return false; - return false; + // face and right click the block + MC.itemUseCooldown = 4; + WURST.getRotationFaker().faceVectorPacket(params.hitVec()); + InteractionSimulator.rightClickBlock(params.toHitResult()); + return true; } private boolean rightClickBlockSimple(BlockPos pos) { - Vec3d eyesPos = RotationUtils.getEyesPos(); - Vec3d posVec = Vec3d.ofCenter(pos); - double distanceSqPosVec = eyesPos.squaredDistanceTo(posVec); - double rangeSq = Math.pow(range.getValue(), 2); - - for(Direction side : Direction.values()) - { - Vec3d hitVec = posVec.add(Vec3d.of(side.getVector()).multiply(0.5)); - double distanceSqHitVec = eyesPos.squaredDistanceTo(hitVec); - - // check if hitVec is within range - if(distanceSqHitVec > rangeSq) - continue; - - // check if side is facing towards player - if(distanceSqHitVec >= distanceSqPosVec) - continue; - - if(checkLOS.isChecked() - && !BlockUtils.hasLineOfSight(eyesPos, hitVec)) - continue; - - IMC.getInteractionManager().rightClickBlock(pos, side, hitVec); - return true; - } + // if this block is unreachable, try the next one + BlockBreakingParams params = BlockBreaker.getBlockBreakingParams(pos); + if(params == null || params.distanceSq() > range.getValueSq()) + return false; + if(checkLOS.isChecked() && !params.lineOfSight()) + return false; - return false; + // right click the block + InteractionSimulator.rightClickBlock(params.toHitResult(), + SwingHand.OFF); + return true; } } diff --git a/src/main/java/net/wurstclient/hacks/TpAuraHack.java b/src/main/java/net/wurstclient/hacks/TpAuraHack.java index a0a05655d3..3c54715637 100644 --- a/src/main/java/net/wurstclient/hacks/TpAuraHack.java +++ b/src/main/java/net/wurstclient/hacks/TpAuraHack.java @@ -25,6 +25,8 @@ import net.wurstclient.settings.PauseAttackOnContainersSetting; import net.wurstclient.settings.SliderSetting; import net.wurstclient.settings.SliderSetting.ValueDisplay; +import net.wurstclient.settings.SwingHandSetting; +import net.wurstclient.settings.SwingHandSetting.SwingHand; import net.wurstclient.settings.filterlists.EntityFilterList; import net.wurstclient.util.EntityUtils; import net.wurstclient.util.RotationUtils; @@ -47,6 +49,9 @@ public final class TpAuraHack extends Hack implements UpdateListener + "\u00a7lHealth\u00a7r - Attacks the weakest entity.", Priority.values(), Priority.ANGLE); + private final SwingHandSetting swingHand = new SwingHandSetting( + "How TP-Aura should swing your hand when attacking.", SwingHand.CLIENT); + private final PauseAttackOnContainersSetting pauseOnContainers = new PauseAttackOnContainersSetting(true); @@ -61,6 +66,7 @@ public TpAuraHack() addSetting(range); addSetting(speed); addSetting(priority); + addSetting(swingHand); addSetting(pauseOnContainers); entityFilters.forEach(this::addSetting); @@ -130,7 +136,7 @@ public void onUpdate() WURST.getHax().criticalsHack.doCritical(); MC.interactionManager.attackEntity(player, entity); - player.swingHand(Hand.MAIN_HAND); + swingHand.swing(Hand.MAIN_HAND); speed.resetTimer(); } diff --git a/src/main/java/net/wurstclient/hacks/TriggerBotHack.java b/src/main/java/net/wurstclient/hacks/TriggerBotHack.java index c3d67618ce..7cb096a5d3 100644 --- a/src/main/java/net/wurstclient/hacks/TriggerBotHack.java +++ b/src/main/java/net/wurstclient/hacks/TriggerBotHack.java @@ -14,17 +14,23 @@ import net.minecraft.util.hit.EntityHitResult; import net.wurstclient.Category; import net.wurstclient.SearchTags; -import net.wurstclient.events.UpdateListener; +import net.wurstclient.events.PostMotionListener; +import net.wurstclient.events.PreMotionListener; import net.wurstclient.hack.Hack; +import net.wurstclient.mixinterface.IKeyBinding; import net.wurstclient.settings.AttackSpeedSliderSetting; import net.wurstclient.settings.CheckboxSetting; import net.wurstclient.settings.SliderSetting; import net.wurstclient.settings.SliderSetting.ValueDisplay; +import net.wurstclient.settings.SwingHandSetting; +import net.wurstclient.settings.SwingHandSetting.SwingHand; import net.wurstclient.settings.filterlists.EntityFilterList; import net.wurstclient.util.EntityUtils; -@SearchTags({"trigger bot"}) -public final class TriggerBotHack extends Hack implements UpdateListener +@SearchTags({"trigger bot", "AutoAttack", "auto attack", "AutoClicker", + "auto clicker"}) +public final class TriggerBotHack extends Hack + implements PreMotionListener, PostMotionListener { private final SliderSetting range = new SliderSetting("Range", 4.25, 1, 6, 0.05, ValueDisplay.DECIMAL); @@ -32,14 +38,36 @@ public final class TriggerBotHack extends Hack implements UpdateListener private final AttackSpeedSliderSetting speed = new AttackSpeedSliderSetting(); - private final CheckboxSetting attackWhileBlocking = new CheckboxSetting( - "Attack while blocking", - "Whether or not to attack while blocking with a shield / using items.", + private final SwingHandSetting swingHand = new SwingHandSetting( + "How TriggerBot should swing your hand when attacking.\n\n" + + "This setting will be ignored if \"Simulate mouse click\" is" + + " enabled.", + SwingHand.CLIENT); + + private final CheckboxSetting attackWhileBlocking = + new CheckboxSetting("Attack while blocking", + "Attacks even while you're blocking with a shield or using" + + " items.\n\n" + + "This would not be possible in vanilla and won't work if" + + " \"Simulate mouse click\" is enabled.", + false); + + private final CheckboxSetting simulateMouseClick = new CheckboxSetting( + "Simulate mouse click", + "Simulates an actual mouse click (or key press) when attacking. Can be" + + " used to trick CPS measuring tools into thinking that you're" + + " attacking manually.\n\n" + + "\u00a7c\u00a7lWARNING:\u00a7r Simulating mouse clicks can lead" + + " to unexpected behavior, like in-game menus clicking themselves." + + " Also, the \"Swing hand\" and \"Attack while blocking\" settings" + + " will not work while this option is enabled.", false); private final EntityFilterList entityFilters = EntityFilterList.genericCombat(); + private boolean simulatingMouseClick; + public TriggerBotHack() { super("TriggerBot"); @@ -47,7 +75,9 @@ public TriggerBotHack() addSetting(range); addSetting(speed); + addSetting(swingHand); addSetting(attackWhileBlocking); + addSetting(simulateMouseClick); entityFilters.forEach(this::addSetting); } @@ -66,17 +96,35 @@ protected void onEnable() WURST.getHax().tpAuraHack.setEnabled(false); speed.resetTimer(); - EVENTS.add(UpdateListener.class, this); + EVENTS.add(PreMotionListener.class, this); + EVENTS.add(PostMotionListener.class, this); } @Override protected void onDisable() { - EVENTS.remove(UpdateListener.class, this); + if(simulatingMouseClick) + { + IKeyBinding.get(MC.options.attackKey).simulatePress(false); + simulatingMouseClick = false; + } + + EVENTS.remove(PreMotionListener.class, this); + EVENTS.remove(PostMotionListener.class, this); } @Override - public void onUpdate() + public void onPreMotion() + { + if(!simulatingMouseClick) + return; + + IKeyBinding.get(MC.options.attackKey).simulatePress(false); + simulatingMouseClick = false; + } + + @Override + public void onPostMotion() { speed.updateTimer(); if(!speed.isTimeToAttack()) @@ -87,22 +135,31 @@ public void onUpdate() return; ClientPlayerEntity player = MC.player; - if(player.isUsingItem() && !attackWhileBlocking.isChecked()) + if(!attackWhileBlocking.isChecked() && player.isUsingItem()) return; if(MC.crosshairTarget == null - || !(MC.crosshairTarget instanceof EntityHitResult)) + || !(MC.crosshairTarget instanceof EntityHitResult eResult)) return; - Entity target = ((EntityHitResult)MC.crosshairTarget).getEntity(); + Entity target = eResult.getEntity(); if(!isCorrectEntity(target)) return; WURST.getHax().autoSwordHack.setSlot(target); - WURST.getHax().criticalsHack.doCritical(); - MC.interactionManager.attackEntity(player, target); - player.swingHand(Hand.MAIN_HAND); + + if(simulateMouseClick.isChecked()) + { + IKeyBinding.get(MC.options.attackKey).simulatePress(true); + simulatingMouseClick = true; + + }else + { + MC.interactionManager.attackEntity(player, target); + swingHand.swing(Hand.MAIN_HAND); + } + speed.resetTimer(); } diff --git a/src/main/java/net/wurstclient/hacks/XRayHack.java b/src/main/java/net/wurstclient/hacks/XRayHack.java index 2e762de3fe..19c160ba76 100644 --- a/src/main/java/net/wurstclient/hacks/XRayHack.java +++ b/src/main/java/net/wurstclient/hacks/XRayHack.java @@ -45,9 +45,10 @@ public final class XRayHack extends Hack implements UpdateListener, "minecraft:amethyst_cluster", "minecraft:ancient_debris", "minecraft:anvil", "minecraft:beacon", "minecraft:bone_block", "minecraft:bookshelf", "minecraft:brewing_stand", - "minecraft:chain_command_block", "minecraft:chest", "minecraft:clay", - "minecraft:coal_block", "minecraft:coal_ore", "minecraft:command_block", - "minecraft:copper_ore", "minecraft:crafter", "minecraft:crafting_table", + "minecraft:budding_amethyst", "minecraft:chain_command_block", + "minecraft:chest", "minecraft:clay", "minecraft:coal_block", + "minecraft:coal_ore", "minecraft:command_block", "minecraft:copper_ore", + "minecraft:crafter", "minecraft:crafting_table", "minecraft:decorated_pot", "minecraft:deepslate_coal_ore", "minecraft:deepslate_copper_ore", "minecraft:deepslate_diamond_ore", "minecraft:deepslate_emerald_ore", "minecraft:deepslate_gold_ore", @@ -66,10 +67,11 @@ public final class XRayHack extends Hack implements UpdateListener, "minecraft:raw_copper_block", "minecraft:raw_gold_block", "minecraft:raw_iron_block", "minecraft:redstone_block", "minecraft:redstone_ore", "minecraft:repeating_command_block", - "minecraft:spawner", "minecraft:suspicious_gravel", - "minecraft:suspicious_sand", "minecraft:tnt", "minecraft:torch", - "minecraft:trapped_chest", "minecraft:trial_spawner", "minecraft:vault", - "minecraft:water"); + "minecraft:sculk_catalyst", "minecraft:sculk_sensor", + "minecraft:sculk_shrieker", "minecraft:spawner", + "minecraft:suspicious_gravel", "minecraft:suspicious_sand", + "minecraft:tnt", "minecraft:torch", "minecraft:trapped_chest", + "minecraft:trial_spawner", "minecraft:vault", "minecraft:water"); private final CheckboxSetting onlyExposed = new CheckboxSetting( "Only show exposed", diff --git a/src/main/java/net/wurstclient/hacks/autocomplete/ApiProviderSetting.java b/src/main/java/net/wurstclient/hacks/autocomplete/ApiProviderSetting.java deleted file mode 100644 index 7cd1b47387..0000000000 --- a/src/main/java/net/wurstclient/hacks/autocomplete/ApiProviderSetting.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2014-2024 Wurst-Imperium and contributors. - * - * This source code is subject to the terms of the GNU General Public - * License, version 3. If a copy of the GPL was not distributed with this - * file, You can obtain one at: https://www.gnu.org/licenses/gpl-3.0.txt - */ -package net.wurstclient.hacks.autocomplete; - -import net.wurstclient.settings.EnumSetting; - -public final class ApiProviderSetting - extends EnumSetting -{ - public ApiProviderSetting() - { - super("API provider", - "\u00a7lOpenAI\u00a7r lets you use models like ChatGPT, but requires an" - + " account with API access, costs money to use and sends your chat" - + " history to their servers. The name is a lie - it's closed" - + " source.\n\n" - + "\u00a7loobabooga\u00a7r lets you use models like LLaMA and many" - + " others. It's a true open source alternative to OpenAI that you" - + " can run locally on your own computer. It's free to use and does" - + " not send your chat history to any servers.", - ApiProvider.values(), ApiProvider.OOBABOOGA); - } - - public enum ApiProvider - { - OPENAI("OpenAI"), - OOBABOOGA("oobabooga"); - - private final String name; - - private ApiProvider(String name) - { - this.name = name; - } - - @Override - public String toString() - { - return name; - } - } -} diff --git a/src/main/java/net/wurstclient/hacks/autocomplete/MessageCompleter.java b/src/main/java/net/wurstclient/hacks/autocomplete/MessageCompleter.java index 6feb1e377c..1213517757 100644 --- a/src/main/java/net/wurstclient/hacks/autocomplete/MessageCompleter.java +++ b/src/main/java/net/wurstclient/hacks/autocomplete/MessageCompleter.java @@ -30,26 +30,27 @@ public MessageCompleter(ModelSettings modelSettings) this.modelSettings = modelSettings; } - public final String completeChatMessage(String draftMessage) + public final String[] completeChatMessage(String draftMessage, + int maxSuggestions) { // build prompt and parameters String prompt = buildPrompt(draftMessage); - JsonObject params = buildParams(prompt); + JsonObject params = buildParams(prompt, maxSuggestions); System.out.println(params); try { // send request - WsonObject response = requestCompletion(params); + WsonObject response = requestCompletions(params); System.out.println(response); // read response - return extractCompletion(response); + return extractCompletions(response); }catch(IOException | JsonException e) { e.printStackTrace(); - return ""; + return new String[0]; } } @@ -98,11 +99,12 @@ protected String buildPrompt(String draftMessage) return prompt; } - protected abstract JsonObject buildParams(String prompt); + protected abstract JsonObject buildParams(String prompt, + int maxSuggestions); - protected abstract WsonObject requestCompletion(JsonObject parameters) + protected abstract WsonObject requestCompletions(JsonObject parameters) throws IOException, JsonException; - protected abstract String extractCompletion(WsonObject response) + protected abstract String[] extractCompletions(WsonObject response) throws JsonException; } diff --git a/src/main/java/net/wurstclient/hacks/autocomplete/ModelSettings.java b/src/main/java/net/wurstclient/hacks/autocomplete/ModelSettings.java index 9e47d3e6aa..1288d1ca3c 100644 --- a/src/main/java/net/wurstclient/hacks/autocomplete/ModelSettings.java +++ b/src/main/java/net/wurstclient/hacks/autocomplete/ModelSettings.java @@ -23,42 +23,33 @@ public final class ModelSettings { public final EnumSetting openAiModel = new EnumSetting<>( "OpenAI model", - "The model to use for OpenAI API calls.\n\n" - + "\u00a7lText-Davinci-003\u00a7r (better known as GPT-3) is an" - + " older model that's less censored than ChatGPT, but it's also" - + " 10x more expensive to use.\n\n" - + "\u00a7lGPT-3.5-Turbo\u00a7r (better known as ChatGPT) is" - + " recommended for most use cases, as it's relatively cheap and" - + " powerful.\n\n" - + "\u00a7lGPT-4\u00a7r is more powerful, but only works if OpenAI" - + " has chosen you to be a beta tester. It can be anywhere from" - + " 15x to 60x more expensive than ChatGPT.", - OpenAiModel.values(), OpenAiModel.GPT_3_5_TURBO); + "The model to use for OpenAI API calls.\nRecommended models:\n\n" + + "\u00a7lGPT-4o-2024-05-13\u00a7r is the world's smartest model at" + + " the time of writing and will often produce the best completions." + + " However, it's meant to be an assistant rather than an" + + " auto-completion system, so you will see it produce some odd" + + " completions at times.\n\n" + + "\u00a7lGPT-3.5-Turbo-Instruct\u00a7r is an older, non-chat model" + + " based on GPT-3.5 that works well for auto-completion tasks.", + OpenAiModel.values(), OpenAiModel.GPT_4O_2024_05_13); public enum OpenAiModel { - GPT_3_5_TURBO("gpt-3.5-turbo", true), - GPT_3_5_TURBO_1106("gpt-3.5-turbo-1106", true), - GPT_3_5_TURBO_0613("gpt-3.5-turbo-0613", true), - GPT_3_5_TURBO_0301("gpt-3.5-turbo-0301", true), - GPT_3_5_TURBO_16K("gpt-3.5-turbo-16k", true), - GPT_3_5_TURBO_16K_0613("gpt-3.5-turbo-16k-0613", true), - GPT_4("gpt-4", true), + GPT_4O_2024_05_13("gpt-4o-2024-05-13", true), + GPT_4_TURBO_2024_04_09("gpt-4-turbo-2024-04-09", true), + GPT_4_0125_PREVIEW("gpt-4-0125-preview", true), GPT_4_1106_PREVIEW("gpt-4-1106-preview", true), GPT_4_0613("gpt-4-0613", true), GPT_4_0314("gpt-4-0314", true), - GPT_4_32K("gpt-4-32k", true), GPT_4_32K_0613("gpt-4-32k-0613", true), - TEXT_DAVINCI_003("text-davinci-003", false), - TEXT_DAVINCI_002("text-davinci-002", false), - TEXT_DAVINCI_001("text-davinci-001", false), - DAVINCI("davinci", false), - TEXT_CURIE_001("text-curie-001", false), - CURIE("curie", false), - TEXT_BABBAGE_001("text-babbage-001", false), - BABBAGE("babbage", false), - TEXT_ADA_001("text-ada-001", false), - ADA("ada", false); + GPT_3_5_TURBO_0125("gpt-3.5-turbo-0125", true), + GPT_3_5_TURBO_1106("gpt-3.5-turbo-1106", true), + GPT_3_5_TURBO_0613("gpt-3.5-turbo-0613", true), + GPT_3_5_TURBO_16K_0613("gpt-3.5-turbo-16k-0613", true), + GPT_3_5_TURBO_0301("gpt-3.5-turbo-0301", true), + GPT_3_5_TURBO_INSTRUCT("gpt-3.5-turbo-instruct", false), + DAVINCI_002("davinci-002", false), + BABBAGE_002("babbage-002", false); private final String name; private final boolean chat; @@ -92,7 +83,7 @@ public boolean isChatModel() "Controls the model's creativity and randomness. A higher value will" + " result in more creative and sometimes nonsensical completions," + " while a lower value will result in more boring completions.", - 0.7, 0, 2, 0.01, ValueDisplay.DECIMAL); + 1, 0, 2, 0.01, ValueDisplay.DECIMAL); public final SliderSetting topP = new SliderSetting("Top P", "An alternative to temperature. Makes the model less random by only" @@ -107,8 +98,7 @@ public boolean isChatModel() + " history.\n\n" + "Positive values encourage the model to use synonyms and" + " talk about different topics. Negative values encourage the" - + " model to repeat the same word over and over again.\n\n" - + "Only works with OpenAI models.", + + " model to repeat the same word over and over again.", 0, -2, 2, 0.01, ValueDisplay.DECIMAL); public final SliderSetting frequencyPenalty = @@ -117,25 +107,8 @@ public boolean isChatModel() + " appears in the chat history.\n\n" + "Positive values encourage the model to use synonyms and" + " talk about different topics. Negative values encourage the" - + " model to repeat existing chat messages.\n\n" - + "Only works with OpenAI models.", - 0.6, -2, 2, 0.01, ValueDisplay.DECIMAL); - - public final SliderSetting repetitionPenalty = - new SliderSetting("Repetition penalty", - "Similar to presence penalty, but uses a different algorithm.\n\n" - + "1.0 means no penalty, negative values are not possible and" - + " 1.5 is the maximum value.\n\n" - + "Only works with the oobabooga web UI.", - 1, 1, 1.5, 0.01, ValueDisplay.DECIMAL); - - public final SliderSetting encoderRepetitionPenalty = - new SliderSetting("Encoder repetition penalty", - "Similar to frequency penalty, but uses a different algorithm.\n\n" - + "1.0 means no penalty, 0.8 behaves like a negative value and" - + " 1.5 is the maximum value.\n\n" - + "Only works with the oobabooga web UI.", - 1, 0.8, 1.5, 0.01, ValueDisplay.DECIMAL); + + " model to repeat existing chat messages.", + 0, -2, 2, 0.01, ValueDisplay.DECIMAL); public final EnumSetting stopSequence = new EnumSetting<>( "Stop sequence", @@ -179,7 +152,7 @@ public String toString() + " predictions.\n\n" + "Higher values improve the quality of predictions, but also" + " increase the time it takes to generate them, as well as cost" - + " (for OpenAI API users) or RAM usage (for oobabooga users).", + + " (for APIs like OpenAI) or RAM usage (for self-hosted models).", 10, 0, 100, 1, ValueDisplay.INTEGER); public final CheckboxSetting filterServerMessages = @@ -191,6 +164,47 @@ public String toString() + " etc.", false); + public final TextFieldSetting customModel = new TextFieldSetting( + "Custom model", + "If set, this model will be used instead of the one specified in the" + + " \"OpenAI model\" setting.\n\n" + + "Use this if you have a fine-tuned OpenAI model or if you are" + + " using a custom endpoint that is OpenAI-compatible but offers" + + " different models.", + ""); + + public final EnumSetting customModelType = + new EnumSetting<>("Custom model type", "Whether the custom" + + " model should use the chat endpoint or the legacy endpoint.\n\n" + + "If \"Custom model\" is left blank, this setting is ignored.", + CustomModelType.values(), CustomModelType.CHAT); + + public enum CustomModelType + { + CHAT("Chat", true), + LEGACY("Legacy", false); + + private final String name; + private final boolean chat; + + private CustomModelType(String name, boolean chat) + { + this.name = name; + this.chat = chat; + } + + public boolean isChat() + { + return chat; + } + + @Override + public String toString() + { + return name; + } + } + public final TextFieldSetting openaiChatEndpoint = new TextFieldSetting( "OpenAI chat endpoint", "Endpoint for OpenAI's chat completion API.", "https://api.openai.com/v1/chat/completions"); @@ -200,19 +214,11 @@ public String toString() "Endpoint for OpenAI's legacy completion API.", "https://api.openai.com/v1/completions"); - public final TextFieldSetting oobaboogaEndpoint = - new TextFieldSetting("Oobabooga endpoint", - "Endpoint for your Oobabooga web UI instance.\n" - + "Remember to start the Oobabooga server with the" - + " \u00a7e--extensions api\u00a7r flag.", - "http://127.0.0.1:5000/api/v1/generate"); - private final List settings = Collections.unmodifiableList(Arrays.asList(openAiModel, maxTokens, - temperature, topP, presencePenalty, frequencyPenalty, - repetitionPenalty, encoderRepetitionPenalty, stopSequence, - contextLength, filterServerMessages, openaiChatEndpoint, - openaiLegacyEndpoint, oobaboogaEndpoint)); + temperature, topP, presencePenalty, frequencyPenalty, stopSequence, + contextLength, filterServerMessages, customModel, customModelType, + openaiChatEndpoint, openaiLegacyEndpoint)); public void forEach(Consumer action) { diff --git a/src/main/java/net/wurstclient/hacks/autocomplete/OobaboogaMessageCompleter.java b/src/main/java/net/wurstclient/hacks/autocomplete/OobaboogaMessageCompleter.java deleted file mode 100644 index 575c98d676..0000000000 --- a/src/main/java/net/wurstclient/hacks/autocomplete/OobaboogaMessageCompleter.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright (c) 2014-2024 Wurst-Imperium and contributors. - * - * This source code is subject to the terms of the GNU General Public - * License, version 3. If a copy of the GPL was not distributed with this - * file, You can obtain one at: https://www.gnu.org/licenses/gpl-3.0.txt - */ -package net.wurstclient.hacks.autocomplete; - -import java.io.IOException; -import java.io.OutputStream; -import java.net.HttpURLConnection; -import java.net.URI; -import java.net.URL; - -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; - -import net.wurstclient.util.json.JsonException; -import net.wurstclient.util.json.JsonUtils; -import net.wurstclient.util.json.WsonObject; - -public final class OobaboogaMessageCompleter extends MessageCompleter -{ - public OobaboogaMessageCompleter(ModelSettings modelSettings) - { - super(modelSettings); - } - - @Override - protected JsonObject buildParams(String prompt) - { - JsonObject params = new JsonObject(); - params.addProperty("prompt", prompt); - params.addProperty("max_length", modelSettings.maxTokens.getValueI()); - params.addProperty("temperature", modelSettings.temperature.getValue()); - params.addProperty("top_p", modelSettings.topP.getValue()); - params.addProperty("repetition_penalty", - modelSettings.repetitionPenalty.getValue()); - params.addProperty("encoder_repetition_penalty", - modelSettings.encoderRepetitionPenalty.getValue()); - JsonArray stoppingStrings = new JsonArray(); - stoppingStrings - .add(modelSettings.stopSequence.getSelected().getSequence()); - params.add("stopping_strings", stoppingStrings); - return params; - } - - @Override - protected WsonObject requestCompletion(JsonObject parameters) - throws IOException, JsonException - { - // set up the API request - URL url = - URI.create(modelSettings.oobaboogaEndpoint.getValue()).toURL(); - HttpURLConnection conn = (HttpURLConnection)url.openConnection(); - conn.setRequestMethod("POST"); - conn.setRequestProperty("Content-Type", "application/json"); - - // set the request body - conn.setDoOutput(true); - try(OutputStream os = conn.getOutputStream()) - { - os.write(JsonUtils.GSON.toJson(parameters).getBytes()); - os.flush(); - } - - // parse the response - return JsonUtils.parseConnectionToObject(conn); - } - - @Override - protected String extractCompletion(WsonObject response) throws JsonException - { - // extract completion from response - String completion = - response.getArray("results").getObject(0).getString("text"); - - // remove newlines - completion = completion.replace("\n", " "); - - return completion; - } -} diff --git a/src/main/java/net/wurstclient/hacks/autocomplete/OpenAiMessageCompleter.java b/src/main/java/net/wurstclient/hacks/autocomplete/OpenAiMessageCompleter.java index 9555c613ad..1140a536e0 100644 --- a/src/main/java/net/wurstclient/hacks/autocomplete/OpenAiMessageCompleter.java +++ b/src/main/java/net/wurstclient/hacks/autocomplete/OpenAiMessageCompleter.java @@ -12,6 +12,7 @@ import java.net.HttpURLConnection; import java.net.URI; import java.net.URL; +import java.util.ArrayList; import com.google.gson.JsonArray; import com.google.gson.JsonObject; @@ -28,14 +29,12 @@ public OpenAiMessageCompleter(ModelSettings modelSettings) } @Override - protected JsonObject buildParams(String prompt) + protected JsonObject buildParams(String prompt, int maxSuggestions) { // build the request parameters JsonObject params = new JsonObject(); params.addProperty("stop", modelSettings.stopSequence.getSelected().getSequence()); - params.addProperty("model", - "" + modelSettings.openAiModel.getSelected()); params.addProperty("max_tokens", modelSettings.maxTokens.getValueI()); params.addProperty("temperature", modelSettings.temperature.getValue()); params.addProperty("top_p", modelSettings.topP.getValue()); @@ -43,11 +42,29 @@ protected JsonObject buildParams(String prompt) modelSettings.presencePenalty.getValue()); params.addProperty("frequency_penalty", modelSettings.frequencyPenalty.getValue()); + params.addProperty("n", maxSuggestions); - // add the prompt, depending on the model - if(modelSettings.openAiModel.getSelected().isChatModel()) + // determine model name and type + boolean customModel = !modelSettings.customModel.getValue().isBlank(); + String modelName = customModel ? modelSettings.customModel.getValue() + : "" + modelSettings.openAiModel.getSelected(); + boolean chatModel = + customModel ? modelSettings.customModelType.getSelected().isChat() + : modelSettings.openAiModel.getSelected().isChatModel(); + + // add the model name + params.addProperty("model", modelName); + + // add the prompt, depending on model type + if(chatModel) { JsonArray messages = new JsonArray(); + JsonObject systemMessage = new JsonObject(); + systemMessage.addProperty("role", "system"); + systemMessage.addProperty("content", + "Complete the following text. Reply only with the completion." + + " You are not an assistant."); + messages.add(systemMessage); JsonObject promptMessage = new JsonObject(); promptMessage.addProperty("role", "user"); promptMessage.addProperty("content", prompt); @@ -61,7 +78,7 @@ protected JsonObject buildParams(String prompt) } @Override - protected WsonObject requestCompletion(JsonObject parameters) + protected WsonObject requestCompletions(JsonObject parameters) throws IOException, JsonException { // get the API URL @@ -90,20 +107,31 @@ protected WsonObject requestCompletion(JsonObject parameters) } @Override - protected String extractCompletion(WsonObject response) throws JsonException + protected String[] extractCompletions(WsonObject response) + throws JsonException { - // extract completion from response - String completion; + ArrayList completions = new ArrayList<>(); + + // extract choices from response + ArrayList choices = + response.getArray("choices").getAllObjects(); + + // extract completions from choices if(modelSettings.openAiModel.getSelected().isChatModel()) - completion = response.getArray("choices").getObject(0) - .getObject("message").getString("content"); + for(WsonObject choice : choices) + { + WsonObject message = choice.getObject("message"); + String content = message.getString("content"); + completions.add(content); + } else - completion = - response.getArray("choices").getObject(0).getString("text"); - + for(WsonObject choice : choices) + completions.add(choice.getString("text")); + // remove newlines - completion = completion.replace("\n", " "); + for(String completion : completions) + completion = completion.replace("\n", " "); - return completion; + return completions.toArray(new String[completions.size()]); } } diff --git a/src/main/java/net/wurstclient/hacks/autocomplete/SuggestionHandler.java b/src/main/java/net/wurstclient/hacks/autocomplete/SuggestionHandler.java index df75950091..5273896a71 100644 --- a/src/main/java/net/wurstclient/hacks/autocomplete/SuggestionHandler.java +++ b/src/main/java/net/wurstclient/hacks/autocomplete/SuggestionHandler.java @@ -14,6 +14,7 @@ import com.mojang.brigadier.suggestion.SuggestionsBuilder; +import net.minecraft.util.math.MathHelper; import net.wurstclient.settings.Setting; import net.wurstclient.settings.SliderSetting; import net.wurstclient.settings.SliderSetting.ValueDisplay; @@ -22,14 +23,11 @@ public final class SuggestionHandler { private final ArrayList suggestions = new ArrayList<>(); - private final SliderSetting maxSuggestionPerDraft = new SliderSetting( - "Max suggestions per draft", - "How many suggestions the AI is allowed to generate for the same draft" - + " message.\n\n" - + "\u00a7c\u00a7lWARNING:\u00a7r Higher values can use up a lot of" - + " tokens. Definitely limit this to 1 for expensive models like" - + " GPT-4.", - 3, 1, 10, 1, ValueDisplay.INTEGER); + private final SliderSetting maxSuggestionsPerDraft = + new SliderSetting("Max suggestions per draft", + "How many suggestions the AI is allowed to generate for the same" + + " draft message.", + 3, 1, 10, 1, ValueDisplay.INTEGER); private final SliderSetting maxSuggestionsKept = new SliderSetting( "Max suggestions kept", "Maximum number of suggestions kept in memory.", @@ -43,7 +41,7 @@ public final class SuggestionHandler + " on your screen resolution and GUI scale.", 5, 1, 10, 1, ValueDisplay.INTEGER); - private final List settings = Arrays.asList(maxSuggestionPerDraft, + private final List settings = Arrays.asList(maxSuggestionsPerDraft, maxSuggestionsKept, maxSuggestionsShown); public List getSettings() @@ -51,13 +49,15 @@ public List getSettings() return settings; } - public boolean hasEnoughSuggestionFor(String draftMessage) + public int getMaxSuggestionsFor(String draftMessage) { synchronized(suggestions) { - return suggestions.stream().map(String::toLowerCase) - .filter(s -> s.startsWith(draftMessage.toLowerCase())) - .count() >= maxSuggestionPerDraft.getValue(); + int existing = (int)suggestions.stream().map(String::toLowerCase) + .filter(s -> s.startsWith(draftMessage.toLowerCase())).count(); + int maxPerDraft = maxSuggestionsPerDraft.getValueI(); + + return MathHelper.clamp(maxPerDraft - existing, 0, maxPerDraft); } } diff --git a/src/main/java/net/wurstclient/hacks/autofish/FishingSpotManager.java b/src/main/java/net/wurstclient/hacks/autofish/FishingSpotManager.java index 62e4f62515..7ba226bf65 100644 --- a/src/main/java/net/wurstclient/hacks/autofish/FishingSpotManager.java +++ b/src/main/java/net/wurstclient/hacks/autofish/FishingSpotManager.java @@ -129,9 +129,12 @@ public boolean onCast() private void moveToNextSpot() { + IKeyBinding forwardKey = IKeyBinding.get(MC.options.forwardKey); + IKeyBinding jumpKey = IKeyBinding.get(MC.options.jumpKey); + PositionAndRotation nextPosRot = nextSpot.input(); - ((IKeyBinding)MC.options.forwardKey).resetPressedState(); - ((IKeyBinding)MC.options.jumpKey).resetPressedState(); + forwardKey.resetPressedState(); + jumpKey.resetPressedState(); // match position Vec3d nextPos = nextPosRot.pos(); @@ -149,14 +152,14 @@ private void moveToNextSpot() } // jump if necessary - MC.options.jumpKey.setPressed( + jumpKey.setPressed( MC.player.isTouchingWater() || MC.player.horizontalCollision); // walk or teleport depending on distance if(distance < 0.2) MC.player.setPosition(nextPos.x, nextPos.y, nextPos.z); else if(distance > 0.7 || MC.player.age % 10 == 0) - MC.options.forwardKey.setPressed(true); + forwardKey.setPressed(true); return; } diff --git a/src/main/java/net/wurstclient/keybinds/KeybindList.java b/src/main/java/net/wurstclient/keybinds/KeybindList.java index f5846fbd4d..0481b10997 100644 --- a/src/main/java/net/wurstclient/keybinds/KeybindList.java +++ b/src/main/java/net/wurstclient/keybinds/KeybindList.java @@ -95,6 +95,7 @@ public ArrayList listProfiles() try(Stream files = Files.list(profilesFolder)) { return files.filter(Files::isRegularFile) + .filter(path -> path.getFileName().toString().endsWith(".json")) .collect(Collectors.toCollection(ArrayList::new)); }catch(IOException e) diff --git a/src/main/java/net/wurstclient/mixin/EntityMixin.java b/src/main/java/net/wurstclient/mixin/EntityMixin.java index 93b9094c3c..218e2189a5 100644 --- a/src/main/java/net/wurstclient/mixin/EntityMixin.java +++ b/src/main/java/net/wurstclient/mixin/EntityMixin.java @@ -11,10 +11,11 @@ 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.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; + import net.minecraft.entity.Entity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.server.command.CommandOutput; @@ -29,19 +30,22 @@ @Mixin(Entity.class) public abstract class EntityMixin implements Nameable, EntityLike, CommandOutput { - @Redirect(at = @At(value = "INVOKE", + /** + * This mixin makes the VelocityFromFluidEvent work, which is used by + * AntiWaterPush. It's set to require 0 because it doesn't work in Forge, + * when using Sinytra Connector. + */ + @WrapWithCondition(at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;setVelocity(Lnet/minecraft/util/math/Vec3d;)V", opcode = Opcodes.INVOKEVIRTUAL, ordinal = 0), - method = "updateMovementInFluid(Lnet/minecraft/registry/tag/TagKey;D)Z") - private void setVelocityFromFluid(Entity entity, Vec3d velocity) + method = "updateMovementInFluid(Lnet/minecraft/registry/tag/TagKey;D)Z", + require = 0) + private boolean shouldSetVelocity(Entity instance, Vec3d velocity) { - VelocityFromFluidEvent event = - new VelocityFromFluidEvent((Entity)(Object)this); + VelocityFromFluidEvent event = new VelocityFromFluidEvent(instance); EventManager.fire(event); - - if(!event.isCancelled()) - entity.setVelocity(velocity); + return !event.isCancelled(); } @Inject(at = @At("HEAD"), diff --git a/src/main/java/net/wurstclient/mixin/KeyBindingMixin.java b/src/main/java/net/wurstclient/mixin/KeyBindingMixin.java index 6c3731a2a1..9078a93fa4 100644 --- a/src/main/java/net/wurstclient/mixin/KeyBindingMixin.java +++ b/src/main/java/net/wurstclient/mixin/KeyBindingMixin.java @@ -7,9 +7,12 @@ */ package net.wurstclient.mixin; +import org.lwjgl.glfw.GLFW; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import net.minecraft.client.MinecraftClient; import net.minecraft.client.option.KeyBinding; import net.minecraft.client.util.InputUtil; import net.wurstclient.WurstClient; @@ -22,19 +25,47 @@ public abstract class KeyBindingMixin implements IKeyBinding private InputUtil.Key boundKey; @Override - public boolean isActallyPressed() + @Unique + @Deprecated // use IKeyBinding.resetPressedState() instead + public void wurst_resetPressedState() { long handle = WurstClient.MC.getWindow().getHandle(); int code = boundKey.getCode(); - return InputUtil.isKeyPressed(handle, code); + setPressed(InputUtil.isKeyPressed(handle, code)); } @Override - public void resetPressedState() + @Unique + @Deprecated // use IKeyBinding.simulatePress() instead + public void wurst_simulatePress(boolean pressed) { - setPressed(isActallyPressed()); + MinecraftClient mc = WurstClient.MC; + long window = mc.getWindow().getHandle(); + int action = pressed ? 1 : 0; + + switch(boundKey.getCategory()) + { + case KEYSYM: + mc.keyboard.onKey(window, boundKey.getCode(), 0, action, 0); + break; + + case SCANCODE: + mc.keyboard.onKey(window, GLFW.GLFW_KEY_UNKNOWN, boundKey.getCode(), + action, 0); + break; + + case MOUSE: + mc.mouse.onMouseButton(window, boundKey.getCode(), action, 0); + break; + + default: + System.out + .println("Unknown keybinding type: " + boundKey.getCategory()); + break; + } } + @Override @Shadow public abstract void setPressed(boolean pressed); } diff --git a/src/main/java/net/wurstclient/mixinterface/IKeyBinding.java b/src/main/java/net/wurstclient/mixinterface/IKeyBinding.java index 8b0409a8c6..bc0f1291e2 100644 --- a/src/main/java/net/wurstclient/mixinterface/IKeyBinding.java +++ b/src/main/java/net/wurstclient/mixinterface/IKeyBinding.java @@ -7,16 +7,57 @@ */ package net.wurstclient.mixinterface; +import net.minecraft.client.option.KeyBinding; + public interface IKeyBinding { /** - * @return true if the user is actually pressing this key on their keyboard. + * Resets the pressed state to whether or not the user is actually pressing + * this key on their keyboard. */ - public boolean isActallyPressed(); + public default void resetPressedState() + { + wurst_resetPressedState(); + } /** - * Resets the pressed state to whether or not the user is actually pressing - * this key on their keyboard. + * Simulates the user pressing this key on their keyboard or mouse. This is + * much more aggressive than using {@link #setPressed(boolean)} and should + * be used sparingly. + */ + public default void simulatePress(boolean pressed) + { + wurst_simulatePress(pressed); + } + + public default void setPressed(boolean pressed) + { + asVanilla().setPressed(pressed); + } + + public default KeyBinding asVanilla() + { + return (KeyBinding)this; + } + + /** + * Returns the given KeyBinding object as an IKeyBinding, allowing you to + * access the resetPressedState() method. + */ + public static IKeyBinding get(KeyBinding kb) + { + return (IKeyBinding)kb; + } + + /** + * @deprecated Use {@link #resetPressedState()} instead. + */ + @Deprecated + public void wurst_resetPressedState(); + + /** + * @deprecated Use {@link #simulatePress()} instead. */ - public void resetPressedState(); + @Deprecated + public void wurst_simulatePress(boolean pressed); } diff --git a/src/main/java/net/wurstclient/navigator/NavigatorFeatureScreen.java b/src/main/java/net/wurstclient/navigator/NavigatorFeatureScreen.java index e5c7b997d0..dff77e6153 100644 --- a/src/main/java/net/wurstclient/navigator/NavigatorFeatureScreen.java +++ b/src/main/java/net/wurstclient/navigator/NavigatorFeatureScreen.java @@ -271,7 +271,9 @@ protected void onMouseClick(double x, double y, int button) return; } - Rectangle area = new Rectangle(width / 2 - 154, 60, 308, height - 103); + boolean noButtons = Screens.getButtons(this).isEmpty(); + Rectangle area = new Rectangle(width / 2 - 154, 60, 308, + height - 60 - (noButtons ? 43 : 67)); if(!area.contains(x, y)) return; @@ -402,6 +404,11 @@ protected void onRender(DrawContext context, int mouseX, int mouseY, { int yc1 = window.getChild(i).getY(); int yc2 = yc1 - 2; + if(yc1 < bgy1 - windowY1) + continue; + if(yc2 > bgy3 - windowY1) + break; + bufferBuilder.vertex(matrix, xc1, yc2, 0).next(); bufferBuilder.vertex(matrix, xc1, yc1, 0).next(); bufferBuilder.vertex(matrix, xc2, yc1, 0).next(); @@ -429,8 +436,16 @@ protected void onRender(DrawContext context, int mouseX, int mouseY, } for(int i = 0; i < window.countChildren(); i++) - window.getChild(i).render(context, mouseX - bgx1, mouseY - windowY1, + { + Component child = window.getChild(i); + if(child.getY() + child.getHeight() < bgy1 - windowY1) + continue; + if(child.getY() > bgy3 - windowY1) + break; + + child.render(context, mouseX - bgx1, mouseY - windowY1, partialTicks); + } matrixStack.pop(); // buttons diff --git a/src/main/java/net/wurstclient/other_features/HackListOtf.java b/src/main/java/net/wurstclient/other_features/HackListOtf.java index a7566a6887..8aa8c23e5c 100644 --- a/src/main/java/net/wurstclient/other_features/HackListOtf.java +++ b/src/main/java/net/wurstclient/other_features/HackListOtf.java @@ -19,8 +19,9 @@ import net.wurstclient.settings.ColorSetting; import net.wurstclient.settings.EnumSetting; -@SearchTags({"ArrayList", "ModList", "CheatList", "mod list", "array list", - "hack list", "cheat list"}) +@SearchTags({"hack list", "HakList", "hak list", "HacksList", "hacks list", + "HaxList", "hax list", "ArrayList", "array list", "ModList", "mod list", + "CheatList", "cheat list"}) @DontBlock public final class HackListOtf extends OtherFeature { diff --git a/src/main/java/net/wurstclient/settings/BlockListSetting.java b/src/main/java/net/wurstclient/settings/BlockListSetting.java index f53f6c9397..ca50e67b38 100644 --- a/src/main/java/net/wurstclient/settings/BlockListSetting.java +++ b/src/main/java/net/wurstclient/settings/BlockListSetting.java @@ -18,6 +18,7 @@ import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import com.google.gson.JsonPrimitive; import net.minecraft.block.Block; import net.minecraft.registry.Registries; @@ -29,7 +30,6 @@ import net.wurstclient.util.BlockUtils; import net.wurstclient.util.json.JsonException; import net.wurstclient.util.json.JsonUtils; -import net.wurstclient.util.json.WsonArray; public final class BlockListSetting extends Setting { @@ -90,10 +90,17 @@ public void fromJson(JsonElement json) { try { - WsonArray wson = JsonUtils.getAsArray(json); blockNames.clear(); - wson.getAllStrings().parallelStream() + // if string "default", load default blocks + if(JsonUtils.getAsString(json, "nope").equals("default")) + { + blockNames.addAll(Arrays.asList(defaultNames)); + return; + } + + // otherwise, load the blocks in the JSON array + JsonUtils.getAsArray(json).getAllStrings().parallelStream() .map(s -> Registries.BLOCK.get(new Identifier(s))) .filter(Objects::nonNull).map(BlockUtils::getName).distinct() .sorted().forEachOrdered(s -> blockNames.add(s)); @@ -108,6 +115,10 @@ public void fromJson(JsonElement json) @Override public JsonElement toJson() { + // if blockNames is the same as defaultNames, save string "default" + if(blockNames.equals(Arrays.asList(defaultNames))) + return new JsonPrimitive("default"); + JsonArray json = new JsonArray(); blockNames.forEach(s -> json.add(s)); return json; diff --git a/src/main/java/net/wurstclient/settings/BookOffersSetting.java b/src/main/java/net/wurstclient/settings/BookOffersSetting.java index 3ff6bb34ce..2e4d185d59 100644 --- a/src/main/java/net/wurstclient/settings/BookOffersSetting.java +++ b/src/main/java/net/wurstclient/settings/BookOffersSetting.java @@ -18,6 +18,7 @@ import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import com.google.gson.JsonPrimitive; import net.minecraft.registry.Registries; import net.minecraft.util.Identifier; @@ -28,7 +29,6 @@ import net.wurstclient.keybinds.PossibleKeybind; import net.wurstclient.util.json.JsonException; import net.wurstclient.util.json.JsonUtils; -import net.wurstclient.util.json.WsonArray; import net.wurstclient.util.json.WsonObject; public final class BookOffersSetting extends Setting @@ -148,12 +148,20 @@ public void fromJson(JsonElement json) { try { - WsonArray wson = JsonUtils.getAsArray(json); offers.clear(); - wson.getAllObjects().parallelStream().map(this::loadOffer) - .filter(Objects::nonNull).filter(BookOffer::isValid).distinct() - .sorted().forEachOrdered(offers::add); + // if string "default", load default offers + if(JsonUtils.getAsString(json, "nope").equals("default")) + { + offers.addAll(Arrays.asList(defaultOffers)); + return; + } + + // otherwise, load the offers in the JSON array + JsonUtils.getAsArray(json).getAllObjects().parallelStream() + .map(this::loadOffer).filter(Objects::nonNull) + .filter(BookOffer::isValid).distinct().sorted() + .forEachOrdered(offers::add); }catch(JsonException e) { @@ -183,6 +191,10 @@ private BookOffer loadOffer(WsonObject wson) @Override public JsonElement toJson() { + // if offers is the same as defaultOffers, save string "default" + if(offers.equals(Arrays.asList(defaultOffers))) + return new JsonPrimitive("default"); + JsonArray json = new JsonArray(); offers.forEach(offer -> { diff --git a/src/main/java/net/wurstclient/settings/ItemListSetting.java b/src/main/java/net/wurstclient/settings/ItemListSetting.java index 26236b5492..d75c6cd324 100644 --- a/src/main/java/net/wurstclient/settings/ItemListSetting.java +++ b/src/main/java/net/wurstclient/settings/ItemListSetting.java @@ -18,6 +18,7 @@ import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import com.google.gson.JsonPrimitive; import net.minecraft.item.Item; import net.minecraft.registry.Registries; @@ -28,7 +29,6 @@ import net.wurstclient.keybinds.PossibleKeybind; import net.wurstclient.util.json.JsonException; import net.wurstclient.util.json.JsonUtils; -import net.wurstclient.util.json.WsonArray; public final class ItemListSetting extends Setting { @@ -90,10 +90,17 @@ public void fromJson(JsonElement json) { try { - WsonArray wson = JsonUtils.getAsArray(json); itemNames.clear(); - wson.getAllStrings().parallelStream() + // if string "default", load default items + if(JsonUtils.getAsString(json, "nope").equals("default")) + { + itemNames.addAll(Arrays.asList(defaultNames)); + return; + } + + // otherwise, load the items in the JSON array + JsonUtils.getAsArray(json).getAllStrings().parallelStream() .map(s -> Registries.ITEM.get(new Identifier(s))) .filter(Objects::nonNull) .map(i -> Registries.ITEM.getId(i).toString()).distinct() @@ -109,6 +116,10 @@ public void fromJson(JsonElement json) @Override public JsonElement toJson() { + // if itemNames is the same as defaultNames, save string "default" + if(itemNames.equals(Arrays.asList(defaultNames))) + return new JsonPrimitive("default"); + JsonArray json = new JsonArray(); itemNames.forEach(s -> json.add(s)); return json; diff --git a/src/main/java/net/wurstclient/settings/SliderSetting.java b/src/main/java/net/wurstclient/settings/SliderSetting.java index 7eb231c872..7c8b486d98 100644 --- a/src/main/java/net/wurstclient/settings/SliderSetting.java +++ b/src/main/java/net/wurstclient/settings/SliderSetting.java @@ -326,6 +326,16 @@ public String getValueString(double v) public static final ValueDisplay ROUNDING_PRECISION = v -> (int)v == 0 ? "1" : "0." + "0".repeat((int)v - 1) + "1"; + /** + * Treats the stored value as a radius from the center block and + * displays the resulting area. For example, a value of 1 will display + * "3x3", 2 will display "5x5", and so on. + */ + public static final ValueDisplay AREA_FROM_RADIUS = v -> { + int d = 2 * (int)v + 1; + return d + "x" + d; + }; + public static final ValueDisplay NONE = v -> ""; public String getValueString(double value); diff --git a/src/main/java/net/wurstclient/settings/SwingHandSetting.java b/src/main/java/net/wurstclient/settings/SwingHandSetting.java index d45e37863c..65264430a9 100644 --- a/src/main/java/net/wurstclient/settings/SwingHandSetting.java +++ b/src/main/java/net/wurstclient/settings/SwingHandSetting.java @@ -18,11 +18,21 @@ public final class SwingHandSetting extends EnumSetting { private static final MinecraftClient MC = WurstClient.MC; - private static final String DESCRIPTION_SUFFIX = buildDescriptionSuffix(); + private static final String FULL_DESCRIPTION_SUFFIX = + buildDescriptionSuffix(true); + private static final String REDUCED_DESCRIPTION_SUFFIX = + buildDescriptionSuffix(false); - public SwingHandSetting(String description) + private SwingHandSetting(String name, String description, + SwingHand[] values, SwingHand selected) { - this(description, SwingHand.SERVER); + super(name, description, values, selected); + } + + public SwingHandSetting(String name, String description, SwingHand selected) + { + this(name, description + FULL_DESCRIPTION_SUFFIX, SwingHand.values(), + selected); } public SwingHandSetting(String description, SwingHand selected) @@ -30,10 +40,23 @@ public SwingHandSetting(String description, SwingHand selected) this("Swing hand", description, selected); } - public SwingHandSetting(String name, String description, SwingHand selected) + public SwingHandSetting(String description) { - super(name, description + DESCRIPTION_SUFFIX, SwingHand.values(), - selected); + this(description, SwingHand.SERVER); + } + + public static SwingHandSetting withoutOffOption(String name, + String description, SwingHand selected) + { + SwingHand[] values = {SwingHand.SERVER, SwingHand.CLIENT}; + return new SwingHandSetting(name, + description + REDUCED_DESCRIPTION_SUFFIX, values, selected); + } + + public static SwingHandSetting withoutOffOption(String description, + SwingHand selected) + { + return withoutOffOption("Swing hand", description, selected); } public void swing(Hand hand) @@ -41,11 +64,13 @@ public void swing(Hand hand) getSelected().swing(hand); } - private static String buildDescriptionSuffix() + private static String buildDescriptionSuffix(boolean includeOff) { StringBuilder builder = new StringBuilder("\n\n"); + SwingHand[] values = includeOff ? SwingHand.values() + : new SwingHand[]{SwingHand.SERVER, SwingHand.CLIENT}; - for(SwingHand value : SwingHand.values()) + for(SwingHand value : values) builder.append("\u00a7l").append(value.name).append("\u00a7r - ") .append(value.description).append("\n\n"); diff --git a/src/main/java/net/wurstclient/settings/filters/FilterBabiesSetting.java b/src/main/java/net/wurstclient/settings/filters/FilterBabiesSetting.java index a60014037b..5f1357ed15 100644 --- a/src/main/java/net/wurstclient/settings/filters/FilterBabiesSetting.java +++ b/src/main/java/net/wurstclient/settings/filters/FilterBabiesSetting.java @@ -8,6 +8,7 @@ package net.wurstclient.settings.filters; import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.Monster; import net.minecraft.entity.passive.PassiveEntity; import net.minecraft.entity.passive.TadpoleEntity; @@ -24,6 +25,10 @@ public FilterBabiesSetting(String description, boolean checked) @Override public boolean test(Entity e) { + // never filter out hostile mobs (including hoglins) + if(e instanceof Monster) + return true; + // filter out passive entity babies if(e instanceof PassiveEntity pe && pe.isBaby()) return false; diff --git a/src/main/java/net/wurstclient/settings/filters/FilterHostileSetting.java b/src/main/java/net/wurstclient/settings/filters/FilterHostileSetting.java index 638f60265a..f52d532f46 100644 --- a/src/main/java/net/wurstclient/settings/filters/FilterHostileSetting.java +++ b/src/main/java/net/wurstclient/settings/filters/FilterHostileSetting.java @@ -27,7 +27,7 @@ public boolean test(Entity e) { // never filter out neutral mobs (including piglins) if(e instanceof Angerable || e instanceof PiglinEntity) - return false; + return true; return !(e instanceof Monster); } diff --git a/src/main/java/net/wurstclient/settings/filters/FilterPassiveSetting.java b/src/main/java/net/wurstclient/settings/filters/FilterPassiveSetting.java index affa9013ad..ccc6bd68e1 100644 --- a/src/main/java/net/wurstclient/settings/filters/FilterPassiveSetting.java +++ b/src/main/java/net/wurstclient/settings/filters/FilterPassiveSetting.java @@ -10,6 +10,7 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.mob.AmbientEntity; import net.minecraft.entity.mob.Angerable; +import net.minecraft.entity.mob.Monster; import net.minecraft.entity.mob.WaterCreatureEntity; import net.minecraft.entity.passive.AnimalEntity; import net.minecraft.entity.passive.PufferfishEntity; @@ -27,6 +28,10 @@ public FilterPassiveSetting(String description, boolean checked) @Override public boolean test(Entity e) { + // never filter out hostile mobs (including hoglins) + if(e instanceof Monster) + return true; + // never filter out neutral mobs (including pufferfish) if(e instanceof Angerable || e instanceof PufferfishEntity) return true; diff --git a/src/main/java/net/wurstclient/update/WurstUpdater.java b/src/main/java/net/wurstclient/update/WurstUpdater.java index 6c1b2962ab..9e8ceb94b9 100644 --- a/src/main/java/net/wurstclient/update/WurstUpdater.java +++ b/src/main/java/net/wurstclient/update/WurstUpdater.java @@ -83,12 +83,21 @@ public void checkForUpdates() e.printStackTrace(); } + String currentVersionEncoded = URLEncoder.encode( + "Wurst " + currentVersion + " MC" + WurstClient.MC_VERSION, + StandardCharsets.UTF_8); + + String baseUrl = "https://www.wurstclient.net/download/"; + String utmSource = "Wurst+Client"; + String utmMedium = "WurstUpdater+chat+message"; + if(latestVersion == null || latestVersion.isInvalid()) { String text = "An error occurred while checking for updates." + " Click \u00a7nhere\u00a7r to check manually."; - String url = - "https://www.wurstclient.net/download/?utm_source=Wurst+Client&utm_medium=WurstUpdater+chat+message&utm_content=An+error+occurred+while+checking+for+updates."; + String url = baseUrl + "?utm_source=" + utmSource + "&utm_medium=" + + utmMedium + "&utm_content=" + currentVersionEncoded + + "+error+checking+updates+chat+message"; showLink(text, url); return; } @@ -96,13 +105,14 @@ public void checkForUpdates() if(!outdated) return; - String textPart1 = "Wurst " + latestVersion + " MC" - + WurstClient.MC_VERSION + " is now available."; - String text = - textPart1 + " Click \u00a7nhere\u00a7r to download the update."; - String url = - "https://www.wurstclient.net/download/?utm_source=Wurst+Client&utm_medium=WurstUpdater+chat+message&utm_content=" - + URLEncoder.encode(textPart1, StandardCharsets.UTF_8); + String text = "Wurst " + latestVersion + + " is now available for Minecraft " + WurstClient.MC_VERSION + + ". \u00a7nUpdate now\u00a7r to benefit from new features and/or bugfixes!"; + String utmContent = currentVersionEncoded + "+update+chat+message"; + + String url = baseUrl + "?utm_source=" + utmSource + "&utm_medium=" + + utmMedium + "&utm_content=" + utmContent; + showLink(text, url); } diff --git a/src/main/java/net/wurstclient/util/BlockBreaker.java b/src/main/java/net/wurstclient/util/BlockBreaker.java index cbcfcc89ff..c1c28ec328 100644 --- a/src/main/java/net/wurstclient/util/BlockBreaker.java +++ b/src/main/java/net/wurstclient/util/BlockBreaker.java @@ -14,6 +14,7 @@ import net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket; import net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket.Action; import net.minecraft.util.Hand; +import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Box; import net.minecraft.util.math.Direction; @@ -126,13 +127,18 @@ public static BlockBreakingParams getBlockBreakingParams(Vec3d eyes, side = sides[i]; } - return new BlockBreakingParams(side, hitVecs[side.ordinal()], + return new BlockBreakingParams(pos, side, hitVecs[side.ordinal()], distancesSq[side.ordinal()], linesOfSight[side.ordinal()]); } - public static record BlockBreakingParams(Direction side, Vec3d hitVec, - double distanceSq, boolean lineOfSight) - {} + public static record BlockBreakingParams(BlockPos pos, Direction side, + Vec3d hitVec, double distanceSq, boolean lineOfSight) + { + public BlockHitResult toHitResult() + { + return new BlockHitResult(hitVec, side, pos, false); + } + } public static void breakBlocksWithPacketSpam(Iterable blocks) { diff --git a/src/main/java/net/wurstclient/util/RotationUtils.java b/src/main/java/net/wurstclient/util/RotationUtils.java index caab79fa00..6b6f0b8d1e 100644 --- a/src/main/java/net/wurstclient/util/RotationUtils.java +++ b/src/main/java/net/wurstclient/util/RotationUtils.java @@ -120,10 +120,10 @@ public static Rotation slowlyTurnTowards(Rotation end, float maxChange) float pitchChange = Math.abs(MathHelper.wrapDegrees(endPitch - startPitch)); - float maxChangeYaw = - Math.min(maxChange, maxChange * yawChange / pitchChange); - float maxChangePitch = - Math.min(maxChange, maxChange * pitchChange / yawChange); + float maxChangeYaw = pitchChange == 0 ? maxChange + : Math.min(maxChange, maxChange * yawChange / pitchChange); + float maxChangePitch = yawChange == 0 ? maxChange + : Math.min(maxChange, maxChange * pitchChange / yawChange); float nextYaw = limitAngleChange(startYaw, endYaw, maxChangeYaw); float nextPitch = diff --git a/src/main/resources/assets/minecraft/shaders/post/lsd.json b/src/main/resources/assets/minecraft/shaders/post/lsd.json new file mode 100644 index 0000000000..86849976f7 --- /dev/null +++ b/src/main/resources/assets/minecraft/shaders/post/lsd.json @@ -0,0 +1,17 @@ +{ + "targets": [ + "swap" + ], + "passes": [ + { + "name": "lsd", + "intarget": "minecraft:main", + "outtarget": "swap" + }, + { + "name": "blit", + "intarget": "swap", + "outtarget": "minecraft:main" + } + ] +} diff --git a/src/main/resources/assets/minecraft/shaders/program/lsd.fsh b/src/main/resources/assets/minecraft/shaders/program/lsd.fsh new file mode 100644 index 0000000000..b36e4854d1 --- /dev/null +++ b/src/main/resources/assets/minecraft/shaders/program/lsd.fsh @@ -0,0 +1,60 @@ +#version 150 + +uniform sampler2D DiffuseSampler; + +in vec2 texCoord; +in vec2 oneTexel; + +uniform vec2 InSize; + +uniform float Time; +uniform vec2 Frequency; +uniform vec2 WobbleAmount; + +out vec4 fragColor; + +vec3 hue(float h) +{ + float r = abs(h * 6.0 - 3.0) - 1.0; + float g = 2.0 - abs(h * 6.0 - 2.0); + float b = 2.0 - abs(h * 6.0 - 4.0); + return clamp(vec3(r,g,b), 0.0, 1.0); +} + +vec3 HSVtoRGB(vec3 hsv) { + return ((hue(hsv.x) - 1.0) * hsv.y + 1.0) * hsv.z; +} + +vec3 RGBtoHSV(vec3 rgb) { + vec3 hsv = vec3(0.0); + hsv.z = max(rgb.r, max(rgb.g, rgb.b)); + float min = min(rgb.r, min(rgb.g, rgb.b)); + float c = hsv.z - min; + + if (c != 0.0) + { + hsv.y = c / hsv.z; + vec3 delta = (hsv.z - rgb) / c; + delta.rgb -= delta.brg; + delta.rg += vec2(2.0, 4.0); + if (rgb.r >= hsv.z) { + hsv.x = delta.b; + } else if (rgb.g >= hsv.z) { + hsv.x = delta.r; + } else { + hsv.x = delta.g; + } + hsv.x = fract(hsv.x / 6.0); + } + return hsv; +} + +void main() { + float xOffset = sin(texCoord.y * Frequency.x + Time * 3.1415926535 * 2.0) * WobbleAmount.x; + float yOffset = cos(texCoord.x * Frequency.y + Time * 3.1415926535 * 2.0) * WobbleAmount.y; + vec2 offset = vec2(xOffset, yOffset); + vec4 rgb = texture(DiffuseSampler, texCoord + offset); + vec3 hsv = RGBtoHSV(rgb.rgb); + hsv.x = fract(hsv.x + Time); + fragColor = vec4(HSVtoRGB(hsv), 1.0); +} diff --git a/src/main/resources/assets/minecraft/shaders/program/lsd.json b/src/main/resources/assets/minecraft/shaders/program/lsd.json new file mode 100644 index 0000000000..abc35e63d3 --- /dev/null +++ b/src/main/resources/assets/minecraft/shaders/program/lsd.json @@ -0,0 +1,86 @@ +{ + "blend": { + "func": "add", + "srcrgb": "one", + "dstrgb": "zero" + }, + "vertex": "sobel", + "fragment": "lsd", + "attributes": [ + "Position" + ], + "samplers": [ + { + "name": "DiffuseSampler" + } + ], + "uniforms": [ + { + "name": "ProjMat", + "type": "matrix4x4", + "count": 16, + "values": [ + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0 + ] + }, + { + "name": "InSize", + "type": "float", + "count": 2, + "values": [ + 1.0, + 1.0 + ] + }, + { + "name": "OutSize", + "type": "float", + "count": 2, + "values": [ + 1.0, + 1.0 + ] + }, + { + "name": "Time", + "type": "float", + "count": 1, + "values": [ + 0.0 + ] + }, + { + "name": "Frequency", + "type": "float", + "count": 2, + "values": [ + 512.0, + 288.0 + ] + }, + { + "name": "WobbleAmount", + "type": "float", + "count": 2, + "values": [ + 0.002, + 0.002 + ] + } + ] +} diff --git a/src/main/resources/assets/wurst/lang/cs_cz.json b/src/main/resources/assets/wurst/lang/cs_cz.json index 4780f92471..b23863c514 100644 --- a/src/main/resources/assets/wurst/lang/cs_cz.json +++ b/src/main/resources/assets/wurst/lang/cs_cz.json @@ -1,7 +1,7 @@ { "description.wurst.hack.airplace": "Umožňuje umístit bloky do prázdného prostoru.", "description.wurst.hack.anchoraura": "Automaticky umísťí (volitelně), nabije a odpalí kotvy oživení k zabití entit kolem vás.", - "description.wurst.hack.antiafk": "Prochází se náhodně, aby vás skryl před AFK detektory.\nPotřebuje alespoň 3x3 bloků volného místa.", + "description.wurst.hack.antiafk": "Prochází se náhodně, aby vás skryl před AFK detektory.", "description.wurst.hack.antiblind": "Zabraňuje blindness a efekty tmy.\nNekompatibilní s OptiFinem.", "description.wurst.hack.anticactus": "Chrání vás před poškozením kaktusem.", "description.wurst.hack.antihunger": "Zpomalí váš hlad, když chodíte.", diff --git a/src/main/resources/assets/wurst/lang/de_de.json b/src/main/resources/assets/wurst/lang/de_de.json index f34eb72f21..e44674f37b 100644 --- a/src/main/resources/assets/wurst/lang/de_de.json +++ b/src/main/resources/assets/wurst/lang/de_de.json @@ -2,7 +2,7 @@ "description.wurst.hack.aimassist": "Hilft dir dabei, auf Mobs und Spieler in deiner Umgebung zu zielen.", "description.wurst.hack.airplace": "Ermöglicht dir, Blöcke in der Luft zu platzieren.", "description.wurst.hack.anchoraura": "Platziert automatisch Seelenanker um dich herum, lädt diese mit Glowstone auf, und sprengt sie dann, um damit Mobs und Spieler um dich herum zu killen.", - "description.wurst.hack.antiafk": "Läuft zufällig durch die Gegend, um dich vor Anti-AFK Plugins zu verstecken.\nBenötigt mindestens 3x3 Blöcke freien Platz.", + "description.wurst.hack.antiafk": "Läuft zufällig durch die Gegend, um dich vor Anti-AFK Plugins zu verstecken.", "description.wurst.hack.antiblind": "Verhindert Blindheits- und Dunkelheitseffekte.\nNicht kompatibel mit OptiFine.", "description.wurst.hack.anticactus": "Schützt dich vor Kakteen.", "description.wurst.hack.antihunger": "Verlangsamt deinen Hunger während du läufst.", diff --git a/src/main/resources/assets/wurst/lang/en_us.json b/src/main/resources/assets/wurst/lang/en_us.json index c933666e03..2c8f16c700 100644 --- a/src/main/resources/assets/wurst/lang/en_us.json +++ b/src/main/resources/assets/wurst/lang/en_us.json @@ -2,7 +2,7 @@ "description.wurst.hack.aimassist": "Helps you aim at nearby entities.", "description.wurst.hack.airplace": "Allows you to place blocks in mid-air.", "description.wurst.hack.anchoraura": "Automatically places (optional), charges, and detonates respawn anchors to kill entities around you.", - "description.wurst.hack.antiafk": "Walks around randomly to hide you from AFK detectors.\nNeeds at least 3x3 blocks of free space.", + "description.wurst.hack.antiafk": "Walks around randomly to hide you from AFK detectors.", "description.wurst.hack.antiblind": "Prevents blindness and darkness effects.\nIncompatible with OptiFine.", "description.wurst.hack.anticactus": "Protects you from cactus damage.", "description.wurst.hack.antientitypush": "Prevents you from getting pushed by players and mobs.", @@ -16,7 +16,7 @@ "description.wurst.setting.arrowdmg.trident_yeet_mode": "When enabled, tridents fly much further. Doesn't seem to affect damage or Riptide.\n\n§c§lWARNING:§r You can easily lose your trident by enabling this option!", "description.wurst.hack.autoarmor": "Manages your armor automatically.", "description.wurst.hack.autobuild": "Builds things automatically.\nPlace a single block to start building.", - "description.wurst.hack.autocomplete": "Auto-completes your chat messages using large language models. Requires either an OpenAI account with API access or a locally installed language model with the oobabooga web UI.", + "description.wurst.hack.autocomplete": "Auto-completes your chat messages using large language models. Requires an OpenAI account with API access or any other language model API that is OpenAI-compatible.", "description.wurst.hack.autodrop": "Automatically drops unwanted items.", "description.wurst.hack.autoleave": "Automatically leaves the server when your health is low.", "description.wurst.hack.autolibrarian": "Automatically trains a villager to become a librarian that sells a specific enchanted book. You can set up an entire trading hall in no time by using this hack.", diff --git a/src/main/resources/assets/wurst/lang/fr_fr.json b/src/main/resources/assets/wurst/lang/fr_fr.json index 49fa2fe0f9..df6fd55056 100644 --- a/src/main/resources/assets/wurst/lang/fr_fr.json +++ b/src/main/resources/assets/wurst/lang/fr_fr.json @@ -1,6 +1,6 @@ { "description.wurst.hack.anchoraura": "Place automatiquement (optionnel), charge et fait exploser les ancres de réapparition pour tuer les entités autour de vous.", - "description.wurst.hack.antiafk": "Marche au hasard pour vous cacher des détecteurs d'AFK.\nNécessite au moins 3x3 blocs d'espace libre.", + "description.wurst.hack.antiafk": "Marche au hasard pour vous cacher des détecteurs d'AFK.", "description.wurst.hack.antiblind": "Empêche l'effet cécité et d'obscurité.\nIncompatible avec OptiFine.", "description.wurst.hack.anticactus": "Vous protège des dommages causés par les cactus.", "description.wurst.hack.antiknockback": "Vous empêche d'être poussé par les joueurs et les mobs.", diff --git a/src/main/resources/assets/wurst/lang/it_it.json b/src/main/resources/assets/wurst/lang/it_it.json index dbf4d68de9..55675eb07f 100644 --- a/src/main/resources/assets/wurst/lang/it_it.json +++ b/src/main/resources/assets/wurst/lang/it_it.json @@ -1,7 +1,7 @@ { "description.wurst.hack.airplace": "Permette di posizionare blocchi in mezz'aria.", "description.wurst.hack.anchoraura": "Posiziona automaticamente (opzionale), carica e fa esplodere le ancore di rigenerazione per uccidere le entità intorno a te.", - "description.wurst.hack.antiafk": "Cammina randomicamente per nasconderti dai detector di player AFK.\nHa bisogno di almeno un 3x3 di spazio libero.", + "description.wurst.hack.antiafk": "Cammina randomicamente per nasconderti dai detector di player AFK.", "description.wurst.hack.antiblind": "Previene la cecità ed effetti oscurità.\nIncompatibile con OptiFine.", "description.wurst.hack.anticactus": "Ti protegge dai danni causati dai cactus.", "description.wurst.hack.antihunger": "Rallenta la tua fame quando cammini.", diff --git a/src/main/resources/assets/wurst/lang/ja_jp.json b/src/main/resources/assets/wurst/lang/ja_jp.json index 50b0291141..334cb3b101 100644 --- a/src/main/resources/assets/wurst/lang/ja_jp.json +++ b/src/main/resources/assets/wurst/lang/ja_jp.json @@ -2,7 +2,7 @@ "description.wurst.hack.aimassist": "近くの存在を狙うのに役立ちます。", "description.wurst.hack.airplace": "空中にブロックを設置できるようになる。", "description.wurst.hack.anchoraura": "リスポーンアンカーを自動で設置(任意)、チャージ、爆発させ、付近にいるエンティティを倒す。", - "description.wurst.hack.antiafk": "離席を検知されないよう、辺りをランダムに歩き回る。\n最低3×3の広さの自由なスペースが必要。", + "description.wurst.hack.antiafk": "離席を検知されないよう、辺りをランダムに歩き回る。", "description.wurst.hack.antiblind": "盲目や暗闇の効果を防ぎます。\nOptiFineとの互換性はありません。", "description.wurst.hack.anticactus": "サボテンのダメージを無効化する。", "description.wurst.hack.antientitypush": "プレイヤーやモブに押されるのを防ぎます。", @@ -16,7 +16,7 @@ "description.wurst.setting.arrowdmg.trident_yeet_mode": "有効時、トライデントがより遠くまで飛ばせるようになる。ダメージ量や激流エンチャントには影響しない模様。\n\n§c§l注意: §rこのオプションを有効化した場合、トライデントをロストしやすくなる。", "description.wurst.hack.autoarmor": "防具を自動で管理する。", "description.wurst.hack.autobuild": "自動で建築を行う。\nブロックを一つ設置することで建築が開始される。", - "description.wurst.hack.autocomplete": "大規模な言語モデルを使用してチャット メッセージをオートコンプリートします。 API アクセスのある OpenAI アカウント、または oobabooga Web UI を使用してローカルにインストールされた言語モデルのいずれかが必要です。", + "description.wurst.hack.autocomplete": "大規模な言語モデルを使用してチャット メッセージをオートコンプリートします。 API アクセス権を持つ OpenAI アカウント、または OpenAI 互換の他の言語モデル API が必要です。", "description.wurst.hack.autodrop": "必要のないアイテムを自動で捨てる。", "description.wurst.hack.autoleave": "残り体力が少なくなるとに自動的にサーバーから切断する。", "description.wurst.hack.autolibrarian": "村人を自動的に訓練して、特定の魔法の本を販売する司書にします。 このハックを使用すると、すぐに取引ホール全体をセットアップできます。", diff --git a/src/main/resources/assets/wurst/lang/ko_kr.json b/src/main/resources/assets/wurst/lang/ko_kr.json index 18a5a390f9..ff372f782e 100644 --- a/src/main/resources/assets/wurst/lang/ko_kr.json +++ b/src/main/resources/assets/wurst/lang/ko_kr.json @@ -1,7 +1,7 @@ { "description.wurst.hack.aimassist": "주변 엔티티를 조준하는 데 도움을 줍니다.", "description.wurst.hack.airplace": "공중에 블록을 배치할 수 있게 해줍니다.", - "description.wurst.hack.antiafk": "자리비움 검출기에서 숨기기 위해 무작위로 이동합니다.\n적어도 3x3 블록의 빈 공간이 필요합니다.", + "description.wurst.hack.antiafk": "자리비움 검출기에서 숨기기 위해 무작위로 이동합니다.", "description.wurst.hack.antiblind": "실명 및 어둠 효과를 방지합니다.\nOptiFine과 호환되지 않습니다.", "description.wurst.hack.anticactus": "선인장 대미지를 받지 않습니다.", "description.wurst.hack.antientitypush": "다른 플레이어나 몹에게 밀려나는 것을 방지합니다.", @@ -12,7 +12,7 @@ "description.wurst.setting.arrowdmg.packets": "전송할 패킷 수.\n패킷이 많을수록 공격력이 높아집니다.", "description.wurst.hack.autoarmor": "자동으로 방어구를 관리합니다.", "description.wurst.hack.autobuild": "자동으로 건물을 건설합니다.\n한 개의 블록을 놓으면 건설을 시작합니다.", - "description.wurst.hack.autocomplete": "대형 언어 모델을 사용하여 채팅 메시지를 자동 완성합니다. OpenAI 계정 API 접근 권한이나 지역적으로 설치된 oobabooga 웹 UI가 필요합니다.", + "description.wurst.hack.autocomplete": "대형 언어 모델을 사용하여 채팅 메시지를 자동 완성합니다. OpenAI 계정 API 접근 권한 또는 OpenAI와 호환되는 다른 언어 모델 API가 필요합니다.", "description.wurst.hack.autodrop": "원하지 않는 아이템을 자동으로 버립니다.", "description.wurst.hack.autoleave": "체력이 낮을 때 자동으로 서버에서 나갑니다.", "description.wurst.hack.autolibrarian": "특정 인챈트된 책을 판매하는 마을 주민을 자동으로 훈련합니다. 이 핵을 사용하면 전체 거래 구간을 짧은 시간 내에 설정할 수 있습니다.", diff --git a/src/main/resources/assets/wurst/lang/pl_pl.json b/src/main/resources/assets/wurst/lang/pl_pl.json index c8209edcc1..2469c1902b 100644 --- a/src/main/resources/assets/wurst/lang/pl_pl.json +++ b/src/main/resources/assets/wurst/lang/pl_pl.json @@ -1,7 +1,7 @@ { "description.wurst.hack.airplace": "Pozwala stawiać bloki w powietrzu.", "description.wurst.hack.anchoraura": "Automatycznie umieszcza (opcjonalnie), ładuje i wysadza kotwice odrodzenia, aby zabijać otaczające cię istoty.", - "description.wurst.hack.antiafk": "Spaceruje losowo dookoła, aby ukryć cię przed wykrywaczami AFK.\nWymaga co najmniej 3x3 bloków wolnego miejsca.", + "description.wurst.hack.antiafk": "Spaceruje losowo dookoła, aby ukryć cię przed wykrywaczami AFK.", "description.wurst.hack.antiblind": "Zapobiega efektom oślepienia i ciemności.\nNiekompatybilny z OptiFine.", "description.wurst.hack.anticactus": "Ochrania cię przed obrażeniami od kaktusa.", "description.wurst.hack.antihunger": "Spowalnia głód podczas chodzenia.", diff --git a/src/main/resources/assets/wurst/lang/ro_ro.json b/src/main/resources/assets/wurst/lang/ro_ro.json index ffec42bb12..0431d4b4d6 100644 --- a/src/main/resources/assets/wurst/lang/ro_ro.json +++ b/src/main/resources/assets/wurst/lang/ro_ro.json @@ -1,6 +1,6 @@ { "description.wurst.hack.anchoraura": "Plaseaza automat (optional), incarca, si detoneaza respawn anchoruri pentru a ucide entitati din jurul tau.", - "description.wurst.hack.antiafk": "Umbla anapoda pentru a evita pluginuri anti-afk.\nNeceseita un spatiu liber de cel putin 3x3.", + "description.wurst.hack.antiafk": "Umbla anapoda pentru a evita pluginuri anti-afk.", "description.wurst.hack.antiblind": "Previne orbirea si efectele întunericului.\nIncompatibl cu OptiFine.", "description.wurst.hack.anticactus": "Esti protejat de damage-ul dat de cactusi.", "description.wurst.hack.antiknockback": "Te previne din a fi impins de catre playeri sau mobi.", diff --git a/src/main/resources/assets/wurst/lang/ru_ru.json b/src/main/resources/assets/wurst/lang/ru_ru.json index b75b885d4c..c404fb1595 100644 --- a/src/main/resources/assets/wurst/lang/ru_ru.json +++ b/src/main/resources/assets/wurst/lang/ru_ru.json @@ -1,7 +1,7 @@ { "description.wurst.hack.airplace": "Позволяет ставить блоки в воздухе.", "description.wurst.hack.anchoraura": "Автоматически ставит (если отмечено), заряжает и взрывает якоря возрождения, чтобы убить сущностей вокруг вас.", - "description.wurst.hack.antiafk": "Ходит в случайном направлении чтобы сервер не знал что Вы АФК.\nДля работы необходимо свободное пространство хотя бы в 3 на 3 блока.", + "description.wurst.hack.antiafk": "Ходит в случайном направлении чтобы сервер не знал что Вы АФК.", "description.wurst.hack.antiblind": "Предотвращает эффекты слепоты и темноты.\nНесовместим с OptiFine.", "description.wurst.hack.anticactus": "Защищает Вас от урона от столкновения с кактусами.", "description.wurst.hack.antihunger": "Замедляет уменьшение голода, когда вы ходите.", diff --git a/src/main/resources/assets/wurst/lang/uk_ua.json b/src/main/resources/assets/wurst/lang/uk_ua.json index 113b4e0be9..1870bd5a71 100644 --- a/src/main/resources/assets/wurst/lang/uk_ua.json +++ b/src/main/resources/assets/wurst/lang/uk_ua.json @@ -1,6 +1,6 @@ { "description.wurst.hack.anchoraura": "Автоматично ставить (якщо прийнято), заряджає і підриває якоря відродження, щоб убити сутності навколо.", - "description.wurst.hack.antiafk": "Ходить у випадковому напрямку, щоб сервер не знав, що ви є АФК.\nДля роботи необхідний простір хоча б 3х3 блоку.", + "description.wurst.hack.antiafk": "Ходить у випадковому напрямку, щоб сервер не знав, що ви є АФК.", "description.wurst.hack.antiblind": "Запобігає ефекту сліпоти та темряви.\nНесумісний з OptiFine.", "description.wurst.hack.anticactus": "Захищає вас від урону від зіткнення з кактусами.", "description.wurst.hack.antiknockback": "Запобігає відкиданням при отриманні урону.", diff --git a/src/main/resources/assets/wurst/lang/zh_cn.json b/src/main/resources/assets/wurst/lang/zh_cn.json index b1c76c72e2..4d51fe9ea7 100644 --- a/src/main/resources/assets/wurst/lang/zh_cn.json +++ b/src/main/resources/assets/wurst/lang/zh_cn.json @@ -1,7 +1,7 @@ { "description.wurst.hack.airplace": "允许您在空中放置方块。", "description.wurst.hack.anchoraura": "自动放置(可选),充能,引爆重生锚并击杀你附近的实体。", - "description.wurst.hack.antiafk": "随机走动,用于避免服务器挂机检测。\n需要至少有 3x3 的区域可以走动。", + "description.wurst.hack.antiafk": "随机走动,用于避免服务器挂机检测。", "description.wurst.hack.antiblind": "防止失明和黑暗效果。\n与 OptiFine 不兼容。", "description.wurst.hack.anticactus": "保护你免受仙人掌伤害。", "description.wurst.hack.antihunger": "在你走路时减缓你的饥饿状态。", diff --git a/src/main/resources/assets/wurst/lang/zh_hk.json b/src/main/resources/assets/wurst/lang/zh_hk.json index 8670e7beef..5f7c8971de 100644 --- a/src/main/resources/assets/wurst/lang/zh_hk.json +++ b/src/main/resources/assets/wurst/lang/zh_hk.json @@ -1,6 +1,6 @@ { "description.wurst.hack.anchoraura": "自動放置(可選),充能並引爆重生錨以擊殺你附近嘅實體。", - "description.wurst.hack.antiafk": "隨便行,避免被伺服器掛機檢查。\n需 3x3 嘅區域。", + "description.wurst.hack.antiafk": "隨便行,避免被伺服器掛機檢查。", "OUTDATED.description.wurst.hack.antiblind": "以防盲咗。\n同 OptiFine(高清修復)唔兼容。", "description.wurst.hack.anticactus": "保護你避免受到仙人掌傷害。", "description.wurst.hack.antiknockback": "保護你唔會被其他生物或者玩家推動同埋用劍擊退。", diff --git a/src/main/resources/assets/wurst/lang/zh_tw.json b/src/main/resources/assets/wurst/lang/zh_tw.json index ad003f808b..543c298ce7 100644 --- a/src/main/resources/assets/wurst/lang/zh_tw.json +++ b/src/main/resources/assets/wurst/lang/zh_tw.json @@ -1,7 +1,7 @@ { "description.wurst.hack.airplace": "允許你在半空中放置方塊。", "description.wurst.hack.anchoraura": "自動放置(可選),充能並引爆重生錨並擊殺你附近的實體。", - "description.wurst.hack.antiafk": "隨機走動,用於避免伺服器掛機檢測。\n需要至少有3x3的區域可以走動。", + "description.wurst.hack.antiafk": "隨機走動,用於避免伺服器掛機檢測。", "description.wurst.hack.antiblind": "防止失明和黑暗效果。\n與 OptiFine不相容。", "description.wurst.hack.anticactus": "保護你免受仙人掌傷害。", "description.wurst.hack.antihunger": "走路時減緩你的飢餓度。", diff --git a/src/main/resources/wurst.accesswidener b/src/main/resources/wurst.accesswidener index fb5d63f683..2136908569 100644 --- a/src/main/resources/wurst.accesswidener +++ b/src/main/resources/wurst.accesswidener @@ -1,6 +1,7 @@ accessWidener v1 named accessible class net/minecraft/client/render/BackgroundRenderer$StatusEffectFogModifier accessible method net/minecraft/client/MinecraftClient doItemUse ()V +accessible method net/minecraft/client/Mouse onMouseButton (JIII)V accessible method net/minecraft/client/render/BackgroundRenderer getFogModifier (Lnet/minecraft/entity/Entity;F)Lnet/minecraft/client/render/BackgroundRenderer$StatusEffectFogModifier; accessible method net/minecraft/client/render/GameRenderer loadPostProcessor (Lnet/minecraft/util/Identifier;)V accessible method net/minecraft/entity/projectile/FishingBobberEntity isOpenOrWaterAround (Lnet/minecraft/util/math/BlockPos;)Z