From 4e82c974a7217824eab084fe43ce4385b6aae52d Mon Sep 17 00:00:00 2001 From: vicisacat Date: Sat, 20 Apr 2024 16:04:25 +0200 Subject: start event notifications --- src/main/java/de/hysky/skyblocker/SkyblockerMod.java | 1 + 1 file changed, 1 insertion(+) (limited to 'src/main/java/de/hysky/skyblocker/SkyblockerMod.java') diff --git a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java index a9aab3b6..abf09032 100644 --- a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java +++ b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java @@ -177,6 +177,7 @@ public class SkyblockerMod implements ClientModInitializer { Kuudra.init(); RenderHelper.init(); FancyStatusBars.init(); + EventNotifications.init(); containerSolverManager.init(); statusBarTracker.init(); BeaconHighlighter.init(); -- cgit From cc4823e3646573d052ea36fef1ce6d9f9e9b90fd Mon Sep 17 00:00:00 2001 From: vicisacat Date: Sat, 20 Apr 2024 21:08:48 +0200 Subject: some more progress --- .../java/de/hysky/skyblocker/SkyblockerMod.java | 1 + .../skyblocker/skyblock/EventNotifications.java | 103 --------------------- .../skyblock/events/EventNotifications.java | 102 ++++++++++++++++++++ .../skyblocker/skyblock/events/EventToast.java | 76 +++++++++++++++ .../resources/assets/skyblocker/lang/en_us.json | 2 + .../textures/gui/sprites/notification.png | Bin 0 -> 157 bytes .../textures/gui/sprites/notification.png.mcmeta | 10 ++ 7 files changed, 191 insertions(+), 103 deletions(-) delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/EventNotifications.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/events/EventNotifications.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/events/EventToast.java create mode 100644 src/main/resources/assets/skyblocker/textures/gui/sprites/notification.png create mode 100644 src/main/resources/assets/skyblocker/textures/gui/sprites/notification.png.mcmeta (limited to 'src/main/java/de/hysky/skyblocker/SkyblockerMod.java') diff --git a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java index abf09032..19eb395a 100644 --- a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java +++ b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java @@ -26,6 +26,7 @@ import de.hysky.skyblocker.skyblock.end.EnderNodes; import de.hysky.skyblocker.skyblock.end.TheEnd; import de.hysky.skyblocker.skyblock.entity.MobBoundingBoxes; import de.hysky.skyblocker.skyblock.fancybars.FancyStatusBars; +import de.hysky.skyblocker.skyblock.events.EventNotifications; import de.hysky.skyblocker.skyblock.garden.FarmingHud; import de.hysky.skyblocker.skyblock.garden.LowerSensitivity; import de.hysky.skyblocker.skyblock.garden.VisitorHelper; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/EventNotifications.java b/src/main/java/de/hysky/skyblocker/skyblock/EventNotifications.java deleted file mode 100644 index 5f3bae90..00000000 --- a/src/main/java/de/hysky/skyblocker/skyblock/EventNotifications.java +++ /dev/null @@ -1,103 +0,0 @@ -package de.hysky.skyblocker.skyblock; - -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.mojang.logging.LogUtils; -import de.hysky.skyblocker.SkyblockerMod; -import de.hysky.skyblocker.events.SkyblockEvents; -import de.hysky.skyblocker.utils.Http; -import de.hysky.skyblocker.utils.scheduler.Scheduler; -import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.toast.SystemToast; -import net.minecraft.text.Text; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.jetbrains.annotations.Nullable; -import org.slf4j.Logger; - -import java.util.*; -import java.util.concurrent.CompletableFuture; - -public class EventNotifications { - private static final Logger LOGGER = LogUtils.getLogger(); - - private static long currentTime = System.currentTimeMillis() / 1000; - - public static void init() { - Scheduler.INSTANCE.scheduleCyclic(EventNotifications::timeUpdate, 20); - - SkyblockEvents.JOIN.register(EventNotifications::refreshEvents); - } - - private static final Map> events = new Object2ObjectOpenHashMap<>(); - - public static void refreshEvents() { - CompletableFuture.supplyAsync(() -> { - try { - JsonArray jsonElements = SkyblockerMod.GSON.fromJson(Http.sendGetRequest("https://hysky.de/api/calendar"), JsonArray.class); - return jsonElements.asList().stream().map(JsonElement::getAsJsonObject).toList(); - } catch (Exception e) { - LOGGER.error("[Skyblocker] Failed to download warps list", e); - } - return List.of(); - }).thenAccept(eventsList -> { - events.clear(); - for (JsonObject object : eventsList) { - if (object.get("timestamp").getAsLong() + object.get("duration").getAsInt() < currentTime) continue; - SkyblockEvent skyblockEvent = SkyblockEvent.of(object); - events.computeIfAbsent(object.get("event").getAsString(), s -> new LinkedList<>()).add(skyblockEvent); - } - - for (Map.Entry> entry : events.entrySet()) { - entry.getValue().sort(Comparator.comparingLong(SkyblockEvent::start)); // Sort just in case it's not in order for some reason in API - LOGGER.info("Next {} is at {}", entry.getKey(), entry.getValue().peekFirst()); - } - }); - } - - - - private static void timeUpdate() { - long newTime = System.currentTimeMillis() / 1000; - LOGGER.info(String.valueOf(newTime)); - for (Map.Entry> entry : events.entrySet()) { - LinkedList nextEvents = entry.getValue(); - SkyblockEvent skyblockEvent = nextEvents.peekFirst(); - if (skyblockEvent == null) continue; - if (newTime > skyblockEvent.start() + skyblockEvent.duration()) { - nextEvents.pollFirst(); - skyblockEvent = nextEvents.peekFirst(); - if (skyblockEvent == null) continue; - } - if (currentTime + 60 < skyblockEvent.start() && newTime + 60 >= skyblockEvent.start()) { - MinecraftClient.getInstance().getToastManager().add(new SystemToast( - SystemToast.Type.PERIODIC_NOTIFICATION, - Text.literal(entry.getKey()), - Text.literal("Starting soon!"))); - } - } - currentTime = newTime; - } - - public record SkyblockEvent(long start, int duration, String[] extras, @Nullable String warpCommand) { - public static SkyblockEvent of(JsonObject jsonObject) { - String location = jsonObject.get("location").getAsString(); - location = location.isBlank() ? null: location; - return new SkyblockEvent(jsonObject.get("timestamp").getAsLong(), - jsonObject.get("duration").getAsInt(), - jsonObject.get("extras").getAsJsonArray().asList().stream().map(JsonElement::getAsString).toArray(String[]::new), - location); - } - - @Override - public String toString() { - return new ToStringBuilder(this) - .append("start", start) - .append("duration", duration) - .append("extras", extras) - .append("warpCommand", warpCommand) - .toString(); - } - } -} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/events/EventNotifications.java b/src/main/java/de/hysky/skyblocker/skyblock/events/EventNotifications.java new file mode 100644 index 00000000..1d5761a5 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/events/EventNotifications.java @@ -0,0 +1,102 @@ +package de.hysky.skyblocker.skyblock.events; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.mojang.logging.LogUtils; +import de.hysky.skyblocker.SkyblockerMod; +import de.hysky.skyblocker.events.SkyblockEvents; +import de.hysky.skyblocker.utils.Http; +import de.hysky.skyblocker.utils.scheduler.Scheduler; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.toast.SystemToast; +import net.minecraft.text.Text; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.jetbrains.annotations.Nullable; +import org.slf4j.Logger; + +import java.util.*; +import java.util.concurrent.CompletableFuture; + +public class EventNotifications { + private static final Logger LOGGER = LogUtils.getLogger(); + + private static long currentTime = System.currentTimeMillis() / 1000; + + public static void init() { + Scheduler.INSTANCE.scheduleCyclic(EventNotifications::timeUpdate, 20); + + SkyblockEvents.JOIN.register(EventNotifications::refreshEvents); + } + + private static final Map> events = new Object2ObjectOpenHashMap<>(); + + public static void refreshEvents() { + CompletableFuture.supplyAsync(() -> { + try { + JsonArray jsonElements = SkyblockerMod.GSON.fromJson(Http.sendGetRequest("https://hysky.de/api/calendar"), JsonArray.class); + return jsonElements.asList().stream().map(JsonElement::getAsJsonObject).toList(); + } catch (Exception e) { + LOGGER.error("[Skyblocker] Failed to download warps list", e); + } + return List.of(); + }).thenAccept(eventsList -> { + events.clear(); + for (JsonObject object : eventsList) { + if (object.get("timestamp").getAsLong() + object.get("duration").getAsInt() < currentTime) continue; + SkyblockEvent skyblockEvent = SkyblockEvent.of(object); + events.computeIfAbsent(object.get("event").getAsString(), s -> new LinkedList<>()).add(skyblockEvent); + } + + for (Map.Entry> entry : events.entrySet()) { + entry.getValue().sort(Comparator.comparingLong(SkyblockEvent::start)); // Sort just in case it's not in order for some reason in API + //LOGGER.info("Next {} is at {}", entry.getKey(), entry.getValue().peekFirst()); + } + }); + } + + + + private static void timeUpdate() { + long newTime = System.currentTimeMillis() / 1000; + for (Map.Entry> entry : events.entrySet()) { + LinkedList nextEvents = entry.getValue(); + SkyblockEvent skyblockEvent = nextEvents.peekFirst(); + if (skyblockEvent == null) continue; + if (newTime > skyblockEvent.start() + skyblockEvent.duration()) { + nextEvents.pollFirst(); + skyblockEvent = nextEvents.peekFirst(); + if (skyblockEvent == null) continue; + } + if (currentTime + 60 < skyblockEvent.start() && newTime + 60 >= skyblockEvent.start()) { + MinecraftClient.getInstance().getToastManager().add(new SystemToast( + SystemToast.Type.PERIODIC_NOTIFICATION, + Text.literal(entry.getKey()), + Text.literal("Starting soon!"))); + } + } + currentTime = newTime; + } + + public record SkyblockEvent(long start, int duration, String[] extras, @Nullable String warpCommand) { + public static SkyblockEvent of(JsonObject jsonObject) { + String location = jsonObject.get("location").getAsString(); + location = location.isBlank() ? null: location; + return new SkyblockEvent(jsonObject.get("timestamp").getAsLong(), + jsonObject.get("duration").getAsInt(), + jsonObject.get("extras").getAsJsonArray().asList().stream().map(JsonElement::getAsString).toArray(String[]::new), + location); + } + + @Override + public String toString() { + return new ToStringBuilder(this) + .append("start", start) + .append("duration", duration) + .append("extras", extras) + .append("warpCommand", warpCommand) + .toString(); + } + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/events/EventToast.java b/src/main/java/de/hysky/skyblocker/skyblock/events/EventToast.java new file mode 100644 index 00000000..4a0d139b --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/events/EventToast.java @@ -0,0 +1,76 @@ +package de.hysky.skyblocker.skyblock.events; + +import de.hysky.skyblocker.SkyblockerMod; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.toast.Toast; +import net.minecraft.client.toast.ToastManager; +import net.minecraft.item.ItemStack; +import net.minecraft.screen.ScreenTexts; +import net.minecraft.text.MutableText; +import net.minecraft.text.OrderedText; +import net.minecraft.text.Text; +import net.minecraft.util.Colors; +import net.minecraft.util.Formatting; +import net.minecraft.util.Identifier; + +import java.util.List; + +public class EventToast implements Toast { + private static final Identifier TEXTURE = new Identifier(SkyblockerMod.NAMESPACE, "notification"); + + private final long eventStartTime; + + private final List message; + private final ItemStack icon; + + public EventToast(long eventStartTime, String name, ItemStack icon) { + this.eventStartTime = eventStartTime; + MutableText formatted = Text.translatable("skyblocker.events.startsSoon", Text.literal(name).formatted(Formatting.YELLOW)).formatted(Formatting.WHITE); + message = MinecraftClient.getInstance().textRenderer.wrapLines(formatted, 200); + this.icon = icon; + + } + @Override + public Visibility draw(DrawContext context, ToastManager manager, long startTime) { + context.drawGuiTexture(TEXTURE, 0, 0, getWidth(), getHeight()); + + long currentTime = System.currentTimeMillis() / 1000; + int timeTillEvent = (int) (eventStartTime - currentTime); + + int seconds = timeTillEvent % 60; + int minutes = (timeTillEvent/60) % 60; + int hours = (timeTillEvent/3600) % 24; + + MutableText time = Text.empty(); + if (hours > 0) { + time.append(hours + "h").append(" "); + } + if (hours > 0 || minutes > 0) { + time.append(minutes + "m").append(" "); + } + time.append(seconds + "s"); + + int y = 4; + TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; + for (OrderedText orderedText : message) { + context.drawText(textRenderer, orderedText, 30, y, Colors.WHITE, false); + y += textRenderer.fontHeight; + } + context.drawText(textRenderer, time, 30, y, Colors.LIGHT_YELLOW, false); + + context.drawItemWithoutEntity(icon, 8, getHeight()/2 - 8); + return startTime > 5_000 ? Visibility.HIDE: Visibility.SHOW; + } + + @Override + public int getWidth() { + return 200 + 30 + 5; + } + + @Override + public int getHeight() { + return 8 + 9 + message.size()*9; + } +} diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index 57abdc46..8b549ac7 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -761,6 +761,8 @@ "skyblocker.itemProtection.noItemUuid": "§cYou must be holding an item that has a uuid in order to protect it!", "skyblocker.itemProtection.unableToProtect": "§cUnable to protect this item :( (Are you in skyblock?, are you holding an item?)", + "skyblocker.events.startsSoon": "%s starts soon!", + "skyblocker.tips.enabled": "§aEnabled Tips.", "skyblocker.tips.disabled": "§cDisabled Tips.", "skyblocker.tips.clickEnable": "§a[Click to Enable Tips]", diff --git a/src/main/resources/assets/skyblocker/textures/gui/sprites/notification.png b/src/main/resources/assets/skyblocker/textures/gui/sprites/notification.png new file mode 100644 index 00000000..8f272cd7 Binary files /dev/null and b/src/main/resources/assets/skyblocker/textures/gui/sprites/notification.png differ diff --git a/src/main/resources/assets/skyblocker/textures/gui/sprites/notification.png.mcmeta b/src/main/resources/assets/skyblocker/textures/gui/sprites/notification.png.mcmeta new file mode 100644 index 00000000..c514d54c --- /dev/null +++ b/src/main/resources/assets/skyblocker/textures/gui/sprites/notification.png.mcmeta @@ -0,0 +1,10 @@ +{ + "gui": { + "scaling": { + "type": "nine_slice", + "width": 160, + "height": 32, + "border": 4 + } + } +} \ No newline at end of file -- cgit