Skip to content

Commit 713934a

Browse files
committed
Added GameStats (FPS, TPS, Ping) HUD. Updated Commands, ChestESP & MobHealth.
1 parent 8641149 commit 713934a

19 files changed

Lines changed: 1384 additions & 32 deletions

README.md

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ This project is a friendly, independent fork of Wurst 7. I originally proposed t
2727
- Upstream repository: https://github.com/Wurst-Imperium/Wurst7
2828
- This fork: https://github.com/cev-api/Wurst7-CevAPI
2929
- Status: actively maintained and re-based as upstream evolves
30-
- Will try and support at least the latest two Minecraft versions
3130

3231
All credit for the original client goes to Wurst-Imperium and its contributors. This fork is not affiliated with or endorsed by Wurst-Imperium. This fork maintains the original GPLv3 licensing.
3332

@@ -119,6 +118,8 @@ I have taken the following ideas from other clients/mods:
119118
- SpearKill
120119
- InfiniteReach
121120
- UI-Utils
121+
- Bundle Dupe
122+
- BookBot
122123

123124
I did not, nor could I copy their code directly as most are Meteor based mods. So these are considered my interpretation of the functionality of those hacks.
124125

@@ -751,9 +752,20 @@ This hack is still undergoing development and has only been tested in the end. A
751752
- Normalised to 10 max hearts.
752753
- Compatible with HealthTags so names don't conflict.
753754
- Conforms to vanilla health status effects (poison, wither, frozen, absorption, hardcore, low health jittering).
755+
- Ignore NPCs and Armor Stands
756+
- Optionally can work through walls
754757

755758
![Hearts](https://i.imgur.com/FZ8Z0TK.png)
756759

760+
### GameStats
761+
- On-screen HUD with configurable stats: FPS, TPS, Ping, Play Time, Time, Packet Rate (in/out), Distance, Mob Kills, Player Kills, and XP Gained
762+
- Draggable/repositionable while inventory or chests screens are open
763+
- FPS/TPS/Ping show running averages in brackets (e.g. `Ping: 30 (21)`)
764+
- Style settings: font size, font opacity, font color, font stroke, background box toggle, background color, and background opacity
765+
- Per-stat visibility toggles plus a universal `Show Prefixes` and `Show Averages` toggle for labels
766+
767+
![FPS](https://i.imgur.com/MhmAno5.png)
768+
757769
## What's changed or improved in this fork?
758770

759771
### ChestESP
@@ -1025,8 +1037,14 @@ Examples:
10251037
- Optimized Search when using corners only ESP to avoid unnecessary heavy mesh work making detection faster.
10261038
- Reduced lag spikes on large scans by using cheaper nearest-result selection paths.
10271039

1028-
### Notes
1029-
- Scanning only includes server-loaded chunks. Larger radii work best in single-player or on high view distance servers.
1040+
### Easier/Quicker ESP Commands
1041+
- ```.search <query>``` -> query mode + set query + enable
1042+
- ```.search off``` / ```.search on```
1043+
- ```.mobsearch <query>``` -> query mode + set query + enable
1044+
- ```.mobsearch off``` / ```.mobsearch on```
1045+
- ```.xray <query>``` -> query mode + set query + enable
1046+
- ```.xray off``` / ```.xray on```
1047+
- Existing ```.xray add/remove/list/reset``` still works
10301048

10311049
---
10321050

src/main/java/net/wurstclient/clickgui/ClickGui.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,14 @@ public void init()
131131
}
132132

133133
if(f.getCategory() != null)
134+
{
135+
// GameStats is intentionally shown only in the dedicated
136+
// "UI Settings" window, not in category windows.
137+
if(f == WURST.getHax().gameStatsHack)
138+
continue;
139+
134140
windowMap.get(f.getCategory()).add(new FeatureButton(f));
141+
}
135142
}
136143
// Keep the "Other" category usable: it contains a mixed bag of hacks,
137144
// commands and other-features, so insertion order is not meaningful.
@@ -167,6 +174,7 @@ public void init()
167174
Window uiSettings = new Window("UI Settings");
168175
uiSettings.add(new FeatureButton(WURST.getOtfs().wurstLogoOtf));
169176
uiSettings.add(new FeatureButton(WURST.getOtfs().hackListOtf));
177+
uiSettings.add(new FeatureButton(WURST.getHax().gameStatsHack));
170178
uiSettings.add(new FeatureButton(WURST.getOtfs().keybindManagerOtf));
171179
uiSettings.add(new FeatureButton(WURST.getOtfs().presetManagerOtf));
172180
uiSettings.add(new FeatureButton(WURST.getOtfs().wurstOptionsOtf));

src/main/java/net/wurstclient/command/CmdList.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ public final class CmdList
5555
public final RepairCmd repairCmd = new RepairCmd();
5656
public final RvCmd rvCmd = new RvCmd();
5757
public final SvCmd svCmd = new SvCmd();
58+
public final SearchCmd searchCmd = new SearchCmd();
59+
public final MobSearchCmd mobSearchCmd = new MobSearchCmd();
5860
public final SayCmd sayCmd = new SayCmd();
5961
public final SetBlockCmd setBlockCmd = new SetBlockCmd();
6062
public final SetCheckboxCmd setCheckboxCmd = new SetCheckboxCmd();
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
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.commands;
9+
10+
import net.wurstclient.command.CmdException;
11+
import net.wurstclient.command.CmdSyntaxError;
12+
import net.wurstclient.command.Command;
13+
import net.wurstclient.hacks.MobSearchHack;
14+
15+
public final class MobSearchCmd extends Command
16+
{
17+
public MobSearchCmd()
18+
{
19+
super("mobsearch",
20+
"Sets MobSearch to query mode and enables/disables it from chat.",
21+
".mobsearch <query>", ".mobsearch query <query>",
22+
".mobsearch [on|off]");
23+
}
24+
25+
@Override
26+
public void call(String[] args) throws CmdException
27+
{
28+
MobSearchHack mobSearch = WURST.getHax().mobSearchHack;
29+
30+
if(args.length == 0)
31+
{
32+
mobSearch.setEnabled(!mobSearch.isEnabled());
33+
return;
34+
}
35+
36+
String action = args[0].toLowerCase();
37+
switch(action)
38+
{
39+
case "on":
40+
mobSearch.setEnabled(true);
41+
return;
42+
43+
case "off":
44+
mobSearch.setEnabled(false);
45+
return;
46+
47+
case "query":
48+
if(args.length < 2)
49+
throw new CmdSyntaxError();
50+
51+
mobSearch.enableQuerySearch(joinArgs(args, 1));
52+
return;
53+
54+
default:
55+
mobSearch.enableQuerySearch(joinArgs(args, 0));
56+
return;
57+
}
58+
}
59+
60+
private static String joinArgs(String[] args, int start)
61+
{
62+
StringBuilder out = new StringBuilder();
63+
for(int i = start; i < args.length; i++)
64+
{
65+
if(i > start)
66+
out.append(' ');
67+
68+
out.append(args[i]);
69+
}
70+
71+
return out.toString().trim();
72+
}
73+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
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.commands;
9+
10+
import net.wurstclient.command.CmdException;
11+
import net.wurstclient.command.CmdSyntaxError;
12+
import net.wurstclient.command.Command;
13+
import net.wurstclient.hacks.SearchHack;
14+
15+
public final class SearchCmd extends Command
16+
{
17+
public SearchCmd()
18+
{
19+
super("search",
20+
"Sets Search to query mode and enables/disables it from chat.",
21+
".search <query>", ".search query <query>", ".search [on|off]");
22+
}
23+
24+
@Override
25+
public void call(String[] args) throws CmdException
26+
{
27+
SearchHack search = WURST.getHax().searchHack;
28+
29+
if(args.length == 0)
30+
{
31+
search.setEnabled(!search.isEnabled());
32+
return;
33+
}
34+
35+
String action = args[0].toLowerCase();
36+
switch(action)
37+
{
38+
case "on":
39+
search.setEnabled(true);
40+
return;
41+
42+
case "off":
43+
search.setEnabled(false);
44+
return;
45+
46+
case "query":
47+
if(args.length < 2)
48+
throw new CmdSyntaxError();
49+
50+
search.enableQuerySearch(joinArgs(args, 1));
51+
return;
52+
53+
default:
54+
search.enableQuerySearch(joinArgs(args, 0));
55+
return;
56+
}
57+
}
58+
59+
private static String joinArgs(String[] args, int start)
60+
{
61+
StringBuilder out = new StringBuilder();
62+
for(int i = start; i < args.length; i++)
63+
{
64+
if(i > start)
65+
out.append(' ');
66+
67+
out.append(args[i]);
68+
}
69+
70+
return out.toString().trim();
71+
}
72+
}

src/main/java/net/wurstclient/commands/XrayCmd.java

Lines changed: 55 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,73 @@
88
package net.wurstclient.commands;
99

1010
import net.wurstclient.command.CmdException;
11+
import net.wurstclient.command.CmdSyntaxError;
1112
import net.wurstclient.command.Command;
13+
import net.wurstclient.hacks.XRayHack;
1214

1315
public final class XrayCmd extends Command
1416
{
1517
public XrayCmd()
1618
{
17-
super("xray", "Shortcut for '.blocklist X-Ray Ores'.",
19+
super("xray", "Controls X-Ray list operations and query mode.",
20+
".xray <query>", ".xray query <query>", ".xray [on|off]",
1821
".xray add <block>", ".xray remove <block>", ".xray list [<page>]",
1922
".xray reset", "Example: .xray add gravel");
2023
}
2124

2225
@Override
2326
public void call(String[] args) throws CmdException
2427
{
25-
WURST.getCmdProcessor()
26-
.process("blocklist X-Ray Ores " + String.join(" ", args));
28+
XRayHack xray = WURST.getHax().xRayHack;
29+
if(args.length == 0)
30+
{
31+
xray.setEnabled(!xray.isEnabled());
32+
return;
33+
}
34+
35+
String action = args[0].toLowerCase();
36+
switch(action)
37+
{
38+
case "on":
39+
xray.setEnabled(true);
40+
return;
41+
42+
case "off":
43+
xray.setEnabled(false);
44+
return;
45+
46+
case "query":
47+
if(args.length < 2)
48+
throw new CmdSyntaxError();
49+
50+
xray.enableQuerySearch(joinArgs(args, 1));
51+
return;
52+
53+
case "add":
54+
case "remove":
55+
case "list":
56+
case "reset":
57+
WURST.getCmdProcessor()
58+
.process("blocklist X-Ray Ores " + String.join(" ", args));
59+
return;
60+
61+
default:
62+
xray.enableQuerySearch(joinArgs(args, 0));
63+
return;
64+
}
65+
}
66+
67+
private static String joinArgs(String[] args, int start)
68+
{
69+
StringBuilder out = new StringBuilder();
70+
for(int i = start; i < args.length; i++)
71+
{
72+
if(i > start)
73+
out.append(' ');
74+
75+
out.append(args[i]);
76+
}
77+
78+
return out.toString().trim();
2779
}
2880
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ public final class HackList implements UpdateListener
140140
public final HideModMenuHack hideModMenuHack = new HideModMenuHack();
141141
public final HideWurstHack hideWurstHack = new HideWurstHack();
142142
public final DurabilityHudHack durabilityHudHack = new DurabilityHudHack();
143+
public final GameStatsHack gameStatsHack = new GameStatsHack();
143144
public final HighJumpHack highJumpHack = new HighJumpHack();
144145
public final InfiniChatHack infiniChatHack = new InfiniChatHack();
145146
public final InstaBuildHack instaBuildHack = new InstaBuildHack();

0 commit comments

Comments
 (0)