Начинающий
- Статус
- Онлайн
- Регистрация
- 13 Май 2025
- Сообщения
- 206
- Реакции
- 1
- Выберите загрузчик игры
- Vanilla
ShaderESPFunction:
package ru.heaven.feature.functions.impl.render;
import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.client.MainWindow;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.player.AbstractClientPlayerEntity;
import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.WorldVertexBufferUploader;
import net.minecraft.client.renderer.entity.EntityRendererManager;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.client.settings.PointOfView;
import net.minecraft.client.shader.Framebuffer;
import net.minecraft.entity.Entity;
import net.minecraft.entity.MobEntity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.util.math.MathHelper;
import org.lwjgl.opengl.GL11;
import ru.heaven.Heaven;
import ru.heaven.event.api.EventRegister;
import ru.heaven.event.impl.render.PostRender2DEvent;
import ru.heaven.event.impl.render.Render3DPosedEvent;
import ru.heaven.feature.functions.api.Function;
import ru.heaven.feature.functions.api.FunctionRegister;
import ru.heaven.feature.functions.api.settings.BooleanSettings;
import ru.heaven.feature.functions.api.settings.ColorSettings;
import ru.heaven.feature.functions.api.settings.ModeListSettings;
import ru.heaven.feature.functions.api.settings.ModeSettings;
import ru.heaven.feature.functions.api.settings.SliderSettings;
import ru.heaven.feature.functions.impl.Category;
import ru.heaven.util.clr.ColorUtils;
import ru.heaven.util.config.frined.FriendUtility;
import ru.heaven.util.render.RenderUtils;
import ru.heaven.util.render.shader.Sahder;
import ru.heaven.util.render.shader.ShaderManager;
import java.awt.Color;
@FunctionRegister(name = "Shader ESP", desc = "Подсвечивает сущности шейдером", category = Category.RENDER)
public class ShaderESPFunction extends Function {
public static boolean renderingEntityMask;
private static final String THEME = "Тема";
private static final String CUSTOM = "Свой";
private static final float MAX_DISTANCE = 128.0F;
private final ModeListSettings selectEntities = new ModeListSettings("Применять на", "Игроков", "Мобов", "Предметы", "Себя и друзей");
private final BooleanSettings drawOutline = new BooleanSettings("Обводка", true);
private final BooleanSettings drawShadow = new BooleanSettings("Свечение", true);
private final BooleanSettings fillModel = new BooleanSettings("Заполнять модель", true);
private final ModeSettings colorMode = new ModeSettings("Режим цвета", THEME, CUSTOM);
private final ColorSettings color = new ColorSettings("Цвет", Color.WHITE.getRGB(), true);
private final SliderSettings multDark = new SliderSettings("Mult Dark", 0.55F, 0.15F, 1.0F, 0.05F);
private final SliderSettings outlineWidth = new SliderSettings("Толщина обводки", 2.0F, 1.0F, 5.0F, 0.5F);
private final SliderSettings glow = new SliderSettings("Сила свечения", 6.0F, 3.0F, 10.0F, 1.0F);
private Framebuffer entityBuffer;
private Framebuffer blurBuffer;
private Framebuffer effectBuffer;
private Framebuffer maskBuffer;
private float lastDistance = 1.0F;
private boolean renderedThisFrame;
public ShaderESPFunction() {
selectEntities.setEnabled("Игроков", true);
selectEntities.setEnabled("Мобов", true);
selectEntities.setEnabled("Предметы", true);
selectEntities.setEnabled("Себя и друзей", true);
color.setVisible(() -> colorMode.is(CUSTOM));
outlineWidth.setVisible(drawOutline::get);
glow.setVisible(drawShadow::get);
addSettings(selectEntities, drawOutline, drawShadow, fillModel, colorMode, color, multDark, outlineWidth, glow);
}
@Override
public void onDisable() {
renderedThisFrame = false;
lastDistance = 1.0F;
renderingEntityMask = false;
releaseBuffers();
super.onDisable();
}
@EventRegister
public void onRender3DPosed(Render3DPosedEvent event) {
if (mc.player == null || mc.world == null || (!drawShadow.get() && !drawOutline.get() && !fillModel.get())) {
renderedThisFrame = false;
return;
}
entityBuffer = ensureFramebuffer(entityBuffer, true);
entityBuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
entityBuffer.bindFramebuffer(false);
RenderSystem.enableBlend();
RenderSystem.defaultBlendFunc();
RenderSystem.enableDepthTest();
RenderSystem.depthMask(true);
GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT);
EntityRendererManager rendererManager = mc.getRenderManager();
IRenderTypeBuffer.Impl bufferSource = mc.getRenderTypeBuffers().getBufferSource();
float closestDistance = Float.MAX_VALUE;
boolean found = false;
renderingEntityMask = true;
try {
for (Entity entity : mc.world.getAllEntities()) {
if (!isValidEntity(entity)) {
continue;
}
float distance = mc.player.getDistance(entity);
if (distance > MAX_DISTANCE) {
continue;
}
double x = MathHelper.lerp(event.getPartialTicks(), entity.lastTickPosX, entity.getPosX()) - event.getCx();
double y = MathHelper.lerp(event.getPartialTicks(), entity.lastTickPosY, entity.getPosY()) - event.getCy();
double z = MathHelper.lerp(event.getPartialTicks(), entity.lastTickPosZ, entity.getPosZ()) - event.getCz();
float yaw = MathHelper.lerp(event.getPartialTicks(), entity.prevRotationYaw, entity.rotationYaw);
rendererManager.renderEntityStatic(entity, x, y, z, yaw, event.getPartialTicks(), event.getMatrix(), bufferSource, rendererManager.getPackedLight(entity, event.getPartialTicks()));
closestDistance = Math.min(closestDistance, distance);
found = true;
}
} finally {
renderingEntityMask = false;
bufferSource.finish();
}
entityBuffer.unbindFramebuffer();
mc.getFramebuffer().bindFramebuffer(false);
RenderSystem.disableBlend();
renderedThisFrame = found;
if (found) {
lastDistance = Math.max(1.0F, closestDistance);
}
}
@EventRegister
public void onPostRender2D(PostRender2DEvent event) {
if (!renderedThisFrame || entityBuffer == null) {
return;
}
blurBuffer = ensureFramebuffer(blurBuffer, false);
effectBuffer = ensureFramebuffer(effectBuffer, false);
maskBuffer = ensureFramebuffer(maskBuffer, false);
int baseColor = resolveBaseColor();
int darkColor = ColorUtils.multDark(baseColor, (float) multDark.getValue());
float distanceScale = (float) Math.min(1.0D, 10.0D / lastDistance);
float finalGlow = (float) glow.getValue() * distanceScale;
float finalOutline = (float) outlineWidth.getValue() * distanceScale;
MainWindow window = event.getMainWindow();
float screenWidth = window.getScaledWidth();
float screenHeight = window.getScaledHeight();
mc.getFramebuffer().bindFramebuffer(false);
RenderSystem.enableBlend();
RenderSystem.defaultBlendFunc();
RenderSystem.disableAlphaTest();
if (drawShadow.get()) {
blurMask(entityBuffer, effectBuffer, Math.max(finalGlow, 2.0F), screenWidth, screenHeight);
drawGradientTexture(effectBuffer.func_242996_f(), baseColor, darkColor, screenWidth, screenHeight);
}
if (fillModel.get()) {
drawGradientTexture(entityBuffer.func_242996_f(), baseColor, darkColor, screenWidth, screenHeight);
}
if (drawOutline.get()) {
blurMask(entityBuffer, effectBuffer, Math.max(finalOutline, 1.0F), screenWidth, screenHeight);
drawGradientTexture(effectBuffer.func_242996_f(), baseColor, darkColor, screenWidth, screenHeight);
}
RenderSystem.enableAlphaTest();
RenderSystem.disableBlend();
entityBuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
blurBuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
effectBuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
maskBuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
mc.getFramebuffer().bindFramebuffer(true);
renderedThisFrame = false;
}
private boolean isValidEntity(Entity entity) {
if (entity instanceof AbstractClientPlayerEntity player) {
boolean isSelf = player == mc.player;
boolean isFriend = FriendUtility.isFriend(player);
if (isSelf) {
return selectEntities.get("Себя и друзей") && mc.gameSettings.getPointOfView() != PointOfView.FIRST_PERSON;
}
if (isFriend && selectEntities.get("Себя и друзей")) {
return true;
}
return selectEntities.get("Игроков");
}
if (entity instanceof MobEntity) {
return selectEntities.get("Мобов");
}
if (entity instanceof ItemEntity) {
return selectEntities.get("Предметы");
}
return false;
}
private int resolveBaseColor() {
if (colorMode.is(CUSTOM)) {
return color.getColor();
}
Heaven heaven = Heaven.getInstance();
if (heaven != null && heaven.getFunctionManager() != null) {
ClickGuiFunction clickGui = heaven.getFunctionManager().getFunction(ClickGuiFunction.class);
if (clickGui != null) {
return clickGui.themeColor.getColor();
}
}
return color.getColor();
}
private void blurMask(Framebuffer input, Framebuffer output, float radius, float width, float height) {
copyMaskBuffer(input, width, height);
blurBuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
blurBuffer.bindFramebuffer(false);
RenderUtils.drawShadow(input.func_242996_f(), input.func_242996_f(), radius, 1.0F, 0.0F, 0.0F, 0.0F, width, height);
blurBuffer.unbindFramebuffer();
output.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
output.bindFramebuffer(false);
RenderUtils.drawShadow(blurBuffer.func_242996_f(), maskBuffer.func_242996_f(), radius, 0.0F, 1.0F, 0.0F, 0.0F, width, height);
output.unbindFramebuffer();
mc.getFramebuffer().bindFramebuffer(false);
}
private void copyMaskBuffer(Framebuffer input, float width, float height) {
Sahder gradient = ShaderManager.shader("gradient.frag");
maskBuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
maskBuffer.bindFramebuffer(false);
gradient.begin();
gradient.setUniformF("location", 0.0F, 0.0F);
gradient.setUniformF("rectSize", width, height);
gradient.setUniform("tex", 0);
gradient.setUniformF("color1", 1.0F, 1.0F, 1.0F, 1.0F);
gradient.setUniformF("color2", 1.0F, 1.0F, 1.0F, 1.0F);
gradient.setUniformF("color3", 1.0F, 1.0F, 1.0F, 1.0F);
gradient.setUniformF("color4", 1.0F, 1.0F, 1.0F, 1.0F);
GlStateManager.bindTexture(input.func_242996_f());
drawStandardQuads(width, height);
gradient.end();
GlStateManager.bindTexture(0);
maskBuffer.unbindFramebuffer();
mc.getFramebuffer().bindFramebuffer(false);
}
private void drawGradientTexture(int textureId, int color1, int color2, float width, float height) {
Sahder gradient = ShaderManager.shader("gradient.frag");
float[] c1 = ColorUtils.getRGBAf(color1);
float[] c2 = ColorUtils.getRGBAf(color2);
gradient.begin();
gradient.setUniformF("location", 0.0F, 0.0F);
gradient.setUniformF("rectSize", width, height);
gradient.setUniform("tex", 0);
gradient.setUniformF("color1", c1[0], c1[1], c1[2], c1[3]);
gradient.setUniformF("color2", c2[0], c2[1], c2[2], c2[3]);
gradient.setUniformF("color3", c1[0], c1[1], c1[2], c1[3]);
gradient.setUniformF("color4", c2[0], c2[1], c2[2], c2[3]);
GlStateManager.bindTexture(textureId);
drawFlippedQuads(width, height);
gradient.end();
GlStateManager.bindTexture(0);
}
private void drawStandardQuads(float width, float height) {
BufferBuilder buffer = Tessellator.getInstance().getBuffer();
buffer.begin(7, DefaultVertexFormats.POSITION_TEX);
buffer.pos(0.0D, height, 0.0D).tex(0.0F, 1.0F).endVertex();
buffer.pos(width, height, 0.0D).tex(1.0F, 1.0F).endVertex();
buffer.pos(width, 0.0D, 0.0D).tex(1.0F, 0.0F).endVertex();
buffer.pos(0.0D, 0.0D, 0.0D).tex(0.0F, 0.0F).endVertex();
buffer.finishDrawing();
WorldVertexBufferUploader.draw(buffer);
}
private void drawFlippedQuads(float width, float height) {
BufferBuilder buffer = Tessellator.getInstance().getBuffer();
buffer.begin(7, DefaultVertexFormats.POSITION_TEX);
buffer.pos(0.0D, height, 0.0D).tex(0.0F, 0.0F).endVertex();
buffer.pos(width, height, 0.0D).tex(1.0F, 0.0F).endVertex();
buffer.pos(width, 0.0D, 0.0D).tex(1.0F, 1.0F).endVertex();
buffer.pos(0.0D, 0.0D, 0.0D).tex(0.0F, 1.0F).endVertex();
buffer.finishDrawing();
WorldVertexBufferUploader.draw(buffer);
}
private Framebuffer ensureFramebuffer(Framebuffer framebuffer, boolean useDepth) {
int width = Math.max(1, mc.getMainWindow().getWidth());
int height = Math.max(1, mc.getMainWindow().getHeight());
if (framebuffer == null || framebuffer.framebufferWidth != width || framebuffer.framebufferHeight != height) {
if (framebuffer != null) {
framebuffer.deleteFramebuffer();
}
return new Framebuffer(width, height, useDepth, false);
}
return framebuffer;
}
private void releaseBuffers() {
entityBuffer = releaseFramebuffer(entityBuffer);
blurBuffer = releaseFramebuffer(blurBuffer);
effectBuffer = releaseFramebuffer(effectBuffer);
maskBuffer = releaseFramebuffer(maskBuffer);
}
private Framebuffer releaseFramebuffer(Framebuffer framebuffer) {
if (framebuffer != null) {
framebuffer.deleteFramebuffer();
}
return null;
}
}
RenderUtils:
public static void drawShadow(int sampler1, int sampler2, float radius, float directionX, float directionY, float x, float y, float width, float height) {
radius = Math.min(radius, 63);
Sahder shader = ShaderManager.shader("shadow.frag");
shader.begin();
shader.setUniform("sampler1", 0);
shader.setUniform("sampler2", 1);
shader.setUniformF("texelSize", 1.0F / (float) mc.getMainWindow().getWidth(), 1.0F / (float) mc.getMainWindow().getHeight());
shader.setUniformF("direction", directionX, directionY);
shader.setUniformF("radius", radius);
float[] kernel = new float[(int) radius + 1];
float sigma = radius / 2.0F;
for (int i = 0; i <= (int) radius; i++) {
kernel[i] = BlurUtils.calculateGaussianValue(i, sigma);
}
shader.setUniformF("kernel", kernel);
RenderSystem.activeTexture(33984);
RenderSystem.bindTexture(sampler1);
RenderSystem.activeTexture(33985);
RenderSystem.bindTexture(sampler2);
RenderSystem.activeTexture(33984);
shader.drawQuads(x, y, width, height);
shader.end();
}