Начинающий
- Статус
- Оффлайн
- Регистрация
- 12 Июн 2025
- Сообщения
- 23
- Реакции
- 0
- Выберите загрузчик игры
- Fabric
Java:
package lungs.noir.client.features.modules.render;
import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem;
import lombok.Getter;
import net.minecraft.client.gl.ShaderProgramKeys;
import net.minecraft.client.render.*;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.RotationAxis;
import net.minecraft.util.math.Vec3d;
import org.joml.Matrix4f;
import lungs.noir.api.event.EventListener;
import lungs.noir.api.event.Listener;
import lungs.noir.api.event.events.render.Render3DEvent;
import lungs.noir.api.module.Category;
import lungs.noir.api.module.Module;
import lungs.noir.api.module.ModuleRegister;
import lungs.noir.api.module.setting.BooleanSetting;
import lungs.noir.api.module.setting.ColorSetting;
import lungs.noir.api.module.setting.SliderSetting;
import lungs.noir.api.system.files.FileUtil;
import lungs.noir.api.utils.color.ColorUtil;
import lungs.noir.api.utils.render.RenderUtil;
import java.awt.*;
@ModuleRegister(name = "Invoker", category = Category.RENDER)
public class InvokerModule extends Module {
@Getter private static final InvokerModule instance = new InvokerModule();
private final ColorSetting sphere1Color = new ColorSetting("Exort color").value(new Color(255, 200, 100, 200));
private final ColorSetting sphere2Color = new ColorSetting("Wex color").value(new Color(255, 150, 255, 200));
private final ColorSetting sphere3Color = new ColorSetting("Quas color").value(new Color(150, 150, 255, 200));
private final SliderSetting sphereSize = new SliderSetting("Размер сфер").value(0.3f).range(0.1f, 0.8f).step(0.05f);
private final SliderSetting orbitRadius = new SliderSetting("Радиус орбиты").value(0.8f).range(0.3f, 2.0f).step(0.1f);
private final SliderSetting height = new SliderSetting("Высота").value(0.7f).range(-0.5f, 1.5f).step(0.1f);
private final BooleanSetting renderSelf = new BooleanSetting("На себе").value(true);
private final BooleanSetting renderOthers = new BooleanSetting("На других").value(false);
private final BooleanSetting renderInFirstPerson = new BooleanSetting("От первого лица").value(true);
public InvokerModule() {
addSettings(sphere1Color, sphere2Color, sphere3Color, sphereSize, orbitRadius, height,
renderSelf, renderOthers, renderInFirstPerson);
}
@Override
public void onEvent() {
EventListener renderEvent = Render3DEvent.getInstance().subscribe(new Listener<>(event -> {
MatrixStack ms = event.matrixStack();
for (Entity e : mc.world.getEntities()) {
if (!(e instanceof PlayerEntity p)) continue;
if (p == mc.player && !renderSelf.getValue()) continue;
if (p != mc.player && !renderOthers.getValue()) continue;
if (p.isInvisible()) continue;
renderSpheres(ms, p, event.partialTicks());
}
}));
addEvents(renderEvent);
}
private void renderSpheres(MatrixStack ms, PlayerEntity player, float partialTicks) {
if (player == mc.player && mc.options.getPerspective().isFirstPerson() && !renderInFirstPerson.getValue()) {
return;
}
double x = MathHelper.lerp(partialTicks, player.prevX, player.getX());
double y = MathHelper.lerp(partialTicks, player.prevY, player.getY());
double z = MathHelper.lerp(partialTicks, player.prevZ, player.getZ());
float bodyYaw = MathHelper.lerpAngleDegrees(partialTicks, player.prevBodyYaw, player.bodyYaw);
Vec3d cam = mc.getEntityRenderDispatcher().camera.getPos();
float sphereY = player.getHeight() * 0.5f + height.getValue();
float radius = orbitRadius.getValue();
float size = sphereSize.getValue();
Color[] colors = {sphere1Color.getValue(), sphere2Color.getValue(), sphere3Color.getValue()};
float[] angleOffsets = {180f, -90f, 360f};
for (int i = 0; i < 3; i++) {
float angle = angleOffsets[i];
double angleRad = Math.toRadians(bodyYaw + angle);
double sphereX = x + Math.cos(angleRad) * radius;
double sphereY_pos = y + sphereY;
double sphereZ = z + Math.sin(angleRad) * radius;
renderSphere(ms, sphereX, sphereY_pos, sphereZ, cam, size, colors[i]);
}
}
private void renderSphere(MatrixStack ms, double x, double y, double z, Vec3d cam, float size, Color color) {
RenderUtil.WORLD.startRender(ms);
ms.push();
double renderX = x - cam.x;
double renderY = y - cam.y;
double renderZ = z - cam.z;
ms.translate(renderX, renderY, renderZ);
Camera camera = mc.gameRenderer.getCamera();
ms.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(-camera.getYaw()));
ms.multiply(RotationAxis.POSITIVE_X.rotationDegrees(camera.getPitch()));
RenderSystem.enableBlend();
RenderSystem.blendFunc(GlStateManager.SrcFactor.SRC_ALPHA, GlStateManager.DstFactor.ONE);
RenderSystem.enableDepthTest();
RenderSystem.depthMask(false);
RenderSystem.setShaderTexture(0, FileUtil.getImage("particles/glow"));
RenderSystem.setShader(ShaderProgramKeys.POSITION_TEX_COLOR);
Matrix4f matrix = ms.peek().getPositionMatrix();
float[] col = ColorUtil.normalize(color);
BufferBuilder buf = Tessellator.getInstance().begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_TEXTURE_COLOR);
buf.vertex(matrix, -size, size, 0).texture(0f, 1f).color(col[0], col[1], col[2], col[3]);
buf.vertex(matrix, size, size, 0).texture(1f, 1f).color(col[0], col[1], col[2], col[3]);
buf.vertex(matrix, size, -size, 0).texture(1f, 0f).color(col[0], col[1], col[2], col[3]);
buf.vertex(matrix, -size, -size, 0).texture(0f, 0f).color(col[0], col[1], col[2], col[3]);
BufferRenderer.drawWithGlobalProgram(buf.end());
RenderSystem.depthMask(true);
RenderSystem.enableDepthTest();
RenderSystem.blendFunc(GlStateManager.SrcFactor.SRC_ALPHA, GlStateManager.DstFactor.ONE_MINUS_SRC_ALPHA);
ms.pop();
RenderUtil.WORLD.endRender(ms);
}
}
SS: