- Выберите загрузчик игры
- Vanilla
ss-
dw-ниже
сразу говорю нужно доработать а то есть мелкие баги
Пожалуйста, авторизуйтесь для просмотра ссылки.
dw-ниже
Java:
package babka.module.impl.render;
import babka.control.events.Event;
import babka.control.events.impl.player.EventJump;
import babka.control.events.impl.render.EventRender;
import babka.module.TypeList;
import babka.module.api.Annotation;
import babka.module.api.Module;
import babka.utils.render.ColorUtils;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.block.*;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import org.lwjgl.opengl.GL11;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@Annotation(name = "JumpEffect", type = TypeList.Render)
public class JumpEffect extends Module {
private final List<Wave> waves = new ArrayList<>();
private long lastJumpTime = 0;
public JumpEffect() {
}
@Override
public boolean onEvent(Event event) {
if (event instanceof EventJump) {
long now = System.currentTimeMillis();
if (now - lastJumpTime < 700) return false;
lastJumpTime = now;
if (mc.player == null || mc.world == null) return false;
if (waves.size() >= 4) {
waves.remove(0);
}
waves.add(new Wave(
(float) mc.player.getPosX(),
(float) mc.player.getPosY() + 0.05f,
(float) mc.player.getPosZ()
));
}
else if (event instanceof EventRender render && render.isRender3D()) {
if (waves.isEmpty()) return false;
renderWaves(render.matrixStack);
}
return false;
}
private void renderWaves(MatrixStack stack) {
Iterator<Wave> it = waves.iterator();
while (it.hasNext()) {
Wave wave = it.next();
wave.update();
if (wave.alpha <= 0.01f) {
it.remove();
continue;
}
wave.render(stack);
}
}
private class Wave {
final float centerX, centerY, centerZ;
float radius = 0.4f;
float alpha = 1.0f;
Wave(float x, float y, float z) {
this.centerX = x;
this.centerY = y;
this.centerZ = z;
}
void update() {
float speedMult = waves.size() > 3 ? 1.5f : 1.0f;
radius += 0.028f * speedMult;
alpha -= 0.0014f * speedMult;
if (alpha < 0) alpha = 0;
}
void render(MatrixStack stack) {
double viewX = mc.getRenderManager().info.getProjectedView().x;
double viewY = mc.getRenderManager().info.getProjectedView().y;
double viewZ = mc.getRenderManager().info.getProjectedView().z;
RenderSystem.pushMatrix();
RenderSystem.translated(-viewX, -viewY, -viewZ);
RenderSystem.enableBlend();
RenderSystem.defaultBlendFunc();
RenderSystem.disableTexture();
RenderSystem.disableCull();
RenderSystem.disableDepthTest();
RenderSystem.depthMask(false);
float progress = Math.min(1.0f, radius / 7.5f);
float fillAlphaBase = alpha * (0.55f - progress * 0.32f);
float lineAlpha = alpha * (1.05f - progress * 0.25f);
float lineWidth = 2.6f;
int ir = (int) (radius + 3.0f);
int startColor = ColorUtils.rgba(80, 255, 255, 220);
int endColor = ColorUtils.rgba(255, 80, 255, 220);
for (int dx = -ir; dx <= ir; dx++) {
for (int dz = -ir; dz <= ir; dz++) {
double dist = Math.sqrt(dx * dx + dz * dz);
if (dist > radius || dist < radius - 2.2f) continue;
for (int dy = -2; dy <= 2; dy++) {
BlockPos pos = new BlockPos(
MathHelper.floor(centerX) + dx,
MathHelper.floor(centerY) + dy,
MathHelper.floor(centerZ) + dz
);
BlockState state = mc.world.getBlockState(pos);
if (shouldSkipBlock(state)) continue;
AxisAlignedBB bb = new AxisAlignedBB(
pos.getX() + 0.002, pos.getY() + 0.002, pos.getZ() + 0.002,
pos.getX() + 0.998, pos.getY() + 0.998, pos.getZ() + 0.998
);
float waveT = (float) (dist / radius);
int baseColor = ColorUtils.interpolate(startColor, endColor, waveT);
float pulse = (float) Math.sin(dist * 0.45 + radius * 2.0 + dy * 0.9) * 0.3f + 0.7f;
float localFillA = fillAlphaBase * pulse;
if (dy <= 0) localFillA *= 0.18f;
if (dy <= -1) localFillA *= 0.1f;
if (localFillA > 0.03f) {
RenderSystem.color4f(
ColorUtils.red(baseColor) / 255f,
ColorUtils.green(baseColor) / 255f,
ColorUtils.blue(baseColor) / 255f,
localFillA
);
drawFilledBox(bb);
}
RenderSystem.enableDepthTest();
RenderSystem.depthMask(true);
GL11.glEnable(GL11.GL_LINE_SMOOTH);
GL11.glHint(GL11.GL_LINE_SMOOTH_HINT, GL11.GL_NICEST);
RenderSystem.lineWidth(lineWidth + (dy <= 0 ? 0.4f : 0f));
RenderSystem.color4f(
ColorUtils.red(baseColor) / 255f,
ColorUtils.green(baseColor) / 255f,
ColorUtils.blue(baseColor) / 255f,
lineAlpha * pulse * (dy <= 0 ? 1.15f : 1.0f)
);
drawOutlineBox(bb);
GL11.glDisable(GL11.GL_LINE_SMOOTH);
}
}
}
RenderSystem.enableCull();
RenderSystem.enableTexture();
RenderSystem.enableDepthTest();
RenderSystem.depthMask(true);
RenderSystem.disableBlend();
RenderSystem.popMatrix();
}
private boolean shouldSkipBlock(BlockState state) {
if (state.isAir()) return true;
Material mat = state.getMaterial();
if (mat == Material.PLANTS || mat == Material.LEAVES || mat == Material.CORAL) {
return true;
}
Block block = state.getBlock();
return block instanceof FlowerBlock ||
block instanceof TallGrassBlock ||
block instanceof DeadBushBlock ||
block instanceof SugarCaneBlock ||
block instanceof CactusBlock ||
block instanceof LilyPadBlock ||
block instanceof DoublePlantBlock ||
block instanceof VineBlock ||
block instanceof NetherSproutsBlock ||
block instanceof FungusBlock ||
block instanceof WeepingVinesBlock ||
block instanceof TwistingVinesBlock ||
block instanceof KelpBlock;
}
private void drawFilledBox(AxisAlignedBB bb) {
Tessellator tess = Tessellator.getInstance();
BufferBuilder buf = tess.getBuffer();
buf.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION);
buf.pos(bb.minX, bb.minY, bb.minZ).endVertex();
buf.pos(bb.maxX, bb.minY, bb.minZ).endVertex();
buf.pos(bb.maxX, bb.minY, bb.maxZ).endVertex();
buf.pos(bb.minX, bb.minY, bb.maxZ).endVertex();
buf.pos(bb.minX, bb.maxY, bb.minZ).endVertex();
buf.pos(bb.minX, bb.maxY, bb.maxZ).endVertex();
buf.pos(bb.maxX, bb.maxY, bb.maxZ).endVertex();
buf.pos(bb.maxX, bb.maxY, bb.minZ).endVertex();
buf.pos(bb.minX, bb.minY, bb.minZ).endVertex();
buf.pos(bb.minX, bb.maxY, bb.minZ).endVertex();
buf.pos(bb.maxX, bb.maxY, bb.minZ).endVertex();
buf.pos(bb.maxX, bb.minY, bb.minZ).endVertex();
buf.pos(bb.minX, bb.minY, bb.maxZ).endVertex();
buf.pos(bb.maxX, bb.minY, bb.maxZ).endVertex();
buf.pos(bb.maxX, bb.maxY, bb.maxZ).endVertex();
buf.pos(bb.minX, bb.maxY, bb.maxZ).endVertex();
buf.pos(bb.minX, bb.minY, bb.minZ).endVertex();
buf.pos(bb.minX, bb.minY, bb.maxZ).endVertex();
buf.pos(bb.minX, bb.maxY, bb.maxZ).endVertex();
buf.pos(bb.minX, bb.maxY, bb.minZ).endVertex();
buf.pos(bb.maxX, bb.minY, bb.minZ).endVertex();
buf.pos(bb.maxX, bb.maxY, bb.minZ).endVertex();
buf.pos(bb.maxX, bb.maxY, bb.maxZ).endVertex();
buf.pos(bb.maxX, bb.minY, bb.maxZ).endVertex();
tess.draw();
}
private void drawOutlineBox(AxisAlignedBB bb) {
Tessellator tess = Tessellator.getInstance();
BufferBuilder buf = tess.getBuffer();
buf.begin(GL11.GL_LINES, DefaultVertexFormats.POSITION);
buf.pos(bb.minX, bb.minY, bb.minZ).endVertex(); buf.pos(bb.maxX, bb.minY, bb.minZ).endVertex();
buf.pos(bb.maxX, bb.minY, bb.minZ).endVertex(); buf.pos(bb.maxX, bb.minY, bb.maxZ).endVertex();
buf.pos(bb.maxX, bb.minY, bb.maxZ).endVertex(); buf.pos(bb.minX, bb.minY, bb.maxZ).endVertex();
buf.pos(bb.minX, bb.minY, bb.maxZ).endVertex(); buf.pos(bb.minX, bb.minY, bb.minZ).endVertex();
buf.pos(bb.minX, bb.maxY, bb.minZ).endVertex(); buf.pos(bb.maxX, bb.maxY, bb.minZ).endVertex();
buf.pos(bb.maxX, bb.maxY, bb.minZ).endVertex(); buf.pos(bb.maxX, bb.maxY, bb.maxZ).endVertex();
buf.pos(bb.maxX, bb.maxY, bb.maxZ).endVertex(); buf.pos(bb.minX, bb.maxY, bb.maxZ).endVertex();
buf.pos(bb.minX, bb.maxY, bb.maxZ).endVertex(); buf.pos(bb.minX, bb.maxY, bb.minZ).endVertex();
buf.pos(bb.minX, bb.minY, bb.minZ).endVertex(); buf.pos(bb.minX, bb.maxY, bb.minZ).endVertex();
buf.pos(bb.maxX, bb.minY, bb.minZ).endVertex(); buf.pos(bb.maxX, bb.maxY, bb.minZ).endVertex();
buf.pos(bb.maxX, bb.minY, bb.maxZ).endVertex(); buf.pos(bb.maxX, bb.maxY, bb.maxZ).endVertex();
buf.pos(bb.minX, bb.minY, bb.maxZ).endVertex(); buf.pos(bb.minX, bb.maxY, bb.maxZ).endVertex();
tess.draw();
}
}
}
