Часть функционала Поиск игроков/SearchCommand | Expensive 3.1

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
7 Сен 2024
Сообщения
7
Реакции
0
Выберите загрузчик игры
  1. OptiFine
Не знаю кому это надо но держите.
Это функция в экспе, а точнее команда .search с помощью неё можно узнать координаты любого игрока с любого расстояния.
.search (ник) - поиск координат игрока по нику
.search near (количество игроков) - ищет самых ближайших игроков к вам

В близи с игроком работает, а из далека не проверял.
Есть гпт код.

тутор:
1. Создаём по этому пути - im/expensive/command/impl/feature/ файл SearchCommand.java
2. Вставляем код
3. Запускаем клиент

Это мой первый пост с функцией, не судите строго

pasta expi:
Expand Collapse Copy
package im.expensive.command.impl.feature;

import im.expensive.command.Command;
import im.expensive.command.CommandWithAdvice;
import im.expensive.command.Parameters;
import im.expensive.command.Prefix;
import im.expensive.command.Logger;
import im.expensive.command.impl.CommandException;
import im.expensive.utils.client.IMinecraft;
import net.minecraft.client.network.play.NetworkPlayerInfo;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.util.text.TextFormatting;

import java.awt.Toolkit;
import java.awt.datatransfer.StringSelection;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.UUID;
import java.util.stream.Collectors;

public class SearchCommand implements Command, CommandWithAdvice, IMinecraft {
    private final Prefix prefix;
    private final Logger logger;

    private static final Map<String, Map<Integer, String>> serverCopyData = new HashMap<>();
    private static final Map<String, Map<UUID, Integer>> serverPlayerIDs = new HashMap<>();
    private static final Random random = new Random();

    public SearchCommand(Prefix prefix, Logger logger) {
        this.prefix = prefix;
        this.logger = logger;
    }

    private String getServerKey() {
        if (mc.getCurrentServerData() != null)
            return mc.getCurrentServerData().serverIP;
        return "singleplayer";
    }

    private int generateUniqueId(String server) {
        serverCopyData.putIfAbsent(server, new HashMap<>());
        int id;
        do {
            id = 10000 + random.nextInt(90000); // 10000..99999
        } while (serverCopyData.get(server).containsKey(id));
        return id;
    }

    private int getOrCreatePlayerID(String server, PlayerEntity player) {
        serverPlayerIDs.putIfAbsent(server, new HashMap<>());
        Map<UUID, Integer> ids = serverPlayerIDs.get(server);
        UUID uuid = player.getUniqueID();
        if (ids.containsKey(uuid))
            return ids.get(uuid);
        int newId = generateUniqueId(server);
        ids.put(uuid, newId);
        return newId;
    }

    @Override
    public void execute(Parameters parameters) {
        if (mc.player == null || mc.world == null) {
            logger.log(TextFormatting.RED + "Вы должны быть в игре!");
            return;
        }

        String server = getServerKey();
        serverCopyData.putIfAbsent(server, new HashMap<>());
        Map<Integer, String> copyData = serverCopyData.get(server);

        if (parameters.asString(0).isPresent() && parameters.asString(0).get().equalsIgnoreCase("copy")) {
            int id = parameters.asInt(1).orElse(-1);
            if (copyData.containsKey(id)) {
                String coords = copyData.get(id);
                try {
                    StringSelection selection = new StringSelection(coords);
                    Toolkit.getDefaultToolkit().getSystemClipboard().setContents(selection, null);
                    logger.log(TextFormatting.GREEN + "Координаты скопированы: " + TextFormatting.WHITE + coords);
                } catch (Exception e) {
                    logger.log(TextFormatting.RED + "Не удалось скопировать в буфер! Координаты: " + coords);
                }
            } else {
                logger.log(TextFormatting.RED + "ID не найден!");
            }
            return;
        }

        if (parameters.asString(0).isPresent() && parameters.asString(0).get().equalsIgnoreCase("near")) {
            int count = parameters.asInt(1).orElse(5);

            List<? extends PlayerEntity> players = mc.world.getPlayers().stream()
                    .filter(p -> !p.getUniqueID().equals(mc.player.getUniqueID()))
                    .sorted(Comparator.comparingDouble(p -> p.getDistance(mc.player)))
                    .limit(count)
                    .collect(Collectors.toList());

            if (players == null || players.isEmpty()) {
                logger.log(TextFormatting.RED + "Рядом нет игроков!");
                return;
            }

            logger.log(TextFormatting.GREEN + "Ближайшие игроки:");
            for (PlayerEntity player : players) {
                int id = getOrCreatePlayerID(server, player);
                String coords = (int) player.getPosX() + " " + (int) player.getPosY() + " " + (int) player.getPosZ();
                copyData.put(id, coords);

                logger.log(TextFormatting.YELLOW + player.getName().getString() + TextFormatting.WHITE +
                        " | X: " + (int) player.getPosX() +
                        " Y: " + (int) player.getPosY() +
                        " Z: " + (int) player.getPosZ() +
                        TextFormatting.GRAY + " (" + String.format("%.1f", mc.player.getDistance(player)) + " блоков)" +
                        TextFormatting.AQUA + " | .search copy " + id);
            }
            return;
        }

        String playerName = parameters.asString(0)
                .orElseThrow(() -> new CommandException(TextFormatting.RED + "Укажите ник игрока!"));

        PlayerEntity targetPlayer = mc.world.getPlayers().stream()
                .filter(p -> p.getName().getString().equalsIgnoreCase(playerName))
                .findFirst()
                .orElse(null);

        if (targetPlayer != null) {
            String coords = (int) targetPlayer.getPosX() + " " + (int) targetPlayer.getPosY() + " " + (int) targetPlayer.getPosZ();
            int id = getOrCreatePlayerID(server, targetPlayer);
            copyData.put(id, coords);

            logger.log(TextFormatting.GREEN + "Игрок найден: " + TextFormatting.WHITE + playerName);
            logger.log(TextFormatting.YELLOW + "Координаты: " + TextFormatting.WHITE + coords);
            logger.log(TextFormatting.YELLOW + "Расстояние: " + TextFormatting.WHITE +
                    String.format("%.1f", mc.player.getDistance(targetPlayer)) + " блоков");
            logger.log(TextFormatting.AQUA + "Команда копирования: .search copy " + id);
            return;
        }

        if (mc.getConnection() != null) {
            boolean found = mc.getConnection().getPlayerInfoMap().stream()
                    .map(NetworkPlayerInfo::getGameProfile)
                    .anyMatch(info -> info.getName().equalsIgnoreCase(playerName));

            if (found)
                logger.log(TextFormatting.GREEN + "Игрок найден на сервере, но слишком далеко.");
            else
                logger.log(TextFormatting.RED + "Игрок не найден!");
        } else {
            logger.log(TextFormatting.RED + "Ошибка подключения к серверу!");
        }
    }

    @Override
    public String name() {
        return "search";
    }

    @Override
    public String description() {
        return "Поиск игроков и копирование координат";
    }

    @Override
    public java.util.List<String> adviceMessage() {
        String p = prefix.get();
        return java.util.List.of(
                p + "search <ник>",
                p + "search near <кол-во>",
                p + "search copy <ID>"
        );
    }
}
Если не работает из далека не бейте палками
 
Последнее редактирование:
Не знаю кому это надо но держите.
Это функция в экспе, а точнее команда .search с помощью неё можно узнать координаты любого игрока с любого расстояния.
.search (ник) - поиск координат игрока по нику
.search near (количество игроков) - ищет самых ближайших игроков к вам

В близи с игроком работает, а из далека не проверял.
Есть гпт код.

тутор:
1. Создаём по этому пути - im/expensive/command/impl/feature/ файл SearchCommand.java
2. Вставляем код
3. Запускаем клиент

pasta expi:
Expand Collapse Copy
package im.expensive.command.impl.feature;

import im.expensive.command.Command;
import im.expensive.command.CommandWithAdvice;
import im.expensive.command.Parameters;
import im.expensive.command.Prefix;
import im.expensive.command.Logger;
import im.expensive.command.impl.CommandException;
import im.expensive.utils.client.IMinecraft;
import net.minecraft.client.network.play.NetworkPlayerInfo;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.util.text.TextFormatting;

import java.awt.Toolkit;
import java.awt.datatransfer.StringSelection;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.UUID;
import java.util.stream.Collectors;

public class SearchCommand implements Command, CommandWithAdvice, IMinecraft {
    private final Prefix prefix;
    private final Logger logger;

    private static final Map<String, Map<Integer, String>> serverCopyData = new HashMap<>();
    private static final Map<String, Map<UUID, Integer>> serverPlayerIDs = new HashMap<>();
    private static final Random random = new Random();

    public SearchCommand(Prefix prefix, Logger logger) {
        this.prefix = prefix;
        this.logger = logger;
    }

    private String getServerKey() {
        if (mc.getCurrentServerData() != null)
            return mc.getCurrentServerData().serverIP;
        return "singleplayer";
    }

    private int generateUniqueId(String server) {
        serverCopyData.putIfAbsent(server, new HashMap<>());
        int id;
        do {
            id = 10000 + random.nextInt(90000); // 10000..99999
        } while (serverCopyData.get(server).containsKey(id));
        return id;
    }

    private int getOrCreatePlayerID(String server, PlayerEntity player) {
        serverPlayerIDs.putIfAbsent(server, new HashMap<>());
        Map<UUID, Integer> ids = serverPlayerIDs.get(server);
        UUID uuid = player.getUniqueID();
        if (ids.containsKey(uuid))
            return ids.get(uuid);
        int newId = generateUniqueId(server);
        ids.put(uuid, newId);
        return newId;
    }

    @Override
    public void execute(Parameters parameters) {
        if (mc.player == null || mc.world == null) {
            logger.log(TextFormatting.RED + "Вы должны быть в игре!");
            return;
        }

        String server = getServerKey();
        serverCopyData.putIfAbsent(server, new HashMap<>());
        Map<Integer, String> copyData = serverCopyData.get(server);

        if (parameters.asString(0).isPresent() && parameters.asString(0).get().equalsIgnoreCase("copy")) {
            int id = parameters.asInt(1).orElse(-1);
            if (copyData.containsKey(id)) {
                String coords = copyData.get(id);
                try {
                    StringSelection selection = new StringSelection(coords);
                    Toolkit.getDefaultToolkit().getSystemClipboard().setContents(selection, null);
                    logger.log(TextFormatting.GREEN + "Координаты скопированы: " + TextFormatting.WHITE + coords);
                } catch (Exception e) {
                    logger.log(TextFormatting.RED + "Не удалось скопировать в буфер! Координаты: " + coords);
                }
            } else {
                logger.log(TextFormatting.RED + "ID не найден!");
            }
            return;
        }

        if (parameters.asString(0).isPresent() && parameters.asString(0).get().equalsIgnoreCase("near")) {
            int count = parameters.asInt(1).orElse(5);

            List<? extends PlayerEntity> players = mc.world.getPlayers().stream()
                    .filter(p -> !p.getUniqueID().equals(mc.player.getUniqueID()))
                    .sorted(Comparator.comparingDouble(p -> p.getDistance(mc.player)))
                    .limit(count)
                    .collect(Collectors.toList());

            if (players == null || players.isEmpty()) {
                logger.log(TextFormatting.RED + "Рядом нет игроков!");
                return;
            }

            logger.log(TextFormatting.GREEN + "Ближайшие игроки:");
            for (PlayerEntity player : players) {
                int id = getOrCreatePlayerID(server, player);
                String coords = (int) player.getPosX() + " " + (int) player.getPosY() + " " + (int) player.getPosZ();
                copyData.put(id, coords);

                logger.log(TextFormatting.YELLOW + player.getName().getString() + TextFormatting.WHITE +
                        " | X: " + (int) player.getPosX() +
                        " Y: " + (int) player.getPosY() +
                        " Z: " + (int) player.getPosZ() +
                        TextFormatting.GRAY + " (" + String.format("%.1f", mc.player.getDistance(player)) + " блоков)" +
                        TextFormatting.AQUA + " | .search copy " + id);
            }
            return;
        }

        String playerName = parameters.asString(0)
                .orElseThrow(() -> new CommandException(TextFormatting.RED + "Укажите ник игрока!"));

        PlayerEntity targetPlayer = mc.world.getPlayers().stream()
                .filter(p -> p.getName().getString().equalsIgnoreCase(playerName))
                .findFirst()
                .orElse(null);

        if (targetPlayer != null) {
            String coords = (int) targetPlayer.getPosX() + " " + (int) targetPlayer.getPosY() + " " + (int) targetPlayer.getPosZ();
            int id = getOrCreatePlayerID(server, targetPlayer);
            copyData.put(id, coords);

            logger.log(TextFormatting.GREEN + "Игрок найден: " + TextFormatting.WHITE + playerName);
            logger.log(TextFormatting.YELLOW + "Координаты: " + TextFormatting.WHITE + coords);
            logger.log(TextFormatting.YELLOW + "Расстояние: " + TextFormatting.WHITE +
                    String.format("%.1f", mc.player.getDistance(targetPlayer)) + " блоков");
            logger.log(TextFormatting.AQUA + "Команда копирования: .search copy " + id);
            return;
        }

        if (mc.getConnection() != null) {
            boolean found = mc.getConnection().getPlayerInfoMap().stream()
                    .map(NetworkPlayerInfo::getGameProfile)
                    .anyMatch(info -> info.getName().equalsIgnoreCase(playerName));

            if (found)
                logger.log(TextFormatting.GREEN + "Игрок найден на сервере, но слишком далеко.");
            else
                logger.log(TextFormatting.RED + "Игрок не найден!");
        } else {
            logger.log(TextFormatting.RED + "Ошибка подключения к серверу!");
        }
    }

    @Override
    public String name() {
        return "search";
    }

    @Override
    public String description() {
        return "Поиск игроков и копирование координат";
    }

    @Override
    public java.util.List<String> adviceMessage() {
        String p = prefix.get();
        return java.util.List.of(
                p + "search <ник>",
                p + "search near <кол-во>",
                p + "search copy <ID>"
        );
    }
}
Если не работает из далека не бейте палками
а зачем скажи пожалуйста мне рядом искать игрока если есть нейм тег ?
 
Ниче не понял как она работает типо если на рв то нужен overlord?
нет где угодно работает но я тестил на рв
а зачем скажи пожалуйста мне рядом искать игрока если есть нейм тег ?
ну он вроде на больших расстояниях должен работать
 
Назад
Сверху Снизу