- Выберите загрузчик игры
- Vanilla
- Forge
Привет, в дельту уже добнули и прошло время так что сливаю. Летает по кордам фт ищет игроков и записывает корды ник в блокнот на рабочем столе, можете доделать чтобы прям на экране показывало
СС снизу будет
Удачного пользования ☺
СС снизу будет
package expensive.modules.impl.misc;
import expensive.modules.api.Category;
import expensive.modules.api.Function;
import expensive.modules.api.FunctionRegister;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.inventory.EquipmentSlotType;
import net.minecraft.inventory.container.ClickType;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.util.text.StringTextComponent;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.*;
@FunctionRegister(name = "PlayerFinder", type = Category.Misc)
public class PlayerFinder extends Function {
private final List<PlayerRecord> foundPlayers = new ArrayList<>();
private volatile boolean isScanning = false;
private BlockPos currentTarget;
private final int minCoord = -2500;
private final int maxCoord = 2500;
private final Random random = new Random();
private ScheduledExecutorService scheduler;
private ScheduledFuture<?> scanTask;
private boolean isFirstRun = true;
private long lastFireworkTime = 0;
private final int targetHeight = 120;
private final int fireworkInterval = 5000;
private boolean reachedTargetHeight = false;
private long startTime;
private boolean elytraEquipped = false;
private boolean isWaitingForElytra = false;
private static class PlayerRecord {
final String name;
final BlockPos position;
final Date foundTime;
PlayerRecord(String name, BlockPos position) {
this.name = name;
this.position = position;
this.foundTime = new Date();
}
}
@Override
public void onEnable() {
super.onEnable();
if (isScanning) return;
foundPlayers.clear();
isScanning = true;
isFirstRun = true;
reachedTargetHeight = false;
elytraEquipped = false;
isWaitingForElytra = false;
startTime = System.currentTimeMillis();
scheduler = Executors.newSingleThreadScheduledExecutor();
scanTask = scheduler.scheduleAtFixedRate(() -> {
try {
if (!isScanning || mc.player == null || mc.world == null) return;
if (!elytraEquipped) {
if (!hasElytraEquipped()) {
if (!isWaitingForElytra) {
equipElytra();
isWaitingForElytra = true;
startTime = System.currentTimeMillis();
}
return;
} else {
elytraEquipped = true;
startTime = System.currentTimeMillis();
sendMessage("§a[PlayerFinder] Элитра надета, готовимся к взлету...");
return;
}
}
if (!mc.player.isElytraFlying() && mc.player.isOnGround()) {
mc.player.jump();
mc.player.jump();
return;
}
if (!reachedTargetHeight) {
climbToTargetHeight();
return;
}
checkForPlayers();
maintainAltitude();
avoidCollisions();
if (isFirstRun || currentTarget == null || isAtTarget()) {
isFirstRun = false;
setRandomTarget();
}
flyToTarget();
} catch (Exception e) {
e.printStackTrace();
sendMessage("§c[PlayerFinder] Ошибка: " + e.getMessage());
}
}, 0, 50, TimeUnit.MILLISECONDS);
sendMessage("§a[PlayerFinder] Сканирование начато. Проверка элитры...");
}
@Override
public void onDisable() {
super.onDisable();
if (!isScanning) return;
isScanning = false;
try {
if (scanTask != null) {
scanTask.cancel(true);
}
saveResultsToFile();
if (scheduler != null) {
scheduler.shutdownNow();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
scanTask = null;
scheduler = null;
currentTarget = null;
}
sendMessage("§c[PlayerFinder] Сканирование остановлено.");
}
private boolean hasElytraEquipped() {
ItemStack chestplate = mc.player.getItemStackFromSlot(EquipmentSlotType.CHEST);
return chestplate.getItem() == Items.ELYTRA && chestplate.getDamage() < chestplate.getMaxDamage() - 10;
}
private void equipElytra() {
ItemStack currentChestplate = mc.player.getItemStackFromSlot(EquipmentSlotType.CHEST);
boolean hasChestplate = !currentChestplate.isEmpty() && currentChestplate.getItem() != Items.ELYTRA;
for (int i = 0; i < mc.player.inventory.getSizeInventory(); i++) {
ItemStack stack = mc.player.inventory.getStackInSlot(i);
if (stack.getItem() == Items.ELYTRA && stack.getDamage() < stack.getMaxDamage() - 10) {
if (hasChestplate) {
int emptySlot = -1;
for (int j = 0; j < mc.player.inventory.getSizeInventory(); j++) {
if (mc.player.inventory.getStackInSlot(j).isEmpty()) {
emptySlot = j;
break;
}
}
if (emptySlot != -1) {
mc.playerController.windowClick(
mc.player.openContainer.windowId,
38,
emptySlot < 9 ? emptySlot + 36 : emptySlot,
ClickType.SWAP,
mc.player
);
}
}
mc.playerController.windowClick(
mc.player.openContainer.windowId,
i < 9 ? i + 36 : i,
38,
ClickType.SWAP,
mc.player
);
sendMessage("§a[PlayerFinder] Элитра надета автоматически");
return;
}
}
sendMessage("§c[PlayerFinder] В инвентаре нет пригодной элитры!");
super.onDisable();
}
private void climbToTargetHeight() {
if (mc.player.getPosY() < targetHeight) {
mc.player.rotationPitch = -45;
if (System.currentTimeMillis() - lastFireworkTime > 1000) {
useFirework();
lastFireworkTime = System.currentTimeMillis();
}
} else {
reachedTargetHeight = true;
mc.player.rotationPitch = 0;
sendMessage("§a[PlayerFinder] Достигнута нужная высота 120 блоков");
}
}
private void maintainAltitude() {
if (!mc.player.isElytraFlying()) return;
if (mc.player.getPosY() < targetHeight - 5) {
mc.player.rotationPitch = -15;
} else if (mc.player.getPosY() > targetHeight + 5) {
mc.player.rotationPitch = 5;
} else {
mc.player.rotationPitch = 0;
}
}
private void avoidCollisions() {
if (!mc.player.isElytraFlying()) return;
Vector3d lookVec = mc.player.getLookVec();
BlockPos checkPos = new BlockPos(
mc.player.getPosX() + lookVec.x * 15,
mc.player.getPosY() + lookVec.y * 15,
mc.player.getPosZ() + lookVec.z * 15
);
if (!mc.world.getBlockState(checkPos).isAir()) {
mc.player.rotationYaw += 45;
sendMessage("§e[PlayerFinder] Обход препятствия");
}
}
private boolean isAtTarget() {
if (mc.player == null || currentTarget == null) return true;
BlockPos playerPos = mc.player.getPosition();
return playerPos.withinDistance(currentTarget, 15);
}
private void setRandomTarget() {
int x = Math.min(maxCoord, Math.max(minCoord, random.nextInt(maxCoord - minCoord) + minCoord));
int z = Math.min(maxCoord, Math.max(minCoord, random.nextInt(maxCoord - minCoord) + minCoord));
currentTarget = new BlockPos(x, targetHeight, z);
sendMessage("§b[PlayerFinder] Летим к: X: " + x + " Z: " + z);
}
private void flyToTarget() {
if (currentTarget == null || !mc.player.isElytraFlying()) return;
Vector3d targetVec = Vector3d.copyCentered(currentTarget);
Vector3d playerVec = mc.player.getPositionVec();
Vector3d direction = targetVec.subtract(playerVec).normalize();
float yaw = (float) Math.toDegrees(Math.atan2(direction.z, direction.x)) - 90;
mc.player.rotationYaw = yaw;
if (System.currentTimeMillis() - lastFireworkTime > fireworkInterval) {
useFirework();
lastFireworkTime = System.currentTimeMillis();
}
}
private void useFirework() {
for (int i = 0; i < 9; i++) {
ItemStack stack = mc.player.inventory.getStackInSlot(i);
if (stack.getItem() == Items.FIREWORK_ROCKET) {
int prevSlot = mc.player.inventory.currentItem;
mc.player.inventory.currentItem = i;
mc.gameSettings.keyBindUseItem.setPressed(true);
scheduler.schedule(() -> mc.gameSettings.keyBindUseItem.setPressed(false), 100, TimeUnit.MILLISECONDS);
mc.player.inventory.currentItem = prevSlot;
return;
}
}
sendMessage("§c[PlayerFinder] Нет фейерверков в горячей панели!");
}
private void checkForPlayers() {
if (mc.world == null) return;
synchronized (foundPlayers) {
for (PlayerEntity player : mc.world.getPlayers()) {
if (player == mc.player) continue;
boolean exists = foundPlayers.stream()
.anyMatch(r -> r.name.equals(player.getName().getString()));
if (!exists) {
PlayerRecord record = new PlayerRecord(
player.getName().getString(),
player.getPosition()
);
foundPlayers.add(record);
String msg = String.format("§6[PlayerFinder] Найден игрок: §e%s §6в координатах §bX: %d Y: %d Z: %d",
record.name, record.position.getX(), record.position.getY(), record.position.getZ());
sendMessage(msg);
}
}
}
}
private void saveResultsToFile() {
String desktop = System.getProperty("user.home") + "/Desktop/";
String filename = "Eternall_" + new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss").format(new Date()) + ".txt";
synchronized (foundPlayers) {
try (BufferedWriter writer = new BufferedWriter(new FileWriter(desktop + filename))) {
writer.write("Найденные игроки - " + new Date() + "\n\n");
for (PlayerRecord record : foundPlayers) {
writer.write(String.format(
"Игрок: %-16s | Координаты: X: %-6d Y: %-4d Z: %-6d | Время: %s\n",
record.name,
record.position.getX(),
record.position.getY(),
record.position.getZ(),
new SimpleDateFormat("HH:mm:ss").format(record.foundTime)
));
}
sendMessage("§a[PlayerFinder] Результаты сохранены в файл: §e" + filename);
} catch (IOException e) {
sendMessage("§c[PlayerFinder] Ошибка сохранения: " + e.getMessage());
}
}
}
private void sendMessage(String message) {
if (mc.player != null) {
mc.player.sendMessage(new StringTextComponent(message), mc.player.getUniqueID());
}
}
}
Удачного пользования ☺