0
0
mirror of https://github.com/Wurst-Imperium/Wurst7.git synced 2024-09-20 01:12:13 +02:00

Merge v7.39 into 1.20

This commit is contained in:
Alexander01998 2024-02-28 19:35:52 +01:00
parent 089700c305
commit f1cf4ec4b5
78 changed files with 1007 additions and 725 deletions

2
.github/FUNDING.yml vendored
View File

@ -1,3 +1,3 @@
# These are supported funding model platforms
ko_fi: wurst
custom: https://www.wurstclient.net/donate/?utm_source=GitHub&utm_medium=Wurst7&utm_campaign=GitHub+Sponsors&utm_content=Sponsor+this+project

View File

@ -1,31 +0,0 @@
---
name: Bug Report
about: Report a bug
title: ''
labels: bug
assignees: ''
---
Before posting, please make sure that this hasn't already been reported by someone else.
## Description
What's wrong?
## Steps To Reproduce
Please make a list of steps to reproduce the problem (ideally from a fresh Wurst installation):
1.
2.
3.
## Screenshots / Videos (Optional)
If applicable, add screenshots, videos or other files to help explain the problem.
## Crash Report
Please find your crash report file at "%appdata%/.minecraft/crash-reports", open the file in a text editor and copy-paste its content below.
```
(crash report goes here)
```
**Please note:** If the game did not crash, please hold down F3+C for 10 seconds to generate a crash report. Even when a bug doesn't cause the game to crash, this file still contains useful information that can help us to find and fix the problem. Because of this, please always include a crash report.

66
.github/ISSUE_TEMPLATE/bug-report.yml vendored Normal file
View File

@ -0,0 +1,66 @@
name: Bug Report
description: Report a bug
labels: ["type:bug", "status:unconfirmed"]
body:
- type: markdown
attributes:
value: |
## Welcome!
Please fill out the following template to help us understand and reproduce the issue you're experiencing.
- type: checkboxes
id: checklist
attributes:
label: Pre-reporting checklist
description: "Please select all that apply."
options:
- label: "I have searched existing issues and didn't find any previous reports of this bug."
- label: "This bug still happens in the latest version of Wurst. I've made sure my installation is up to date."
- label: "I have tried removing all other mods and the bug still happens."
- type: textarea
id: description
attributes:
label: Description
description: "Please describe the bug in as much detail as possible."
validations:
required: true
- type: textarea
id: repro
attributes:
label: Repro steps
description: "How do you trigger this bug? Please walk us through it step by step."
value: |
1.
2.
3.
validations:
required: true
- type: input
id: wurst-version
attributes:
label: Wurst Client version
placeholder: e.g. 7.15
validations:
required: true
- type: input
id: minecraft-version
attributes:
label: Minecraft version
placeholder: e.g. 1.16.5
validations:
required: true
- type: textarea
id: crash
attributes:
label: Crash report (if applicable)
description: "If your game crashed, please paste the entire crash report here."
placeholder: |
---- Minecraft Crash Report ----
// Who set us up the TNT?
render: plaintext
validations:
required: false
- type: markdown
attributes:
value: |
## Thank you!
We appreciate your help in improving Wurst Client by reporting this bug. Please make sure you have filled out all the necessary information before submitting this issue.

View File

@ -1,14 +0,0 @@
---
name: Suggestion
about: Suggest a new hack/command/setting/etc.
title: ''
labels: enhancement
assignees: ''
---
Before posting, please make sure that this hasn't already been suggested by someone else.
## Description
What does it do and how is it useful? Please assume that we have never heard of it before. Just mentioning a name won't work. If it's for an older version of Minecraft (like 1.8 or 1.12), please mention that too.
## Screenshots / Videos (Optional)
If applicable, add screenshots, videos or other files to help explain the suggestion.

62
.github/ISSUE_TEMPLATE/suggestion.yml vendored Normal file
View File

@ -0,0 +1,62 @@
name: Suggestion
description: "Suggest a change to improve the Wurst Client"
labels: ["type:enhancement", "status:unconfirmed"]
body:
- type: markdown
attributes:
value: |
## Welcome!
Please fill out the following template to help us understand the improvement you're suggesting.
- type: checkboxes
id: checklist
attributes:
label: Pre-suggestion checklist
description: "Please select all that apply."
options:
- label: "I have searched existing issues and didn't find any previous issues with the same suggestion."
- label: "This is only one suggestion. I understand that GitHub issues don't work well with lists."
- label: "This feature doesn't already exist in the latest version of Wurst. I've made sure my installation is up to date."
- label: "I have looked at the code and am reasonably confident that this suggestion is possible to implement."
- type: dropdown
id: type
attributes:
label: What type of improvement are you suggesting?
multiple: true
options:
- "Adding a new hack."
- "Adding a new chat command."
- "Adding a different kind of feature."
- "Changing the settings of existing features."
- "Porting existing features to a different Minecraft version."
- "Turning a Wurst feature into a standalone mod."
- "Removing an old feature that doesn't work anymore."
- "Other (please explain in description)"
validations:
required: true
- type: dropdown
id: target-audience
attributes:
label: What type of player would find this improvement useful?
multiple: true
options:
- "Builders"
- "Miners"
- "Griefers"
- "PVPers"
- "Redstoners"
- "Anarchy/faction players"
- "Other (please explain in description)"
validations:
required: true
- type: textarea
id: description
attributes:
label: Description
description: "Please describe the improvement in as much detail as possible. What does it do and how is it useful? Assume that we have never heard of it before, even if it exists in other hacked clients."
validations:
required: true
- type: markdown
attributes:
value: |
## Thank you!
We appreciate your help in improving Wurst Client by suggesting this improvement. Please make sure you have filled out all the necessary information before submitting this issue.

View File

@ -1,7 +1,7 @@
<!--NOTE: If you are contributing multiple unrelated features, please create a separate pull request for each feature. Squeezing everything into one giant pull request makes it very difficult for me to add your features, as I have to test, validate and add them one by one. Thank you for your understanding - and thanks again for taking the time to contribute!!-->
## Description
What have you added and what does it do? (Alternatively, what have you fixed and how does it work?)
> What have you added and what does it do? (Alternatively, what have you fixed and how does it work?)
## (Optional) screenshots / videos
If applicable, add screenshots or videos to help explain your pull request.
> If applicable, add screenshots or videos to help explain your pull request.

View File

@ -33,5 +33,5 @@ jobs:
days-before-close: 7
stale-issue-label: "status:stale"
stale-pr-label: "status:stale"
operations-per-run: 30
operations-per-run: 50
enable-statistics: true

View File

@ -13,7 +13,7 @@ loader_version=0.15.7
fabric_version=0.83.0+1.20
# Mod Properties
mod_version = v7.38-MC1.20
mod_version = v7.39-MC1.20
maven_group = net.wurstclient
archives_base_name = Wurst-Client

View File

@ -12,6 +12,28 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Adds search tags to a Wurst feature so that it can be found through the
* search bar in the Navigator GUI.
*
* <p>
* Navigator can already find features by their name and description, so
* repeating that information in the search tags is pointless. However, names
* and descriptions of settings are not used by Navigator, so repeating those
* can make sense if people are likely to search for them.
*
* <p>
* Navigator is not case-sensitive, so for example "NukerLegit" and "nukerlegit"
* are treated the same. However, Navigator struggles with spaces and the order
* of words, for example "NukerLegit", "Nuker Legit" and "Legit Nuker" are all
* treated differently.
*
* <p>
* By convention, search tags with spaces should be written in lower case and
* search tags without spaces should be written in camel case. For example,
* "NukerLegit" and "nuker legit". This is not enforced, but it makes the
* code easier to read.
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface SearchTags

View File

@ -57,7 +57,7 @@ public enum WurstClient
public static MinecraftClient MC;
public static IMinecraftClient IMC;
public static final String VERSION = "7.38";
public static final String VERSION = "7.39";
public static final String MC_VERSION = "1.20";
private WurstAnalytics analytics;

View File

@ -151,4 +151,10 @@ public class FlyPathProcessor extends PathProcessor
}
}
}
@Override
public boolean canBreakBlocks()
{
return true;
}
}

View File

@ -40,6 +40,8 @@ public abstract class PathProcessor
public abstract void process();
public abstract boolean canBreakBlocks();
public final int getIndex()
{
return index;

View File

@ -138,4 +138,10 @@ public class WalkPathProcessor extends PathProcessor
MC.options.forwardKey.setPressed(true);
}
}
@Override
public boolean canBreakBlocks()
{
return MC.player.isOnGround();
}
}

View File

@ -16,6 +16,7 @@ import net.wurstclient.command.CmdException;
import net.wurstclient.command.CmdSyntaxError;
import net.wurstclient.command.Command;
import net.wurstclient.util.ChatUtils;
import net.wurstclient.util.ItemUtils;
public final class EnchantCmd extends Command
{
@ -34,15 +35,16 @@ public final class EnchantCmd extends Command
if(args.length > 1)
throw new CmdSyntaxError();
ItemStack stack = getHeldItem();
enchant(stack);
enchant(getHeldItem(), 127);
ChatUtils.message("Item enchanted.");
}
private ItemStack getHeldItem() throws CmdError
{
ItemStack stack = MC.player.getInventory().getMainHandStack();
ItemStack stack = MC.player.getMainHandStack();
if(stack.isEmpty())
stack = MC.player.getOffHandStack();
if(stack.isEmpty())
throw new CmdError("There is no item in your hand.");
@ -50,23 +52,26 @@ public final class EnchantCmd extends Command
return stack;
}
private void enchant(ItemStack stack)
private void enchant(ItemStack stack, int level)
{
for(Enchantment enchantment : Registries.ENCHANTMENT)
{
if(enchantment == Enchantments.SILK_TOUCH)
continue;
// Skip curses
if(enchantment.isCursed())
continue;
// Skip Silk Touch so it doesn't remove Fortune
if(enchantment == Enchantments.SILK_TOUCH)
continue;
// Limit Quick Charge to level 5 so it doesn't break
if(enchantment == Enchantments.QUICK_CHARGE)
{
stack.addEnchantment(enchantment, 5);
stack.addEnchantment(enchantment, Math.min(level, 5));
continue;
}
stack.addEnchantment(enchantment, 127);
ItemUtils.addEnchantment(stack, enchantment, level);
}
}

View File

@ -10,11 +10,11 @@ package net.wurstclient.commands;
import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.util.math.Box;
import net.minecraft.util.math.Direction;
import net.minecraft.util.shape.VoxelShape;
import net.wurstclient.command.CmdError;
import net.wurstclient.command.CmdException;
import net.wurstclient.command.CmdSyntaxError;
import net.wurstclient.command.Command;
import net.wurstclient.util.BlockUtils;
import net.wurstclient.util.MathUtils;
public final class VClipCmd extends Command
@ -92,15 +92,12 @@ public final class VClipCmd extends Command
private boolean hasCollisions(Box box)
{
Iterable<VoxelShape> collisions =
MC.world.getBlockCollisions(MC.player, box);
return collisions.iterator().hasNext();
return BlockUtils.getBlockCollisions(box).findAny().isPresent();
}
private double getSubBlockOffset(Box offsetBox)
{
return IMC.getWorld().getCollidingBoxes(MC.player, offsetBox)
return BlockUtils.getBlockCollisions(offsetBox)
.mapToDouble(box -> box.maxY).max().getAsDouble() - offsetBox.minY;
}

View File

@ -8,6 +8,7 @@
package net.wurstclient.events;
import java.util.ArrayList;
import java.util.Objects;
import net.minecraft.block.BlockState;
import net.minecraft.util.math.BlockPos;
@ -27,7 +28,7 @@ public interface ShouldDrawSideListener extends Listener
public ShouldDrawSideEvent(BlockState state, BlockPos pos)
{
this.state = state;
this.state = Objects.requireNonNull(state);
this.pos = pos;
}

View File

@ -1,61 +0,0 @@
/*
* Copyright (c) 2014-2023 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.events;
import java.util.ArrayList;
import net.minecraft.block.BlockState;
import net.minecraft.util.math.BlockPos;
import net.wurstclient.event.CancellableEvent;
import net.wurstclient.event.Listener;
public interface TesselateBlockListener extends Listener
{
public void onTesselateBlock(TesselateBlockEvent event);
public static class TesselateBlockEvent
extends CancellableEvent<TesselateBlockListener>
{
private final BlockState state;
private final BlockPos pos;
public TesselateBlockEvent(BlockState state, BlockPos pos)
{
this.state = state;
this.pos = pos;
}
public BlockState getState()
{
return state;
}
public BlockPos getPos()
{
return pos;
}
@Override
public void fire(ArrayList<TesselateBlockListener> listeners)
{
for(TesselateBlockListener listener : listeners)
{
listener.onTesselateBlock(this);
if(isCancelled())
break;
}
}
@Override
public Class<TesselateBlockListener> getListenerType()
{
return TesselateBlockListener.class;
}
}
}

View File

@ -65,6 +65,7 @@ public final class HackList implements UpdateListener
public final AutoToolHack autoToolHack = new AutoToolHack();
public final AutoTotemHack autoTotemHack = new AutoTotemHack();
public final AutoWalkHack autoWalkHack = new AutoWalkHack();
public final BarrierEspHack barrierEspHack = new BarrierEspHack();
public final BaseFinderHack baseFinderHack = new BaseFinderHack();
public final BlinkHack blinkHack = new BlinkHack();
public final BoatFlyHack boatFlyHack = new BoatFlyHack();

View File

@ -41,12 +41,13 @@ public final class AutoFishHack extends Hack
private final SliderSetting catchDelay = new SliderSetting("Catch delay",
"How long AutoFish will wait after a bite before reeling in.", 0, 0, 60,
1, ValueDisplay.INTEGER.withSuffix(" ticks"));
1, ValueDisplay.INTEGER.withSuffix(" ticks").withLabel(1, "1 tick"));
private final SliderSetting retryDelay = new SliderSetting("Retry delay",
"If casting or reeling in the fishing rod fails, this is how long"
+ " AutoFish will wait before trying again.",
15, 0, 100, 1, ValueDisplay.INTEGER.withSuffix(" ticks"));
15, 0, 100, 1,
ValueDisplay.INTEGER.withSuffix(" ticks").withLabel(1, "1 tick"));
private final SliderSetting patience = new SliderSetting("Patience",
"How long AutoFish will wait if it doesn't get a bite before reeling in.",

View File

@ -13,6 +13,7 @@ import net.wurstclient.Category;
import net.wurstclient.SearchTags;
import net.wurstclient.events.UpdateListener;
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;
@ -36,13 +37,18 @@ public final class AutoLeaveHack extends Hack implements UpdateListener
+ "Bypasses both CombatLog and NoCheat+.",
Mode.values(), Mode.QUIT);
private final CheckboxSetting disableAutoReconnect = new CheckboxSetting(
"Disable AutoReconnect", "Automatically turns off AutoReconnect when"
+ " AutoLeave makes you leave the server.",
true);
public AutoLeaveHack()
{
super("AutoLeave");
setCategory(Category.COMBAT);
addSetting(health);
addSetting(mode);
addSetting(disableAutoReconnect);
}
@Override
@ -76,7 +82,8 @@ public final class AutoLeaveHack extends Hack implements UpdateListener
return;
// check health
if(MC.player.getHealth() > health.getValueF() * 2F)
float currentHealth = MC.player.getHealth();
if(currentHealth <= 0F || currentHealth > health.getValueF() * 2F)
return;
// leave server
@ -104,6 +111,9 @@ public final class AutoLeaveHack extends Hack implements UpdateListener
// disable
setEnabled(false);
if(disableAutoReconnect.isChecked())
WURST.getHax().autoReconnectHack.setEnabled(false);
}
public static enum Mode

View File

@ -9,16 +9,23 @@ package net.wurstclient.hacks;
import net.wurstclient.Category;
import net.wurstclient.SearchTags;
import net.wurstclient.WurstClient;
import net.wurstclient.events.DeathListener;
import net.wurstclient.hack.Hack;
import net.wurstclient.settings.CheckboxSetting;
@SearchTags({"auto respawn", "AutoRevive", "auto revive"})
public final class AutoRespawnHack extends Hack implements DeathListener
{
private final CheckboxSetting button =
new CheckboxSetting("Death screen button", "Shows a button on the death"
+ " screen that lets you quickly enable AutoRespawn.", true);
public AutoRespawnHack()
{
super("AutoRespawn");
setCategory(Category.COMBAT);
addSetting(button);
}
@Override
@ -39,4 +46,10 @@ public final class AutoRespawnHack extends Hack implements DeathListener
MC.player.requestRespawn();
MC.setScreen(null);
}
public boolean shouldShowButton()
{
return WurstClient.INSTANCE.isEnabled() && !isEnabled()
&& button.isChecked();
}
}

View File

@ -23,6 +23,7 @@ import net.wurstclient.settings.CheckboxSetting;
import net.wurstclient.settings.EnumSetting;
import net.wurstclient.settings.SliderSetting;
import net.wurstclient.settings.SliderSetting.ValueDisplay;
import net.wurstclient.util.EntityUtils;
import net.wurstclient.util.ItemUtils;
@SearchTags({"auto sword"})
@ -39,7 +40,8 @@ public final class AutoSwordHack extends Hack implements UpdateListener
private final SliderSetting releaseTime = new SliderSetting("Release time",
"Time until AutoSword will switch back from the weapon to the previously selected slot.\n\n"
+ "Only works when \u00a7lSwitch back\u00a7r is checked.",
10, 1, 200, 1, ValueDisplay.INTEGER.withSuffix(" ticks"));
10, 1, 200, 1,
ValueDisplay.INTEGER.withSuffix(" ticks").withLabel(1, "1 tick"));
private int oldSlot;
private int timer;
@ -77,7 +79,7 @@ public final class AutoSwordHack extends Hack implements UpdateListener
Entity entity = ((EntityHitResult)MC.crosshairTarget).getEntity();
if(entity instanceof LivingEntity
&& ((LivingEntity)entity).getHealth() > 0)
&& EntityUtils.IS_ATTACKABLE.test(entity))
setSlot();
}

View File

@ -0,0 +1,24 @@
/*
* Copyright (c) 2014-2023 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;
import net.wurstclient.Category;
import net.wurstclient.SearchTags;
import net.wurstclient.hack.Hack;
@SearchTags({"barrier esp"})
public class BarrierEspHack extends Hack
{
public BarrierEspHack()
{
super("BarrierESP");
setCategory(Category.RENDER);
}
// See ClientWorldMixin
}

View File

@ -23,9 +23,6 @@ import net.wurstclient.util.GoogleTranslate;
"google translator", "GoogleTranslation", "google translation"})
public final class ChatTranslatorHack extends Hack implements ChatInputListener
{
private static final GoogleTranslate googleTranslate =
new GoogleTranslate();
private final EnumSetting<FromLanguage> langFrom = new EnumSetting<>(
"Translate from", FromLanguage.values(), FromLanguage.AUTO_DETECT);
@ -79,7 +76,7 @@ public final class ChatTranslatorHack extends Hack implements ChatInputListener
|| incomingMsg.startsWith(translatorPrefix))
return;
String translated = googleTranslate.translate(incomingMsg,
String translated = GoogleTranslate.translate(incomingMsg,
langFrom.getSelected().value, langTo.getSelected().value);
if(translated == null)

View File

@ -31,8 +31,8 @@ public final class CreativeFlightHack extends Hack implements UpdateListener
new SliderSetting("Anti-Kick Interval",
"How often Anti-Kick should prevent you from getting kicked.\n"
+ "Most servers will kick you after 80 ticks.",
30, 5, 80, 1,
SliderSetting.ValueDisplay.INTEGER.withSuffix(" ticks"));
30, 5, 80, 1, SliderSetting.ValueDisplay.INTEGER
.withSuffix(" ticks").withLabel(1, "1 tick"));
private final SliderSetting antiKickDistance = new SliderSetting(
"Anti-Kick Distance",

View File

@ -44,7 +44,8 @@ public final class FlightHack extends Hack
new SliderSetting("Anti-Kick Interval",
"How often Anti-Kick should prevent you from getting kicked.\n"
+ "Most servers will kick you after 80 ticks.",
30, 5, 80, 1, ValueDisplay.INTEGER.withSuffix(" ticks"));
30, 5, 80, 1,
ValueDisplay.INTEGER.withSuffix(" ticks").withLabel(1, "1 tick"));
private final SliderSetting antiKickDistance = new SliderSetting(
"Anti-Kick Distance",

View File

@ -19,7 +19,6 @@ import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Box;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.shape.VoxelShape;
import net.wurstclient.Category;
import net.wurstclient.SearchTags;
import net.wurstclient.events.PacketOutputListener;
@ -157,25 +156,19 @@ public final class JesusHack extends Hack
{
boolean foundLiquid = false;
boolean foundSolid = false;
Box box = MC.player.getBoundingBox().offset(0, -0.5, 0);
// check collision boxes below player
ArrayList<Box> blockCollisions = IMC.getWorld()
.getBlockCollisionsStream(MC.player,
MC.player.getBoundingBox().offset(0, -0.5, 0))
.map(VoxelShape::getBoundingBox)
ArrayList<Block> blockCollisions = BlockUtils.getBlockCollisions(box)
.map(bb -> BlockUtils.getBlock(BlockPos.ofFloored(bb.getCenter())))
.collect(Collectors.toCollection(ArrayList::new));
for(Box bb : blockCollisions)
{
BlockPos pos = BlockPos.ofFloored(bb.getCenter());
Block block = BlockUtils.getBlock(pos);
for(Block block : blockCollisions)
if(block instanceof FluidBlock)
foundLiquid = true;
else if(!(block instanceof AirBlock))
foundSolid = true;
}
return foundLiquid && !foundSolid;
}

View File

@ -10,6 +10,7 @@ package net.wurstclient.hacks;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
import java.util.regex.Pattern;
import net.minecraft.client.network.PlayerListEntry;
import net.minecraft.util.StringHelper;
@ -19,6 +20,10 @@ import net.wurstclient.events.ChatInputListener;
import net.wurstclient.events.UpdateListener;
import net.wurstclient.hack.DontSaveState;
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.TextFieldSetting;
import net.wurstclient.util.ChatUtils;
@SearchTags({"mass tpa"})
@ -26,9 +31,36 @@ import net.wurstclient.util.ChatUtils;
public final class MassTpaHack extends Hack
implements UpdateListener, ChatInputListener
{
private static final Pattern ALLOWED_COMMANDS =
Pattern.compile("^/+[a-zA-Z0-9_\\-]+$");
private final TextFieldSetting commandSetting =
new TextFieldSetting("Command",
"The command to use for teleporting.\n"
+ "Examples: /tp, /tpa, /tpahere, /tpo",
"/tpa",
s -> s.length() < 64 && ALLOWED_COMMANDS.matcher(s).matches());
private final SliderSetting delay = new SliderSetting("Delay",
"The delay between each teleportation request.", 20, 1, 200, 1,
ValueDisplay.INTEGER.withSuffix(" ticks").withLabel(1, "1 tick"));
private final CheckboxSetting ignoreErrors =
new CheckboxSetting("Ignore errors",
"Whether to ignore messages from the server telling you that the"
+ " teleportation command isn't valid or that you don't have"
+ " permission to use it.",
false);
private final CheckboxSetting stopWhenAccepted = new CheckboxSetting(
"Stop when accepted", "Whether to stop sending more teleportation"
+ " requests when someone accepts one of them.",
true);
private final Random random = new Random();
private final ArrayList<String> players = new ArrayList<>();
private String command;
private int index;
private int timer;
@ -36,15 +68,24 @@ public final class MassTpaHack extends Hack
{
super("MassTPA");
setCategory(Category.CHAT);
addSetting(commandSetting);
addSetting(delay);
addSetting(ignoreErrors);
addSetting(stopWhenAccepted);
}
@Override
public void onEnable()
{
index = 0;
timer = -1;
// reset state
players.clear();
index = 0;
timer = 0;
// cache command in case the setting is changed mid-run
command = commandSetting.getValue().substring(1);
// collect player names
String playerName = MC.getSession().getProfile().getName();
for(PlayerListEntry info : MC.player.networkHandler.getPlayerList())
@ -80,7 +121,7 @@ public final class MassTpaHack extends Hack
@Override
public void onUpdate()
{
if(timer > -1)
if(timer > 0)
{
timer--;
return;
@ -92,9 +133,11 @@ public final class MassTpaHack extends Hack
return;
}
MC.getNetworkHandler().sendChatCommand("tpa " + players.get(index));
MC.getNetworkHandler()
.sendChatCommand(command + " " + players.get(index));
index++;
timer = 20;
timer = delay.getValueI() - 1;
}
@Override
@ -106,15 +149,23 @@ public final class MassTpaHack extends Hack
if(message.contains("/help") || message.contains("permission"))
{
if(ignoreErrors.isChecked())
return;
event.cancel();
ChatUtils.error("This server doesn't have TPA.");
ChatUtils.error("This server doesn't have a "
+ command.toUpperCase() + " command.");
setEnabled(false);
}else if(message.contains("accepted") && message.contains("request")
|| message.contains("akzeptiert") && message.contains("anfrage"))
{
if(!stopWhenAccepted.isChecked())
return;
event.cancel();
ChatUtils.message("Someone accepted your TPA request. Stopping.");
ChatUtils.message("Someone accepted your " + command.toUpperCase()
+ " request. Stopping.");
setEnabled(false);
}
}

View File

@ -76,6 +76,7 @@ public final class MobEspHack extends Hack implements UpdateListener,
FilterShulkersSetting.genericVision(false),
FilterAllaysSetting.genericVision(false),
FilterInvisibleSetting.genericVision(false),
FilterNamedSetting.genericVision(false),
FilterArmorStandsSetting.genericVision(true));
private final ArrayList<LivingEntity> mobs = new ArrayList<>();

View File

@ -77,7 +77,7 @@ public final class RemoteViewHack extends Hack
}
// save old data
wasInvisible = entity.isInvisibleTo(MC.player);
wasInvisible = entity.isInvisible();
// enable NoClip
MC.player.noClip = true;

View File

@ -7,20 +7,17 @@
*/
package net.wurstclient.hacks;
import java.util.ArrayList;
import java.util.stream.Collectors;
import net.minecraft.client.network.ClientPlayNetworkHandler;
import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket;
import net.minecraft.util.math.Box;
import net.minecraft.util.shape.VoxelShape;
import net.wurstclient.Category;
import net.wurstclient.events.UpdateListener;
import net.wurstclient.hack.Hack;
import net.wurstclient.settings.EnumSetting;
import net.wurstclient.settings.SliderSetting;
import net.wurstclient.settings.SliderSetting.ValueDisplay;
import net.wurstclient.util.BlockUtils;
public final class StepHack extends Hack implements UpdateListener
{
@ -87,18 +84,10 @@ public final class StepHack extends Hack implements UpdateListener
if(!MC.world.isSpaceEmpty(player, box.offset(0, 1, 0)))
return;
double stepHeight = Double.NEGATIVE_INFINITY;
double stepHeight = BlockUtils.getBlockCollisions(box)
.mapToDouble(bb -> bb.maxY).max().orElse(Double.NEGATIVE_INFINITY);
ArrayList<Box> blockCollisions =
IMC.getWorld().getBlockCollisionsStream(player, box)
.map(VoxelShape::getBoundingBox)
.collect(Collectors.toCollection(ArrayList::new));
for(Box bb : blockCollisions)
if(bb.maxY > stepHeight)
stepHeight = bb.maxY;
stepHeight = stepHeight - player.getY();
stepHeight -= player.getY();
if(stepHeight < 0 || stepHeight > 1)
return;
@ -113,7 +102,7 @@ public final class StepHack extends Hack implements UpdateListener
player.getX(), player.getY() + 0.753 * stepHeight, player.getZ(),
player.isOnGround()));
player.setPosition(player.getX(), player.getY() + 1 * stepHeight,
player.setPosition(player.getX(), player.getY() + stepHeight,
player.getZ());
}

View File

@ -15,23 +15,14 @@ import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.joml.Matrix4f;
import org.lwjgl.opengl.GL11;
import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.client.gl.ShaderProgram;
import net.minecraft.client.gl.VertexBuffer;
import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.client.render.GameRenderer;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.network.packet.c2s.play.HandSwingC2SPacket;
import net.minecraft.util.Hand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Box;
import net.minecraft.util.math.Direction;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.Vec3i;
import net.wurstclient.Category;
import net.wurstclient.SearchTags;
import net.wurstclient.WurstClient;
@ -43,14 +34,16 @@ import net.wurstclient.events.RenderListener;
import net.wurstclient.events.UpdateListener;
import net.wurstclient.hack.DontSaveState;
import net.wurstclient.hack.Hack;
import net.wurstclient.hacks.treebot.Tree;
import net.wurstclient.hacks.treebot.TreeBotUtils;
import net.wurstclient.settings.FacingSetting;
import net.wurstclient.settings.SliderSetting;
import net.wurstclient.settings.SliderSetting.ValueDisplay;
import net.wurstclient.treebot.Tree;
import net.wurstclient.treebot.TreeBotUtils;
import net.wurstclient.settings.SwingHandSetting;
import net.wurstclient.util.BlockBreaker;
import net.wurstclient.util.BlockBreaker.BlockBreakingParams;
import net.wurstclient.util.BlockUtils;
import net.wurstclient.util.RegionPos;
import net.wurstclient.util.RenderUtils;
import net.wurstclient.util.RotationUtils;
import net.wurstclient.util.OverlayRenderer;
@SearchTags({"tree bot"})
@DontSaveState
@ -61,20 +54,41 @@ public final class TreeBotHack extends Hack
"How far TreeBot will reach to break blocks.", 4.5, 1, 6, 0.05,
ValueDisplay.DECIMAL);
private final FacingSetting facing = FacingSetting.withoutPacketSpam(
"How to face the logs and leaves when breaking them.\n\n"
+ "\u00a7lOff\u00a7r - Don't face the blocks at all. Will be"
+ " detected by anti-cheat plugins.\n\n"
+ "\u00a7lServer-side\u00a7r - Face the blocks on the"
+ " server-side, while still letting you move the camera freely on"
+ " the client-side.\n\n"
+ "\u00a7lClient-side\u00a7r - Face the blocks by moving your"
+ " camera on the client-side. This is the most legit option, but"
+ " can be disorienting to look at.");
private final SwingHandSetting swingHand = new SwingHandSetting(
"How TreeBot should swing your hand when breaking logs and leaves.\n\n"
+ "\u00a7lOff\u00a7r - Don't swing your hand at all. Will be detected"
+ " by anti-cheat plugins.\n\n"
+ "\u00a7lServer-side\u00a7r - Swing your hand on the server-side,"
+ " without playing the animation on the client-side.\n\n"
+ "\u00a7lClient-side\u00a7r - Swing your hand on the client-side."
+ " This is the most legit option.");
private TreeFinder treeFinder;
private AngleFinder angleFinder;
private TreeBotPathProcessor processor;
private Tree tree;
private BlockPos currentBlock;
private float progress;
private float prevProgress;
private final OverlayRenderer overlay = new OverlayRenderer();
public TreeBotHack()
{
super("TreeBot");
setCategory(Category.BLOCKS);
addSetting(range);
addSetting(facing);
addSetting(swingHand);
}
@Override
@ -124,6 +138,8 @@ public final class TreeBotHack extends Hack
MC.interactionManager.cancelBlockBreaking();
currentBlock = null;
}
overlay.resetProgress();
}
@Override
@ -157,13 +173,8 @@ public final class TreeBotHack extends Hack
return;
}
ArrayList<BlockPos> logsInRange = getLogsInRange();
if(!logsInRange.isEmpty())
{
breakBlocks(logsInRange);
if(breakBlocks(tree.getLogs()))
return;
}
if(angleFinder == null)
angleFinder = new AngleFinder();
@ -211,69 +222,38 @@ public final class TreeBotHack extends Hack
angleFinder = null;
}
private ArrayList<BlockPos> getLogsInRange()
private boolean breakBlocks(ArrayList<BlockPos> blocks)
{
Vec3d eyesVec = RotationUtils.getEyesPos().subtract(0.5, 0.5, 0.5);
double rangeSq = Math.pow(range.getValue(), 2);
return tree.getLogs().stream()
.filter(pos -> eyesVec.squaredDistanceTo(Vec3d.of(pos)) <= rangeSq)
.filter(TreeBotUtils::hasLineOfSight)
.collect(Collectors.toCollection(ArrayList::new));
}
private void breakBlocks(ArrayList<BlockPos> blocksInRange)
{
for(BlockPos pos : blocksInRange)
for(BlockPos pos : blocks)
if(breakBlock(pos))
{
WURST.getHax().autoToolHack.equipBestTool(pos, false, true, 0);
currentBlock = pos;
break;
return true;
}
if(currentBlock == null)
MC.interactionManager.cancelBlockBreaking();
if(currentBlock != null && BlockUtils.getHardness(currentBlock) < 1)
{
prevProgress = progress;
progress = MC.interactionManager.currentBreakingProgress;
if(progress < prevProgress)
prevProgress = progress;
}else
{
progress = 1;
prevProgress = 1;
}
return false;
}
private boolean breakBlock(BlockPos pos)
{
Direction side =
TreeBotUtils.getLineOfSightSide(RotationUtils.getEyesPos(), pos);
Vec3d relCenter = BlockUtils.getBoundingBox(pos)
.offset(-pos.getX(), -pos.getY(), -pos.getZ()).getCenter();
Vec3d center = Vec3d.of(pos).add(relCenter);
Vec3i dirVec = side.getVector();
Vec3d relHitVec = new Vec3d(relCenter.x * dirVec.getX(),
relCenter.y * dirVec.getY(), relCenter.z * dirVec.getZ());
Vec3d hitVec = center.add(relHitVec);
// face block
WURST.getRotationFaker().faceVectorPacket(hitVec);
// damage block
if(!MC.interactionManager.updateBlockBreakingProgress(pos, side))
BlockBreakingParams params = BlockBreaker.getBlockBreakingParams(pos);
if(params == null || !params.lineOfSight()
|| params.distanceSq() > range.getValueSq())
return false;
// swing arm
MC.player.networkHandler
.sendPacket(new HandSwingC2SPacket(Hand.MAIN_HAND));
// select tool
WURST.getHax().autoToolHack.equipBestTool(pos, false, true, 0);
// face block
facing.getSelected().face(params.hitVec());
// damage block and swing hand
if(MC.interactionManager.updateBlockBreakingProgress(pos,
params.side()))
swingHand.getSelected().swing(Hand.MAIN_HAND);
// update progress
overlay.updateProgress();
return true;
}
@ -292,71 +272,10 @@ public final class TreeBotHack extends Hack
angleFinder.renderPath(matrixStack, pathCmd.isDebugMode(),
pathCmd.isDepthTest());
// GL settings
GL11.glEnable(GL11.GL_BLEND);
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
GL11.glEnable(GL11.GL_CULL_FACE);
GL11.glDisable(GL11.GL_DEPTH_TEST);
if(tree != null)
drawTree(matrixStack);
tree.draw(matrixStack);
if(currentBlock != null)
drawCurrentBlock(matrixStack, partialTicks);
// GL resets
RenderSystem.setShaderColor(1, 1, 1, 1);
GL11.glEnable(GL11.GL_DEPTH_TEST);
GL11.glDisable(GL11.GL_BLEND);
}
private void drawTree(MatrixStack matrixStack)
{
RenderSystem.setShaderColor(0, 1, 0, 0.5F);
matrixStack.push();
RenderUtils.applyRegionalRenderOffset(matrixStack,
MC.world.getChunk(tree.getStump()));
Matrix4f viewMatrix = matrixStack.peek().getPositionMatrix();
Matrix4f projMatrix = RenderSystem.getProjectionMatrix();
ShaderProgram shader = RenderSystem.getShader();
tree.getVertexBuffer().bind();
tree.getVertexBuffer().draw(viewMatrix, projMatrix, shader);
VertexBuffer.unbind();
matrixStack.pop();
}
private void drawCurrentBlock(MatrixStack matrixStack, float partialTicks)
{
matrixStack.push();
RegionPos region = RenderUtils.getCameraRegion();
RenderUtils.applyRegionalRenderOffset(matrixStack, region);
Box box = new Box(BlockPos.ORIGIN);
float p = prevProgress + (progress - prevProgress) * partialTicks;
float red = p * 2F;
float green = 2 - red;
matrixStack.translate(currentBlock.getX() - region.x(),
currentBlock.getY(), currentBlock.getZ() - region.z());
if(p < 1)
{
matrixStack.translate(0.5, 0.5, 0.5);
matrixStack.scale(p, p, p);
matrixStack.translate(-0.5, -0.5, -0.5);
}
RenderSystem.setShaderColor(red, green, 0, 0.25F);
RenderUtils.drawSolidBox(box, matrixStack);
RenderSystem.setShaderColor(red, green, 0, 0.5F);
RenderUtils.drawOutlinedBox(box, matrixStack);
matrixStack.pop();
overlay.render(matrixStack, partialTicks, currentBlock);
}
private ArrayList<BlockPos> getNeighbors(BlockPos pos)
@ -419,28 +338,19 @@ public final class TreeBotHack extends Hack
return;
}
ArrayList<BlockPos> leaves = getLeavesInRange(pathFinder.getPath());
if(!leaves.isEmpty())
{
breakBlocks(leaves);
if(processor.canBreakBlocks() && breakBlocks(getLeavesOnPath()))
return;
}
processor.process();
}
private ArrayList<BlockPos> getLeavesInRange(List<PathPos> path)
private ArrayList<BlockPos> getLeavesOnPath()
{
Vec3d eyesVec = RotationUtils.getEyesPos().subtract(0.5, 0.5, 0.5);
double rangeSq = Math.pow(range.getValue(), 2);
List<PathPos> path = pathFinder.getPath();
path = path.subList(processor.getIndex(), path.size());
return path.stream().flatMap(pos -> Stream.of(pos, pos.up()))
.distinct().filter(TreeBotUtils::isLeaves)
.filter(
pos -> eyesVec.squaredDistanceTo(Vec3d.of(pos)) <= rangeSq)
.filter(TreeBotUtils::hasLineOfSight)
.collect(Collectors.toCollection(ArrayList::new));
}
@ -557,19 +467,18 @@ public final class TreeBotHack extends Hack
private boolean hasAngle(PathPos pos)
{
double rangeSq = range.getValueSq();
ClientPlayerEntity player = WurstClient.MC.player;
Vec3d eyes = Vec3d.ofBottomCenter(pos).add(0,
player.getEyeHeight(player.getPose()), 0);
Vec3d eyesVec = eyes.subtract(0.5, 0.5, 0.5);
double rangeSq = Math.pow(range.getValue(), 2);
for(BlockPos log : tree.getLogs())
{
if(eyesVec.squaredDistanceTo(Vec3d.of(log)) > rangeSq)
continue;
BlockBreakingParams params =
BlockBreaker.getBlockBreakingParams(eyes, log);
if(TreeBotUtils.getLineOfSightSide(eyes, log) != null)
if(params != null && params.lineOfSight()
&& params.distanceSq() <= rangeSq)
return true;
}

View File

@ -7,8 +7,6 @@
*/
package net.wurstclient.hacks;
import java.util.stream.Stream;
import net.minecraft.client.gui.screen.ingame.HandledScreen;
import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.entity.Entity;
@ -110,14 +108,12 @@ public final class TriggerBotHack extends Hack implements UpdateListener
private boolean isCorrectEntity(Entity entity)
{
Stream<Entity> stream = Stream.of(entity);
stream = stream.filter(EntityUtils.IS_ATTACKABLE);
if(!EntityUtils.IS_ATTACKABLE.test(entity))
return false;
double rangeSq = Math.pow(range.getValue(), 2);
stream = stream.filter(e -> MC.player.squaredDistanceTo(e) <= rangeSq);
if(MC.player.squaredDistanceTo(entity) > range.getValueSq())
return false;
stream = entityFilters.applyTo(stream);
return stream.findFirst().isPresent();
return entityFilters.testOne(entity);
}
}

View File

@ -7,18 +7,50 @@
*/
package net.wurstclient.hacks;
import net.minecraft.entity.Entity;
import net.wurstclient.Category;
import net.wurstclient.SearchTags;
import net.wurstclient.hack.Hack;
import net.wurstclient.settings.filterlists.EntityFilterList;
import net.wurstclient.settings.filters.*;
@SearchTags({"true sight"})
public final class TrueSightHack extends Hack
{
private final EntityFilterList entityFilters =
new EntityFilterList(FilterHostileSetting.genericVision(false),
FilterNeutralSetting
.genericVision(AttackDetectingEntityFilter.Mode.OFF),
FilterPassiveSetting.genericVision(false),
FilterPassiveWaterSetting.genericVision(false),
FilterBatsSetting.genericVision(false),
FilterSlimesSetting.genericVision(false),
FilterPetsSetting.genericVision(false),
FilterVillagersSetting.genericVision(false),
FilterZombieVillagersSetting.genericVision(false),
FilterGolemsSetting.genericVision(false),
FilterPiglinsSetting
.genericVision(AttackDetectingEntityFilter.Mode.OFF),
FilterZombiePiglinsSetting
.genericVision(AttackDetectingEntityFilter.Mode.OFF),
FilterEndermenSetting
.genericVision(AttackDetectingEntityFilter.Mode.OFF),
FilterShulkersSetting.genericVision(false),
FilterAllaysSetting.genericVision(false),
FilterNamedSetting.genericVision(false),
FilterArmorStandsSetting.genericVision(false));
public TrueSightHack()
{
super("TrueSight");
setCategory(Category.RENDER);
entityFilters.forEach(this::addSetting);
}
// See LivingEntityRendererMixin
public boolean shouldBeVisible(Entity entity)
{
return isEnabled() && entityFilters.testOne(entity);
}
// See EntityMixin.onIsInvisibleTo()
}

View File

@ -25,7 +25,6 @@ import net.wurstclient.events.GetAmbientOcclusionLightLevelListener;
import net.wurstclient.events.RenderBlockEntityListener;
import net.wurstclient.events.SetOpaqueCubeListener;
import net.wurstclient.events.ShouldDrawSideListener;
import net.wurstclient.events.TesselateBlockListener;
import net.wurstclient.events.UpdateListener;
import net.wurstclient.hack.Hack;
import net.wurstclient.mixinterface.ISimpleOption;
@ -37,7 +36,7 @@ import net.wurstclient.util.ChatUtils;
@SearchTags({"XRay", "x ray", "OreFinder", "ore finder"})
public final class XRayHack extends Hack implements UpdateListener,
SetOpaqueCubeListener, GetAmbientOcclusionLightLevelListener,
ShouldDrawSideListener, TesselateBlockListener, RenderBlockEntityListener
ShouldDrawSideListener, RenderBlockEntityListener
{
private final BlockListSetting ores = new BlockListSetting("Ores",
"A list of blocks that X-Ray will show. They don't have to be just ores"
@ -109,7 +108,6 @@ public final class XRayHack extends Hack implements UpdateListener,
EVENTS.add(SetOpaqueCubeListener.class, this);
EVENTS.add(GetAmbientOcclusionLightLevelListener.class, this);
EVENTS.add(ShouldDrawSideListener.class, this);
EVENTS.add(TesselateBlockListener.class, this);
EVENTS.add(RenderBlockEntityListener.class, this);
// reload chunks
@ -128,7 +126,6 @@ public final class XRayHack extends Hack implements UpdateListener,
EVENTS.remove(SetOpaqueCubeListener.class, this);
EVENTS.remove(GetAmbientOcclusionLightLevelListener.class, this);
EVENTS.remove(ShouldDrawSideListener.class, this);
EVENTS.remove(TesselateBlockListener.class, this);
EVENTS.remove(RenderBlockEntityListener.class, this);
// reload chunks
@ -168,13 +165,6 @@ public final class XRayHack extends Hack implements UpdateListener,
isVisible(event.getState().getBlock(), event.getPos()));
}
@Override
public void onTesselateBlock(TesselateBlockEvent event)
{
if(!isVisible(event.getState().getBlock(), event.getPos()))
event.cancel();
}
@Override
public void onRenderBlockEntity(RenderBlockEntityEvent event)
{
@ -189,7 +179,7 @@ public final class XRayHack extends Hack implements UpdateListener,
int index = Collections.binarySearch(oreNamesCache, name);
boolean visible = index >= 0;
if(visible && onlyExposed.isChecked())
if(visible && onlyExposed.isChecked() && pos != null)
return !BlockUtils.isOpaqueFullCube(pos.up())
|| !BlockUtils.isOpaqueFullCube(pos.down())
|| !BlockUtils.isOpaqueFullCube(pos.east())

View File

@ -38,11 +38,13 @@ public final class ModelSettings
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_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),

View File

@ -5,18 +5,23 @@
* 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.treebot;
package net.wurstclient.hacks.treebot;
import java.util.ArrayList;
import org.joml.Matrix4f;
import org.lwjgl.opengl.GL11;
import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.client.gl.ShaderProgram;
import net.minecraft.client.gl.VertexBuffer;
import net.minecraft.client.render.BufferBuilder;
import net.minecraft.client.render.BufferBuilder.BuiltBuffer;
import net.minecraft.client.render.Tessellator;
import net.minecraft.client.render.VertexFormat;
import net.minecraft.client.render.VertexFormats;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Box;
import net.minecraft.util.math.Vec3d;
@ -65,10 +70,43 @@ public class Tree implements AutoCloseable
VertexBuffer.unbind();
}
public void draw(MatrixStack matrixStack)
{
if(vertexBuffer == null)
return;
// GL settings
GL11.glEnable(GL11.GL_BLEND);
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
GL11.glEnable(GL11.GL_CULL_FACE);
GL11.glDisable(GL11.GL_DEPTH_TEST);
RenderSystem.setShaderColor(0, 1, 0, 0.5F);
matrixStack.push();
RenderUtils.applyRegionalRenderOffset(matrixStack, RegionPos.of(stump));
Matrix4f viewMatrix = matrixStack.peek().getPositionMatrix();
Matrix4f projMatrix = RenderSystem.getProjectionMatrix();
ShaderProgram shader = RenderSystem.getShader();
vertexBuffer.bind();
vertexBuffer.draw(viewMatrix, projMatrix, shader);
VertexBuffer.unbind();
matrixStack.pop();
// GL resets
RenderSystem.setShaderColor(1, 1, 1, 1);
GL11.glEnable(GL11.GL_DEPTH_TEST);
GL11.glDisable(GL11.GL_BLEND);
}
@Override
public void close()
{
vertexBuffer.close();
vertexBuffer = null;
}
public BlockPos getStump()
@ -80,9 +118,4 @@ public class Tree implements AutoCloseable
{
return logs;
}
public VertexBuffer getVertexBuffer()
{
return vertexBuffer;
}
}

View File

@ -0,0 +1,30 @@
/*
* Copyright (c) 2014-2023 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.treebot;
import net.minecraft.block.BlockState;
import net.minecraft.registry.tag.BlockTags;
import net.minecraft.util.math.BlockPos;
import net.wurstclient.util.BlockUtils;
public enum TreeBotUtils
{
;
public static boolean isLog(BlockPos pos)
{
return BlockUtils.getState(pos).isIn(BlockTags.LOGS);
}
public static boolean isLeaves(BlockPos pos)
{
BlockState state = BlockUtils.getState(pos);
return state.isIn(BlockTags.LEAVES)
|| state.isIn(BlockTags.WART_BLOCKS);
}
}

View File

@ -0,0 +1,48 @@
/*
* Copyright (c) 2014-2023 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.mixin;
import java.util.List;
import org.jetbrains.annotations.Nullable;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import net.minecraft.block.BlockState;
import net.minecraft.client.render.model.BakedQuad;
import net.minecraft.client.render.model.BasicBakedModel;
import net.minecraft.util.math.Direction;
import net.minecraft.util.math.random.Random;
import net.wurstclient.WurstClient;
import net.wurstclient.event.EventManager;
import net.wurstclient.events.ShouldDrawSideListener.ShouldDrawSideEvent;
@Mixin(BasicBakedModel.class)
public class BasicBakedModelMixin
{
/**
* This mixin hides blocks like grass and snow when using X-Ray. It works
* with and without Sodium installed.
*/
@Inject(at = @At("HEAD"), method = "getQuads", cancellable = true)
private void getQuads(@Nullable BlockState state, @Nullable Direction face,
Random random, CallbackInfoReturnable<List<BakedQuad>> cir)
{
if(face != null || state == null
|| !WurstClient.INSTANCE.getHax().xRayHack.isEnabled())
return;
ShouldDrawSideEvent event = new ShouldDrawSideEvent(state, null);
EventManager.fire(event);
if(Boolean.FALSE.equals(event.isRendered()))
cir.setReturnValue(List.of());
}
}

View File

@ -26,6 +26,10 @@ import net.wurstclient.hack.HackList;
@Mixin(Block.class)
public abstract class BlockMixin implements ItemConvertible
{
/**
* This mixin allows X-Ray to show ores that would normally be obstructed by
* other blocks.
*/
@Inject(at = @At("HEAD"),
method = "shouldDrawSide(Lnet/minecraft/block/BlockState;Lnet/minecraft/world/BlockView;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/util/math/Direction;Lnet/minecraft/util/math/BlockPos;)Z",
cancellable = true)

View File

@ -1,67 +0,0 @@
/*
* Copyright (c) 2014-2023 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.mixin;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import net.minecraft.block.BlockState;
import net.minecraft.client.render.VertexConsumer;
import net.minecraft.client.render.block.BlockModelRenderer;
import net.minecraft.client.render.model.BakedModel;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.random.Random;
import net.minecraft.world.BlockRenderView;
import net.wurstclient.event.EventManager;
import net.wurstclient.events.ShouldDrawSideListener.ShouldDrawSideEvent;
import net.wurstclient.events.TesselateBlockListener.TesselateBlockEvent;
@Mixin(BlockModelRenderer.class)
public abstract class BlockModelRendererMixin
{
@Inject(at = @At("HEAD"),
method = {
"renderSmooth(Lnet/minecraft/world/BlockRenderView;Lnet/minecraft/client/render/model/BakedModel;Lnet/minecraft/block/BlockState;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumer;ZLnet/minecraft/util/math/random/Random;JI)V",
"renderFlat(Lnet/minecraft/world/BlockRenderView;Lnet/minecraft/client/render/model/BakedModel;Lnet/minecraft/block/BlockState;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumer;ZLnet/minecraft/util/math/random/Random;JI)V"},
cancellable = true)
private void onRenderSmoothOrFlat(BlockRenderView world, BakedModel model,
BlockState state, BlockPos pos, MatrixStack matrices,
VertexConsumer vertexConsumer, boolean cull, Random random, long seed,
int overlay, CallbackInfo ci)
{
TesselateBlockEvent event = new TesselateBlockEvent(state, pos);
EventManager.fire(event);
if(event.isCancelled())
{
ci.cancel();
return;
}
if(!cull)
return;
ShouldDrawSideEvent event2 = new ShouldDrawSideEvent(state, pos);
EventManager.fire(event2);
if(!Boolean.TRUE.equals(event2.isRendered()))
return;
renderSmooth(world, model, state, pos, matrices, vertexConsumer, false,
random, seed, overlay);
}
@Shadow
public abstract void renderSmooth(BlockRenderView world, BakedModel model,
BlockState state, BlockPos pos, MatrixStack matrices,
VertexConsumer vertexConsumer, boolean cull, Random random, long seed,
int overlay);
}

View File

@ -0,0 +1,51 @@
/*
* Copyright (c) 2014-2023 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.mixin;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import net.minecraft.block.Block;
import net.minecraft.block.Blocks;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.world.ClientWorld;
import net.minecraft.item.Items;
import net.minecraft.world.GameMode;
import net.wurstclient.WurstClient;
@Mixin(ClientWorld.class)
public class ClientWorldMixin
{
@Shadow
@Final
private MinecraftClient client;
/**
* This is the part that makes BarrierESP work.
*/
@Inject(at = @At("HEAD"),
method = "getBlockParticle()Lnet/minecraft/block/Block;",
cancellable = true)
private void onGetBlockParticle(CallbackInfoReturnable<Block> cir)
{
if(!WurstClient.INSTANCE.getHax().barrierEspHack.isEnabled())
return;
// Pause BarrierESP when holding a light in Creative Mode, since it
// would otherwise prevent the player from seeing light blocks.
if(client.interactionManager.getCurrentGameMode() == GameMode.CREATIVE
&& client.player.getMainHandStack().getItem() == Items.LIGHT)
return;
cir.setReturnValue(Blocks.BARRIER);
}
}

View File

@ -14,10 +14,12 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import net.minecraft.client.gui.screen.DeathScreen;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.text.Text;
import net.wurstclient.WurstClient;
import net.wurstclient.event.EventManager;
import net.wurstclient.events.DeathListener.DeathEvent;
import net.wurstclient.hacks.AutoRespawnHack;
@Mixin(DeathScreen.class)
public abstract class DeathScreenMixin extends Screen
@ -27,9 +29,28 @@ public abstract class DeathScreenMixin extends Screen
super(title);
}
@Inject(at = @At(value = "TAIL"), method = "tick()V")
@Inject(at = @At("TAIL"), method = "tick()V")
private void onTick(CallbackInfo ci)
{
EventManager.fire(DeathEvent.INSTANCE);
}
@Inject(at = @At("TAIL"), method = "init()V")
private void onInit(CallbackInfo ci)
{
AutoRespawnHack autoRespawn =
WurstClient.INSTANCE.getHax().autoRespawnHack;
if(!autoRespawn.shouldShowButton())
return;
int backButtonX = width / 2 - 100;
int backButtonY = height / 4;
addDrawableChild(
ButtonWidget.builder(Text.literal("AutoRespawn: OFF"), b -> {
autoRespawn.setEnabled(true);
autoRespawn.onDeath();
}).dimensions(backButtonX, backButtonY + 48, 200, 20).build());
}
}

View File

@ -13,12 +13,15 @@ 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 net.minecraft.entity.Entity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.server.command.CommandOutput;
import net.minecraft.util.Nameable;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.entity.EntityLike;
import net.wurstclient.WurstClient;
import net.wurstclient.event.EventManager;
import net.wurstclient.events.VelocityFromEntityCollisionListener.VelocityFromEntityCollisionEvent;
import net.wurstclient.events.VelocityFromFluidListener.VelocityFromFluidEvent;
@ -53,4 +56,22 @@ public abstract class EntityMixin implements Nameable, EntityLike, CommandOutput
if(event.isCancelled())
ci.cancel();
}
/**
* Makes invisible entities render as ghosts if TrueSight is enabled.
*/
@Inject(at = @At("RETURN"),
method = "Lnet/minecraft/entity/Entity;isInvisibleTo(Lnet/minecraft/entity/player/PlayerEntity;)Z",
cancellable = true)
private void onIsInvisibleTo(PlayerEntity player,
CallbackInfoReturnable<Boolean> cir)
{
// Return early if the entity is not invisible
if(!cir.getReturnValueZ())
return;
if(WurstClient.INSTANCE.getHax().trueSightHack
.shouldBeVisible((Entity)(Object)this))
cir.setReturnValue(false);
}
}

View File

@ -23,6 +23,10 @@ import net.wurstclient.events.ShouldDrawSideListener.ShouldDrawSideEvent;
@Mixin(FluidRenderer.class)
public class FluidRendererMixin
{
/**
* This mixin hides and shows fluids when using X-Ray without Sodium
* installed.
*/
@Inject(at = @At("HEAD"),
method = "isSideCovered(Lnet/minecraft/world/BlockView;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/util/math/Direction;FLnet/minecraft/block/BlockState;)Z",
cancellable = true)

View File

@ -17,27 +17,11 @@ import net.minecraft.client.render.entity.EntityRenderDispatcher;
import net.minecraft.client.render.entity.LivingEntityRenderer;
import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.wurstclient.WurstClient;
@Mixin(LivingEntityRenderer.class)
public abstract class LivingEntityRendererMixin
{
/**
* Makes invisible entities render as ghosts if TrueSight is enabled.
*/
@Redirect(at = @At(value = "INVOKE",
target = "Lnet/minecraft/entity/LivingEntity;isInvisibleTo(Lnet/minecraft/entity/player/PlayerEntity;)Z",
ordinal = 0),
method = "render(Lnet/minecraft/entity/LivingEntity;FFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V")
private boolean isInvisibleToWurst(LivingEntity e, PlayerEntity player)
{
if(WurstClient.INSTANCE.getHax().trueSightHack.isEnabled())
return false;
return e.isInvisibleTo(player);
}
/**
* Disables the distance limit in hasLabel() if configured in NameTags.
*/

View File

@ -31,7 +31,6 @@ import net.minecraft.client.network.ClientPlayerInteractionManager;
import net.minecraft.client.util.ProfileKeys;
import net.minecraft.client.util.ProfileKeysImpl;
import net.minecraft.client.util.Session;
import net.minecraft.client.world.ClientWorld;
import net.minecraft.util.hit.EntityHitResult;
import net.minecraft.util.hit.HitResult;
import net.minecraft.util.thread.ReentrantThreadExecutor;
@ -42,7 +41,6 @@ import net.wurstclient.events.RightClickListener.RightClickEvent;
import net.wurstclient.mixinterface.IClientPlayerEntity;
import net.wurstclient.mixinterface.IClientPlayerInteractionManager;
import net.wurstclient.mixinterface.IMinecraftClient;
import net.wurstclient.mixinterface.IWorld;
@Mixin(MinecraftClient.class)
public abstract class MinecraftClientMixin
@ -57,8 +55,6 @@ public abstract class MinecraftClientMixin
@Shadow
public ClientPlayerEntity player;
@Shadow
public ClientWorld world;
@Shadow
@Final
private Session session;
@Shadow
@ -171,12 +167,6 @@ public abstract class MinecraftClientMixin
return (IClientPlayerEntity)player;
}
@Override
public IWorld getWorld()
{
return (IWorld)world;
}
@Override
public IClientPlayerInteractionManager getInteractionManager()
{

View File

@ -22,15 +22,18 @@ import net.wurstclient.events.ShouldDrawSideListener.ShouldDrawSideEvent;
@Pseudo
@Mixin(targets = {
// current target
"me.jellysquid.mods.sodium.client.render.chunk.compile.pipeline.BlockOcclusionCache",
// < Sodium 0.5.0
"me.jellysquid.mods.sodium.client.render.occlusion.BlockOcclusionCache"},
remap = false)
public class SodiumBlockOcclusionCacheMixin
{
@Inject(at = @At("HEAD"),
method = "shouldDrawSide",
cancellable = true,
remap = false)
/**
* This mixin hides and shows regular full blocks when using X-Ray with
* Sodium installed.
*/
@Inject(at = @At("HEAD"), method = "shouldDrawSide", cancellable = true)
public void shouldDrawSide(BlockState state, BlockView world, BlockPos pos,
Direction side, CallbackInfoReturnable<Boolean> cir)
{

View File

@ -0,0 +1,47 @@
/*
* Copyright (c) 2014-2023 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.mixin;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Pseudo;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import net.minecraft.block.BlockState;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
import net.minecraft.world.BlockRenderView;
import net.wurstclient.event.EventManager;
import net.wurstclient.events.ShouldDrawSideListener.ShouldDrawSideEvent;
@Pseudo
@Mixin(targets = {
// current target
"me.jellysquid.mods.sodium.client.render.chunk.compile.pipeline.FluidRenderer",
// < Sodium 0.4.9
"me.jellysquid.mods.sodium.client.render.pipeline.FluidRenderer"},
remap = false)
public class SodiumFluidRendererMixin
{
/**
* This mixin hides and shows fluids when using X-Ray with Sodium installed.
*/
@Inject(at = @At("HEAD"), method = "isSideExposed", cancellable = true)
private void isSideExposed(BlockRenderView world, int x, int y, int z,
Direction dir, float height, CallbackInfoReturnable<Boolean> cir)
{
BlockPos pos = new BlockPos(x, y, z);
BlockState state = world.getBlockState(pos);
ShouldDrawSideEvent event = new ShouldDrawSideEvent(state, pos);
EventManager.fire(event);
if(event.isRendered() != null)
cir.setReturnValue(event.isRendered());
}
}

View File

@ -1,48 +0,0 @@
/*
* Copyright (c) 2014-2023 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.mixin;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import net.fabricmc.fabric.impl.client.indigo.renderer.render.TerrainRenderContext;
import net.minecraft.block.BlockState;
import net.minecraft.client.render.model.BakedModel;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.util.math.BlockPos;
import net.wurstclient.event.EventManager;
import net.wurstclient.events.TesselateBlockListener.TesselateBlockEvent;
@Mixin(TerrainRenderContext.class)
public class TerrainRenderContextMixin
{
/**
* This is a part of what allows X-Ray to make blocks invisible. It's
* also the part that keeps breaking whenever Fabric API updates their
* rendering code.
*
* <p>
* We could make this optional to stop the game from crashing, but then
* X-Ray would silently stop working and it would be much harder to debug.
*/
@Inject(at = @At("HEAD"),
method = "tessellateBlock",
cancellable = true,
remap = false)
private void onTessellateBlock(BlockState state, BlockPos pos,
final BakedModel model, MatrixStack matrixStack, CallbackInfo ci)
{
TesselateBlockEvent event = new TesselateBlockEvent(state, pos);
EventManager.fire(event);
if(event.isCancelled())
ci.cancel();
}
}

View File

@ -7,26 +7,18 @@
*/
package net.wurstclient.mixin;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
import org.jetbrains.annotations.Nullable;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import net.minecraft.entity.Entity;
import net.minecraft.util.math.Box;
import net.minecraft.util.shape.VoxelShape;
import net.minecraft.world.World;
import net.minecraft.world.WorldAccess;
import net.wurstclient.WurstClient;
import net.wurstclient.hacks.NoWeatherHack;
import net.wurstclient.mixinterface.IWorld;
@Mixin(World.class)
public abstract class WorldMixin implements WorldAccess, AutoCloseable, IWorld
public abstract class WorldMixin implements WorldAccess, AutoCloseable
{
@Inject(at = @At("HEAD"),
method = "getRainGradient(F)F",
@ -59,12 +51,4 @@ public abstract class WorldMixin implements WorldAccess, AutoCloseable, IWorld
return getDimension().getMoonPhase(getLunarTime());
}
@Override
public Stream<VoxelShape> getBlockCollisionsStream(@Nullable Entity entity,
Box box)
{
return StreamSupport
.stream(getBlockCollisions(entity, box).spliterator(), false);
}
}

View File

@ -15,7 +15,5 @@ public interface IMinecraftClient
public IClientPlayerEntity getPlayer();
public IWorld getWorld();
public void setSession(Session session);
}

View File

@ -1,30 +0,0 @@
/*
* Copyright (c) 2014-2023 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.mixinterface;
import java.util.stream.Stream;
import org.jetbrains.annotations.Nullable;
import net.minecraft.entity.Entity;
import net.minecraft.util.math.Box;
import net.minecraft.util.shape.VoxelShape;
public interface IWorld
{
public Stream<VoxelShape> getBlockCollisionsStream(@Nullable Entity entity,
Box box);
public default Stream<Box> getCollidingBoxes(@Nullable Entity entity,
Box box)
{
return getBlockCollisionsStream(entity, box)
.flatMap(vs -> vs.getBoundingBoxes().stream())
.filter(b -> b.intersects(box));
}
}

View File

@ -26,6 +26,7 @@ import net.wurstclient.commands.FriendsCmd;
import net.wurstclient.hacks.XRayHack;
import net.wurstclient.other_features.VanillaSpoofOtf;
import net.wurstclient.settings.CheckboxSetting;
import net.wurstclient.util.ChatUtils;
public class WurstOptionsScreen extends Screen
{
@ -69,29 +70,26 @@ public class WurstOptionsScreen extends Screen
new WurstOptionsButton(-154, 48,
() -> "Count Users: " + (analytics.isEnabled() ? "ON" : "OFF"),
"Counts how many people are using Wurst\n"
+ "and which versions are the most popular.\n"
+ "We use this data to decide when to stop\n"
+ "supporting old Minecraft versions.\n\n"
+ "We use a random ID to tell users apart\n"
+ "so that this data can never be linked to\n"
+ "your Minecraft account. The random ID is\n"
+ "changed every 3 days to make extra sure\n"
+ "that you remain anonymous.",
"Counts how many people are using Wurst and which versions are the"
+ " most popular. We use this data to decide when to stop"
+ " supporting old Minecraft versions.\n\n"
+ "We use a random ID to tell users apart so that this data can"
+ " never be linked to your Minecraft account. The random ID is"
+ " changed every 3 days to make extra sure that you remain"
+ " anonymous.",
b -> analytics.setEnabled(!analytics.isEnabled()));
new WurstOptionsButton(-154, 72,
() -> "Spoof Vanilla: "
+ (vanillaSpoofOtf.isEnabled() ? "ON" : "OFF"),
vanillaSpoofOtf.getWrappedDescription(200),
vanillaSpoofOtf.getDescription(),
b -> vanillaSpoofOtf.doPrimaryAction());
new WurstOptionsButton(-154, 96,
() -> "Translations: " + (!forceEnglish.isChecked() ? "ON" : "OFF"),
"§cThis is an experimental feature!\n"
+ "We don't have many translations yet. If you\n"
+ "speak both English and some other language,\n"
+ "please help us by adding more translations.",
"Allows text in Wurst to be displayed in other languages than"
+ " English. It will use the same language that Minecraft is"
+ " set to.\n\n" + "This is an experimental feature!",
b -> forceEnglish.setChecked(!forceEnglish.isChecked()));
}
@ -100,18 +98,17 @@ public class WurstOptionsScreen extends Screen
XRayHack xRayHack = WurstClient.INSTANCE.getHax().xRayHack;
new WurstOptionsButton(-50, 24, () -> "Keybinds",
"Keybinds allow you to toggle any hack\n"
+ "or command by simply pressing a\n" + "button.",
"Keybinds allow you to toggle any hack or command by simply"
+ " pressing a button.",
b -> client.setScreen(new KeybindManagerScreen(this)));
new WurstOptionsButton(-50, 48, () -> "X-Ray Blocks",
"Manager for the blocks\n" + "that X-Ray will show.",
"Manager for the blocks that X-Ray will show.",
b -> xRayHack.openBlockListEditor(this));
new WurstOptionsButton(-50, 72, () -> "Zoom",
"The Zoom Manager allows you to\n"
+ "change the zoom key, how far it\n"
+ "will zoom in and more.",
"The Zoom Manager allows you to change the zoom key and how far it"
+ " will zoom in.",
b -> client.setScreen(new ZoomManagerScreen(this)));
}
@ -120,14 +117,16 @@ public class WurstOptionsScreen extends Screen
OperatingSystem os = Util.getOperatingSystem();
new WurstOptionsButton(54, 24, () -> "Official Website",
"WurstClient.net", b -> os.open(
"§n§lWurstClient.net", b -> os.open(
"https://www.wurstclient.net/?utm_source=Wurst+Client&utm_medium=Wurst+Options&utm_content=Official+Website"));
new WurstOptionsButton(54, 48, () -> "Wurst Wiki", "Wurst.Wiki",
new WurstOptionsButton(54, 48, () -> "Wurst Wiki", "§n§lWurst.Wiki\n"
+ "We are looking for volunteers to help us expand"
+ " the wiki and keep it up to date with the latest Wurst updates.",
b -> os.open(
"https://wurst.wiki/?utm_source=Wurst+Client&utm_medium=Wurst+Options&utm_content=Wurst+Wiki"));
new WurstOptionsButton(54, 72, () -> "WurstForum", "WurstForum.net",
new WurstOptionsButton(54, 72, () -> "WurstForum", "§n§lWurstForum.net",
b -> os.open(
"https://wurstforum.net/?utm_source=Wurst+Client&utm_medium=Wurst+Options&utm_content=WurstForum"));
@ -135,7 +134,12 @@ public class WurstOptionsScreen extends Screen
b -> os.open("https://www.wurstclient.net/twitter/"));
new WurstOptionsButton(54, 120, () -> "Donate",
"WurstClient.net/donate", b -> os.open(
"§n§lWurstClient.net/donate\n"
+ "Donate now to help me keep the Wurst Client alive and free"
+ " to use for everyone.\n\n"
+ "Every bit helps and is much appreciated! You can also get a"
+ " few cool perks in return.",
b -> os.open(
"https://www.wurstclient.net/donate/?utm_source=Wurst+Client&utm_medium=Wurst+Options&utm_content=Donate"));
}
@ -211,7 +215,7 @@ public class WurstOptionsScreen extends Screen
this.tooltip = Arrays.asList();
else
{
String[] lines = tooltip.split("\n");
String[] lines = ChatUtils.wrapText(tooltip, 200).split("\n");
Text[] lines2 = new Text[lines.length];
for(int i = 0; i < lines.length; i++)

View File

@ -25,9 +25,10 @@ public final class TranslationsOtf extends OtherFeature
public TranslationsOtf()
{
super("Translations", "Localization settings.\n\n"
+ "\u00a7cThis is an experimental feature!\u00a7r\n"
+ "We don't have many translations yet. If you speak both English and some other language, please help us by adding more translations.");
super("Translations", "Allows text in Wurst to be displayed"
+ " in other languages than English. It will use the same language"
+ " that Minecraft is set to.\n\n"
+ "This is an experimental feature!");
addSetting(forceEnglish);
}

View File

@ -50,6 +50,15 @@ public class EntityFilterList
return stream;
}
public final boolean testOne(Entity entity)
{
for(EntityFilter filter : entityFilters)
if(filter.isFilterEnabled() && !filter.test(entity))
return false;
return true;
}
public static EntityFilterList genericCombat()
{
return new EntityFilterList(FilterPlayersSetting.genericCombat(false),

View File

@ -27,4 +27,10 @@ public final class FilterNamedSetting extends EntityFilterCheckbox
return new FilterNamedSetting("Won't attack name-tagged entities.",
checked);
}
public static FilterNamedSetting genericVision(boolean checked)
{
return new FilterNamedSetting("Won't show name-tagged entities.",
checked);
}
}

View File

@ -1,104 +0,0 @@
/*
* Copyright (c) 2014-2023 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.treebot;
import java.util.Arrays;
import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.block.Blocks;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.Vec3i;
import net.wurstclient.util.BlockUtils;
import net.wurstclient.util.RotationUtils;
public enum TreeBotUtils
{
;
private static final List<Block> LOG_BLOCKS =
Arrays.asList(Blocks.OAK_LOG, Blocks.SPRUCE_LOG, Blocks.BIRCH_LOG,
Blocks.JUNGLE_LOG, Blocks.ACACIA_LOG, Blocks.DARK_OAK_LOG);
private static final List<Block> LEAVES_BLOCKS = Arrays.asList(
Blocks.OAK_LEAVES, Blocks.SPRUCE_LEAVES, Blocks.BIRCH_LEAVES,
Blocks.JUNGLE_LEAVES, Blocks.ACACIA_LEAVES, Blocks.DARK_OAK_LEAVES);
public static boolean isLog(BlockPos pos)
{
return LOG_BLOCKS.contains(BlockUtils.getBlock(pos));
}
public static boolean isLeaves(BlockPos pos)
{
return LEAVES_BLOCKS.contains(BlockUtils.getBlock(pos));
}
public static boolean hasLineOfSight(BlockPos pos)
{
return getLineOfSightSide(RotationUtils.getEyesPos(), pos) != null;
}
public static Direction getLineOfSightSide(Vec3d eyesPos, BlockPos pos)
{
Direction[] sides = Direction.values();
Vec3d relCenter = BlockUtils.getBoundingBox(pos)
.offset(-pos.getX(), -pos.getY(), -pos.getZ()).getCenter();
Vec3d center = Vec3d.of(pos).add(relCenter);
Vec3d[] hitVecs = new Vec3d[sides.length];
for(int i = 0; i < sides.length; i++)
{
Vec3i dirVec = sides[i].getVector();
Vec3d relHitVec = new Vec3d(relCenter.x * dirVec.getX(),
relCenter.y * dirVec.getY(), relCenter.z * dirVec.getZ());
hitVecs[i] = center.add(relHitVec);
}
double[] distancesSq = new double[sides.length];
boolean[] linesOfSight = new boolean[sides.length];
double distanceSqToCenter = eyesPos.squaredDistanceTo(center);
for(int i = 0; i < sides.length; i++)
{
distancesSq[i] = eyesPos.squaredDistanceTo(hitVecs[i]);
// no need to raytrace the rear sides,
// they can't possibly have line of sight
if(distancesSq[i] >= distanceSqToCenter)
continue;
linesOfSight[i] = BlockUtils.hasLineOfSight(eyesPos, hitVecs[i]);
}
Direction side = null;
for(int i = 0; i < sides.length; i++)
{
// require line of sight
if(!linesOfSight[i])
continue;
// start with the first side that has LOS
if(side == null)
{
side = sides[i];
continue;
}
// then pick the closest side
if(distancesSq[i] < distancesSq[side.ordinal()])
side = sides[i];
}
// will be null if no LOS was found
return side;
}
}

View File

@ -56,6 +56,18 @@ public enum BlockBreaker
* sight to that hit vector.
*/
public static BlockBreakingParams getBlockBreakingParams(BlockPos pos)
{
return getBlockBreakingParams(RotationUtils.getEyesPos(), pos);
}
/**
* Returns everything you need to break a block at the given position, such
* as which side to face, the exact hit vector to face that side, the
* squared distance to that hit vector, and whether or not there is line of
* sight to that hit vector.
*/
public static BlockBreakingParams getBlockBreakingParams(Vec3d eyes,
BlockPos pos)
{
Direction[] sides = Direction.values();
@ -64,7 +76,6 @@ public enum BlockBreaker
if(shape.isEmpty())
return null;
Vec3d eyesPos = RotationUtils.getEyesPos();
Box box = shape.getBoundingBox();
Vec3d halfSize = new Vec3d(box.maxX - box.minX, box.maxY - box.minY,
box.maxZ - box.minZ).multiply(0.5);
@ -79,20 +90,20 @@ public enum BlockBreaker
hitVecs[i] = center.add(relHitVec);
}
double distanceSqToCenter = eyesPos.squaredDistanceTo(center);
double distanceSqToCenter = eyes.squaredDistanceTo(center);
double[] distancesSq = new double[sides.length];
boolean[] linesOfSight = new boolean[sides.length];
for(int i = 0; i < sides.length; i++)
{
distancesSq[i] = eyesPos.squaredDistanceTo(hitVecs[i]);
distancesSq[i] = eyes.squaredDistanceTo(hitVecs[i]);
// no need to raytrace the rear sides,
// they can't possibly have line of sight
if(distancesSq[i] >= distanceSqToCenter)
continue;
linesOfSight[i] = BlockUtils.hasLineOfSight(eyesPos, hitVecs[i]);
linesOfSight[i] = BlockUtils.hasLineOfSight(eyes, hitVecs[i]);
}
Direction side = sides[0];

View File

@ -9,11 +9,13 @@ package net.wurstclient.util;
import java.util.ArrayList;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.client.MinecraftClient;
import net.minecraft.entity.Entity;
import net.minecraft.registry.Registries;
import net.minecraft.util.Identifier;
import net.minecraft.util.InvalidIdentifierException;
@ -24,6 +26,7 @@ import net.minecraft.util.math.Box;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.shape.VoxelShape;
import net.minecraft.util.shape.VoxelShapes;
import net.minecraft.world.CollisionView;
import net.minecraft.world.RaycastContext;
import net.wurstclient.WurstClient;
@ -149,6 +152,25 @@ public enum BlockUtils
.getType() == HitResult.Type.MISS;
}
/**
* Returns a stream of all blocks that collide with the given box.
*
* <p>
* Unlike {@link CollisionView#getBlockCollisions(Entity, Box)}, this method
* breaks the voxel shapes down into their bounding boxes and only returns
* those that actually intersect with the given box. It also assumes that
* the entity is the player.
*/
public static Stream<Box> getBlockCollisions(Box box)
{
Iterable<VoxelShape> blockCollisions =
MC.world.getBlockCollisions(MC.player, box);
return StreamSupport.stream(blockCollisions.spliterator(), false)
.flatMap(shape -> shape.getBoundingBoxes().stream())
.filter(shapeBox -> shapeBox.intersects(box));
}
public static ArrayList<BlockPos> getAllInBox(BlockPos from, BlockPos to)
{
ArrayList<BlockPos> blocks = new ArrayList<>();

View File

@ -35,7 +35,7 @@ public enum EntityUtils
.filter(IS_ATTACKABLE);
}
public static Predicate<Entity> IS_ATTACKABLE = e -> e != null
public static final Predicate<Entity> IS_ATTACKABLE = e -> e != null
&& !e.isRemoved()
&& (e instanceof LivingEntity && ((LivingEntity)e).getHealth() > 0
|| e instanceof EndCrystalEntity
@ -50,7 +50,7 @@ public enum EntityUtils
.filter(IS_VALID_ANIMAL);
}
public static Predicate<AnimalEntity> IS_VALID_ANIMAL =
public static final Predicate<AnimalEntity> IS_VALID_ANIMAL =
a -> a != null && !a.isRemoved() && a.getHealth() > 0;
/**

View File

@ -18,9 +18,11 @@ import java.net.URLEncoder;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class GoogleTranslate
public enum GoogleTranslate
{
public String translate(String text, String langFrom, String langTo)
;
public static String translate(String text, String langFrom, String langTo)
{
String html = getHTML(text, langFrom, langTo);
String translated = parseHTML(html);
@ -31,7 +33,7 @@ public class GoogleTranslate
return translated;
}
private String getHTML(String text, String langFrom, String langTo)
private static String getHTML(String text, String langFrom, String langTo)
{
URL url = createURL(text, langFrom, langTo);
@ -57,7 +59,7 @@ public class GoogleTranslate
}
}
private URL createURL(String text, String langFrom, String langTo)
private static URL createURL(String text, String langFrom, String langTo)
{
try
{
@ -75,7 +77,7 @@ public class GoogleTranslate
}
}
private URLConnection setupConnection(URL url) throws IOException
private static URLConnection setupConnection(URL url) throws IOException
{
URLConnection connection = url.openConnection();
@ -87,7 +89,7 @@ public class GoogleTranslate
}
@SuppressWarnings("deprecation")
private String parseHTML(String html)
private static String parseHTML(String html)
{
String regex = "class=\"result-container\">([^<]*)<\\/div>";
Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);

View File

@ -7,10 +7,16 @@
*/
package net.wurstclient.util;
import net.minecraft.enchantment.Enchantment;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.entity.EquipmentSlot;
import net.minecraft.entity.attribute.EntityAttributes;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ToolItem;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.nbt.NbtElement;
import net.minecraft.nbt.NbtList;
import net.minecraft.registry.Registries;
import net.minecraft.util.Identifier;
import net.minecraft.util.InvalidIdentifierException;
@ -56,4 +62,26 @@ public enum ItemUtils
.get(EntityAttributes.GENERIC_ATTACK_SPEED).stream().findFirst()
.orElseThrow().getValue();
}
/**
* Adds the specified enchantment to the specified item stack. Unlike
* {@link ItemStack#addEnchantment(Enchantment, int)}, this method doesn't
* limit the level to 127.
*/
public static void addEnchantment(ItemStack stack, Enchantment enchantment,
int level)
{
Identifier id = EnchantmentHelper.getEnchantmentId(enchantment);
NbtList nbt = getOrCreateNbtList(stack, ItemStack.ENCHANTMENTS_KEY);
nbt.add(EnchantmentHelper.createNbt(id, level));
}
public static NbtList getOrCreateNbtList(ItemStack stack, String key)
{
NbtCompound nbt = stack.getOrCreateNbt();
if(!nbt.contains(key, NbtElement.LIST_TYPE))
nbt.put(key, new NbtList());
return nbt.getList(key, NbtElement.COMPOUND_TYPE);
}
}

View File

@ -96,7 +96,7 @@
"description.wurst.hack.killpotion": "Vytvoří lektvar, který může zabít téměř cokoliv, včetně hráčů v kreativním režimu. Nefunguje na nemrtvé, protože jsou již mrtví.\n\nVyžaduje kreativní režim.",
"description.wurst.hack.liquids": "Umožňuje umístit bloky do kapalin.",
"description.wurst.hack.lsd": "Způsobuje halucinace.",
"description.wurst.hack.masstpa": "Odešle požadavek na TPA všem hráčům.\nZastaví, když někdo přijme.",
"description.wurst.hack.masstpa": "Odešle požadavek na TPA všem hráčům.",
"description.wurst.hack.mileycyrus": "Neustálé twerkování.",
"description.wurst.hack.mobesp": "Zvýrazní moby v okolí.",
"description.wurst.hack.mobspawnesp": "Zvýrazní oblasti, kde se mohou mobové objevovat.\n§ežlutá§r - mobové se mohou oběvovat v noci\n§cred§r - mobové se mohou oběvovat vždy",

View File

@ -98,7 +98,7 @@
"description.wurst.hack.killpotion": "Generiert einen Trank, der fast alles töten kann, sogar Spieler im Kreativmodus. Funktioniert nicht bei untoten Mobs, weil die nach der Spiellogik bereits tot sind.\n\nFunktioniert nur im Kreativmodus.",
"description.wurst.hack.liquids": "Ermöglicht dir, Blöcke direkt in bzw. an Flüssigkeiten zu platzieren.",
"description.wurst.hack.lsd": "Verursacht Halluzinationen.",
"description.wurst.hack.masstpa": "Sendet TPA-Requests an alle Spieler.\nHört auf, sobald jemand akzeptiert.",
"description.wurst.hack.masstpa": "Sendet TPA-Requests an alle Spieler.",
"description.wurst.hack.mileycyrus": "Lässt dich twerken.",
"description.wurst.hack.mobesp": "Markiert Mobs in deiner Umgebung.",
"description.wurst.hack.mobspawnesp": "Markiert Orte, an denen Mobs spawnen können.\n§eGelb§r - Mobs können nachts spawnen\n§cRot§r - Mobs können jederzeit spawnen",

View File

@ -46,6 +46,7 @@
"description.wurst.hack.autotool": "Automatically equips the fastest applicable tool in your hotbar when you try to break a block.",
"description.wurst.hack.autototem": "Automatically moves totems of undying to your off-hand.",
"description.wurst.hack.autowalk": "Makes you walk automatically.",
"description.wurst.hack.barrieresp": "Allows you to see nearby barrier blocks.\n\nNote: Due to Minecraft bug MC-47607, this hack does not work if your \"Particles\" option is set to \"Minimal\".",
"description.wurst.hack.basefinder": "Finds player bases by searching for man-made blocks.\nThe blocks that it finds will be highlighted in the selected color.\nGood for finding faction bases.",
"description.wurst.hack.blink": "Suspends all motion updates while enabled.",
"description.wurst.hack.boatfly": "Allows you to fly with boats and other vehicles.\nPress the sprint key to go down faster.",
@ -100,7 +101,7 @@
"description.wurst.hack.killpotion": "Generates a potion that can kill almost anything, including players in Creative mode. Does not work on undead mobs, since they are already dead.\n\nRequires Creative mode.",
"description.wurst.hack.liquids": "Allows you to place blocks in liquids.",
"description.wurst.hack.lsd": "Causes hallucinations.",
"description.wurst.hack.masstpa": "Sends a TPA request to all players.\nStops if someone accepts.",
"description.wurst.hack.masstpa": "Sends a TPA request to all players.",
"description.wurst.hack.mileycyrus": "Makes you twerk.",
"description.wurst.hack.mobesp": "Highlights nearby mobs.",
"description.wurst.hack.mobspawnesp": "Highlights areas where mobs can spawn.\n§eyellow§r - mobs can spawn at night\n§cred§r - mobs can always spawn",

View File

@ -93,7 +93,7 @@
"description.wurst.hack.killpotion": "Génère une potion qui peut presque tout tuer, y compris les joueurs en mode Créatif. Ne fonctionne pas sur les monstres morts-vivants, car ils sont déjà morts.\n\nNécessite le mode Créatif.",
"description.wurst.hack.liquids": "Permet de placer des blocs dans des liquides.",
"description.wurst.hack.lsd": "Provoque des hallucinations.",
"description.wurst.hack.masstpa": "Envoie une requête TPA à tous les joueurs.\nS'arrête si quelqu'un accepte.",
"description.wurst.hack.masstpa": "Envoie une requête TPA à tous les joueurs.",
"description.wurst.hack.mileycyrus": "Vous fait twerker.",
"description.wurst.hack.mobesp": "Met en évidence les monstres à proximité.",
"description.wurst.hack.mobspawnesp": "Met en évidence les zones où les monstres peuvent apparaître.\n§ejaune§r - les monstres peuvent apparaître la nuit\n§crouge§r - les monstres peuvent toujours apparaître",

View File

@ -96,7 +96,7 @@
"description.wurst.hack.killpotion": "Genera una pozione che può uccidere quasi tutto, inclusi i giocatori in modalità Creativa. Non funziona sui mob non morti, poiché sono già morti.\n\nRichiede la modalità Creativa.",
"description.wurst.hack.liquids": "Ti permette di piazzare blocchi nei liquidi.",
"description.wurst.hack.lsd": "Causa allucinazioni da LSD.",
"description.wurst.hack.masstpa": "Manda una richiesta di teletrasporto a tutti i giocatori.\nSi ferma se qualcuno accetta.",
"description.wurst.hack.masstpa": "Manda una richiesta di teletrasporto a tutti i giocatori.",
"description.wurst.hack.mileycyrus": "Ti fa twerkare.",
"description.wurst.hack.mobesp": "Evidenzia i mob vicini.",
"description.wurst.hack.mobspawnesp": "Evidenzia le aree dove i mob possono spawnare.\n§egiallo§r - I mob possono nascere durante la notte\n§crosso§r - i mob possono nascere sempre",

View File

@ -100,7 +100,7 @@
"description.wurst.hack.killpotion": "クリエイティブモードのプレイヤーを含む、ほぼすべての生き物を倒すことができるポーションを生成する。\nアンデッドのモブはすでに死んでいるため使用不可。\n\nクリエイティブモード必須。",
"description.wurst.hack.liquids": "水面に直接ブロックを設置できるようになる。",
"description.wurst.hack.lsd": "幻覚症状を引き起こす。",
"description.wurst.hack.masstpa": "すべてのプレイヤーにTPAテレポートリクエストを送信する。\n誰かに許可されると停止する。",
"description.wurst.hack.masstpa": "すべてのプレイヤーにTPAテレポートリクエストを送信する。",
"description.wurst.hack.mileycyrus": "腰振りダンスをする。",
"description.wurst.hack.mobesp": "付近のモブをハイライト表示する。",
"description.wurst.hack.mobspawnesp": "モブがスポーンする可能性のあるエリアをハイライト表示する。\n§e黄色§r - モブが夜にスポーンする可能性あり\n§c赤色§r - モブが常時スポーンする可能性あり",

View File

@ -0,0 +1,155 @@
{
"description.wurst.hack.aimassist": "주변 엔티티를 조준하는 데 도움을 줍니다.",
"description.wurst.hack.airplace": "공중에 블록을 배치할 수 있게 해줍니다.",
"description.wurst.hack.antiafk": "자리비움 검출기에서 숨기기 위해 무작위로 이동합니다.\n적어도 3x3 블록의 빈 공간이 필요합니다.",
"description.wurst.hack.antiblind": "실명 및 어둠 효과를 방지합니다.\nOptiFine과 호환되지 않습니다.",
"description.wurst.hack.anticactus": "선인장 대미지를 받지 않습니다.",
"description.wurst.hack.antientitypush": "다른 플레이어나 몹에게 밀려나는 것을 방지합니다.",
"description.wurst.hack.antihunger": "걷는 동안 배고픔 속도를 늦춥니다.",
"description.wurst.hack.antiknockback": "플레이어나 몹으로부터 넉백을 받지 않도록 합니다.",
"description.wurst.hack.antispam": "반복된 메시지에 카운터를 추가하여 채팅 스팸을 차단합니다.",
"description.wurst.hack.antiwaterpush": "물에 밀리는 것을 방지합니다.",
"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.autodrop": "원하지 않는 아이템을 자동으로 버립니다.",
"description.wurst.hack.autoleave": "체력이 낮을 때 자동으로 서버에서 나갑니다.",
"description.wurst.hack.autolibrarian": "특정 인챈트된 책을 판매하는 마을 주민을 자동으로 훈련합니다. 이 핵을 사용하면 전체 거래 구간을 짧은 시간 내에 설정할 수 있습니다.",
"description.wurst.hack.autoeat": "음식을 필요할때 자동으로 섭취합니다.",
"description.wurst.setting.autoeat.target_hunger": "배고픔 게이지를 이 수준 이상으로 유지하려고 하지만 배고픔 점수를 낭비하지 않습니다.",
"description.wurst.setting.autoeat.min_hunger": "항상 이 수준 이상으로 배고픔 게이지를 유지하되, 음식 점수를 낭비하더라도 상관하지 않습니다.\n6.5 - 바닐라 음식 아이템으로는 낭비를 일으키지 않습니다.\n10.0 - 낭비를 무시하고 배고픔 게이지를 항상 가득 채웁니다.",
"description.wurst.setting.autoeat.injured_hunger": "부상당했을 때 이 수준 이상으로 배고픔 게이지를 채우며 음식 점수를 낭비하더라도 상관하지 않습니다.\n10.0 - 가장 빠른 회복\n9.0 - 가장 느린 회복\n<9.0 - 회복 없음\n<3.5 - 달리기 금지",
"description.wurst.setting.autoeat.injury_threshold": "작은 부상으로 인해 모든 음식이 낭비되는 것을 방지합니다. AutoEat은 최소한 만큼의 체력을 잃었을 때만 부상 상태로 간주합니다.",
"description.wurst.setting.autoeat.eat_while_walking": "걷는 동안 음식을 먹는 것은 속도를 늦춥니다. 권장하지 않습니다.",
"description.wurst.setting.autoeat.allow_poison": "독성 음식은 시간 경과에 따라 피해를 입힙니다.\n권장하지 않습니다.",
"description.wurst.hack.autofarm": "곡물, 당근, 감자, 비트, 호박, 수박, 선인장, 사탕수수, 켈프, 대나무, 네더 와트, 코코아 열매에 대해 자동으로 작물을 수확하고 다시 심습니다.",
"description.wurst.hack.autofish": "최고의 낚싯대를 사용하여 자동으로 물고기를 잡습니다. 물고기를 잡는 동안 더 좋은 낚싯대를 발견하면 자동으로 전환됩니다.",
"description.wurst.hack.automine": "시선을 정한 블록을 자동으로 채굴합니다.",
"description.wurst.hack.autopotion": "체력이 낮을 때 즉시 회복 물약을 자동으로 던집니다.",
"description.wurst.hack.autoreconnect": "서버에서 강제 퇴장당할 경우 자동으로 재접속합니다.",
"description.wurst.hack.autorespawn": "죽을 경우 자동으로 리스폰합니다.",
"description.wurst.hack.autosign": "원하는 글을 모든 표지판에 즉시 작성합니다. 활성화된 후 첫 번째 표지판에 일반적으로 글을 작성하여 모든 다른 표지판에 적용할 수 있습니다.",
"description.wurst.hack.autosoup": "체력이 낮을 때 자동으로 수프를 먹습니다.\n\n§l참고:§r 이 해킹 기능은 배고픔을 무시하고 수프를 직접 먹으면 체력이 회복된다고 가정합니다. 만약 이 기능이 서버에서 설정되어 있지 않다면 AutoEat을 사용하세요.",
"description.wurst.hack.autosprint": "자동으로 달립니다.",
"description.wurst.hack.autosteal": "여는 모든 상자와 셜커 상자에서 모든 것을 자동으로 훔칩니다.",
"description.wurst.hack.autoswim": "수영 애니메이션을 자동으로 실행합니다.",
"description.wurst.hack.autoswitch": "항상 손에 들고 있는 아이템을 전환합니다.\n\n§l팁:§r 이 기능은 다양한 색의 양털 또는 콘크리트 블록을 핫바에 넣고 BuildRandom과 함께 사용하는 것이 좋습니다.",
"description.wurst.hack.autowalk": "자동으로 걷게 해줍니다.",
"description.wurst.hack.basefinder": "인공 블록을 검색하여 베이스를 찾습니다.\n찾은 블록은 선택한 색상으로 강조됩니다.\nFaction 기지를 찾는 데 유용합니다.",
"description.wurst.hack.buildrandom": "주변에 무작위로 블록을 배치합니다.",
"description.wurst.hack.bunnyhop": "자동으로 점프합니다.",
"description.wurst.hack.cameradistance": "카메라 거리를 3인칭에서 변경할 수 있습니다.",
"description.wurst.hack.cameranoclip": "카메라가 벽을 통과할 수 있습니다(3인칭).",
"description.wurst.hack.cavefinder": "선택한 색상으로 동굴을 강조하여 찾도록 도와줍니다.",
"description.wurst.hack.chattranslator": "구글 번역을 이용하여 채팅을 번역합니다.",
"description.wurst.hack.chestesp": "주변의 상자를 강조합니다.",
"description.wurst.hack.clickaura": "클릭할 때 가장 가까운 유효한 엔티티를 자동으로 공격합니다.\n\n§c§l경고:§r ClickAura는 Killaura보다 더욱 의심스러워 보이며, 플러그인에 탐지되기 쉽습니다. 대신 Killaura나 TriggerBot을 사용하는 것이 좋습니다.",
"description.wurst.hack.creativeflight": "크리에이티브 모드와 같이 비행할 수 있습니다.\n\n§c§l경고:§r NoFall을 사용하지 않으면 낙하 대미지를 입을 수 있습니다.",
"description.wurst.hack.criticals": "모든 공격을 크리티컬로 변경합니다.",
"description.wurst.hack.derp": "머리를 무작위로 움직입니다.\n다른 플레이어에게만 보입니다.",
"description.wurst.hack.dolphin": "물 속에서 자동으로 위아래로 움직이도록 합니다.\n(돌고래처럼)",
"description.wurst.hack.excavator": "선택한 영역 내의 모든 블록을 자동으로 부숩니다.",
"description.wurst.hack.fancychat": "채팅 메시지에서 ASCII 문자를 화려한 유니코드 문자로 바꿉니다. 일부 서버에서 욕설 필터를 우회하는 데 사용할 수 있습니다. \n유니코드 문자를 차단하는 서버에서는 작동하지 않습니다.",
"description.wurst.hack.fastbreak": "블록을 더 빨리 부술 수 있습니다. \n팁: Nuker와 함께 사용할 수 있습니다.",
"description.wurst.hack.fastladder": "사다리를 더 빨리 올라갈 수 있습니다.",
"description.wurst.hack.fastplace": "블록을 5배 더 빨리 배치할 수 있습니다. \n팁: AutoBuild와 같은 다른 해킹을 가속화할 수 있습니다.",
"description.wurst.hack.feedaura": "주변의 동물에게 자동으로 사료를 줍니다.",
"description.wurst.hack.fightbot": "자동으로 주변을 돌아다니며 모든 것을 죽이는 봇입니다. \nMobArena에 적합합니다.",
"description.wurst.hack.fish": "수중 중력을 해제하여 물고기처럼 수영할 수 있습니다.",
"description.wurst.hack.flight": "비행이 가능합니다. \n\n§c§l경고:§r NoFall을 사용하지 않으면 낙하 피해를 입을 수 있습니다.",
"description.wurst.hack.follow": "가장 가까운 개체를 따라가는 봇입니다. \n매우 귀찮습니다. \n\n.follow를 사용하여 특정 개체를 따라갈 수 있습니다.",
"description.wurst.hack.forceop": "AuthMe 비밀번호를 크랙합니다. \nOP를 얻는 데 사용할 수 있습니다.",
"description.wurst.hack.glide": "낙하할 때 천천히 떨어집니다. \n\n§c§l경고:§r NoFall을 사용하지 않으면 낙하 피해를 입을 수 있습니다.",
"description.wurst.hack.handnoclip": "벽을 통해 특정 블록에 접근할 수 있습니다.",
"description.wurst.hack.headroll": "항상 고개를 끄덕입니다. \n다른 플레이어에게만 표시됩니다.",
"description.wurst.hack.healthtags": "플레이어의 체력을 이름표에 표시합니다.",
"description.wurst.hack.highjump": "더 높이 점프할 수 있게 해줍니다.\n\n§c§l주의:§r NoFall을 사용하지 않으면 낙하 피해를 입을 수 있습니다.",
"description.wurst.hack.infinichat": "채팅에서 256자 제한을 없애줍니다.\nNBT 데이터를 수정하는 긴 명령어에 유용합니다.\n\n§6§l주의:§r 대화를 위해 권장되지 않습니다. 대부분의 서버는 메시지를 256자로 제한합니다.",
"description.wurst.hack.instantbunker": "자신 주위에 작은 벙커를 만듭니다. 57개의 블록이 필요합니다.",
"description.wurst.setting.invwalk.allow_clickgui": "Wurst의 ClickGUI가 열려있는 동안에도 움직일 수 있게 해줍니다.",
"description.wurst.setting.invwalk.allow_other": "다른 게임 내 화면(상자, 말, 주민 거래 등)이 열려있는 동안에도 움직일 수 있게 해줍니다. 다만 텍스트 상자가 있는 경우에는 예외입니다.",
"description.wurst.hack.itemesp": "떨어진 아이템을 강조합니다.",
"description.wurst.hack.itemgenerator": "랜덤 아이템을 생성하여 땅에 드롭합니다.\n§o크리에이티브 모드 전용입니다.§r",
"description.wurst.hack.jesus": "물 위를 걸을 수 있게 해줍니다.\n이 핵은 약 2000년 전에 예수님이 사용했습니다.",
"description.wurst.hack.jetpack": "마치 제트팩을 가지고 있는 것처럼 날 수 있게 해줍니다.\n\n§c§l주의:§r NoFall을 사용하지 않으면 낙하 피해를 입을 수 있습니다.",
"description.wurst.hack.kaboom": "주변 블록을 폭발처럼 부숩니다.\n서버에 NoCheat+가 없다면 Nuker보다 훨씬 빠를 수 있습니다. 빠른 도구와 약한 블록과 함께 사용하는 것이 가장 효과적입니다.\n참고: 실제로 폭발하는 것은 아닙니다.",
"description.wurst.hack.killauralegit": "감지가 어려운 느린 Killaura입니다.\n일반적인 NoCheat+ 서버에서는 필요하지 않습니다!",
"description.wurst.hack.killaura": "자동으로 주변의 개체를 공격합니다.",
"description.wurst.hack.liquids": "액체 안에 블록을 배치할 수 있게 해줍니다.",
"description.wurst.hack.lsd": "환각을 유발합니다.",
"description.wurst.hack.masstpa": "모든 플레이어에게 TPA 요청을 보냅니다.",
"description.wurst.hack.mileycyrus": "트월킹을 할 수 있게 해줍니다.",
"description.wurst.hack.mobesp": "주변의 몹을 강조합니다.",
"description.wurst.hack.multiaura": "여러 개체를 동시에 공격하는 더 빠른 Killaura입니다.",
"description.wurst.hack.nameprotect": "모든 플레이어 이름을 숨깁니다.",
"description.wurst.hack.nametags": "네임태그의 크기를 크게 변경하여 항상 읽을 수 있게 해줍니다. 또한 웅크리는 플레이어의 네임태그를 볼 수 있게 해줍니다.",
"description.wurst.hack.navigator": "시간이 지남에 따라 사용자의 선호도를 학습하는 검색 가능한 GUI입니다.",
"description.wurst.hack.newchunks": "자신 주변에 최근에 생성된 청크를 강조합니다.",
"description.wurst.hack.noclip": "블록을 자유롭게 통과할 수 있게 해줍니다.\n블록(예: 모래)이 머리 위로 떨어져야 활성화됩니다.\n\n§c§l주의:§r 블록을 통과하는 동안 피해를 입을 수 있습니다!",
"description.wurst.hack.nocomcrash": "Nocom 악용을 통해 서버를 지연시키고 충돌시킵니다.\nPaper 서버에서 작동하지 않습니다. Vanilla, Spigot 및 Fabric에서 테스트된 작동합니다. 일부 AntiCheats에 의해 비활성화될 수 있습니다.",
"description.wurst.hack.nofall": "낙하 피해를 방지합니다.",
"description.wurst.hack.nofireoverlay": "불에 탔을 때 오버레이를 제거합니다.\n\n§c§l주의:§r 이로 인해 알지 못하고 타죽을 수 있습니다.",
"description.wurst.hack.nohurtcam": "피해를 입었을 때 흔들림 효과를 제거합니다.",
"description.wurst.hack.nooverlay": "물과 용암의 오버레이를 제거합니다.",
"description.wurst.hack.nopumpkin": "호박을 머리에 쓸 때 오버레이를 제거합니다.",
"description.wurst.hack.noslowdown": "꿀, 영혼 모래 및 아이템 사용으로 인한 속도 감소 효과를 제거합니다.",
"description.wurst.hack.noweather": "클라이언트 측의 날씨, 시간 및 달의 위상을 변경할 수 있게 해줍니다.",
"description.wurst.hack.noweb": "거미줄에 갇히는 것을 제거합니다.",
"description.wurst.hack.nuker": "주변 블록을 자동으로 부숩니다.",
"description.wurst.hack.nukerlegit": "감지 플러그인을 우회하는 더 느린 Nuker입니다.\n일반적인 NoCheat+ 서버에서는 필요하지 않습니다!",
"description.wurst.hack.openwateresp": "'열린 물'에서 낚시를 하는지 여부를 보여주고 열린 물 계산에 사용되는 영역 주위에 상자를 그립니다.",
"description.wurst.hack.overlay": "블록을 채굴할 때마다 Nuker 애니메이션을 렌더링합니다.",
"description.wurst.hack.panic": "활성화된 모든 핵을 즉시 비활성화합니다.\n이 기능을 사용할 때 주의하세요!",
"description.wurst.hack.parkour": "블록 가장자리에 도달하면 자동으로 점프합니다.\n파쿠르와 점프'n'런에 유용합니다.",
"description.wurst.hack.portalgui": "포탈에서 GUI를 열 수 있게 해줍니다.",
"description.wurst.hack.potionsaver": "정지 상태에서는 모든 물약 효과를 유지합니다.",
"description.wurst.hack.prophuntesp": "블럭 숨바꼭질에서 가짜 블록을 볼 수 있게 해줍니다.\nMineplex서버의 블럭 숨바꼭질을 위해 제작되었으며, 다른 서버에서 작동하지 않을 수 있습니다.",
"description.wurst.hack.protect": "가장 가까운 개체를 따라가고 다른 개체로부터 보호하는 봇입니다.\n가장 가까운 개체 대신 특정 개체를 보호하려면 .protect 명령을 사용하세요.",
"description.wurst.hack.radar": "주변 개체의 위치를 보여줍니다.\n§c빨강색§r - 플레이어\n§6주황색§r - 몬스터\n§a초록색§r - 동물\n§7회색§r - 기타",
"description.wurst.hack.remoteview": "특정 플레이어의 시야를 공유합니다.\n.rv 명령을 사용하여 특정 개체를 대상으로 설정할 수 있습니다.",
"description.wurst.hack.safewalk": "블럭끝에서 떨어지지 않게 해줍니다.",
"description.wurst.hack.scaffoldwalk": "자동으로 발 아래에 블록을 배치합니다.",
"description.wurst.hack.search": "무지개 색상으로 강조하여 특정 블록을 찾는 데 도움을 줍니다.",
"description.wurst.hack.servercrasher": "1.15.x 버전 서버를 충돌시킬 수 있는 아이템을 생성합니다.\n§o크리에이티브 모드 전용.§r",
"description.wurst.hack.skinderp": "스킨의 커버를 무작위로 on/off 합니다.",
"description.wurst.hack.sneak": "웅크리게 합니다.",
"description.wurst.hack.speedhack": "달리기와 점프로 할 때보다 약 2.5배 더 빠르게 달릴 수 있게 해줍니다.\n\n§6§l주의:§r NoCheat+ 버전 3.13.2에서 패치되었습니다. 이전 버전의 NoCheat+에서만 우회됩니다.\n서버의 NoCheat+ 버전을 확인하려면 §l/ncp version§r을 입력하세요.",
"description.wurst.hack.speednuker": "NoCheat+를 우회할 수 없는 더 빠른 버전의 Nuker입니다.",
"description.wurst.hack.spider": "거미처럼 벽을 타고 올라갈 수 있게 해줍니다.",
"description.wurst.hack.step": "모든 블럭을 계단처럼 올라갑니다.",
"description.wurst.hack.tillaura": "자동으로 흙, 잔디 등을 경작화 시킵니다.\nKillaura와 혼동하지 마세요.",
"description.wurst.hack.timer": "개인의 시간 선을 조절합니다.\n단, 서버의 영향을 미치진 않습니다.",
"description.wurst.hack.toomanyhax": "원치 않는 기능을 차단합니다.\n잘못된 핵을 우연히 활성화하여 밴을 당하는 것을 방지할 수 있습니다.\n'핵을 조금만 사용하는' 사람들을 위한 기능입니다.\n\n§6.toomanyhax§r 명령을 사용하여 어떤 기능을 차단할지 선택할 수 있습니다.\n자세한 내용은 §6.help toomanyhax§r를 입력하세요.",
"description.wurst.hack.tp-aura": "가까운 유효한 개체로 텔레포트 하면서 가장 자동으로 공격합니다.",
"description.wurst.hack.trajectories": "화살과 던져지는 아이템의 비행 경로를 예측해 줍니다.",
"description.wurst.hack.treebot": "자동으로 주위를 돌아다니며 나무를 베어줍니다.\n현재는 작은 나무에만 사용 가능합니다.",
"description.wurst.hack.triggerbot": "바라보고 있는 개체를 자동으로 공격합니다.",
"description.wurst.hack.tunneller": "터널을 자동으로 만들어 줍니다.\n\n§c§l주의:§r 이 봇은 용암 및 기타 위험을 피하려고 노력하지만, 죽지 않는다는 보장은 없습니다. 잃어도 괜찮은 장비를 가지고 보내세요.",
"description.wurst.hack.x-ray": "벽을 통해 광물을 볼 수 있게 해줍니다.",
"description.wurst.other_feature.nochatreports": "1.19 버전부터 채팅 메시지에 첨부되는 암호화 서명을 비활성화합니다.\n\n§c§l주의: §c채팅에 §c인증을 §c첨부하여 §c메시지를 §c보내면 §c계정이 §c신고되어 §c멀티플레이어에서 §c글로벌 §c밴 §c처리될 §c수 §c있습니다!§r\n\n채팅에서 무해한 내용을 말한다고 해도, 서명된 메시지는 가짜 채팅 신고를 생성하여 계정이 불공정하게 밴 처리되는 경우가 있을 수 있습니다.\n\n채팅 서명을 다시 활성화하여 채팅을 하려면 계정이 아닌 가계정에서 플레이하는 것을 고려하세요.",
"button.wurst.nochatreports.disable_signatures": "서명 비활성화",
"button.wurst.nochatreports.re-enable_signatures": "서명 활성화",
"description.wurst.setting.generic.pause_attack_on_containers": "상자 화면(상자, 호퍼 등)이 열려 있을 때 공격하지 않습니다.\n상자와 비슷한 메뉴를 표시하는 미니게임 서버에 유용합니다.",
"description.wurst.altmanager.premium": "이 가계정은 비밀번호가 있으며 모든 서버에 접속할 수 있습니다.",
"description.wurst.altmanager.cracked": "이 가계정은 비밀번호가 없으며 크랙 서버에서만 작동합니다.",
"description.wurst.altmanager.failed": "이 가계정으로 마지막으로 로그인 시도한 때 작동하지 않았습니다.",
"description.wurst.altmanager.checked": "비밀번호가 이전에 작동한 적이 있습니다.",
"description.wurst.altmanager.unchecked": "이 가계정으로 로그인에 성공한 적이 없습니다.",
"description.wurst.altmanager.favorite": "이 가계정을 즐겨찾기로 표시했습니다.",
"description.wurst.altmanager.window": "이 버튼은 다른 창을 엽니다.",
"description.wurst.altmanager.window_freeze": "해당 창이 열려 있는 동안 게임이 응답하지 않는 것처럼 보일 수 있습니다.",
"description.wurst.altmanager.fullscreen": "§c전체 화면 모드를 해제하세요!",
"gui.wurst.altmanager.folder_error.title": "'.Wurst encryption' 폴더를 생성할 수 없습니다!",
"gui.wurst.altmanager.folder_error.message": "Wurst가 이 폴더에 액세스할 수 없게 블록한 것 같습니다.\nAltManager는 이 폴더 없이 가계정 목록을 암호화하거나 복호화할 수 없습니다.\nAltManager를 계속 사용할 수 있지만, 이제 만드는 가계정은 저장되지 않습니다.\n\n전체 오류는 다음과 같습니다:\n%s",
"gui.wurst.altmanager.empty.title": "가계정 목록이 비어 있습니다.",
"gui.wurst.altmanager.empty.message": "시작하기 위해 일부 무작위 알트 계정을 원하시나요?",
"gui.wurst.nochatreports.unsafe_server.title": "§4§l주의:§r 위험한 서버",
"gui.wurst.nochatreports.unsafe_server.message": "이 서버는 채팅 서명을 활성화해야 하므로 계정이 가짜 채팅 신고의 위험에 노출됩니다.\n\n채팅 서명을 차단하고 다시 연결한 경우 이 서버에서 채팅할 수 있습니다. 그렇다면 계정을 잃어도 상관없는 가계정으로 플레이하는 것을 고려하세요.\n\n이 서버가 소유한 경우 server.properties에서 'enforce-secure-profile'을 false로 설정하여 수정할 수 있습니다. 전형적인 Mojang의 스타일로, 이 설정은 이름이 의미하는 것과 반대로 작동합니다.",
"toast.wurst.nochatreports.unsafe_server.title": "채팅 메시지가 신고될 수 있습니다",
"toast.wurst.nochatreports.unsafe_server.message": "이 서버에서 전송한 메시지는 Mojang에게 신고될 수 있으며 계정이 모든 서버 밴 처리될 수 있습니다",
"button.wurst.nochatreports.signatures_status": "서명: ",
"description.wurst.nochatreports.message_is_reportable": "이 메시지에는 유효한 서명이 있으므로 가짜 채팅 신고에 취약합니다.",
"gui.wurst.generic.allcaps_blocked": "차단됨",
"gui.wurst.generic.allcaps_allowed": "허용됨"
}

View File

@ -96,7 +96,7 @@
"description.wurst.hack.killpotion": "Generuje miksturę, która może zabić prawie wszystko, w tym graczy w trybie kreatywnym. Nie działa na nieumarłych mobach, ponieważ są już martwe.\n\nWymaga trybu kreatywnego.",
"description.wurst.hack.liquids": "Umożliwia umieszczanie bloków w płynach.",
"description.wurst.hack.lsd": "Powoduje halucynacje.",
"description.wurst.hack.masstpa": "Wysyła prośbę TPA do wszystkich graczy.\nPrzestaje, jeśli ktoś zaakceptuje.",
"description.wurst.hack.masstpa": "Wysyła prośbę TPA do wszystkich graczy.",
"description.wurst.hack.mileycyrus": "Sprawia, że twerkujesz.",
"description.wurst.hack.mobesp": "Podświetla pobliskie moby.",
"description.wurst.hack.mobspawnesp": "Podświetla obszary, w których moby mogą się odradzać.\n§eżółty§r - moby mogą odradzać się w nocy\n§cczerwony§r - moby mogą zawsze się odradzać",

View File

@ -93,7 +93,7 @@
"description.wurst.hack.killpotion": "Genereaza o potiune care poate ucide orice, inclusiv playerii in Creativ. Nu functioneaza pe mortaciuni, fiindca mortaciunile-s deja moarte.\n\nNecesita Creativ.",
"description.wurst.hack.liquids": "Iti permite sa pui block-uri in lichide.",
"description.wurst.hack.lsd": "Cauzeaza halucinatii.",
"description.wurst.hack.masstpa": "Trimite TPA request la toti playerii.\nSe opreste atunci cand cineva accepta.",
"description.wurst.hack.masstpa": "Trimite TPA request la toti playerii.",
"description.wurst.hack.mileycyrus": "Faci twerk.",
"description.wurst.hack.mobesp": "Contureaza mobii din apropiere.",
"description.wurst.hack.mobspawnesp": "Contureaza zonele in care mobii se pot spawna.\n§egalben§r - mobii se pot spawna noaptea\n§crosu§r - mobii se pot spawna mereu",

View File

@ -96,7 +96,7 @@
"description.wurst.hack.killpotion": "Создает зелье которое убивает практически кого угодно, даже тех кто в креативе. Не работает на нежити потому что они и так мертвы лол.\n\nДля работы требуется креатив.",
"description.wurst.hack.liquids": "Позволяет ставить блоки прямо в жидкостях.",
"description.wurst.hack.lsd": "Провоцирует тяжелые галлюцинации.",
"description.wurst.hack.masstpa": "Отправляет запрос на телепортацию всем игрокам.\nОстанавливается если кто-то примет.",
"description.wurst.hack.masstpa": "Отправляет запрос на телепортацию всем игрокам.",
"description.wurst.hack.mileycyrus": "Заставляет Вас тверкать.",
"description.wurst.hack.mobesp": "Подсвечивает мобов неподалеку.",
"description.wurst.hack.mobspawnesp": "Показывает места в которых могут заспавниться мобы.\n§eжёлтым§r - мобы могут заспавниться ночью\n§cкрасным§r - мобы могут заспавниться когда угодно",

View File

@ -92,7 +92,7 @@
"description.wurst.hack.killpotion": "Створює зілля вбиває практично будь-кого, навіть тих хто в креативі. Не працює на нежиті, бо вони мертві лол.\n\nДля роботи потрібен креатив.",
"description.wurst.hack.liquids": "Дозволяє ставити блоки прямо на рідині.",
"description.wurst.hack.lsd": "Провокує тяжкі галюцинації.",
"description.wurst.hack.masstpa": "Надсилає запит на телепортацію всім гравцям.\nЗупиняється, якщо хтось прийме.",
"description.wurst.hack.masstpa": "Надсилає запит на телепортацію всім гравцям.",
"description.wurst.hack.mileycyrus": "Примушує вас тверкати.",
"description.wurst.hack.mobesp": "Підсвічує мобів знову.",
"description.wurst.hack.mobspawnesp": "Показує місця, у яких можуть народитися моби.\n§eжовтим§r - моби можуть народитися вночі\n§cчервоним§r - моби можуть народиться коли завгодно",

View File

@ -96,7 +96,7 @@
"description.wurst.hack.killpotion": "生成一个能杀死绝大多数生物(包括创造模式的玩家)的药水,但对那些不死的生物或者已死生物无效。\n\n需要在创造模式下。",
"description.wurst.hack.liquids": "取消无法把方块直接放置在水中的限制,允许你直接在水方块中放置方块。",
"description.wurst.hack.lsd": "让你像吃了云南蘑菇一样。",
"description.wurst.hack.masstpa": "给每个人发送 TPA 请求。\n直到有人接受就会停止\n\n§c§l警告§r当在国内服务器使用会因为 Wurst 无法判断中文返回消息而导致 TPA 请求继续。",
"description.wurst.hack.masstpa": "给每个人发送 TPA 请求。\n\n§c§l警告§r当在国内服务器使用会因为 Wurst 无法判断中文返回消息而导致 TPA 请求继续。",
"description.wurst.hack.mileycyrus": "类似疯狂按 Shift 潜行。",
"description.wurst.hack.mobesp": "高亮附近的生物。",
"description.wurst.hack.mobspawnesp": "高亮生物可以生成的区域。\n§e黄色§r 可以在夜间生成\n§c红色§r - 可以在任意时候生成",

View File

@ -92,7 +92,7 @@
"description.wurst.hack.killpotion": "生成一個能殺死絕大多數生物嘅葯水,包括創造模式嘅玩家,但對唔死嘅生物抑或已死生物無效。\n\n需要喺創造模式下。",
"description.wurst.hack.liquids": "解除限制,允許你喺水中直接放置方塊。",
"description.wurst.hack.lsd": "產生食咗雲南蘑菇一樣嘅效果。",
"description.wurst.hack.masstpa": "畀每個人發送 傳送申請。\n直到有人接受就會停止\n\n§c§l警告§r中文伺服器使用會因為 Wurst 判斷嘅係英文而導致 傳送申請 仍喺繼續。",
"description.wurst.hack.masstpa": "畀每個人發送 傳送申請。\n\n§c§l警告§r中文伺服器使用會因為 Wurst 判斷嘅係英文而導致 傳送申請 仍喺繼續。",
"description.wurst.hack.mileycyrus": "類似瘋狂按 Shift 潛行。",
"description.wurst.hack.mobesp": "高亮附近嘅生物。",
"description.wurst.hack.mobspawnesp": "高亮生物可以生成嘅區域。\n§e黃色§r 可以喺夜間生成\n§c紅色§r - 可以喺任意時候生成",

View File

@ -96,7 +96,7 @@
"description.wurst.hack.killpotion": "生成一個能殺死絕大多數生物的藥水,包括創造模式的玩家,但對那些不死的生物或者已死生物無效。\n\n需要在創造模式下。",
"description.wurst.hack.liquids": "取消限制,允許你在水面上直接放置方塊。",
"description.wurst.hack.lsd": "產生和吃了雲南蘑菇一樣的漸變色暈眩效果。",
"description.wurst.hack.masstpa": "給每個人發送TPA請求。\n直到有人接受就會停止\n\n§c§l警告§r國內服務器使用會因為Wurst判斷的是英文而導致TPA仍在繼續。",
"description.wurst.hack.masstpa": "給每個人發送TPA請求。\n\n§c§l警告§r國內服務器使用會因為Wurst判斷的是英文而導致TPA仍在繼續。",
"description.wurst.hack.mileycyrus": "類似全自動Shift蹲起。",
"description.wurst.hack.mobesp": "高亮附近的生物。",
"description.wurst.hack.mobspawnesp": "高亮那些生物可以生成的區域。\n§e黃色§r - 可以在夜間生成\n§c紅色§r - 可以在任意時候生成",

View File

@ -6,23 +6,24 @@
"mixins": [
],
"client": [
"AbstractBlockStateMixin",
"AbstractBlockStateMixin",
"AbstractSignEditScreenMixin",
"AllowedAddressResolverMixin",
"BackgroundRendererMixin",
"BlockEntityRenderDispatcherMixin",
"BlockMixin",
"BlockModelRendererMixin",
"CactusBlockMixin",
"CameraMixin",
"ChatHudMixin",
"ChatInputSuggestorMixin",
"ChatScreenMixin",
"ChunkOcclusionGraphBuilderMixin",
"ClientConnectionMixin",
"BasicBakedModelMixin",
"BlockEntityRenderDispatcherMixin",
"BlockMixin",
"CactusBlockMixin",
"CameraMixin",
"ChatHudMixin",
"ChatInputSuggestorMixin",
"ChatScreenMixin",
"ChunkOcclusionGraphBuilderMixin",
"ClientConnectionMixin",
"ClientPlayerEntityMixin",
"ClientPlayerInteractionManagerMixin",
"ClientPlayNetworkHandlerMixin",
"ClientWorldMixin",
"CreativeInventoryScreenMixin",
"CustomPayloadC2SPacketAccessor",
"DeathScreenMixin",
@ -53,10 +54,10 @@
"ShulkerBoxScreenMixin",
"SimpleOptionMixin",
"SodiumBlockOcclusionCacheMixin",
"SodiumFluidRendererMixin",
"StatsScreenMixin",
"StatusEffectInstanceMixin",
"TelemetryManagerMixin",
"TerrainRenderContextMixin",
"TextVisitFactoryMixin",
"TitleScreenMixin",
"WorldMixin",