Начинающий
- Статус
- Оффлайн
- Регистрация
- 21 Фев 2024
- Сообщения
- 167
- Реакции
- 1
- Выберите загрузчик игры
- Vanilla
Дарова всем сразу скажу почти всё чат гпт делал я только вставил но так это BackTrack Celestial 1.12.2 вроде работают но они хуйня как по мне
Ну както так база Excellent Omni
Пожалуйста, авторизуйтесь для просмотра ссылки.
(noad)
BackTrack:
package org.sheluvparis.excellent.client.impl.feature.impl.combat;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.network.play.client.CConfirmTransactionPacket;
import net.minecraft.util.math.vector.Vector3d;
import org.sheluvparis.common.events.orbit.EventHandler;
import org.sheluvparis.excellent.client.Client;
import org.sheluvparis.excellent.client.events.other.PacketEvent;
import org.sheluvparis.excellent.client.events.player.UpdateEvent;
import org.sheluvparis.excellent.client.events.render.Render3DEvent;
import org.sheluvparis.excellent.client.impl.feature.Category;
import org.sheluvparis.excellent.client.impl.feature.Feature;
import org.sheluvparis.excellent.client.impl.feature.FeatureInfo;
import org.sheluvparis.excellent.client.impl.settings.impl.BooleanSetting;
import org.sheluvparis.excellent.client.impl.settings.impl.SliderSetting;
import org.sheluvparis.excellent.client.util.other.BackEntityCord;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
@FeatureInfo(name = "BackTrack", category = Category.COMBAT)
public class BackTrack extends Feature {
// Настройки
public final SliderSetting range = new SliderSetting("Range", 5.0f, 1.0f, 20.0f, 1.0f);
public final SliderSetting alpha = new SliderSetting("Alpha", 0.3f, 0.1f, 1.0f, 0.05f);
public final BooleanSetting onlyTarget = new BooleanSetting("Only Target", true);
public final BooleanSetting visual = new BooleanSetting("Visual", true);
// Packet Delay настройки (опционально)
public final BooleanSetting packetDelay = new BooleanSetting("Packet Delay", false);
public final SliderSetting delayChance = new SliderSetting("Delay Chance", 0.2f, 0f, 1f, 0.05f)
.visible(() -> packetDelay.get());
// Основные данные
public static final List<BackEntityCord> backEntityCoords = new ArrayList<>();
private PlayerEntity currentTarget = null;
// Для packet delay
private final Map<Integer, Short> lastTransactionUids = new HashMap<>();
private final Set<String> processedTransactions = new HashSet<>();
private final Random random = new Random();
// Для predictive backtrack
private final Map<Integer, CircularBuffer<Vector3d>> positionHistory = new ConcurrentHashMap<>();
private static class CircularBuffer<T> {
private final T[] buffer;
private int head = 0;
private int size = 0;
@SuppressWarnings("unchecked")
public CircularBuffer(int capacity) {
buffer = (T[]) new Object[capacity];
}
public void add(T item) {
buffer[head] = item;
head = (head + 1) % buffer.length;
if (size < buffer.length) size++;
}
public T get(int index) {
if (index < 0 || index >= size) return null;
int actualIndex = (head - size + index + buffer.length) % buffer.length;
return buffer[actualIndex];
}
public int size() { return size; }
}
@Override
public void onEnable() {
backEntityCoords.clear();
positionHistory.clear();
lastTransactionUids.clear();
processedTransactions.clear();
currentTarget = null;
}
@Override
public void onDisable() {
backEntityCoords.clear();
positionHistory.clear();
lastTransactionUids.clear();
processedTransactions.clear();
currentTarget = null;
}
@EventHandler
public void onUpdate(UpdateEvent event) {
if (mc.world == null || mc.player == null) return;
// Находим цель из Aura
AttackAura aura = Client.inst().featureManager().attackAura;
PlayerEntity target = aura != null ? (PlayerEntity) aura.target() : null;
// Обновляем историю позиций для всех игроков
updatePositionHistory();
// Если включен onlyTarget
if (onlyTarget.get()) {
if (target != null && target != currentTarget) {
backEntityCoords.clear();
currentTarget = target;
backEntityCoords.add(new BackEntityCord(target));
} else if (target == null) {
backEntityCoords.clear();
currentTarget = null;
}
} else {
// Обновляем BackEntityCord для всех игроков
updateAllPlayers();
}
// Обновляем данные BackTrack
backEntityCoords.forEach(BackEntityCord::tick);
}
private void updatePositionHistory() {
for (PlayerEntity player : mc.world.getPlayers()) {
if (player == mc.player || !player.isAlive()) continue;
CircularBuffer<Vector3d> buffer = positionHistory.computeIfAbsent(
player.getEntityId(),
k -> new CircularBuffer<>(range.get().intValue())
);
buffer.add(player.getPositionVec());
}
}
private void updateAllPlayers() {
backEntityCoords.removeIf(coord ->
coord.entity == null ||
!coord.entity.isAlive() ||
coord.entity.removed
);
for (PlayerEntity player : mc.world.getPlayers()) {
if (player == mc.player || !player.isAlive() || player.getHealth() <= 0.0f) {
continue;
}
boolean exists = false;
for (BackEntityCord coord : backEntityCoords) {
if (coord.entity.getEntityId() == player.getEntityId()) {
exists = true;
break;
}
}
if (!exists) {
backEntityCoords.add(new BackEntityCord(player));
}
}
}
@EventHandler
public void onRender(Render3DEvent event) {
if (!visual.get() || mc.world == null) return;
// Рендерим BackTrack позиции
for (BackEntityCord cord : backEntityCoords) {
if (cord.entity != null && cord.entity.isAlive()) {
cord.renderPositions(alpha.get());
}
}
}
@EventHandler
public void onPacket(PacketEvent e) {
if (!enabled() || !packetDelay.get()) return;
// Безопасная задержка Transaction пакетов
if (e.getPacket() instanceof CConfirmTransactionPacket) {
handleTransactionPacket((CConfirmTransactionPacket) e.getPacket(), e);
}
}
private void handleTransactionPacket(CConfirmTransactionPacket packet, PacketEvent e) {
// 1. Пропускаем окно 0 (инвентарь игрока)
if (packet.getWindowId() == 0) return;
// 2. Проверяем UID
short uid = packet.getUid();
int windowId = packet.getWindowId();
String key = windowId + "_" + uid;
if (processedTransactions.contains(key)) {
return; // Уже обработан
}
// 3. Проверяем порядок (для обхода TransactionOrder детекта)
short lastUid = lastTransactionUids.getOrDefault(windowId, (short)-1);
// Если UID не следующий по порядку - не задерживаем
if (uid != lastUid + 1 && lastUid != -1) {
// Отправляем сразу без задержки
lastTransactionUids.put(windowId, uid);
processedTransactions.add(key);
return;
}
// 4. Задерживаем с шансом
if (random.nextFloat() < delayChance.get()) {
e.cancel();
// Маленькая случайная задержка
int delayMs = 30 + random.nextInt(40); // 30-70ms
// Отправляем с задержкой
new Thread(() -> {
try {
Thread.sleep(delayMs);
} catch (InterruptedException ignored) {}
if (mc.player != null && mc.player.connection != null) {
mc.player.connection.sendPacket(packet);
processedTransactions.add(key);
}
}).start();
lastTransactionUids.put(windowId, uid);
} else {
// Отправляем сразу
lastTransactionUids.put(windowId, uid);
processedTransactions.add(key);
}
// Очистка старых записей
if (processedTransactions.size() > 50) {
processedTransactions.clear();
}
}
// Методы для доступа из других модулей
public static BackEntityCord getBackEntityCord(Entity entity) {
if (entity == null) return null;
for (BackEntityCord cord : backEntityCoords) {
if (cord.entity != null && cord.entity.getEntityId() == entity.getEntityId()) {
return cord;
}
}
return null;
}
public BackEntityCord getCurrentTargetCord() {
if (currentTarget == null) return null;
return getBackEntityCord(currentTarget);
}
public Vector3d getBackTrackPosition(Entity entity, int ticksBack) {
if (entity == null) return null;
// Получаем из истории позиций
CircularBuffer<Vector3d> buffer = positionHistory.get(entity.getEntityId());
if (buffer == null || buffer.size() == 0) {
return entity.getPositionVec();
}
// Берем позицию от ticksBack тиков назад
int index = Math.max(0, buffer.size() - 1 - ticksBack);
Vector3d pos = buffer.get(index);
return pos != null ? pos : entity.getPositionVec();
}
public Vector3d getBestBackTrackPosition(Entity entity) {
BackEntityCord cord = getBackEntityCord(entity);
if (cord == null || cord.positions.isEmpty()) {
return entity.getPositionVec();
}
// Находим ближайшую позицию к игроку
Vector3d bestPos = null;
double bestDistance = Double.MAX_VALUE;
for (BackEntityCord.Point point : cord.positions) {
double distance = mc.player.getDistanceSq(point.vec3d.x, point.vec3d.y, point.vec3d.z);
if (distance < bestDistance) {
bestDistance = distance;
bestPos = point.vec3d;
}
}
return bestPos != null ? bestPos : entity.getPositionVec();
}
// Метод для AttackAura чтобы атаковать с BackTrack
public boolean attackWithBackTrack(PlayerEntity target) {
if (!enabled() || target == null) return false;
BackEntityCord cord = getBackEntityCord(target);
if (cord != null && !cord.positions.isEmpty()) {
// Атакуем по самой старой позиции
Vector3d backTrackPos = cord.positions.get(0).vec3d;
// Сохраняем оригинальную позицию
Vector3d originalPos = target.getPositionVec();
try {
// Временно перемещаем цель
target.setPosition(backTrackPos.x, backTrackPos.y, backTrackPos.z);
// Атакуем
if (mc.playerController != null) {
mc.playerController.attackEntity(mc.player, target);
return true;
}
} finally {
// Возвращаем на место
target.setPosition(originalPos.x, originalPos.y, originalPos.z);
}
}
return false;
}
// Статический метод для получения позиции
public static Vector3d getNearestPosition(BackEntityCord entityCoord) {
if (entityCoord == null || entityCoord.positions.isEmpty()) {
return entityCoord != null ? entityCoord.entity.getPositionVec() : Vector3d.ZERO;
}
return entityCoord.positions.stream()
.min(Comparator.comparingDouble(p ->
p.vec3d.distanceTo(mc.player.getPositionVec())
))
.map(p -> p.vec3d)
.orElse(entityCoord.entity.getPositionVec());
}
}
BackEntityCord:
package org.sheluvparis.excellent.client.util.other;
import net.blaze3d.matrix.MatrixStack;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.player.ClientPlayerEntity;
import net.minecraft.client.multiplayer.PlayerController;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.entity.EntityRenderer;
import net.minecraft.client.renderer.entity.LivingRenderer;
import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.EntityRayTraceResult;
import net.minecraft.util.math.vector.Vector3d;
import org.lwjgl.opengl.GL11;
import org.sheluvparis.excellent.client.Client;
import org.sheluvparis.excellent.client.impl.feature.impl.combat.AttackAura;
import org.sheluvparis.excellent.client.impl.feature.impl.combat.BackTrack;
import org.sheluvparis.excellent.client.util.color.ColorUtil;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
public class BackEntityCord {
public Entity entity;
private FakePlayer backtarack;
private Vector3d pos;
public List<Point> positions;
private final Minecraft mc;
public BackEntityCord(Entity entityCoord) {
this.positions = new ArrayList<>();
this.mc = Minecraft.getInstance();
this.entity = entityCoord;
}
public void tick() {
if (this.entity instanceof ClientPlayerEntity || this.entity == null || !this.entity.isAlive()) {
return;
}
// Добавляем новую позицию если игрок двигался
if (Math.abs(this.entity.getPosX() - this.entity.prevPosX) > 0.001 ||
Math.abs(this.entity.getPosZ() - this.entity.prevPosZ) > 0.001 ||
Math.abs(this.entity.getPosY() - this.entity.prevPosY) > 0.001) {
Vector3d currentPos = this.entity.getPositionVec();
final Point p = new Point(currentPos.add(0, 0.0, 0));
p.yaw = (int) this.entity.rotationYaw;
this.positions.add(p);
}
// Ограничиваем по Range
BackTrack module = Client.inst().featureManager().backTrack;
if (module != null) {
int maxPositions = module.range.get().intValue();
// Удаляем старые позиции если превысили лимит
while (this.positions.size() > maxPositions) {
this.positions.remove(0);
}
// Удаляем устаревшие
this.positions.removeIf(point -> point.ticks > maxPositions * 2);
// Обновляем таймеры
this.positions.forEach(Point::update);
}
}
private void addFakePlayer() {
AttackAura aura = Client.inst().featureManager().attackAura;
pos = AttackAura.getBackTrackPosition(aura.target);
entity = new FakePlayer(-1);
entity.copyLocationAndAnglesFrom(aura.target);
backtarack.rotationYawHead = aura.target.rotationYawHead;
backtarack.rotationPitchHead = aura.target.rotationPitchHead;
mc.world.addEntity(-1, entity);
}
public void renderPositions(float alpha) {
if (this.positions.isEmpty() || this.entity == null || !this.entity.isAlive()) return;
// Временно отключаем ShaderESP если нужно
boolean wasShaderEspEnabled = false;
try {
for (int i = 0; i < this.positions.size(); i++) {
Point pos = this.positions.get(i);
// Рассчитываем прозрачность (чем старее - тем прозрачнее)
float positionAlpha = alpha * (1.0f - (float)i / this.positions.size());
// Рендерим позицию
renderPosition((LivingEntity) entity, positionAlpha);
}
} finally {
// Восстанавливаем ShaderESP
if (wasShaderEspEnabled && Client.inst().featureManager().shaderEsp != null) {
Client.inst().featureManager().shaderEsp.setEnabled(true);
}
}
}
private void renderPosition(LivingEntity entity, float yaw) {
// Рисуем простой куб вместо полной модели
float width = entity.getWidth() * 0.5f;
float height = entity.getHeight();
GL11.glBegin(GL11.GL_QUADS);
// Передняя грань
GL11.glVertex3f(-width, 0, -width);
GL11.glVertex3f(width, 0, -width);
GL11.glVertex3f(width, height, -width);
GL11.glVertex3f(-width, height, -width);
// Задняя грань
GL11.glVertex3f(-width, 0, width);
GL11.glVertex3f(width, 0, width);
GL11.glVertex3f(width, height, width);
GL11.glVertex3f(-width, height, width);
// Боковые грани
GL11.glVertex3f(-width, 0, -width);
GL11.glVertex3f(-width, 0, width);
GL11.glVertex3f(-width, height, width);
GL11.glVertex3f(-width, height, -width);
GL11.glVertex3f(width, 0, -width);
GL11.glVertex3f(width, 0, width);
GL11.glVertex3f(width, height, width);
GL11.glVertex3f(width, height, -width);
GL11.glEnd();
}
// Метод для атаки по BackTrack позиции
public void click() {
if (!this.entity.isAlive() || this.positions.isEmpty()) return;
// Берем самую старую позицию (позади игрока)
Point backPosition = this.positions.get(0);
Vector3d src = mc.player.getEyePosition(mc.getRenderPartialTicks());
Vector3d lookVec = mc.player.getLookVec();
Vector3d dest = src.add(lookVec.x * 3.1, lookVec.y * 3.1, lookVec.z * 3.1);
AxisAlignedBB bb = new AxisAlignedBB(
backPosition.vec3d.x + 0.2, backPosition.vec3d.y, backPosition.vec3d.z + 0.2,
backPosition.vec3d.x + 0.8, backPosition.vec3d.y + 1.8, backPosition.vec3d.z + 0.8
);
Optional<Vector3d> hitResult = bb.rayTrace(src, dest);
if (hitResult.isPresent() && mc.playerController != null) {
// Сохраняем оригинальную позицию
Vector3d originalPos = this.entity.getPositionVec();
try {
// Временно телепортируем цель на BackTrack позицию
this.entity.setPosition(backPosition.vec3d.x, backPosition.vec3d.y, backPosition.vec3d.z);
// Атакуем
mc.playerController.attackEntity(mc.player, this.entity);
} finally {
// Возвращаем на оригинальную позицию
this.entity.setPosition(originalPos.x, originalPos.y, originalPos.z);
}
}
}
public static class Point {
public Vector3d vec3d;
public int ticks;
public int yaw;
public Point(Vector3d vec3d) {
this.vec3d = vec3d;
this.ticks = 0;
}
public void update() {
this.ticks++;
}
}
}
Ну както так база Excellent Omni