Начинающий
- Статус
- Онлайн
- Регистрация
- 6 Окт 2024
- Сообщения
- 176
- Реакции
- 0
- Выберите загрузчик игры
- Прочие моды
За основу взял эту тему - Тык
Gps модуль ( без него работать не будет ) ну кто хочет тот сделает без модуля
( Если что eventftcomponent вырезан )
И сама команда
Ну впринципе все
Забыл вот SS
Gps модуль ( без него работать не будет ) ну кто хочет тот сделает без модуля
( Если что eventftcomponent вырезан )
Йоу:
package zenith.zov.client.modules.impl.render;
import com.darkmagician6.eventapi.EventTarget;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d;
import zenith.zov.Zenith;
import zenith.zov.base.events.impl.server.EventPacket;
import zenith.zov.base.events.impl.render.EventHudRender;
import zenith.zov.base.font.Font;
import zenith.zov.base.font.Fonts;
import zenith.zov.base.theme.Theme;
import zenith.zov.client.modules.api.Category;
import zenith.zov.client.modules.api.Module;
import zenith.zov.client.modules.api.ModuleAnnotation;
import zenith.zov.client.modules.api.setting.impl.BooleanSetting;
import zenith.zov.client.modules.api.setting.impl.ModeSetting;
import zenith.zov.client.modules.api.setting.impl.NumberSetting;
import zenith.zov.utility.render.display.base.CustomDrawContext;
import zenith.zov.utility.render.display.base.BorderRadius;
import zenith.zov.utility.render.display.shader.DrawUtil;
import zenith.zov.utility.math.ProjectionUtil;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@ModuleAnnotation(name = "GPS", description = "Показывает стрелку к заданным координатам", category = Category.RENDER)
public class GPS extends Module {
public static final GPS INSTANCE = new GPS();
private GPS() {
}
private final NumberSetting distanceFromCenter = new NumberSetting("Дистанция от центра", 50, 30, 150, 5);
private final NumberSetting arrowSize = new NumberSetting("Размер стрелки", 32, 16, 64, 2);
private final NumberSetting markerSize = new NumberSetting("Размер метки 3D", 1.5f, 0.5f, 3f, 0.1f);
private final BooleanSetting showDistance = new BooleanSetting("Показывать дистанцию", true);
private final BooleanSetting show3DMarker = new BooleanSetting("Показывать 3D метку", true);
private final zenith.zov.client.modules.api.setting.impl.ColorSetting arrowColor = new zenith.zov.client.modules.api.setting.impl.ColorSetting(
"Цвет стрелки HUD", new zenith.zov.utility.render.display.base.color.ColorRGBA(255, 255, 255, 255));
private final zenith.zov.client.modules.api.setting.impl.ColorSetting markerIconColor = new zenith.zov.client.modules.api.setting.impl.ColorSetting(
"Цвет иконки метки", new zenith.zov.utility.render.display.base.color.ColorRGBA(255, 100, 100, 255));
private final BooleanSetting autoGPS = new BooleanSetting("АвтоGPS", false);
private final ModeSetting autoGPSMode = new ModeSetting("Режим", autoGPS::isEnabled);
private final ModeSetting.Value funtime = new ModeSetting.Value(autoGPSMode, "Funtime").select();
private final Identifier arrowTexture = Zenith.id("icons/gps_arrow.png");
private static double targetX = 0;
private static double targetY = 0;
private static double targetZ = 0;
private static boolean hasTarget = false;
private static String lastEventName = "";
private float smoothAngle = 0;
private double smoothArrowX = 0;
private double smoothArrowY = 0;
private static final Pattern METEOR_PATTERN = Pattern
.compile("Метеоритный дождь.*?\\[(-?\\d+)\\s+(\\d+)\\s+(-?\\d+)\\]");
private static final Pattern VOLCANO_PATTERN = Pattern
.compile("Вулкан.*?(-?\\d+)\\s+(\\d+)\\s+(-?\\d+)");
private static final Pattern KILLER_BEACON_PATTERN = Pattern
.compile("Маяк убийца.*?(-?\\d+)\\s+(\\d+)\\s+(-?\\d+)");
private static final Pattern DEATH_CHEST_PATTERN = Pattern
.compile("Сундук Смерти.*?Появится уже через (\\d+) минут");
private static final Pattern EVENT_STARTED_PATTERN = Pattern
.compile("(Портал на резню активирован|Идёт страшный бой)");
public static void setTarget(double x, double y, double z) {
setTarget(x, y, z, "");
}
public static void setTarget(double x, double y, double z, String eventName) {
targetX = x;
targetY = y;
targetZ = z;
hasTarget = true;
lastEventName = eventName;
}
public static void clearTarget() {
hasTarget = false;
lastEventName = "";
}
public static boolean hasTarget() {
return hasTarget;
}
public static String getLastEventName() {
return lastEventName;
}
public static double getTargetX() {
return targetX;
}
public static double getTargetY() {
return targetY;
}
public static double getTargetZ() {
return targetZ;
}
@EventTarget
public void onHudRender(EventHudRender event) {
if (mc.player == null || mc.world == null || !hasTarget)
return;
CustomDrawContext ctx = event.getContext();
Theme theme = Zenith.getInstance().getThemeManager().getCurrentTheme();
Font font = Fonts.MEDIUM.getFont(5);
float centerX = ctx.getScaledWindowWidth() / 2f;
float centerY = ctx.getScaledWindowHeight() / 2f;
double playerX = mc.player.getX();
double playerZ = mc.player.getZ();
double deltaX = targetX - playerX;
double deltaZ = targetZ - playerZ;
double distance = Math.sqrt(deltaX * deltaX + deltaZ * deltaZ);
float yaw = mc.player.getYaw();
double yawRad = Math.toRadians(yaw);
double cos = Math.cos(yawRad);
double sin = Math.sin(yawRad);
double rotY = -(deltaZ * cos - deltaX * sin);
double rotX = -(deltaX * cos + deltaZ * sin);
if (Math.abs(rotX) < 0.01 && Math.abs(rotY) < 0.01)
return;
float targetAngle = (float) (Math.atan2(rotY, rotX) * 180 / Math.PI);
// Плавная интерполяция угла
float angleDiff = targetAngle - smoothAngle;
while (angleDiff > 180)
angleDiff -= 360;
while (angleDiff < -180)
angleDiff += 360;
smoothAngle += angleDiff * 0.3f;
double targetArrowX = distanceFromCenter.getCurrent() * MathHelper.cos((float) Math.toRadians(targetAngle))
+ centerX;
double targetArrowY = distanceFromCenter.getCurrent() * MathHelper.sin((float) Math.toRadians(targetAngle))
+ centerY;
// Плавная интерполяция позиции
smoothArrowX += (targetArrowX - smoothArrowX) * 0.3;
smoothArrowY += (targetArrowY - smoothArrowY) * 0.3;
float size = arrowSize.getCurrent();
ctx.pushMatrix();
ctx.getMatrices().translate(smoothArrowX, smoothArrowY, 0);
ctx.getMatrices().multiply(net.minecraft.util.math.RotationAxis.POSITIVE_Z.rotationDegrees(smoothAngle + 90));
ctx.getMatrices().translate(-size / 2, -size / 2, 0);
zenith.zov.utility.render.display.base.color.ColorRGBA arrowColor = getArrowColor();
ctx.drawTexture(arrowTexture, 0, 0, size, size, arrowColor);
ctx.popMatrix();
if (showDistance.isEnabled()) {
String distanceText = String.format("%.0f", distance);
float textWidth = font.width(distanceText);
float textAngleRad = (float) Math.toRadians(smoothAngle);
float textX = (float) smoothArrowX + MathHelper.cos(textAngleRad) * (size / 2 + 5);
float textY = (float) smoothArrowY + MathHelper.sin(textAngleRad) * (size / 2 + 5);
ctx.drawText(font, distanceText, textX - textWidth / 2, textY - font.height() / 2, getArrowColor());
}
}
private zenith.zov.utility.render.display.base.color.ColorRGBA getArrowColor() {
return arrowColor.getColor();
}
public static void processMessage(String message) {
if (!INSTANCE.autoGPS.isEnabled() || mc.player == null) return;
// Убираем все цветовые коды, форматирование и невидимые символы
String cleanMessage = message
.replaceAll("§[0-9a-fk-or]", "") // Minecraft цвета
.replaceAll("&[0-9a-fk-or]", "") // Альтернативные цвета
.replaceAll("[\\x00-\\x1F\\x7F]", "") // Управляющие символы
.replaceAll("\\p{C}", ""); // Все невидимые Unicode символы
if (INSTANCE.funtime.isSelected()) {
// Проверяем начало ивента (портал активирован / идёт бой = выключаем GPS)
Matcher eventStartedMatcher = EVENT_STARTED_PATTERN.matcher(cleanMessage);
if (eventStartedMatcher.find()) {
clearTarget();
if (mc.player != null) {
mc.player.sendMessage(
Text.literal("§cGPS метка снята - §6Ивент начался!"),
true);
}
return;
}
// Проверяем сундук смерти (появится через 3 минуты = выключаем GPS)
Matcher deathChestMatcher = DEATH_CHEST_PATTERN.matcher(cleanMessage);
if (deathChestMatcher.find()) {
try {
int minutes = Integer.parseInt(deathChestMatcher.group(1));
if (minutes == 3) {
clearTarget();
if (mc.player != null) {
mc.player.sendMessage(
Text.literal("§cGPS метка снята - §6Сундук Смерти §cпоявится через 3 минуты"),
true);
}
}
} catch (NumberFormatException e) {
// Игнорируем ошибки парсинга
}
return;
}
// Ищем паттерн метеоритного дождя
Matcher meteorMatcher = METEOR_PATTERN.matcher(cleanMessage);
if (meteorMatcher.find()) {
try {
int x = Integer.parseInt(meteorMatcher.group(1));
int y = Integer.parseInt(meteorMatcher.group(2));
int z = Integer.parseInt(meteorMatcher.group(3));
setTarget(x, y, z, "Метеоритный дождь");
// Показываем уведомление в ActionBar
if (mc.player != null) {
mc.player.sendMessage(Text.literal("§aGPS метка установлена на §e[" + x + " " + y + " " + z
+ "]§a от события §6Метеоритный дождь"), true);
}
} catch (NumberFormatException e) {
// Игнорируем ошибки парсинга
}
return;
}
// Ищем паттерн вулкана
Matcher volcanoMatcher = VOLCANO_PATTERN.matcher(cleanMessage);
if (volcanoMatcher.find()) {
try {
int x = Integer.parseInt(volcanoMatcher.group(1));
int y = Integer.parseInt(volcanoMatcher.group(2));
int z = Integer.parseInt(volcanoMatcher.group(3));
setTarget(x, y, z, "Вулкан");
// Показываем уведомление в ActionBar
if (mc.player != null) {
mc.player.sendMessage(Text.literal("§aGPS метка установлена на §e[" + x + " " + y + " " + z
+ "]§a от события §6Вулкан"), true);
}
} catch (NumberFormatException e) {
// Игнорируем ошибки парсинга
}
return;
}
// Ищем паттерн маяка убийцы
Matcher killerBeaconMatcher = KILLER_BEACON_PATTERN.matcher(cleanMessage);
if (killerBeaconMatcher.find()) {
try {
int x = Integer.parseInt(killerBeaconMatcher.group(1));
int y = Integer.parseInt(killerBeaconMatcher.group(2));
int z = Integer.parseInt(killerBeaconMatcher.group(3));
setTarget(x, y, z, "Маяк убийца");
// Показываем уведомление в ActionBar
if (mc.player != null) {
mc.player.sendMessage(Text.literal("§aGPS метка установлена на §e[" + x + " " + y + " " + z
+ "]§a от события §6Маяк убийца"), true);
}
} catch (NumberFormatException e) {
// Игнорируем ошибки парсинга
}
}
}
}
@EventTarget
public void onPacket(EventPacket event) {
if (mc.player == null || !event.isReceive())
return;
// Обрабатываем сообщения для автоGPS
if (autoGPS.isEnabled() && event.getPacket() instanceof net.minecraft.network.packet.s2c.play.GameMessageS2CPacket packet) {
processMessage(packet.content().getString());
}
// Отслеживаем заход на сервер (GameJoinS2CPacket)
if (event.getPacket() instanceof net.minecraft.network.packet.s2c.play.GameJoinS2CPacket) {
}
}
@EventTarget
public void onRender2D(zenith.zov.base.events.impl.render.EventRender2D event) {
if (mc.player == null || mc.world == null || !hasTarget || !show3DMarker.isEnabled())
return;
double playerX = mc.player.getX();
double playerY = mc.player.getY();
double playerZ = mc.player.getZ();
double distance = Math.sqrt((targetX - playerX) * (targetX - playerX)
+ (targetY - playerY) * (targetY - playerY) + (targetZ - playerZ) * (targetZ - playerZ));
// Получаем проекцию точки на экран
Vec3d targetPos = new Vec3d(targetX, targetY, targetZ);
Vec3d projected = ProjectionUtil.worldSpaceToScreenSpace(targetPos);
CustomDrawContext context = event.getContext();
Font font = Fonts.MEDIUM.getFont(8 * markerSize.getCurrent());
zenith.zov.utility.render.display.base.color.ColorRGBA color = getArrowColor();
Theme theme = Zenith.getInstance().getThemeManager().getCurrentTheme();
float posX = (float) projected.x;
float posY = (float) projected.y;
// Размеры иконки
float iconSize = 16 * markerSize.getCurrent();
// Текст
String gpsText = "GPS";
String distText = String.format("%.0fm", distance);
float gpsWidth = font.width(gpsText);
float distWidth = font.width(distText);
float maxTextWidth = Math.max(gpsWidth, distWidth);
// Размеры прямоугольника
float rectWidth = maxTextWidth + 16 * markerSize.getCurrent();
float rectHeight = (font.height() * 2 + 6) * markerSize.getCurrent();
float rectX = posX - rectWidth / 2;
float rectY = posY + iconSize + 4 * markerSize.getCurrent();
context.pushMatrix();
context.getMatrices().translate(posX, posY, 0);
context.getMatrices().scale(markerSize.getCurrent(), markerSize.getCurrent(), 1f);
context.getMatrices().translate(-posX, -posY, 0);
// Рисуем фон для текста
DrawUtil.drawBlurHud(context.getMatrices(), rectX, rectY, rectWidth, rectHeight, 22, BorderRadius.all(2),
new zenith.zov.utility.render.display.base.color.ColorRGBA(255, 255, 255, 255));
context.drawRoundedRect(rectX, rectY, rectWidth, rectHeight, BorderRadius.all(2), theme.getForegroundLight());
DrawUtil.drawRoundedCorner(context.getMatrices(), rectX, rectY, rectWidth, rectHeight, 0.1f, 9, color,
BorderRadius.all(2));
// Рисуем иконку стрелки (перевернутую вниз, чуть ниже)
context.pushMatrix();
context.getMatrices().translate(posX, posY, 0);
context.getMatrices().multiply(net.minecraft.util.math.RotationAxis.POSITIVE_Z.rotationDegrees(180));
context.drawTexture(arrowTexture, -iconSize / 2, -iconSize / 2, iconSize, iconSize, markerIconColor.getColor());
context.popMatrix();
// Рисуем текст
context.drawText(font, gpsText, posX - gpsWidth / 2, rectY + 3 * markerSize.getCurrent(), color);
context.drawText(font, distText, posX - distWidth / 2, rectY + 3 * markerSize.getCurrent() + font.height() + 2,
color);
context.popMatrix();
}
}
И сама команда
Команда йоууу:
package zenith.zov.base.comand.impl;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import net.minecraft.command.CommandSource;
import net.minecraft.client.MinecraftClient;
import net.minecraft.entity.player.PlayerEntity;
import zenith.zov.base.comand.api.CommandAbstract;
import zenith.zov.base.comand.impl.args.CoordinateArgumentType;
import zenith.zov.client.modules.impl.render.GPS;
import zenith.zov.utility.game.other.MessageUtil;
import static com.mojang.brigadier.Command.SINGLE_SUCCESS;
public class GpsCommand extends CommandAbstract {
public GpsCommand() {
super("gps");
}
@Override
public void execute(LiteralArgumentBuilder<CommandSource> builder) {
builder.then(arg("x", CoordinateArgumentType.create())
.then(arg("z", CoordinateArgumentType.create())
.executes(context -> {
double x = context.getArgument("x", Double.class);
double z = context.getArgument("z", Double.class);
PlayerEntity player = MinecraftClient.getInstance().player;
if (player != null) {
GPS.setTarget(x, 64, z, "Ручная установка");
MessageUtil.displayMessage(MessageUtil.LogLevel.INFO,
"§aGPS метка установлена на §e[" + (int)x + " " + 64 + " " + (int)z + "]");
}
return SINGLE_SUCCESS;
})));
builder.then(arg("x", CoordinateArgumentType.create())
.then(arg("y", CoordinateArgumentType.create())
.then(arg("z", CoordinateArgumentType.create())
.executes(context -> {
double x = context.getArgument("x", Double.class);
double y = context.getArgument("y", Double.class);
double z = context.getArgument("z", Double.class);
PlayerEntity player = MinecraftClient.getInstance().player;
if (player != null) {
GPS.setTarget(x, y, z, "Ручная установка");
MessageUtil.displayMessage(MessageUtil.LogLevel.INFO,
"§aGPS метка установлена на §e[" + (int)x + " " + (int)y + " " + (int)z + "]");
}
return SINGLE_SUCCESS;
}))));
builder.then(literal("clear").executes(context -> {
GPS.clearTarget();
MessageUtil.displayMessage(MessageUtil.LogLevel.INFO, "§cGPS метка очищена");
return SINGLE_SUCCESS;
}));
builder.then(literal("info").executes(context -> {
if (GPS.hasTarget()) {
double x = GPS.getTargetX();
double y = GPS.getTargetY();
double z = GPS.getTargetZ();
String eventName = GPS.getLastEventName();
MessageUtil.displayMessage(MessageUtil.LogLevel.INFO,
"§6Текущая GPS метка: §e[" + (int)x + " " + (int)y + " " + (int)z + "]");
MessageUtil.displayMessage(MessageUtil.LogLevel.INFO,
"§6Источник: §e" + eventName);
PlayerEntity player = MinecraftClient.getInstance().player;
if (player != null) {
double distance = Math.sqrt(
Math.pow(x - player.getX(), 2) +
Math.pow(z - player.getZ(), 2)
);
MessageUtil.displayMessage(MessageUtil.LogLevel.INFO,
"§6Дистанция: §e" + String.format("%.0f", distance) + " блоков");
}
} else {
MessageUtil.displayMessage(MessageUtil.LogLevel.INFO, "§cGPS метка не установлена");
}
return SINGLE_SUCCESS;
}));
builder.then(literal("here").executes(context -> {
PlayerEntity player = MinecraftClient.getInstance().player;
if (player != null) {
GPS.setTarget(player.getX(), player.getY(), player.getZ(), "Текущая позиция");
MessageUtil.displayMessage(MessageUtil.LogLevel.INFO,
"§aGPS метка установлена на текущую позицию §e[" +
(int)player.getX() + " " + (int)player.getY() + " " + (int)player.getZ() + "]");
}
return SINGLE_SUCCESS;
}));
builder.then(literal("help").executes(context -> {
MessageUtil.displayMessage(MessageUtil.LogLevel.INFO,
"§6Использование команды GPS:§r");
MessageUtil.displayMessage(MessageUtil.LogLevel.INFO,
"§e.gps <x> <z> §7- установить метку на координаты (y=64)");
MessageUtil.displayMessage(MessageUtil.LogLevel.INFO,
"§e.gps <x> <y> <z> §7- установить метку на координаты");
MessageUtil.displayMessage(MessageUtil.LogLevel.INFO,
"§e.gps clear §7- очистить текущую метку");
MessageUtil.displayMessage(MessageUtil.LogLevel.INFO,
"§e.gps info §7- информация о текущей метке");
MessageUtil.displayMessage(MessageUtil.LogLevel.INFO,
"§e.gps here §7- установить метку на текущую позицию");
MessageUtil.displayMessage(MessageUtil.LogLevel.INFO,
"§e.gps help §7- показать эту справку");
return SINGLE_SUCCESS;
}));
builder.executes(context -> {
if (GPS.hasTarget()) {
double x = GPS.getTargetX();
double y = GPS.getTargetY();
double z = GPS.getTargetZ();
String eventName = GPS.getLastEventName();
MessageUtil.displayMessage(MessageUtil.LogLevel.INFO,
"§6Текущая GPS метка: §e[" + (int)x + " " + (int)y + " " + (int)z + "]");
MessageUtil.displayMessage(MessageUtil.LogLevel.INFO,
"§6Источник: §e" + eventName);
PlayerEntity player = MinecraftClient.getInstance().player;
if (player != null) {
double distance = Math.sqrt(
Math.pow(x - player.getX(), 2) +
Math.pow(z - player.getZ(), 2)
);
MessageUtil.displayMessage(MessageUtil.LogLevel.INFO,
"§6Дистанция: §e" + String.format("%.0f", distance) + " блоков");
}
MessageUtil.displayMessage(MessageUtil.LogLevel.INFO,
"§7Используйте §e.gps help §7для просмотра всех команд");
} else {
MessageUtil.displayMessage(MessageUtil.LogLevel.INFO,
"§6Используйте §e.gps help §6для просмотра справки по команде");
}
return SINGLE_SUCCESS;
});
}
}
Ну впринципе все
Забыл вот SS
Последнее редактирование: