Skip to content

Commit 108e1d4

Browse files
committed
feat: Add AutoDisenchant & LavaWaterESP; faster search (heap, min=100); MobESP octahedrons/fill; UI/list fixes; compass/waypoints/breadcrumbs ranges; X-Ray transparency
1 parent 0f341b0 commit 108e1d4

19 files changed

+940
-226
lines changed

README.md

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ 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.
@@ -73,6 +73,7 @@ All credit for the original client goes to Wurst-Imperium and its contributors.
7373

7474
### Breadcrumbs
7575
- Leaves a line trail behind you (toggle-able/pause-able).
76+
- Trail can be infinitely long
7677
- Settings: color, max sections, section length, thickness.
7778

7879
### LogoutSpots
@@ -81,6 +82,9 @@ All credit for the original client goes to Wurst-Imperium and its contributors.
8182
- Rendering: solid box + outline, optional tracers, name labels with adjustable scale.
8283
- Settings: side color, line color, name scale, tracers toggle.
8384

85+
### AutoDisenchant
86+
- Feeds items from your inventory (and or hotbar) that can be disenchanted into the grindstone automatically.
87+
8488
### ItemESP (expanded)
8589
Highlights dropped, equipped, and framed items with powerful filters and customization.
8690

@@ -98,6 +102,10 @@ Examples:
98102
- Highlight skulls → Item ID: `minecraft:player_head`, special color: magenta, outline-only ON.
99103
- Highlight talismans (non-standard item) → Query: `talisman`, special color: rainbow, highlight frames ON, lines-only-for-special ON.
100104

105+
### List UI (Search, MobSearch, ItemESP, Xray etc) improvemements
106+
- Able to specifically enter and save keywords into the list (Great for custom items on modded servers).
107+
- Able to clear the entire list with a single button
108+
101109
### ClickGUI improvements
102110
- Accidentally typing in ClickGUI just continues what you typed in the Navigator typing in ClickGUI just continues what you typed in the Navigator
103111
- Favorites category, middle click a hack for it to be added to Favorites. Middle click when within Favorites to remove it.
@@ -131,6 +139,8 @@ Examples:
131139

132140
### MobESP improvements
133141
- Added rainbow/fixed color options for boxes/lines.
142+
- Added octahedron shapes and set it as the new default.
143+
- Added box color fill option
134144

135145
### Portal ESP improvement
136146
- Radius changes reset scan instantly.

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

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

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

3939
private ListGui listGui;
4040
private TextFieldWidget itemNameField;
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, itemList.getItemNames());
6061
addSelectableChild(listGui);
6162

62-
itemNameField = 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+
itemNameField = new TextFieldWidget(client.textRenderer, rowStart, rowY,
74+
fieldWidth, 20, Text.literal(""));
6475
addSelectableChild(itemNameField);
6576
itemNameField.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 = itemNameField.getText();
85+
if(raw != null)
86+
raw = raw.trim();
87+
if(raw != null && !raw.isEmpty())
88+
itemList.addRawName(raw);
89+
client.setScreen(EditItemListScreen.this);
90+
}).dimensions(keywordX, rowY, keywordWidth, 20).build());
91+
6792
addDrawableChild(
6893
addButton = ButtonWidget.builder(Text.literal("Add"), b -> {
6994
if(itemToAdd != null)
@@ -82,14 +107,14 @@ public void init()
82107
itemList.addRawName(raw);
83108
}
84109
client.setScreen(EditItemListScreen.this);
85-
}).dimensions(width / 2 + 40, height - 56, 80, 20).build());
110+
}).dimensions(addX, rowY, addWidth, 20).build());
86111

87112
addDrawableChild(removeButton =
88113
ButtonWidget.builder(Text.literal("Remove Selected"), b -> {
89114
itemList.remove(itemList.getItemNames()
90115
.indexOf(listGui.getSelectedBlockName()));
91116
client.setScreen(EditItemListScreen.this);
92-
}).dimensions(width / 2 + 124, height - 56, 120, 20).build());
117+
}).dimensions(removeX, rowY, removeWidth, 20).build());
93118

94119
addDrawableChild(ButtonWidget.builder(Text.literal("Reset to Defaults"),
95120
b -> client.setScreen(new ConfirmScreen(b2 -> {
@@ -146,12 +171,15 @@ public boolean keyPressed(int keyCode, int scanCode, int int_3)
146171
@Override
147172
public void tick()
148173
{
149-
String nameOrId = itemNameField.getText().toLowerCase();
174+
String rawInput = itemNameField.getText();
175+
String nameOrId = rawInput == null ? "" : rawInput.toLowerCase();
176+
String trimmed = rawInput == null ? "" : rawInput.trim();
177+
boolean hasInput = !trimmed.isEmpty();
150178
itemToAdd = ItemUtils.getItemFromNameOrID(nameOrId);
151179
if(itemToAdd == null)
152180
{
153-
String q = nameOrId == null ? ""
154-
: nameOrId.trim().toLowerCase(java.util.Locale.ROOT);
181+
String q = trimmed.isEmpty() ? ""
182+
: trimmed.toLowerCase(java.util.Locale.ROOT);
155183
if(q.isEmpty())
156184
{
157185
fuzzyMatches = java.util.Collections.emptyList();
@@ -177,10 +205,7 @@ public void tick()
177205
.comparing(i -> net.minecraft.registry.Registries.ITEM
178206
.getId(i).toString()));
179207
}
180-
// Allow adding raw keyword when no match found
181-
addButton.active =
182-
!fuzzyMatches.isEmpty() || (itemNameField.getText() != null
183-
&& !itemNameField.getText().trim().isEmpty());
208+
addButton.active = !fuzzyMatches.isEmpty() || hasInput;
184209
addButton.setMessage(Text.literal(fuzzyMatches.isEmpty() ? "Add"
185210
: ("Add Matches (" + fuzzyMatches.size() + ")")));
186211
}else
@@ -190,6 +215,7 @@ public void tick()
190215
addButton.setMessage(Text.literal("Add"));
191216
}
192217

218+
addKeywordButton.active = hasInput;
193219
removeButton.active = listGui.getSelectedOrNull() != null;
194220
}
195221

@@ -229,17 +255,17 @@ public void render(DrawContext context, int mouseX, int mouseY,
229255
int border =
230256
itemNameField.isFocused() ? Colors.WHITE : Colors.LIGHT_GRAY;
231257
int black = Colors.BLACK;
258+
int iconBoxLeft = x0 - 20;
232259

233260
// Left decoration for the item icon, anchored to the field (keeps your
234261
// look).
235-
context.fill(x0 - 16, y0, x0, y1, border);
236-
context.fill(x0 - 15, y0 + 1, x0 - 1, y1 - 1, black);
262+
context.fill(iconBoxLeft, y0, x0, y1, border);
263+
context.fill(iconBoxLeft + 1, y0 + 1, x0 - 1, y1 - 1, black);
237264

238-
// Draw preview item next to the field (positioned relative to the
239-
// field).
265+
// Draw preview item inside the decorative frame.
240266
RenderUtils.drawItem(context,
241267
itemToAdd == null ? ItemStack.EMPTY : new ItemStack(itemToAdd),
242-
x0 - 28, y0 + 4, false);
268+
iconBoxLeft + 2, y0 + 2, false);
243269

244270
context.state.goDownLayer();
245271
matrixStack.popMatrix();

0 commit comments

Comments
 (0)