aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/chat/chatcoords/ChatLocation.java26
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/chat/chatcoords/ChatWaypointLocation.java66
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dungeon/Reparty.java2
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/waypoint/IndividualWaypoint.java84
-rw-r--r--src/main/java/de/hysky/skyblocker/utils/scheduler/MessageScheduler.java18
-rw-r--r--src/main/java/de/hysky/skyblocker/utils/waypoint/NamedWaypoint.java4
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);
}
}