Начинающий
- Статус
- Оффлайн
- Регистрация
- 3 Янв 2025
- Сообщения
- 139
- Реакции
- 3
Java:
package im.expensive.functions.impl.render;
import com.google.common.eventbus.Subscribe;
import com.mojang.blaze3d.platform.GlStateManager;
import im.expensive.events.EventDisplay;
import im.expensive.functions.api.Category;
import im.expensive.functions.api.Function;
import im.expensive.functions.api.FunctionRegister;
import im.expensive.utils.math.Vector4i;
import im.expensive.utils.projections.ProjectionUtil;
import im.expensive.utils.render.ColorUtils;
import im.expensive.utils.render.DisplayUtils;
import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.vector.Vector2f;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.client.Minecraft;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.util.math.EntityRayTraceResult;
import net.minecraft.client.gui.screen.ChatScreen;
@FunctionRegister(name = "TargetESP", type = Category.Render)
public class TargetESP extends Function {
private LivingEntity target;
private final Minecraft mc = Minecraft.getInstance();
private boolean allow = false;
private final Stopwatch stopWatch = new Stopwatch();
public TargetESP() {}
@Subscribe
private void onDisplay(EventDisplay e) {
if (e.getType() != EventDisplay.Type.PRE) {
return;
}
target = getTarget(null);
if (allow && target != null) {
double sin = Math.sin(System.currentTimeMillis() / 1000.0);
float size = 150.0F;
Vector3d interpolated = target.getPositionVec();
Vector2f pos = ProjectionUtil.project(interpolated.x, interpolated.y + target.getHeight() / 2f, interpolated.z);
GlStateManager.pushMatrix();
GlStateManager.translatef(pos.x, pos.y, 0);
GlStateManager.rotatef((float) sin * 360, 0, 0, 1);
GlStateManager.translatef(-pos.x, -pos.y, 0);
DisplayUtils.drawImage(new ResourceLocation("expensive/images/target.png"), pos.x - size / 2f, pos.y - size / 2f, size, size, new Vector4i(
ColorUtils.setAlpha(HUD.getColor(0, 1), 220),
ColorUtils.setAlpha(HUD.getColor(90, 1), 220),
ColorUtils.setAlpha(HUD.getColor(180, 1), 220),
ColorUtils.setAlpha(HUD.getColor(270, 1), 220)
));
GlStateManager.popMatrix();
}
}
private LivingEntity getTarget(LivingEntity nullTarget) {
RayTraceResult rayTraceResult = mc.objectMouseOver;
LivingEntity newTarget = nullTarget;
if (rayTraceResult != null && rayTraceResult.getType() == RayTraceResult.Type.ENTITY) {
Entity entityHit = ((EntityRayTraceResult) rayTraceResult).getEntity();
if (entityHit instanceof LivingEntity) {
newTarget = (LivingEntity) entityHit;
if (target != newTarget) {
target = newTarget;
stopWatch.reset();
allow = true;
}
}
} else if (target != null && stopWatch.getElapsedTime() <= 3000) {
double distanceToTarget = mc.player.getDistance(target);
if (distanceToTarget <= 4) {
newTarget = target;
} else {
target = null;
allow = false;
}
} else if (stopWatch.getElapsedTime() > 3000) {
target = null;
allow = false;
} else if (mc.currentScreen instanceof ChatScreen) {
newTarget = mc.player;
stopWatch.reset();
allow = true;
} else {
target = null;
allow = false;
}
return newTarget;
}
// Метод для отслеживания наведений на сущность
public void onTick() {
target = getTarget(null);
}
private static class Stopwatch {
private long startTime;
public Stopwatch() {
reset();
}
public void reset() {
startTime = System.currentTimeMillis();
}
public long getElapsedTime() {
return System.currentTimeMillis() - startTime;
}
}
}