Skip to content

Commit 69f5c66

Browse files
committed
Fullfilling requested changes for PR
1 parent f599a6a commit 69f5c66

5 files changed

Lines changed: 131 additions & 43 deletions

File tree

src/main/java/meteordevelopment/meteorclient/systems/modules/render/blockesp/BlockESP.java

Lines changed: 80 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -25,68 +25,86 @@
2525
import net.minecraft.util.math.ChunkPos;
2626
import net.minecraft.world.chunk.Chunk;
2727
import net.minecraft.world.dimension.DimensionType;
28+
import net.minecraft.block.BlockState;
29+
import net.minecraft.state.property.Property;
2830

2931
import java.util.Iterator;
3032
import java.util.List;
3133
import java.util.Map;
3234
import java.util.Set;
3335
import java.util.concurrent.ExecutorService;
3436
import java.util.concurrent.Executors;
37+
import java.util.HashMap;
38+
import java.util.Optional;
3539

3640
public class BlockESP extends Module {
3741
private final SettingGroup sgGeneral = settings.getDefaultGroup();
3842

3943
// General
4044

41-
private final Setting<List<Block>> blocks = sgGeneral.add(new BlockListSetting.Builder()
42-
.name("blocks")
43-
.description("Blocks to search for.")
44-
.onChanged(blocks1 -> {
45-
if (isActive() && Utils.canUpdate()) onActivate();
46-
})
47-
.build()
45+
private final Setting<List<Block>> blocks = sgGeneral.add(
46+
new BlockListSetting.Builder()
47+
.name("blocks")
48+
.description("Blocks to search for.")
49+
.onChanged(blocks1 -> {
50+
if (isActive() && Utils.canUpdate()) onActivate();
51+
})
52+
.build()
4853
);
49-
50-
private final Setting<ESPBlockData> defaultBlockConfig = sgGeneral.add(new GenericSetting.Builder<ESPBlockData>()
51-
.name("default-block-config")
52-
.description("Default block config.")
53-
.defaultValue(
54-
new ESPBlockData(
55-
ShapeMode.Lines,
56-
new SettingColor(0, 255, 200),
57-
new SettingColor(0, 255, 200, 25),
58-
true,
59-
new SettingColor(0, 255, 200, 125)
54+
55+
56+
private final Setting<ESPBlockData> defaultBlockConfig = sgGeneral.add(
57+
new GenericSetting.Builder<ESPBlockData>()
58+
.name("default-block-config")
59+
.description("Default block config.")
60+
.defaultValue(
61+
new ESPBlockData(
62+
ShapeMode.Lines,
63+
new SettingColor(0, 255, 200),
64+
new SettingColor(0, 255, 200, 25),
65+
true,
66+
new SettingColor(0, 255, 200, 125)
67+
)
6068
)
61-
)
62-
.build()
63-
);
64-
65-
private final Setting<Map<Block, ESPBlockData>> blockConfigs = sgGeneral.add(new BlockDataSetting.Builder<ESPBlockData>()
66-
.name("block-configs")
67-
.description("Config for each block.")
68-
.defaultData(defaultBlockConfig)
69-
.build()
69+
.build()
7070
);
7171

72-
private final Setting<Boolean> tracers = sgGeneral.add(new BoolSetting.Builder()
73-
.name("tracers")
74-
.description("Render tracer lines.")
75-
.defaultValue(false)
76-
.build()
72+
private final Setting<Map<Block, ESPBlockData>> blockConfigs =
73+
sgGeneral.add(
74+
new BlockDataSetting.Builder<ESPBlockData>()
75+
.name("block-configs")
76+
.description("Config for each block.")
77+
.defaultData(defaultBlockConfig)
78+
.onChanged(configs -> {
79+
if (isActive() && Utils.canUpdate()) onActivate();
80+
})
81+
.build()
82+
);
83+
84+
private final Setting<Boolean> tracers = sgGeneral.add(
85+
new BoolSetting.Builder()
86+
.name("tracers")
87+
.description("Render tracer lines.")
88+
.defaultValue(false)
89+
.build()
7790
);
7891

7992
private final BlockPos.Mutable blockPos = new BlockPos.Mutable();
8093

8194
private final Long2ObjectMap<ESPChunk> chunks = new Long2ObjectOpenHashMap<>();
8295
private final Set<ESPGroup> groups = new ReferenceOpenHashSet<>();
83-
private final ExecutorService workerThread = Executors.newSingleThreadExecutor();
96+
private final ExecutorService workerThread =
97+
Executors.newSingleThreadExecutor();
8498

8599
private DimensionType lastDimension;
86100

87101
public BlockESP() {
88-
super(Categories.Render, "block-esp", "Renders specified blocks through walls.", "search");
89-
102+
super(
103+
Categories.Render,
104+
"block-esp",
105+
"Renders specified blocks through walls.",
106+
"search"
107+
);
90108
RainbowColors.register(this::onTickRainbow);
91109
}
92110

@@ -161,8 +179,7 @@ private void onChunkData(ChunkDataEvent event) {
161179
private void searchChunk(Chunk chunk) {
162180
workerThread.submit(() -> {
163181
if (!isActive()) return;
164-
ESPChunk schunk = ESPChunk.searchChunk(chunk, blocks.get());
165-
182+
ESPChunk schunk = ESPChunk.searchChunk(chunk, this);
166183
if (schunk.size() > 0) {
167184
synchronized (chunks) {
168185
chunks.put(chunk.getPos().toLong(), schunk);
@@ -189,8 +206,8 @@ private void onBlockUpdate(BlockUpdateEvent event) {
189206
int chunkZ = bz >> 4;
190207
long key = ChunkPos.toLong(chunkX, chunkZ);
191208

192-
boolean added = blocks.get().contains(event.newState.getBlock()) && !blocks.get().contains(event.oldState.getBlock());
193-
boolean removed = !added && !blocks.get().contains(event.newState.getBlock()) && blocks.get().contains(event.oldState.getBlock());
209+
boolean added = shouldRender(event.newState) && !shouldRender(event.oldState);
210+
boolean removed = !added && !shouldRender(event.newState) && shouldRender(event.oldState);
194211

195212
if (added || removed) {
196213
workerThread.submit(() -> {
@@ -263,4 +280,28 @@ private void onRender(Render3DEvent event) {
263280
public String getInfoString() {
264281
return "%s groups".formatted(groups.size());
265282
}
283+
284+
285+
public boolean shouldRender(BlockState state) {
286+
Block block = state.getBlock();
287+
if (!blocks.get().contains(block)) return false;
288+
289+
ESPBlockData data = getBlockData(block);
290+
for (String filter : data.stateFilters) {
291+
String[] kv = filter.split("=");
292+
if (kv.length != 2) return false;
293+
294+
Property<?> property = block.getStateManager().getProperty(kv[0].trim());
295+
if (property == null) return false;
296+
297+
Optional<?> parsed = property.parse(kv[1].trim());
298+
if (parsed.isEmpty()) return false;
299+
300+
if (!state.get(property).equals(parsed.get())) return false;
301+
}
302+
303+
return true;
304+
}
305+
306+
266307
}

src/main/java/meteordevelopment/meteorclient/systems/modules/render/blockesp/ESPBlock.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,8 @@ private boolean isNeighbour(Direction dir) {
127127

128128
if (neighbourState.getBlock() != state.getBlock()) return false;
129129

130+
if (!blockEsp.shouldRender(neighbourState)) return false;
131+
130132
VoxelShape cube = VoxelShapes.fullCube();
131133
VoxelShape shape = state.getOutlineShape(mc.world, blockPos);
132134
VoxelShape neighbourShape = neighbourState.getOutlineShape(mc.world, blockPos);
@@ -165,7 +167,8 @@ private boolean isNeighbour(Direction dir) {
165167

166168
private boolean isNeighbourDiagonal(double x, double y, double z) {
167169
blockPos.set(this.x + x, this.y + y, this.z + z);
168-
return state.getBlock() == mc.world.getBlockState(blockPos).getBlock();
170+
BlockState neighbourState = mc.world.getBlockState(blockPos);
171+
return state.getBlock() == neighbourState.getBlock() && blockEsp.shouldRender(neighbourState);
169172
}
170173

171174
public void render(Render3DEvent event) {

src/main/java/meteordevelopment/meteorclient/systems/modules/render/blockesp/ESPBlockData.java

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55

66
package meteordevelopment.meteorclient.systems.modules.render.blockesp;
77

8+
import java.util.ArrayList;
9+
import java.util.List;
10+
11+
812
import meteordevelopment.meteorclient.gui.GuiTheme;
913
import meteordevelopment.meteorclient.gui.WidgetScreen;
1014
import meteordevelopment.meteorclient.renderer.ShapeMode;
@@ -16,6 +20,8 @@
1620
import meteordevelopment.meteorclient.utils.render.color.SettingColor;
1721
import net.minecraft.block.Block;
1822
import net.minecraft.nbt.NbtCompound;
23+
import net.minecraft.nbt.NbtList;
24+
import net.minecraft.nbt.NbtString;
1925

2026
public class ESPBlockData implements IGeneric<ESPBlockData>, IChangeable, IBlockData<ESPBlockData> {
2127
public ShapeMode shapeMode;
@@ -25,6 +31,8 @@ public class ESPBlockData implements IGeneric<ESPBlockData>, IChangeable, IBlock
2531
public boolean tracer;
2632
public SettingColor tracerColor;
2733

34+
public final List<String> stateFilters = new ArrayList<>();
35+
2836
private boolean changed;
2937

3038
public ESPBlockData(ShapeMode shapeMode, SettingColor lineColor, SettingColor sideColor, boolean tracer, SettingColor tracerColor) {
@@ -70,14 +78,19 @@ public ESPBlockData set(ESPBlockData value) {
7078
tracer = value.tracer;
7179
tracerColor.set(value.tracerColor);
7280

81+
stateFilters.clear();
82+
stateFilters.addAll(value.stateFilters);
83+
7384
changed = value.changed;
7485

7586
return this;
7687
}
7788

7889
@Override
7990
public ESPBlockData copy() {
80-
return new ESPBlockData(shapeMode, new SettingColor(lineColor), new SettingColor(sideColor), tracer, new SettingColor(tracerColor));
91+
ESPBlockData copy = new ESPBlockData(shapeMode, new SettingColor(lineColor), new SettingColor(sideColor), tracer, new SettingColor(tracerColor));
92+
copy.stateFilters.addAll(stateFilters);
93+
return copy;
8194
}
8295

8396
@Override
@@ -91,6 +104,12 @@ public NbtCompound toTag() {
91104
tag.putBoolean("tracer", tracer);
92105
tag.put("tracerColor", tracerColor.toTag());
93106

107+
NbtList filtersList = new NbtList();
108+
for (String filter : stateFilters) {
109+
filtersList.add(NbtString.of(filter));
110+
}
111+
tag.put("State-Filters", filtersList);
112+
94113
tag.putBoolean("changed", changed);
95114

96115
return tag;
@@ -105,6 +124,14 @@ public ESPBlockData fromTag(NbtCompound tag) {
105124
tracer = tag.getBoolean("tracer", false);
106125
tracerColor.fromTag(tag.getCompoundOrEmpty("tracerColor"));
107126

127+
stateFilters.clear();
128+
tag.getList("State-Filters").ifPresent(filtersList -> {
129+
for (int i = 0; i < filtersList.size(); i++) {
130+
filtersList.getString(i).ifPresent(stateFilters::add);
131+
}
132+
});
133+
134+
108135
changed = tag.getBoolean("changed", false);
109136

110137
return this;

src/main/java/meteordevelopment/meteorclient/systems/modules/render/blockesp/ESPBlockDataScreen.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
import net.minecraft.block.Block;
1414
import org.jetbrains.annotations.Nullable;
1515

16+
import java.util.ArrayList;
17+
1618
public class ESPBlockDataScreen extends WindowScreen {
1719
private final ESPBlockData blockData;
1820
private final Setting<?> setting;
@@ -39,6 +41,7 @@ public void initWidgets() {
3941
Settings settings = new Settings();
4042
SettingGroup sgGeneral = settings.getDefaultGroup();
4143
SettingGroup sgTracer = settings.createGroup("Tracer");
44+
SettingGroup sgFilters = settings.createGroup("State-Filters");
4245

4346
sgGeneral.add(new EnumSetting.Builder<ShapeMode>()
4447
.name("shape-mode")
@@ -110,6 +113,20 @@ public void initWidgets() {
110113
.build()
111114
);
112115

116+
// Add state filters setting
117+
sgFilters.add(new StringListSetting.Builder()
118+
.name("state-filters")
119+
.description("Filters block properties (e.g. 'waterlogged=true'). Only blocks matching ALL filters will be shown.")
120+
.defaultValue(new ArrayList<>())
121+
.onModuleActivated(stringSetting -> stringSetting.set(blockData.stateFilters))
122+
.onChanged(filters -> {
123+
blockData.stateFilters.clear();
124+
blockData.stateFilters.addAll(filters);
125+
onChanged();
126+
})
127+
.build()
128+
);
129+
113130
settings.onActivated();
114131
add(theme.settings(settings)).expandX();
115132
}

src/main/java/meteordevelopment/meteorclient/systems/modules/render/blockesp/ESPChunk.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ public void render(Render3DEvent event) {
8686
}
8787

8888

89-
public static ESPChunk searchChunk(Chunk chunk, List<Block> blocks) {
89+
public static ESPChunk searchChunk(Chunk chunk, BlockESP module) {
9090
ESPChunk schunk = new ESPChunk(chunk.getPos().x, chunk.getPos().z);
9191
if (schunk.shouldBeDeleted()) return schunk;
9292

@@ -100,7 +100,7 @@ public static ESPChunk searchChunk(Chunk chunk, List<Block> blocks) {
100100
blockPos.set(x, y, z);
101101
BlockState bs = chunk.getBlockState(blockPos);
102102

103-
if (blocks.contains(bs.getBlock())) schunk.add(blockPos, false);
103+
if (module.shouldRender(bs)) schunk.add(blockPos, false);
104104
}
105105
}
106106
}

0 commit comments

Comments
 (0)