Skip to content

Commit 35daf3c

Browse files
committed
HideWurst & HideModMenu
1 parent 8e24870 commit 35daf3c

38 files changed

+1519
-22
lines changed

README.md

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,10 @@ I'm pleased to note that many of the features and improvements below are complet
8686
- SusNoMore
8787
- Towny Hack, ChorusFruit and MeasurementESP (Unlisted Hacks)
8888
- BedrockEscape
89+
- PacketFirewall
90+
- KickForensics
91+
- HideWurst
92+
- LootRunner
8993
- Redstone, Bed, Sign & Workstation ESP
9094
- PearlESP (Not a simple trajectory hack)
9195
- SignFramePassThrough (I didn't know something like this existed as a mod already)
@@ -642,7 +646,6 @@ Credits to [Trouser-Streak](https://github.com/etianl/Trouser-Streak/blob/main/s
642646

643647
- Navigator only hack that simply tells you who or what caused you damage and where in chat
644648

645-
646649
### Teleport
647650

648651
- Teleports you along a visible path
@@ -673,6 +676,14 @@ This hack is still undergoing development and has only been tested in the end. A
673676
- Disabled by default; enable in ClickGUI > Other > Packet Firewall.
674677
- Great for understanding and potentially evading some anti-cheats.
675678

679+
### HideWurst
680+
681+
- Disables all Wurst rendering (ESP, HackList, HUD, overlays, glow outlines) while keeping hacks enabled.
682+
- Can hide Wurst's UI mixins (menus, containers, overlays) without disabling the hacks.
683+
- Can hide Wurst from ModMenu's mod list.
684+
- Use HideModMenu to hide additional mods by keyword (comma-separated list).
685+
- Useful for recording/streaming or just hiding visuals without turning off your active hacks.
686+
676687
## What's changed or improved in this fork?
677688

678689
### ChestESP

src/main/java/net/wurstclient/WurstClient.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,25 @@ public boolean isEnabled()
398398
return enabled;
399399
}
400400

401+
public boolean shouldHideWurstUiMixins()
402+
{
403+
if(hax == null)
404+
return false;
405+
return hax.hideWurstHack.shouldHideUiMixins();
406+
}
407+
408+
public boolean shouldHideModMenuEntries()
409+
{
410+
if(hax == null)
411+
return false;
412+
413+
if(hax.hideWurstHack != null
414+
&& hax.hideWurstHack.shouldHideFromModMenu())
415+
return true;
416+
417+
return hax.hideModMenuHack != null && hax.hideModMenuHack.isEnabled();
418+
}
419+
401420
public void setEnabled(boolean enabled)
402421
{
403422
this.enabled = enabled;

src/main/java/net/wurstclient/event/EventManager.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
import net.minecraft.CrashReportCategory;
1616
import net.minecraft.ReportedException;
1717
import net.wurstclient.WurstClient;
18+
import net.wurstclient.hack.HackList;
19+
import net.wurstclient.events.GUIRenderListener.GUIRenderEvent;
20+
import net.wurstclient.events.RenderListener.RenderEvent;
1821

1922
public final class EventManager
2023
{
@@ -46,6 +49,9 @@ private <L extends Listener, E extends Event<L>> void fireImpl(E event)
4649
if(!wurst.isEnabled())
4750
return;
4851

52+
if(isWurstRenderEvent(event) && isHideWurstEnabled())
53+
return;
54+
4955
try
5056
{
5157
Class<L> type = event.getListenerType();
@@ -80,6 +86,18 @@ private <L extends Listener, E extends Event<L>> void fireImpl(E event)
8086
}
8187
}
8288

89+
private <L extends Listener, E extends Event<L>> boolean isWurstRenderEvent(
90+
E event)
91+
{
92+
return event instanceof RenderEvent || event instanceof GUIRenderEvent;
93+
}
94+
95+
private boolean isHideWurstEnabled()
96+
{
97+
HackList hax = wurst.getHax();
98+
return hax != null && hax.hideWurstHack.isEnabled();
99+
}
100+
83101
public <L extends Listener> void add(Class<L> type, L listener)
84102
{
85103
try

src/main/java/net/wurstclient/hack/HackList.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,8 @@ public final class HackList implements UpdateListener
135135
public final HandNoClipHack handNoClipHack = new HandNoClipHack();
136136
public final HeadRollHack headRollHack = new HeadRollHack();
137137
public final HealthTagsHack healthTagsHack = new HealthTagsHack();
138+
public final HideModMenuHack hideModMenuHack = new HideModMenuHack();
139+
public final HideWurstHack hideWurstHack = new HideWurstHack();
138140
public final DurabilityHudHack durabilityHudHack = new DurabilityHudHack();
139141
public final HighJumpHack highJumpHack = new HighJumpHack();
140142
public final InfiniChatHack infiniChatHack = new InfiniChatHack();
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/*
2+
* Copyright (c) 2014-2026 Wurst-Imperium and contributors.
3+
*
4+
* This source code is subject to the terms of the GNU General Public
5+
* License, version 3. If a copy of the GPL was not distributed with this
6+
* file, You can obtain one at: https://www.gnu.org/licenses/gpl-3.0.txt
7+
*/
8+
package net.wurstclient.hacks;
9+
10+
import java.util.Arrays;
11+
import java.util.LinkedHashSet;
12+
import java.util.Set;
13+
import java.util.stream.Collectors;
14+
15+
import net.wurstclient.Category;
16+
import net.wurstclient.SearchTags;
17+
import net.wurstclient.hack.Hack;
18+
import net.wurstclient.settings.TextFieldSetting;
19+
20+
@SearchTags({"mod menu", "modmenu", "hide mod", "mod list", "hide list"})
21+
public final class HideModMenuHack extends Hack
22+
{
23+
private final TextFieldSetting keywords =
24+
new TextFieldSetting("Hide keywords",
25+
"Comma-separated keywords to hide mods in ModMenu.", "");
26+
27+
public HideModMenuHack()
28+
{
29+
super("HideModMenu");
30+
setCategory(Category.OTHER);
31+
addSetting(keywords);
32+
}
33+
34+
public Set<String> getKeywords()
35+
{
36+
String value = keywords.getValue();
37+
if(value == null || value.isBlank())
38+
return Set.of();
39+
40+
return Arrays.stream(value.split(",")).map(String::trim)
41+
.filter(s -> !s.isEmpty()).map(String::toLowerCase)
42+
.collect(Collectors.toCollection(LinkedHashSet::new));
43+
}
44+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/*
2+
* Copyright (c) 2014-2026 Wurst-Imperium and contributors.
3+
*
4+
* This source code is subject to the terms of the GNU General Public
5+
* License, version 3. If a copy of the GPL was not distributed with this
6+
* file, You can obtain one at: https://www.gnu.org/licenses/gpl-3.0.txt
7+
*/
8+
package net.wurstclient.hacks;
9+
10+
import net.wurstclient.Category;
11+
import net.wurstclient.SearchTags;
12+
import net.wurstclient.hack.Hack;
13+
import net.wurstclient.settings.CheckboxSetting;
14+
15+
@SearchTags({"hide render", "no render", "no esp", "hide esp", "no hud",
16+
"hide hud"})
17+
public final class HideWurstHack extends Hack
18+
{
19+
private final CheckboxSetting hideUiMixins =
20+
new CheckboxSetting("Hide UI mixins",
21+
"Hide Wurst UI injections on menus and container screens.", false);
22+
private final CheckboxSetting hideFromModMenu =
23+
new CheckboxSetting("Hide from ModMenu",
24+
"Remove Wurst from ModMenu's mod list while this hack is enabled.",
25+
false);
26+
private final CheckboxSetting hideToggleChat = new CheckboxSetting(
27+
"Hide toggle chat",
28+
"Suppress enabled/disabled chat messages while this hack is enabled.",
29+
false);
30+
31+
public HideWurstHack()
32+
{
33+
super("HideWurst");
34+
setCategory(Category.RENDER);
35+
addSetting(hideUiMixins);
36+
addSetting(hideFromModMenu);
37+
addSetting(hideToggleChat);
38+
}
39+
40+
// Rendering is blocked in EventManager when this hack is enabled.
41+
42+
public boolean shouldHideUiMixins()
43+
{
44+
return isEnabled() && hideUiMixins.isChecked();
45+
}
46+
47+
public boolean shouldHideFromModMenu()
48+
{
49+
return isEnabled() && hideFromModMenu.isChecked();
50+
}
51+
52+
public boolean shouldHideToggleChatFeedback()
53+
{
54+
return isEnabled() && hideToggleChat.isChecked();
55+
}
56+
}

src/main/java/net/wurstclient/hacks/KickForensicsHack.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -261,17 +261,27 @@ private static void pruneDeque(ArrayDeque<? extends TimedEntry> deque,
261261
if(first == null)
262262
return;
263263
if(now - first.getTimeMs() > windowMs)
264-
deque.removeFirst();
265-
else
264+
{
265+
if(deque.pollFirst() == null)
266+
return;
267+
}else
266268
return;
267269
}
268270
}
269271

270272
private static void pruneTimes(ArrayDeque<Long> deque, long now,
271273
long windowMs)
272274
{
273-
while(!deque.isEmpty() && now - deque.peekFirst() > windowMs)
274-
deque.removeFirst();
275+
while(true)
276+
{
277+
Long first = deque.peekFirst();
278+
if(first == null)
279+
return;
280+
if(now - first > windowMs)
281+
deque.pollFirst();
282+
else
283+
return;
284+
}
275285
}
276286

277287
private String buildPacketSummary(String dir, Packet<?> packet)

src/main/java/net/wurstclient/mixin/ControlsListWidgetMixin.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ public ControlsListWidgetMixin(WurstClient wurst, Minecraft client,
4040
private int dontAddZoomEntry(KeyBindsList instance,
4141
AbstractSelectionList.Entry<?> entry, Operation<Integer> original)
4242
{
43+
if(WurstClient.INSTANCE.shouldHideWurstUiMixins())
44+
return original.call(instance, entry);
45+
4346
if(!(entry instanceof KeyBindsList.KeyEntry kbEntry))
4447
return original.call(instance, entry);
4548

src/main/java/net/wurstclient/mixin/CreativeInventoryScreenMixin.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ private CreativeInventoryScreenMixin(WurstClient wurst,
3535
private void onShouldShowOperatorTab(Player player,
3636
CallbackInfoReturnable<Boolean> cir)
3737
{
38+
if(WurstClient.INSTANCE.shouldHideWurstUiMixins())
39+
return;
40+
3841
if(WurstClient.INSTANCE.isEnabled())
3942
cir.setReturnValue(true);
4043
}

src/main/java/net/wurstclient/mixin/DisconnectedScreenMixin.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,8 @@ private void onInit(CallbackInfo ci)
9696
{
9797
if(!WurstClient.INSTANCE.isEnabled())
9898
return;
99+
if(WurstClient.INSTANCE.shouldHideWurstUiMixins())
100+
return;
99101

100102
Component reason = details.reason();
101103
System.out.println("Disconnected: " + reason);
@@ -590,6 +592,8 @@ public void tick()
590592
{
591593
if(!WurstClient.INSTANCE.isEnabled() || autoReconnectButton == null)
592594
return;
595+
if(WurstClient.INSTANCE.shouldHideWurstUiMixins())
596+
return;
593597

594598
AutoReconnectHack autoReconnect =
595599
WurstClient.INSTANCE.getHax().autoReconnectHack;

0 commit comments

Comments
 (0)