Skip to content

Commit 86ff0ce

Browse files
committed
no render entities
1 parent a6f5972 commit 86ff0ce

File tree

4 files changed

+124
-18
lines changed

4 files changed

+124
-18
lines changed

src/main/java/com/lambda/mixin/network/ClientPlayNetworkHandlerMixin.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,4 +103,4 @@ public boolean onServerMetadata(ClientPlayNetworkHandler clientPlayNetworkHandle
103103
void injectVelocity(ExplosionS2CPacket packet, CallbackInfo ci) {
104104
if (Velocity.getExplosion() && Velocity.INSTANCE.isEnabled()) ci.cancel();
105105
}
106-
}
106+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
* Copyright 2025 Lambda
3+
*
4+
* This program is free software: you can redistribute it and/or modify
5+
* it under the terms of the GNU General Public License as published by
6+
* the Free Software Foundation, either version 3 of the License, or
7+
* (at your option) any later version.
8+
*
9+
* This program is distributed in the hope that it will be useful,
10+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+
* GNU General Public License for more details.
13+
*
14+
* You should have received a copy of the GNU General Public License
15+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
16+
*/
17+
18+
package com.lambda.mixin.render;
19+
20+
import com.lambda.module.modules.render.NoRender;
21+
import net.minecraft.client.render.Frustum;
22+
import net.minecraft.client.render.entity.EntityRenderer;
23+
import net.minecraft.entity.Entity;
24+
import org.spongepowered.asm.mixin.Mixin;
25+
import org.spongepowered.asm.mixin.injection.At;
26+
import org.spongepowered.asm.mixin.injection.Inject;
27+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
28+
29+
@Mixin(EntityRenderer.class)
30+
public class EntityRendererMixin {
31+
@Inject(method = "shouldRender(Lnet/minecraft/entity/Entity;Lnet/minecraft/client/render/Frustum;DDD)Z", at = @At("HEAD"), cancellable = true)
32+
private void injectShouldRender(Entity entity, Frustum frustum, double x, double y, double z, CallbackInfoReturnable<Boolean> cir) {
33+
if (NoRender.shouldOmitEntity(entity)) cir.cancel();
34+
}
35+
}

src/main/kotlin/com/lambda/module/modules/render/NoRender.kt

Lines changed: 87 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -20,31 +20,32 @@ package com.lambda.module.modules.render
2020
import com.lambda.module.Module
2121
import com.lambda.module.tag.ModuleTag
2222
import com.lambda.util.reflections.scanResult
23+
import io.github.classgraph.ClassInfo
2324
import net.minecraft.client.particle.Particle
2425
import net.minecraft.client.render.BackgroundRenderer.StatusEffectFogModifier
26+
import net.minecraft.entity.Entity
27+
import net.minecraft.entity.SpawnGroup
2528
import net.minecraft.entity.effect.StatusEffects
2629

2730
object NoRender : Module(
2831
name = "NoRender",
2932
description = "Disables rendering of certain things",
3033
tag = ModuleTag.RENDER,
3134
) {
32-
private val particleMap = mutableMapOf<String, String>().apply {
33-
val subClasses = scanResult
34-
.getSubclasses(Particle::class.java)
35-
.filter { !it.isAbstract }
36-
subClasses
37-
.forEach { particle ->
38-
val fullStr = particle.name
39-
if (!fullStr.startsWith("net.minecraft")) return@forEach
40-
val value = fullStr
41-
.replace("net.minecraft.client.particle.", "")
42-
.replace("$", " - ")
43-
.replace("Particle", "")
44-
.replace("(?<!\\s)[A-Z]".toRegex(), " $0")
45-
put(particle.simpleName, value)
46-
}
47-
} as Map<String, String>
35+
private val entities = scanResult
36+
.getSubclasses(Entity::class.java)
37+
.asSequence()
38+
.filter { !it.isAbstract && it.name.startsWith("net.minecraft") }
39+
40+
private val particleMap = createParticleNameMap()
41+
private val playerEntityMap = createEntityNameMap("net.minecraft.client.network.")
42+
private val bossEntityMap = createEntityNameMap("net.minecraft.entity.boss.")
43+
private val decorationEntityMap = createEntityNameMap("net.minecraft.entity.decoration.")
44+
private val mobEntityMap = createEntityNameMap("net.minecraft.entity.mob.")
45+
private val passiveEntityMap = createEntityNameMap("net.minecraft.entity.passive.")
46+
private val projectileEntityMap = createEntityNameMap("net.minecraft.entity.projectile.")
47+
private val vehicleEntityMap = createEntityNameMap("net.minecraft.entity.vehicle.")
48+
private val miscEntityMap = createEntityNameMap("net.minecraft.entity.", strictDir = true)
4849

4950
@JvmStatic val noBlindness by setting("No Blindness", true)
5051
@JvmStatic val noDarkness by setting("No Darkness", true)
@@ -53,12 +54,81 @@ object NoRender : Module(
5354
@JvmStatic val noUnderwater by setting("No Underwater Overlay", true)
5455
@JvmStatic val noInWall by setting("No In Wall Overlay", true)
5556
@JvmStatic val noChatVerificationToast by setting("No Chat Verification Toast", true)
56-
@JvmStatic val particles by setting("Particles", particleMap.values.toSet(), description = "Particles to omit from rendering")
57+
private val particles by setting("Particles", particleMap.values.toSet(), emptySet(), "Particles to omit from rendering")
58+
private val playerEntities by setting("Player Entities", playerEntityMap.values.toSet(), emptySet(), "Player entities to omit from rendering")
59+
private val bossEntities by setting("Boss Entities", bossEntityMap.values.toSet(), emptySet(), "Boss entities to omit from rendering")
60+
private val decorationEntities by setting("Decoration Entities", decorationEntityMap.values.toSet(), emptySet(), "Decoration entities to omit from rendering")
61+
private val mobEntities by setting("Mob Entities", mobEntityMap.values.toSet(), emptySet(), "Mob entities to omit from rendering")
62+
private val passiveEntities by setting("Passive Entities", passiveEntityMap.values.toSet(), emptySet(), "Passive entities to omit from rendering")
63+
private val projectileEntities by setting("Projectile Entities", projectileEntityMap.values.toSet(), emptySet(), "Projectile entities to omit from rendering")
64+
private val vehicleEntities by setting("Vehicle Entities", vehicleEntityMap.values.toSet(), emptySet(), "Vehicle entities to omit from rendering")
65+
private val miscEntities by setting("Misc Entities", miscEntityMap.values.toSet(), emptySet(), "Miscellaneous entities to omit from rendering")
66+
67+
private fun createParticleNameMap(): Map<String, String> {
68+
val subClasses = scanResult
69+
.getSubclasses(Particle::class.java)
70+
.filter { !it.isAbstract }
71+
return createNameMap(subClasses.asSequence(), "net.minecraft.client.particle.", "Particle")
72+
}
73+
74+
private fun createEntityNameMap(directory: String, strictDir: Boolean = false): Map<String, String> {
75+
return createNameMap(entities, directory, "Entity", strictDir)
76+
}
77+
78+
private fun createNameMap(
79+
items: Sequence<ClassInfo>,
80+
directory: String,
81+
removePattern: String = "",
82+
strictDirectory: Boolean = false
83+
): Map<String, String> {
84+
val map = mutableMapOf<String, String>()
85+
items
86+
.filter { item ->
87+
if (strictDirectory) item.name.startsWith(directory) && !item.name.substring(directory.length).contains(".")
88+
else item.name.startsWith(directory)
89+
}
90+
.forEach { item ->
91+
val value = item.name
92+
.substring(item.name.indexOfLast { it == '.' } + 1)
93+
.replace(removePattern, "")
94+
.fancyFormat()
95+
map[item.simpleName] = value
96+
}
97+
return map
98+
}
99+
100+
private fun String.fancyFormat() =
101+
this
102+
.replace("$", " - ")
103+
.replace("(?<!\\s)[A-Z]".toRegex(), " $0")
57104

58105
@JvmStatic
59106
fun shouldOmitParticle(particle: Particle) =
60107
isEnabled && particleMap[particle.javaClass.simpleName] in particles
61108

109+
@JvmStatic
110+
fun shouldOmitEntity(entity: Entity): Boolean {
111+
val simpleName = entity.javaClass.simpleName
112+
return when (entity.type.spawnGroup) {
113+
SpawnGroup.MISC ->
114+
miscEntityMap[simpleName] in miscEntities ||
115+
playerEntityMap[simpleName] in playerEntities ||
116+
projectileEntityMap[simpleName] in projectileEntities ||
117+
vehicleEntityMap[simpleName] in vehicleEntities ||
118+
decorationEntityMap[simpleName] in decorationEntities ||
119+
passiveEntityMap[simpleName] in passiveEntities ||
120+
mobEntityMap[simpleName] in mobEntities ||
121+
bossEntityMap[simpleName] in bossEntities
122+
SpawnGroup.WATER_AMBIENT,
123+
SpawnGroup.WATER_CREATURE,
124+
SpawnGroup.AMBIENT,
125+
SpawnGroup.AXOLOTLS,
126+
SpawnGroup.CREATURE,
127+
SpawnGroup.UNDERGROUND_WATER_CREATURE -> passiveEntityMap[simpleName] in passiveEntities
128+
SpawnGroup.MONSTER -> mobEntityMap[simpleName] in mobEntities
129+
}
130+
}
131+
62132
@JvmStatic
63133
fun shouldAcceptFog(modifier: StatusEffectFogModifier) =
64134
when {

src/main/resources/lambda.mixins.common.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
"render.DebugHudMixin",
3838
"render.DebugRendererMixin",
3939
"render.ElytraFeatureRendererMixin",
40+
"render.EntityRendererMixin",
4041
"render.GameRendererMixin",
4142
"render.GlStateManagerMixin",
4243
"render.HeldItemRendererMixin",

0 commit comments

Comments
 (0)