- Выберите загрузчик игры
- Fabric
Всем привет, прикольная штучка, знаю что она итак была в этой базе, но баганная + не рабочая
Перенести принципе можно
Перенести принципе можно
Пожалуйста, авторизуйтесь для просмотра ссылки.
wexside(((:
package fun.rich.features.impl.render;
import fun.rich.events.player.AttackEvent;
import fun.rich.events.render.WorldRenderEvent;
import fun.rich.features.module.Module;
import fun.rich.features.module.ModuleCategory;
import fun.rich.utils.client.Instance;
import fun.rich.utils.client.managers.event.EventHandler;
import fun.rich.utils.display.color.ColorAssist;
import fun.rich.utils.display.geometry.Render3D;
import lombok.AccessLevel;
import lombok.experimental.FieldDefaults;
import net.minecraft.block.BlockState;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.shape.VoxelShape;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@FieldDefaults(level = AccessLevel.PRIVATE)
public class HitEffect extends Module {
public static HitEffect getInstance() {
return Instance.get(HitEffect.class);
}
final List<WaveEffect> waveEffects = new ArrayList<>();
public HitEffect() {
super("HitEffect", "Hit Effect", ModuleCategory.RENDER);
}
@EventHandler
public void onAttack(AttackEvent e) {
if (e.getEntity() == null) return;
Vec3d pos = e.getEntity().getPos();
BlockPos basePos = BlockPos.ofFloored(pos.x, pos.y - 0.1, pos.z);
addWave(basePos);
}
public void addWave(BlockPos pos) {
if (mc.world != null) {
waveEffects.add(new WaveEffect(pos, System.currentTimeMillis()));
}
}
@EventHandler
public void onWorldRender(WorldRenderEvent e) {
if (waveEffects.isEmpty() || mc.world == null) return;
Iterator<WaveEffect> iterator = waveEffects.iterator();
while (iterator.hasNext()) {
WaveEffect wave = iterator.next();
if (wave.isExpired()) {
iterator.remove();
continue;
}
wave.render();
}
}
private class WaveEffect {
private final BlockPos centerPos;
private final long startTime;
private final long duration = 1500;
private final int maxRadius = 12;
public WaveEffect(BlockPos centerPos, long startTime) {
this.centerPos = centerPos;
this.startTime = startTime;
}
public boolean isExpired() {
return System.currentTimeMillis() - startTime > duration;
}
public void render() {
if (mc.world == null) return;
long elapsed = System.currentTimeMillis() - startTime;
float progress = (float) elapsed / duration;
float currentRadius = progress * maxRadius;
float waveWidth = 2.5f;
float globalAlpha = (float) Math.pow(1.0f - progress, 0.6);
int rendered = 0;
int maxPerFrame = 400;
float minRadSq = (currentRadius - waveWidth) * (currentRadius - waveWidth);
float maxRadSq = (currentRadius + 0.5f) * (currentRadius + 0.5f);
int clientColor = ColorAssist.getClientColor();
for (int x = -maxRadius; x <= maxRadius; x++) {
for (int z = -maxRadius; z <= maxRadius; z++) {
if (rendered >= maxPerFrame) return;
float distSq = x * x + z * z;
if (distSq < minRadSq || distSq > maxRadSq) continue;
BlockPos checkPos = centerPos.add(x, 0, z);
BlockPos renderPos = findSurface(checkPos);
if (renderPos == null) continue;
BlockState state = mc.world.getBlockState(renderPos);
VoxelShape shape = state.getOutlineShape(mc.world, renderPos);
if (shape.isEmpty()) continue;
rendered++;
float distance = (float) Math.sqrt(distSq);
float localAlpha = 1.0f - Math.abs(distance - currentRadius) / waveWidth;
localAlpha = Math.max(0, Math.min(1, localAlpha)) * globalAlpha;
if (localAlpha > 0.05f) {
int color = ColorAssist.setAlpha(clientColor, (int) (localAlpha * 255));
float lineWidth = 1.0f + (localAlpha * 2.5f);
try {
Render3D.drawShapeAlternative(
renderPos,
shape,
color,
lineWidth,
true,
true
);
} catch (Exception ignored) {
}
}
}
}
}
private BlockPos findSurface(BlockPos pos) {
for (int y = 2; y >= -4; y--) {
BlockPos p = pos.up(y);
if (!mc.world.getBlockState(p).isAir() && mc.world.getBlockState(p.up()).isAir()) {
return p;
}
}
return null;
}
}
}
