Начинающий
- Статус
- Оффлайн
- Регистрация
- 20 Окт 2025
- Сообщения
- 68
- Реакции
- 0
- Выберите загрузчик игры
- Fabric
ну в общем обычные призраки с физикой которые следуют за тобой
Пожалуйста, авторизуйтесь для просмотра ссылки.
пнгшку сами возьмете самый дефолтный glow
код:
package eu.aesthetic.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.Identifier;
import eu.aesthetic.core.system.backend.ClientInfo;
import net.minecraft.util.math.RotationAxis;
import net.minecraft.util.math.Vec3d;
import org.joml.Matrix4f;
import eu.aesthetic.core.event.EventListener;
import eu.aesthetic.core.event.Listener;
import eu.aesthetic.core.event.events.render.Render3DEvent;
import eu.aesthetic.core.module.Category;
import eu.aesthetic.core.module.Module;
import eu.aesthetic.core.module.ModuleRegister;
import eu.aesthetic.core.utils.color.UIColors;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;
@ModuleRegister(name = "Ghost", category = Category.RENDER)
public class GhostModule extends Module {
@Getter private static final GhostModule instance = new GhostModule();
private static final Identifier GLOW = Identifier.of(ClientInfo.MOD_ID, "images/particles/glow.png");
private final float[] SCALE_CACHE = new float[101];
private final Vec3d[] ghostPos = new Vec3d[3];
private final Vec3d[] ghostVel = new Vec3d[3];
private final List<Vec3d>[] trails = new ArrayList[3];
private long lastUpdate = 0;
public GhostModule() {
for (int i = 0; i <= 100; i++) SCALE_CACHE[i] = Math.max(0.28f * (i / 100f), 0.15f);
for (int i = 0; i < 3; i++) {
trails[i] = new ArrayList<>();
}
}
@Override
public void onEvent() {
EventListener render3DEvent = Render3DEvent.getInstance().subscribe(new Listener<>(event -> {
renderGhosts(event);
}));
addEvents(render3DEvent);
}
@Override
public void onEnable() {
lastUpdate = System.currentTimeMillis();
for (int i = 0; i < 3; i++) {
ghostPos[i] = null;
ghostVel[i] = Vec3d.ZERO;
trails[i].clear();
}
super.onEnable();
}
private void renderGhosts(Render3DEvent.Render3DEventData event) {
if (mc.player == null || mc.world == null) return;
PlayerEntity player = mc.player;
float delta = event.partialTicks();
MatrixStack eventMatrices = event.matrixStack();
Camera camera = mc.gameRenderer.getCamera();
long now = System.currentTimeMillis();
if (lastUpdate == 0) lastUpdate = now;
float dt = (now - lastUpdate) / 1000f;
lastUpdate = now;
if (dt > 0.1f) dt = 0.1f;
if (dt <= 0) dt = 0.001f;
double x = interpolate(player.prevX, player.getX(), delta);
double y = interpolate(player.prevY, player.getY(), delta);
double z = interpolate(player.prevZ, player.getZ(), delta);
Vec3d playerPos = new Vec3d(x, y, z);
float age = player.age + delta;
int trailLength = 25;
int factor = 4;
RenderSystem.enableBlend();
RenderSystem.blendFunc(GlStateManager.SrcFactor.SRC_ALPHA, GlStateManager.DstFactor.ONE);
RenderSystem.setShaderTexture(0, GLOW);
RenderSystem.setShader(ShaderProgramKeys.POSITION_TEX_COLOR);
RenderSystem.enableDepthTest();
RenderSystem.depthMask(false);
BufferBuilder buffer = Tessellator.getInstance().begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_TEXTURE_COLOR);
float pitch = camera.getPitch();
float yaw = camera.getYaw();
double time = (now % 100000L) / 1000.0;
for (int j = 0; j < 3; j++) {
double radians = Math.toRadians(((age) * factor + j * 120) % (factor * 360));
float baseR = player.getWidth() * 1.15f;
float dynR = baseR * (0.95f + 0.12f * (float) Math.sin(time * 0.8 + j));
double tx = Math.cos(radians) * dynR;
double tz = Math.sin(radians) * dynR;
double ty = 0.15 + 0.12 * Math.sin(time * 2.5 + j);
Vec3d targetWorldPos = playerPos.add(tx, ty, tz);
if (ghostPos[j] == null || ghostPos[j].distanceTo(targetWorldPos) > 15) {
ghostPos[j] = targetWorldPos;
ghostVel[j] = Vec3d.ZERO;
}
Vec3d diff = targetWorldPos.subtract(ghostPos[j]);
double spring = 15.0;
double damping = 0.85;
ghostVel[j] = ghostVel[j].add(diff.multiply(spring * dt)).multiply(Math.pow(damping, dt * 60));
ghostPos[j] = ghostPos[j].add(ghostVel[j].multiply(dt * 60));
if (trails[j].isEmpty() || trails[j].get(0).distanceTo(ghostPos[j]) > 0.015) {
trails[j].add(0, ghostPos[j]);
while (trails[j].size() > trailLength) {
trails[j].remove(trails[j].size() - 1);
}
}
Color baseColor = (j == 0) ? UIColors.primary() :
(j == 1) ? UIColors.secondary() :
blendColors(UIColors.primary(), UIColors.secondary(), 0.5f);
Color brightness = blendColors(baseColor, Color.WHITE, 0.4f);
for (int i = 0; i < trails[j].size(); i++) {
Vec3d p = trails[j].get(i);
float offset = 1.0f - (float) i / trailLength;
eventMatrices.push();
eventMatrices.translate(p.x - camera.getPos().x, p.y - camera.getPos().y, p.z - camera.getPos().z);
eventMatrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(-yaw));
eventMatrices.multiply(RotationAxis.POSITIVE_X.rotationDegrees(pitch));
Matrix4f matrix = eventMatrices.peek().getPositionMatrix();
float opacity = (float) Math.pow(offset, 1.5) * 0.85f;
int alpha = (int) (opacity * 255);
int color = (alpha << 24) | (brightness.getRed() << 16) | (brightness.getGreen() << 8) | brightness.getBlue();
float scale = SCALE_CACHE[Math.min((int) (offset * 100), 100)] * 0.65f;
buffer.vertex(matrix, -scale, scale, 0).texture(0f, 1f).color(color);
buffer.vertex(matrix, scale, scale, 0).texture(1f, 1f).color(color);
buffer.vertex(matrix, scale, -scale, 0).texture(1f, 0).color(color);
buffer.vertex(matrix, -scale, -scale, 0).texture(0f, 0).color(color);
eventMatrices.pop();
}
}
try {
BufferRenderer.drawWithGlobalProgram(buffer.end());
} catch (Exception ignored) {}
RenderSystem.depthMask(true);
RenderSystem.disableBlend();
RenderSystem.blendFunc(GlStateManager.SrcFactor.SRC_ALPHA, GlStateManager.DstFactor.ONE_MINUS_SRC_ALPHA);
}
private double interpolate(double prev, double current, float delta) {
return prev + (current - prev) * delta;
}
private Color blendColors(Color c1, Color c2, float ratio) {
int r = (int) (c1.getRed() * (1 - ratio) + c2.getRed() * ratio);
int g = (int) (c1.getGreen() * (1 - ratio) + c2.getGreen() * ratio);
int b = (int) (c1.getBlue() * (1 - ratio) + c2.getBlue() * ratio);
int a = (int) (c1.getAlpha() * (1 - ratio) + c2.getAlpha() * ratio);
return new Color(r, g, b, a);
}
}