Начинающий
- Статус
- Оффлайн
- Регистрация
- 16 Мар 2024
- Сообщения
- 19
- Реакции
- 0
- Выберите загрузчик игры
- Fabric
простенький Numb сделанный за 5 минут с ии
Пожалуйста, авторизуйтесь для просмотра ссылки.
Java:
package sweetie.Zero.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.player.PlayerEntity;
import net.minecraft.util.math.RotationAxis;
import net.minecraft.util.math.Vec3d;
import org.joml.Matrix4f;
import sweetie.Zero.api.event.EventListener;
import sweetie.Zero.api.event.Listener;
import sweetie.Zero.api.event.events.render.Render3DEvent;
import sweetie.Zero.api.module.Category;
import sweetie.Zero.api.module.Module;
import sweetie.Zero.api.module.ModuleRegister;
import sweetie.Zero.api.module.setting.BooleanSetting;
import sweetie.Zero.api.module.setting.ModeSetting;
import sweetie.Zero.api.module.setting.SliderSetting;
import sweetie.Zero.api.system.files.FileUtil;
import sweetie.Zero.api.utils.animation.AnimationUtil;
import sweetie.Zero.api.utils.animation.Easing;
import sweetie.Zero.api.utils.color.ColorUtil;
import sweetie.Zero.api.utils.color.UIColors;
import sweetie.Zero.api.utils.math.MathUtil;
import java.awt.*;
@ModuleRegister(name = "Numb", category = Category.RENDER)
public class NumbModule extends Module {
@Getter private static final NumbModule instance = new NumbModule();
private final ModeSetting mode = new ModeSetting("Mode").value("Ring").values("Ring", "Crown", "Pulse");
private final SliderSetting height = new SliderSetting("Height").value(0.22f).range(0f, 0.6f).step(0.01f);
private final SliderSetting radius = new SliderSetting("Radius").value(0.28f).range(0.05f, 0.6f).step(0.01f);
private final SliderSetting glowSize = new SliderSetting("Glow size").value(0.18f).range(0.04f, 0.5f).step(0.01f);
private final SliderSetting speed = new SliderSetting("Speed").value(1.0f).range(0.2f, 4f).step(0.1f);
private final SliderSetting opacity = new SliderSetting("Opacity").value(0.85f).range(0.1f, 1f).step(0.05f);
private final BooleanSetting self = new BooleanSetting("Render self").value(true);
private final BooleanSetting firstPerson = new BooleanSetting("1st person").value(false)
.setVisible(() -> self.getValue());
private final BooleanSetting others = new BooleanSetting("Render others").value(false);
private final SliderSetting particles = new SliderSetting("Particles").value(12f).range(4f, 32f).step(1f)
.setVisible(() -> mode.is("Ring"));
private final SliderSetting rays = new SliderSetting("Rays").value(5f).range(3f, 9f).step(1f)
.setVisible(() -> mode.is("Crown"));
private final SliderSetting rayHeight = new SliderSetting("Ray height").value(0.35f).range(0.1f, 0.8f).step(0.05f)
.setVisible(() -> mode.is("Crown"));
private double angle = 0.0;
private final AnimationUtil enableAnim = new AnimationUtil();
public NumbModule() {
addSettings(mode, height, radius, glowSize, speed, opacity, self, firstPerson, others, particles, rays, rayHeight);
}
@Override
public void onEnable() {
angle = 0.0;
enableAnim.setValue(0.0);
}
@Override
public void toggle() {
super.toggle();
if (!isEnabled()) enableAnim.run(0.0, 300, Easing.QUINT_OUT);
}
@Override
public void onEvent() {
EventListener renderEvent = Render3DEvent.getInstance().subscribe(new Listener<>(event -> {
if (mc.world == null) return;
enableAnim.update();
if (isEnabled() && enableAnim.getValue() < 1.0)
enableAnim.run(1.0, 500, Easing.QUINT_OUT);
float appear = (float) enableAnim.getValue();
if (appear < 0.01f) return;
angle += 0.04 * speed.getValue();
MatrixStack ms = event.matrixStack();
float pt = event.partialTicks();
// true если сейчас вид от первого лица
boolean isFirstPerson = mc.options.getPerspective().isFirstPerson();
for (PlayerEntity player : mc.world.getPlayers()) {
if (player == mc.player) {
if (!self.getValue()) continue;
// если вид от первого лица и настройка "1st person" выключена — пропускаем
if (isFirstPerson && !firstPerson.getValue()) continue;
}
if (player != mc.player && !others.getValue()) continue;
if (player.isInvisible()) continue;
renderNumb(ms, player, pt, appear);
}
}));
addEvents(renderEvent);
}
private void renderNumb(MatrixStack ms, PlayerEntity player, float pt, float appear) {
Vec3d cam = mc.getEntityRenderDispatcher().camera.getPos();
double px = MathUtil.interpolate(player.prevX, player.getX(), pt);
double py = MathUtil.interpolate(player.prevY, player.getY(), pt);
double pz = MathUtil.interpolate(player.prevZ, player.getZ(), pt);
double haloY = py + player.getHeight() + height.getValue() * appear;
setupGlState();
switch (mode.getValue()) {
case "Ring" -> renderRing(ms, cam, px, haloY, pz, appear);
case "Crown" -> renderCrown(ms, cam, px, haloY, pz, appear);
case "Pulse" -> renderPulse(ms, cam, px, haloY, pz, appear);
}
restoreGlState();
}
private void renderRing(MatrixStack ms, Vec3d cam, double cx, double cy, double cz, float appear) {
int count = particles.getValue().intValue();
float r = radius.getValue() * appear;
float sz = glowSize.getValue() * appear;
float opc = opacity.getValue();
for (int i = 0; i < count; i++) {
double a = angle + (Math.PI * 2.0 / count) * i;
double or = r * (i % 2 == 0 ? 1.0 : 0.6);
float os = sz * (i % 2 == 0 ? 1.0f : 0.65f);
double wx = cx + Math.sin(a) * or;
double wz = cz + Math.cos(a) * or;
int colorIdx = (int)(((double) i / count) * 360) + (int)(angle * 30);
Color c1 = ColorUtil.setAlpha(UIColors.gradient(colorIdx), (int)(255 * opc * appear));
Color c2 = ColorUtil.setAlpha(UIColors.gradient(colorIdx + 60), (int)(180 * opc * appear * 0.5f));
drawBillboard(ms, cam, wx, cy, wz, os, c1);
drawBillboard(ms, cam, wx, cy, wz, os * 1.8f, c2);
}
}
private void renderCrown(MatrixStack ms, Vec3d cam, double cx, double cy, double cz, float appear) {
int n = rays.getValue().intValue();
float r = radius.getValue() * appear;
float rh = rayHeight.getValue() * appear;
float sz = glowSize.getValue() * appear;
float opc = opacity.getValue();
float pulse = 0.75f + 0.25f * (float) Math.sin(angle * 2.5);
for (int i = 0; i < n; i++) {
double a = (Math.PI * 2.0 / n) * i;
double wx = cx + Math.sin(a) * r;
double wz = cz + Math.cos(a) * r;
int colorIdx = (int)(((double) i / n) * 360);
Color base = UIColors.gradient(colorIdx);
Color cBase = ColorUtil.setAlpha(base, (int)(200 * opc * appear));
drawBillboard(ms, cam, wx, cy, wz, sz * 0.9f, cBase);
double tipY = cy + rh * pulse;
Color cTip = ColorUtil.setAlpha(UIColors.gradient(colorIdx + 120), (int)(255 * opc * appear * pulse));
drawBillboard(ms, cam, wx, tipY, wz, sz * pulse, cTip);
Color cGlow = ColorUtil.setAlpha(base, (int)(120 * opc * appear * pulse));
drawBillboard(ms, cam, wx, tipY, wz, sz * 2.0f * pulse, cGlow);
}
}
private void renderPulse(MatrixStack ms, Vec3d cam, double cx, double cy, double cz, float appear) {
float opc = opacity.getValue();
for (int layer = 0; layer < 3; layer++) {
double phase = angle * 1.8 + layer * (Math.PI * 2.0 / 3.0);
float pulse = 0.6f + 0.4f * (float) Math.sin(phase);
float sz = glowSize.getValue() * appear * (1.0f + layer * 0.6f) * pulse;
int colorIdx = (int)(angle * 40) + layer * 120;
int alpha = (int)(255 * opc * appear * (1.0f - layer * 0.25f) * pulse);
Color c = ColorUtil.setAlpha(UIColors.gradient(colorIdx), alpha);
drawBillboard(ms, cam, cx, cy, cz, sz, c);
}
}
private void setupGlState() {
RenderSystem.setShader(ShaderProgramKeys.POSITION_TEX_COLOR);
RenderSystem.setShaderTexture(0, FileUtil.getImage("particles/glow"));
RenderSystem.enableBlend();
RenderSystem.blendFunc(GlStateManager.SrcFactor.SRC_ALPHA, GlStateManager.DstFactor.ONE);
RenderSystem.disableCull();
RenderSystem.disableDepthTest();
RenderSystem.depthMask(false);
}
private void restoreGlState() {
RenderSystem.depthMask(true);
RenderSystem.enableDepthTest();
RenderSystem.enableCull();
RenderSystem.blendFunc(GlStateManager.SrcFactor.SRC_ALPHA, GlStateManager.DstFactor.ONE_MINUS_SRC_ALPHA);
RenderSystem.setShaderColor(1f, 1f, 1f, 1f);
}
private void drawBillboard(MatrixStack stack, Vec3d cam,
double wx, double wy, double wz,
float size, Color color) {
stack.push();
stack.translate(wx - cam.x, wy - cam.y, wz - cam.z);
Camera camera = mc.gameRenderer.getCamera();
stack.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(-camera.getYaw() + 180.0f));
stack.multiply(RotationAxis.POSITIVE_X.rotationDegrees(-camera.getPitch() + 180.0f));
Matrix4f matrix = stack.peek().getPositionMatrix();
float[] c = 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(c[0], c[1], c[2], c[3]);
buf.vertex(matrix, size, size, 0).texture(1f, 1f).color(c[0], c[1], c[2], c[3]);
buf.vertex(matrix, size, -size, 0).texture(1f, 0f).color(c[0], c[1], c[2], c[3]);
buf.vertex(matrix, -size, -size, 0).texture(0f, 0f).color(c[0], c[1], c[2], c[3]);
BufferRenderer.drawWithGlobalProgram(buf.end());
stack.pop();
}
}