Skip to content

Commit d1eb684

Browse files
committed
Xaeros Minimap Integration, Waypoint Becaons, AutoDisenchant, MobESP Improvement, Xray Improvement, Search Improvement, UI Improvement, Compass Improvements, Breadcrumb Improvements
1 parent 0f341b0 commit d1eb684

24 files changed

+1759
-243
lines changed

README.md

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -64,15 +64,18 @@ All credit for the original client goes to Wurst-Imperium and its contributors.
6464
### Waypoints
6565
- Create and save waypoints, with optional automatic death waypoints for all players.
6666
- Manager UI (`.waypoints` or apostrophe key).
67-
- Compass overlay: Show a bar at the top of the screen that shows the waypoint icons, when you're looking at it then it will display its name (Adjustable Position/Transparency)
67+
- Compass overlay: Show a bar at the top of the screen that shows the waypoint icons, when you're looking at it then it will display its name (Adjustable Position/Transparency and Render Distance)
6868
- Coordinates overlay: Show your direction and current XYZ position above the compass overlay
6969
- Preset icons
7070
- Features: name, co-ordinates, dimension, icon, visibility, lines, color, copy button, opposite co-ordinates (nether), death pruning.
7171
- Constant-size labels and optional tracers.
7272
- Stored per world/server under `wurst/waypoints/<worldId>.json`.
73+
- Xaero's Minimap integration, allows exporting and importing of waypoint data.
74+
- Adjustable Tri-state Beacon Mode on waypoints (On/Off/ESP) that matches the waypoint's color.
7375

7476
### Breadcrumbs
7577
- Leaves a line trail behind you (toggle-able/pause-able).
78+
- Trail can be infinitely long
7679
- Settings: color, max sections, section length, thickness.
7780

7881
### LogoutSpots
@@ -81,7 +84,10 @@ All credit for the original client goes to Wurst-Imperium and its contributors.
8184
- Rendering: solid box + outline, optional tracers, name labels with adjustable scale.
8285
- Settings: side color, line color, name scale, tracers toggle.
8386

84-
### ItemESP (expanded)
87+
### AutoDisenchant
88+
- Feeds items from your inventory (and or hotbar) that can be disenchanted into the grindstone automatically.
89+
90+
### ItemESP (Expanded)
8591
Highlights dropped, equipped, and framed items with powerful filters and customization.
8692

8793
- Base highlighting: all dropped items with configurable base color.
@@ -98,11 +104,15 @@ Examples:
98104
- Highlight skulls → Item ID: `minecraft:player_head`, special color: magenta, outline-only ON.
99105
- Highlight talismans (non-standard item) → Query: `talisman`, special color: rainbow, highlight frames ON, lines-only-for-special ON.
100106

101-
### ClickGUI improvements
107+
### List UI (Search, MobSearch, ItemESP, Xray etc) Improvements
108+
- Able to specifically enter and save keywords into the list (Great for custom items on modded servers).
109+
- Able to clear the entire list with a single button
110+
111+
### ClickGUI Improvements
102112
- Accidentally typing in ClickGUI just continues what you typed in the Navigator typing in ClickGUI just continues what you typed in the Navigator
103113
- Favorites category, middle click a hack for it to be added to Favorites. Middle click when within Favorites to remove it.
104114

105-
### Search improvements
115+
### Search Improvements
106116
- Keyword queries supported; falls back to picker when empty.
107117
- List mode with visual item list.
108118
- Multi-term queries: comma-separated (e.g., `ore, ancient`).
@@ -112,33 +122,35 @@ Examples:
112122
- Replaced full-sort approach to bounded max-heap (PriorityQueue) that keeps the closest N matches. This avoids sorting entire result and keeps search as fast as X-Ray.
113123
- Safer rescans and better crash handling.
114124

115-
### X-Ray improvements
125+
### X-Ray Improvements
116126
- Added ESP (Highlight Corners and or Fill Blocks)
117127
- Uses cached positions for speed
118128
- Optional transparency slider for ESP
119129
- Multi-term queries: comma-separated (e.g., `diamond, ancient`).
120130
- Opacity, block type changes and 'only show exposed' apply live without toggling.
121131
- New minimum search to 100 blocks.
122132

123-
### Nuker improvements
133+
### Nuker Improvements
124134
- Auto toggle AutoTool option (If it wasn't on already, it will be enabled when using Nuker then turned off with Nuker)
125135

126-
### AutoSteal improvements
136+
### AutoSteal Improvements
127137
- Toggle 'Steal/Store Same' to move items that match the same ones in the players inventory or chest. Bind-able to a key.
128138

129-
### BaseFinder improvements
139+
### BaseFinder Improvements
130140
- Updated natural blocks list to latest versions.
131141

132-
### MobESP improvements
142+
### MobESP Improvements
133143
- Added rainbow/fixed color options for boxes/lines.
144+
- Added octahedron shapes and set it as the new default.
145+
- Added box color fill option
134146

135-
### Portal ESP improvement
147+
### Portal ESP Improvement
136148
- Radius changes reset scan instantly.
137149

138-
### Larger scan radius
150+
### Larger Scan Radius
139151
- Extended up to 65×65 chunks for all chunk-based features.
140152

141-
### Sticky area (new option)
153+
### Sticky Area (New Option)
142154
- Added to chunk-based ESPs (Search, Portal ESP, BedESP, SignESP, WorkstationESP, RedstoneESP, ChestESP).
143155
- Keeps results anchored as you move. Default OFF.
144156

src/main/java/net/wurstclient/clickgui/screens/EditBlockListScreen.java

Lines changed: 38 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ public final class EditBlockListScreen extends Screen
3838

3939
private ListGui listGui;
4040
private TextFieldWidget blockNameField;
41+
private ButtonWidget addKeywordButton;
4142
private ButtonWidget addButton;
4243
private ButtonWidget removeButton;
4344
private ButtonWidget doneButton;
@@ -59,11 +60,35 @@ public void init()
5960
listGui = new ListGui(client, this, blockList.getBlockNames());
6061
addSelectableChild(listGui);
6162

62-
blockNameField = new TextFieldWidget(client.textRenderer,
63-
width / 2 - 152, height - 56, 140, 20, Text.literal(""));
63+
int rowY = height - 56;
64+
int gap = 8;
65+
int fieldWidth = 160;
66+
int keywordWidth = 110;
67+
int addWidth = 80;
68+
int removeWidth = 120;
69+
int totalWidth =
70+
fieldWidth + keywordWidth + addWidth + removeWidth + gap * 3;
71+
int rowStart = width / 2 - totalWidth / 2;
72+
73+
blockNameField = new TextFieldWidget(client.textRenderer, rowStart,
74+
rowY, fieldWidth, 20, Text.literal(""));
6475
addSelectableChild(blockNameField);
6576
blockNameField.setMaxLength(256);
6677

78+
int keywordX = rowStart + fieldWidth + gap;
79+
int addX = keywordX + keywordWidth + gap;
80+
int removeX = addX + addWidth + gap;
81+
82+
addDrawableChild(addKeywordButton =
83+
ButtonWidget.builder(Text.literal("Add Keyword"), b -> {
84+
String raw = blockNameField.getText();
85+
if(raw != null)
86+
raw = raw.trim();
87+
if(raw != null && !raw.isEmpty())
88+
blockList.addRawName(raw);
89+
client.setScreen(EditBlockListScreen.this);
90+
}).dimensions(keywordX, rowY, keywordWidth, 20).build());
91+
6792
addDrawableChild(
6893
addButton = ButtonWidget.builder(Text.literal("Add"), b -> {
6994
if(blockToAdd != null)
@@ -82,15 +107,14 @@ public void init()
82107
blockList.addRawName(raw);
83108
}
84109
client.setScreen(EditBlockListScreen.this);
85-
}).dimensions(width / 2 + 40, height - 56, 80, 20).build());
110+
}).dimensions(addX, rowY, addWidth, 20).build());
86111

87-
// Shift remove to the right to make room for wider Add
88112
addDrawableChild(removeButton =
89113
ButtonWidget.builder(Text.literal("Remove Selected"), b -> {
90114
blockList
91115
.remove(blockList.indexOf(listGui.getSelectedBlockName()));
92116
client.setScreen(EditBlockListScreen.this);
93-
}).dimensions(width / 2 + 124, height - 56, 120, 20).build());
117+
}).dimensions(removeX, rowY, removeWidth, 20).build());
94118

95119
addDrawableChild(ButtonWidget.builder(Text.literal("Reset to Defaults"),
96120
b -> client.setScreen(new ConfirmScreen(b2 -> {
@@ -148,13 +172,14 @@ public boolean keyPressed(int keyCode, int scanCode, int int_3)
148172
public void tick()
149173
{
150174
String nameOrId = blockNameField.getText();
175+
String trimmed = nameOrId == null ? "" : nameOrId.trim();
176+
boolean hasInput = !trimmed.isEmpty();
151177
blockToAdd =
152178
net.wurstclient.util.BlockUtils.getBlockFromNameOrID(nameOrId);
153179
// Build fuzzy matches if no exact block found
154180
if(blockToAdd == null)
155181
{
156-
String q = nameOrId == null ? ""
157-
: nameOrId.trim().toLowerCase(java.util.Locale.ROOT);
182+
String q = trimmed.toLowerCase(java.util.Locale.ROOT);
158183
if(q.isEmpty())
159184
{
160185
fuzzyMatches = java.util.Collections.emptyList();
@@ -179,9 +204,7 @@ public void tick()
179204
fuzzyMatches.sort(java.util.Comparator
180205
.comparing(net.wurstclient.util.BlockUtils::getName));
181206
}
182-
addButton.active =
183-
!fuzzyMatches.isEmpty() || (blockNameField.getText() != null
184-
&& !blockNameField.getText().trim().isEmpty());
207+
addButton.active = !fuzzyMatches.isEmpty() || hasInput;
185208
addButton.setMessage(Text.literal(fuzzyMatches.isEmpty() ? "Add"
186209
: ("Add Matches (" + fuzzyMatches.size() + ")")));
187210
}else
@@ -191,6 +214,7 @@ public void tick()
191214
addButton.setMessage(Text.literal("Add"));
192215
}
193216

217+
addKeywordButton.active = hasInput;
194218
removeButton.active = listGui.getSelectedOrNull() != null;
195219
}
196220

@@ -230,14 +254,15 @@ public void render(DrawContext context, int mouseX, int mouseY,
230254
int border =
231255
blockNameField.isFocused() ? Colors.WHITE : Colors.LIGHT_GRAY;
232256
int black = Colors.BLACK;
257+
int iconBoxLeft = x0 - 20;
233258

234259
// Left decoration for the item icon, anchored to the field.
235-
context.fill(x0 - 16, y0, x0, y1, border);
236-
context.fill(x0 - 15, y0 + 1, x0 - 1, y1 - 1, black);
260+
context.fill(iconBoxLeft, y0, x0, y1, border);
261+
context.fill(iconBoxLeft + 1, y0 + 1, x0 - 1, y1 - 1, black);
237262

238263
RenderUtils.drawItem(context,
239264
blockToAdd == null ? ItemStack.EMPTY : new ItemStack(blockToAdd),
240-
x0 - 28, y0 + 4, false);
265+
iconBoxLeft + 2, y0 + 2, false);
241266

242267
context.state.goDownLayer();
243268
matrixStack.popMatrix();

src/main/java/net/wurstclient/clickgui/screens/EditEntityTypeListScreen.java

Lines changed: 37 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ public final class EditEntityTypeListScreen extends Screen
3535

3636
private ListGui listGui;
3737
private TextFieldWidget typeNameField;
38+
private ButtonWidget addKeywordButton;
3839
private ButtonWidget addButton;
3940
private ButtonWidget removeButton;
4041
private ButtonWidget doneButton;
@@ -57,11 +58,35 @@ public void init()
5758
listGui = new ListGui(client, this, typeList.getTypeNames());
5859
addSelectableChild(listGui);
5960

60-
typeNameField = new TextFieldWidget(client.textRenderer,
61-
width / 2 - 152, height - 56, 140, 20, Text.literal(""));
61+
int rowY = height - 56;
62+
int gap = 8;
63+
int fieldWidth = 160;
64+
int keywordWidth = 110;
65+
int addWidth = 80;
66+
int removeWidth = 120;
67+
int totalWidth =
68+
fieldWidth + keywordWidth + addWidth + removeWidth + gap * 3;
69+
int rowStart = width / 2 - totalWidth / 2;
70+
71+
typeNameField = new TextFieldWidget(client.textRenderer, rowStart, rowY,
72+
fieldWidth, 20, Text.literal(""));
6273
addSelectableChild(typeNameField);
6374
typeNameField.setMaxLength(256);
6475

76+
int keywordX = rowStart + fieldWidth + gap;
77+
int addX = keywordX + keywordWidth + gap;
78+
int removeX = addX + addWidth + gap;
79+
80+
addDrawableChild(addKeywordButton =
81+
ButtonWidget.builder(Text.literal("Add Keyword"), b -> {
82+
String raw = typeNameField.getText();
83+
if(raw != null)
84+
raw = raw.trim();
85+
if(raw != null && !raw.isEmpty())
86+
typeList.addRawName(raw);
87+
client.setScreen(EditEntityTypeListScreen.this);
88+
}).dimensions(keywordX, rowY, keywordWidth, 20).build());
89+
6590
addDrawableChild(
6691
addButton = ButtonWidget.builder(Text.literal("Add"), b -> {
6792
if(typeToAdd != null)
@@ -80,14 +105,14 @@ public void init()
80105
typeList.addRawName(raw);
81106
}
82107
client.setScreen(EditEntityTypeListScreen.this);
83-
}).dimensions(width / 2 - 2, height - 56, 80, 20).build());
108+
}).dimensions(addX, rowY, addWidth, 20).build());
84109

85110
addDrawableChild(removeButton =
86111
ButtonWidget.builder(Text.literal("Remove Selected"), b -> {
87112
String selected = listGui.getSelectedTypeName();
88113
typeList.remove(typeList.getTypeNames().indexOf(selected));
89114
client.setScreen(EditEntityTypeListScreen.this);
90-
}).dimensions(width / 2 + 82, height - 56, 120, 20).build());
115+
}).dimensions(removeX, rowY, removeWidth, 20).build());
91116

92117
addDrawableChild(ButtonWidget.builder(Text.literal("Reset to Defaults"),
93118
b -> client.setScreen(new ConfirmScreen(b2 -> {
@@ -144,7 +169,10 @@ public boolean keyPressed(int keyCode, int scanCode, int int_3)
144169
@Override
145170
public void tick()
146171
{
147-
String nameOrId = typeNameField.getText().toLowerCase();
172+
String rawInput = typeNameField.getText();
173+
String nameOrId = rawInput == null ? "" : rawInput.toLowerCase();
174+
String trimmed = rawInput == null ? "" : rawInput.trim();
175+
boolean hasInput = !trimmed.isEmpty();
148176
try
149177
{
150178
Identifier id = Identifier.of(nameOrId);
@@ -158,8 +186,8 @@ public void tick()
158186
}
159187
if(typeToAdd == null)
160188
{
161-
String q = nameOrId == null ? ""
162-
: nameOrId.trim().toLowerCase(java.util.Locale.ROOT);
189+
String q = trimmed.isEmpty() ? ""
190+
: trimmed.toLowerCase(java.util.Locale.ROOT);
163191
if(q.isEmpty())
164192
{
165193
fuzzyMatches = java.util.Collections.emptyList();
@@ -181,9 +209,7 @@ public void tick()
181209
fuzzyMatches.sort(java.util.Comparator.comparing(
182210
t -> Registries.ENTITY_TYPE.getId(t).toString()));
183211
}
184-
addButton.active =
185-
!fuzzyMatches.isEmpty() || (typeNameField.getText() != null
186-
&& !typeNameField.getText().trim().isEmpty());
212+
addButton.active = !fuzzyMatches.isEmpty() || hasInput;
187213
addButton.setMessage(Text.literal(fuzzyMatches.isEmpty() ? "Add"
188214
: ("Add Matches (" + fuzzyMatches.size() + ")")));
189215
}else
@@ -193,6 +219,7 @@ public void tick()
193219
addButton.setMessage(Text.literal("Add"));
194220
}
195221

222+
addKeywordButton.active = hasInput;
196223
removeButton.active = listGui.getSelectedOrNull() != null;
197224
}
198225

0 commit comments

Comments
 (0)