diff options
| author | BigloBot <95036804+BigloBot@users.noreply.github.com> | 2024-09-06 20:32:06 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-09-07 03:32:06 +0800 |
| commit | dd5f0d39130d53cdc5b39b15eb1a5ddea08739b5 (patch) | |
| tree | be426a7b576dde0221f561a6e64a5216afd1aad1 /src/main/java | |
| parent | 5ed09f8601022ef6cf51043410e0294cbfad4ad9 (diff) | |
| download | Skyblocker-dd5f0d39130d53cdc5b39b15eb1a5ddea08739b5.tar.gz Skyblocker-dd5f0d39130d53cdc5b39b15eb1a5ddea08739b5.tar.bz2 Skyblocker-dd5f0d39130d53cdc5b39b15eb1a5ddea08739b5.zip | |
[Location Share & Waypoint] Share position and set waypoint (#916)
Co-authored-by: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com>
Diffstat (limited to 'src/main/java')
6 files changed, 191 insertions, 9 deletions
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chat/chatcoords/ChatLocation.java b/src/main/java/de/hysky/skyblocker/skyblock/chat/chatcoords/ChatLocation.java new file mode 100644 index 00000000..d519a414 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/chat/chatcoords/ChatLocation.java @@ -0,0 +1,26 @@ +package de.hysky.skyblocker.skyblock.chat.chatcoords; + +import com.mojang.brigadier.Command; +import de.hysky.skyblocker.annotations.Init; +import de.hysky.skyblocker.utils.Utils; +import de.hysky.skyblocker.utils.scheduler.MessageScheduler; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.ClientPlayerEntity; + +public class ChatLocation { + @Init + public static void init() { + ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register( + ClientCommandManager.literal("skyblocker").then(ClientCommandManager.literal("location").executes(context -> sharePlayerLocation())) + )); + } + + private static int sharePlayerLocation() { + ClientPlayerEntity thePlayer = MinecraftClient.getInstance().player; + MessageScheduler.INSTANCE.sendMessageAfterCooldown("x: " + (int) thePlayer.getX() + ", y: " + (int) thePlayer.getY() + ", z: " + (int) thePlayer.getZ() + " | " + Utils.getIslandArea(), true); + return Command.SINGLE_SUCCESS; + } + +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chat/chatcoords/ChatWaypointLocation.java b/src/main/java/de/hysky/skyblocker/skyblock/chat/chatcoords/ChatWaypointLocation.java new file mode 100644 index 00000000..b291a763 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/chat/chatcoords/ChatWaypointLocation.java @@ -0,0 +1,66 @@ +package de.hysky.skyblocker.skyblock.chat.chatcoords; + +import de.hysky.skyblocker.annotations.Init; +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.utils.Constants; +import de.hysky.skyblocker.utils.Utils; +import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents; +import net.minecraft.client.MinecraftClient; +import net.minecraft.text.ClickEvent; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class ChatWaypointLocation { + + private static final Logger LOGGER = LoggerFactory.getLogger(ChatWaypointLocation.class); + + private static final Pattern GENERIC_COORDS_PATTERN = Pattern.compile("x: (?<x>-?[0-9]+), y: (?<y>[0-9]+), z: (?<z>-?[0-9]+)"); + private static final Pattern SKYBLOCKER_COORDS_PATTERN = Pattern.compile("x: (?<x>-?[0-9]+), y: (?<y>[0-9]+), z: (?<z>-?[0-9]+)(?: \\| (?<area>[^|]+))"); + private static final Pattern SKYHANNI_DIANA_PATTERN = Pattern.compile("A MINOS INQUISITOR has spawned near \\[(?<area>[^]]*)] at Coords (?<x>-?[0-9]+) (?<y>[0-9]+) (?<z>-?[0-9]+)"); + private static final List<Pattern> PATTERNS = List.of(SKYBLOCKER_COORDS_PATTERN, SKYHANNI_DIANA_PATTERN, GENERIC_COORDS_PATTERN); + + @Init + public static void init() { + ClientReceiveMessageEvents.GAME.register(ChatWaypointLocation::onMessage); + } + + private static void onMessage(Text text, boolean overlay) { + if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().uiAndVisuals.waypoints.enableWaypoints) { + + String message = text.getString(); + + for (Pattern pattern : PATTERNS) { + Matcher matcher = pattern.matcher(message); + if (matcher.find()) { + try { + String x = matcher.group("x"); + String y = matcher.group("y"); + String z = matcher.group("z"); + String area = matcher.group("area"); + requestWaypoint(x, y, z, area); + } catch (Exception e) { + LOGGER.error("[SKYBLOCKER CHAT WAYPOINTS] Error creating chat waypoint: ", e); + } + break; + } + } + } + } + + private static void requestWaypoint(String x, String y, String z, String area) { + String command = "/skyblocker waypoints individual " + x + " " + y + " " + z + " " + area; + + Text text = Constants.PREFIX.get() + .append(Text.translatable("skyblocker.config.chat.waypoints.display").formatted(Formatting.AQUA) + .styled(style -> style.withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, command)))) + .append(Text.of(area != null ? " at " + area : "")); + + MinecraftClient.getInstance().player.sendMessage(text, false); + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/Reparty.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/Reparty.java index 80753c1d..526b7686 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/Reparty.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/Reparty.java @@ -107,6 +107,6 @@ public class Reparty extends ChatPatternListener { } private void sendCommand(String command, int delay) { - MessageScheduler.INSTANCE.queueMessage(command, delay * BASE_DELAY); + MessageScheduler.INSTANCE.queueMessage(command, false, delay * BASE_DELAY); } }
\ No newline at end of file diff --git a/src/main/java/de/hysky/skyblocker/skyblock/waypoint/IndividualWaypoint.java b/src/main/java/de/hysky/skyblocker/skyblock/waypoint/IndividualWaypoint.java new file mode 100644 index 00000000..7a470373 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/waypoint/IndividualWaypoint.java @@ -0,0 +1,84 @@ +package de.hysky.skyblocker.skyblock.waypoint; + +import com.mojang.brigadier.Command; +import com.mojang.brigadier.arguments.IntegerArgumentType; +import com.mojang.brigadier.arguments.StringArgumentType; +import de.hysky.skyblocker.SkyblockerMod; +import de.hysky.skyblocker.annotations.Init; +import de.hysky.skyblocker.utils.ColorUtils; +import de.hysky.skyblocker.utils.waypoint.NamedWaypoint; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents; +import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; +import net.minecraft.client.MinecraftClient; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; + +import java.awt.*; + +public class IndividualWaypoint extends NamedWaypoint { + + private static IndividualWaypoint waypoint; + + @Init + public static void init() { + + ClientTickEvents.END_CLIENT_TICK.register(IndividualWaypoint::onTick); + + WorldRenderEvents.AFTER_TRANSLUCENT.register(context -> { if (waypoint != null) waypoint.render(context); }); + + ClientPlayConnectionEvents.JOIN.register((ignore, ignore2, ignore3) -> waypoint = null); + + ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register( + ClientCommandManager.literal(SkyblockerMod.NAMESPACE) + .then(ClientCommandManager.literal("waypoints") + .then(ClientCommandManager.literal("individual") + .then(ClientCommandManager.argument("x", IntegerArgumentType.integer(Integer.MIN_VALUE)) + .then(ClientCommandManager.argument("y", IntegerArgumentType.integer(Integer.MIN_VALUE)) + .then(ClientCommandManager.argument("z", IntegerArgumentType.integer(Integer.MIN_VALUE)) + .then(ClientCommandManager.argument("area", StringArgumentType.greedyString()) + .executes(context -> setWaypoint( + IntegerArgumentType.getInteger(context, "x"), + IntegerArgumentType.getInteger(context, "y"), + IntegerArgumentType.getInteger(context, "z"), + StringArgumentType.getString(context, "area") + )) + ) + ) + ) + ) + ) + ) + )); + } + + public IndividualWaypoint(BlockPos pos, Text name, float[] colorComponents) { + super(pos, name, colorComponents, 0.5f, true); + } + + private static int setWaypoint(int x, int y, int z, String area) { + String waypointName = area != null && !area.isEmpty() ? area : "Waypoint"; + + Text waypointDisplay; + if (waypointName.charAt(0) == '⏣') { + waypointDisplay = Text.literal("⏣").formatted(Formatting.DARK_PURPLE) + .append(Text.literal(waypointName.substring(1)).formatted(Formatting.AQUA)); + } else { + waypointDisplay = Text.literal(waypointName).formatted(Formatting.AQUA); + } + + waypoint = new IndividualWaypoint(new BlockPos(x, y, z), waypointDisplay, ColorUtils.getFloatComponents(Color.GREEN.getRGB())); + return Command.SINGLE_SUCCESS; + } + + private static void onTick(MinecraftClient c) { + if (waypoint != null && c.player.getPos().distanceTo(Vec3d.ofCenter(waypoint.pos)) <= 8) { + waypoint = null; + } + } + +} diff --git a/src/main/java/de/hysky/skyblocker/utils/scheduler/MessageScheduler.java b/src/main/java/de/hysky/skyblocker/utils/scheduler/MessageScheduler.java index 43194938..04596960 100644 --- a/src/main/java/de/hysky/skyblocker/utils/scheduler/MessageScheduler.java +++ b/src/main/java/de/hysky/skyblocker/utils/scheduler/MessageScheduler.java @@ -26,16 +26,20 @@ public class MessageScheduler extends Scheduler { * * @param message the message to send */ - public void sendMessageAfterCooldown(String message) { + public void sendMessageAfterCooldown(String message, boolean hide) { if (lastMessage + MIN_DELAY < System.currentTimeMillis()) { - sendMessage(message); + sendMessage(message,hide); lastMessage = System.currentTimeMillis(); } else { - queueMessage(message, 0); + queueMessage(message, hide, 0); } } - private void sendMessage(String message) { + public void sendMessageAfterCooldown(String message) { + sendMessageAfterCooldown(message, false); + } + + private void sendMessage(String message, boolean hide) { MinecraftClient client = MinecraftClient.getInstance(); if (client.player == null) { Scheduler.LOGGER.error("[Skyblocker Message Scheduler] Tried to send a message while player is null: {}", message); @@ -45,7 +49,7 @@ public class MessageScheduler extends Scheduler { if (message.startsWith("/")) { client.player.networkHandler.sendCommand(message.substring(1)); } else { - client.inGameHud.getChatHud().addToMessageHistory(message); + if (!hide) client.inGameHud.getChatHud().addToMessageHistory(message); client.player.networkHandler.sendChatMessage(message); } } @@ -56,8 +60,8 @@ public class MessageScheduler extends Scheduler { * @param message the message to send * @param delay the delay before sending the message in ticks */ - public void queueMessage(String message, int delay) { - schedule(() -> sendMessage(message), delay); + public void queueMessage(String message, boolean hide, int delay) { + schedule(() -> sendMessage(message, hide), delay); } @Override diff --git a/src/main/java/de/hysky/skyblocker/utils/waypoint/NamedWaypoint.java b/src/main/java/de/hysky/skyblocker/utils/waypoint/NamedWaypoint.java index 5ba920c0..60f053e2 100644 --- a/src/main/java/de/hysky/skyblocker/utils/waypoint/NamedWaypoint.java +++ b/src/main/java/de/hysky/skyblocker/utils/waypoint/NamedWaypoint.java @@ -7,6 +7,7 @@ import com.mojang.serialization.DataResult; import com.mojang.serialization.codecs.RecordCodecBuilder; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.utils.ColorUtils; +import de.hysky.skyblocker.utils.Utils; import de.hysky.skyblocker.utils.render.RenderHelper; import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; import net.minecraft.text.Text; @@ -114,7 +115,8 @@ public class NamedWaypoint extends Waypoint { public void render(WorldRenderContext context) { super.render(context); if (shouldRenderName()) { - RenderHelper.renderText(context, name, centerPos.add(0, 1, 0), true); + float scale = (float) (context.camera().getPos().distanceTo(centerPos) / 10); + RenderHelper.renderText(context, name, centerPos.add(0, 1, 0), scale, true); } } |
