Короче писал авто наводку на 1.21 наводила только ротацию попросил ии она сделала прицел вроде все норм было вчера сегодня захожу опять работает токо ротация просил ии код вроде тот а не работает короче вот
Java:
package tech.javelin.client.modules.impl.combat;
import com.darkmagician6.eventapi.EventTarget;
import com.mojang.blaze3d.systems.RenderSystem;
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.LivingEntity;
import net.minecraft.entity.decoration.ArmorStandEntity;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d;
import org.joml.Matrix4f;
import org.joml.Vector4d;
import tech.javelin.base.events.impl.player.EventUpdate;
import tech.javelin.base.events.impl.render.EventRender2D;
import tech.javelin.client.modules.api.Category;
import tech.javelin.client.modules.api.Module;
import tech.javelin.client.modules.api.ModuleAnnotation;
import tech.javelin.client.modules.api.setting.impl.BooleanSetting;
import tech.javelin.client.modules.api.setting.impl.ColorSetting;
import tech.javelin.client.modules.api.setting.impl.NumberSetting;
import tech.javelin.utility.math.ProjectionUtil;
import tech.javelin.utility.render.display.base.color.ColorRGBA;
@ModuleAnnotation(
name = "AimAssist",
category = Category.COMBAT,
description = "Аим срабатывает при касании кругом хитбокса"
)
public class AimAssist extends Module {
public static final AimAssist INSTANCE = new AimAssist();
public final BooleanSetting player = new BooleanSetting("Игроки", true);
public final BooleanSetting onlyAttack = new BooleanSetting("Только при атаке", true);
public final NumberSetting speed = new NumberSetting("Скорость", 0.4f, 0.02f, 2.0f, 0.02f);
public final NumberSetting range = new NumberSetting("Дальность", 4.5f, 2.0f, 8.0f, 0.1f);
public final NumberSetting fov = new NumberSetting("FOV", 100.0f, 10.0f, 500.0f, 5.0f);
public final BooleanSetting drawFov = new BooleanSetting("Рисовать FOV", true);
public final NumberSetting points = new NumberSetting("Точек круга", 30.0f, 3.0f, 100.0f, 1.0f);
public final NumberSetting thickness = new NumberSetting("Толщина", 2.0f, 1.0f, 10.0f, 0.5f);
public final ColorSetting fovColor = new ColorSetting("Цвет FOV", new ColorRGBA(255, 255, 255, 255));
public LivingEntity target;
public AimAssist() {
getSettings().add(player);
getSettings().add(onlyAttack);
getSettings().add(speed);
getSettings().add(range);
getSettings().add(fov);
getSettings().add(drawFov);
getSettings().add(points);
getSettings().add(thickness);
getSettings().add(fovColor);
}
@EventTarget
public void onUpdate(EventUpdate eventUpdate) {
if (mc.player == null) return;
updateTarget();
boolean isAttacking = !onlyAttack.isEnabled() || mc.options.attackKey.isPressed();
if (isAttacking && target != null && isValidTarget(target)) {
Vec3d targetPos = target.getPos().add(0, MathHelper.clamp(mc.player.getEyePos().y - target.getY(), 0.5, target.getHeight() * 0.8), 0);
Vec3d vec = targetPos.subtract(mc.player.getEyePos()).normalize();
float targetYaw = (float) Math.toDegrees(Math.atan2(-vec.x, vec.z));
float currentYaw = mc.player.getYaw();
mc.player.setYaw(applyGCD(currentYaw + MathHelper.wrapDegrees(targetYaw - currentYaw) * (speed.getCurrent() * 0.5f), currentYaw));
}
}
@EventTarget
public void onRender2D(EventRender2D e) {
if (mc.player == null || !drawFov.isEnabled()) return;
MatrixStack ms = e.getContext().getMatrices();
float cx = (float) mc.getWindow().getScaledWidth() / 2f;
float cy = (float) mc.getWindow().getScaledHeight() / 2f;
float baseRadius = fov.getCurrent();
float thick = thickness.getCurrent();
ColorRGBA color = fovColor.getColor();
int segments = (int) points.getCurrent();
// Настройка рендера для максимальной яркости
RenderSystem.enableBlend();
RenderSystem.defaultBlendFunc();
RenderSystem.setShader(ShaderProgramKeys.POSITION_COLOR);
RenderSystem.disableDepthTest();
Tessellator tess = Tessellator.getInstance();
Matrix4f mat = ms.peek().getPositionMatrix();
// Рисуем круг. Для жирности используем очень плотный шаг смещения
for (float j = 0; j < thick; j += 0.2f) {
float r = baseRadius + (j - thick / 2f);
BufferBuilder buffer = tess.begin(VertexFormat.DrawMode.DEBUG_LINE_STRIP, VertexFormats.POSITION_COLOR);
for (int i = 0; i <= segments; i++) {
double angle = i * (Math.PI * 2) / segments;
// vertex(mat, x, y, z)
buffer.vertex(mat, cx + (float)(Math.cos(angle) * r), cy + (float)(Math.sin(angle) * r), 0)
.color(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha());
}
BufferRenderer.drawWithGlobalProgram(buffer.end());
}
RenderSystem.enableDepthTest();
RenderSystem.disableBlend();
}
private void updateTarget() {
LivingEntity bestTarget = null;
double minDistanceToCircle = Double.MAX_VALUE;
float cx = (float) mc.getWindow().getScaledWidth() / 2f;
float cy = (float) mc.getWindow().getScaledHeight() / 2f;
float fovRadius = fov.getCurrent();
for (Entity entity : mc.world.getEntities()) {
if (!(entity instanceof LivingEntity living) || !isValidTarget(living)) continue;
// Используем твой утилитный класс ProjectionUtil для получения 2D координат
Vector4d rect = ProjectionUtil.getVector4D(living);
if (rect == null) continue;
// Логика "касания" кругом хитбокса
double closestX = MathHelper.clamp(cx, rect.x, rect.z);
double closestY = MathHelper.clamp(cy, rect.y, rect.w);
double diffX = cx - closestX;
double diffY = cy - closestY;
double dist = Math.sqrt(diffX * diffX + diffY * diffY);
if (dist <= fovRadius) {
if (dist < minDistanceToCircle) {
minDistanceToCircle = dist;
bestTarget = living;
}
}
}
target = bestTarget;
}
private boolean isValidTarget(LivingEntity entity) {
if (entity == null || entity == mc.player || !entity.isAlive() || entity instanceof ArmorStandEntity) return false;
return mc.player.distanceTo(entity) <= range.getCurrent() && mc.player.canSee(entity);
}
private float applyGCD(float targetYaw, float currentYaw) {
float f = mc.options.getMouseSensitivity().getValue().floatValue() * 0.6F + 0.2F;
float gcd = f * f * f * 8.0F * 0.15F;
return currentYaw + Math.round((targetYaw - currentYaw) / gcd) * gcd;
}
@Override
public void onEnable() { target = null; super.onEnable(); }
}
Последнее редактирование: