From 46fd6258c3f147ed1dfd1ecf152f41b0b56d284f Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Mon, 15 Jul 2024 11:33:16 +0300 Subject: SkyblockTime improvements. - Added skyblock hour - Added events for each time unit (year, season, month, day, hour) that are fired when the time unit changes value - Removed magic numbers and added constant fields holding the numbers --- .../de/hysky/skyblocker/utils/SkyblockTime.java | 116 ++++++++++++++++++--- 1 file changed, 103 insertions(+), 13 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/de/hysky/skyblocker/utils/SkyblockTime.java b/src/main/java/de/hysky/skyblocker/utils/SkyblockTime.java index ec3effaf..175156c0 100644 --- a/src/main/java/de/hysky/skyblocker/utils/SkyblockTime.java +++ b/src/main/java/de/hysky/skyblocker/utils/SkyblockTime.java @@ -1,6 +1,8 @@ package de.hysky.skyblocker.utils; import de.hysky.skyblocker.utils.scheduler.Scheduler; +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -13,39 +15,77 @@ public class SkyblockTime { public static final AtomicReference skyblockSeason = new AtomicReference<>(Season.SPRING); public static final AtomicReference skyblockMonth = new AtomicReference<>(Month.EARLY_SPRING); public static final AtomicInteger skyblockDay = new AtomicInteger(0); + public static final AtomicInteger skyblockHour = new AtomicInteger(0); private static final Logger LOGGER = LoggerFactory.getLogger("Skyblocker Time"); + //All time lengths are in milliseconds + public static final double HOUR_LENGTH = 50000; + public static final double DAY_LENGTH = HOUR_LENGTH * 24; + public static final double MONTH_LENGTH = DAY_LENGTH * 31; + public static final double SEASON_LENGTH = MONTH_LENGTH * 3; + public static final double YEAR_LENGTH = SEASON_LENGTH * 4; + private SkyblockTime() { } + /** + * Updates the time and schedules a cyclic scheduler which will update the time every hour, to be run on the next hour change. + */ public static void init() { updateTime(); - //ScheduleCyclic already runs the task upon scheduling, so there's no need to call updateTime() here - Scheduler.INSTANCE.schedule(() -> Scheduler.INSTANCE.scheduleCyclic(SkyblockTime::updateTime, 1200 * 20), (int) (1200000 - (getSkyblockMillis() % 1200000)) / 50); + //scheduleCyclic already runs the task upon scheduling, so there's no need to call updateTime() in the lambda as well + //The division by 50 is to convert the time to ticks + Scheduler.INSTANCE.schedule(() -> Scheduler.INSTANCE.scheduleCyclic(SkyblockTime::updateTime, (int) (HOUR_LENGTH / 50)), (int) (HOUR_LENGTH - (getSkyblockMillis() % HOUR_LENGTH)) / 50); } public static long getSkyblockMillis() { return System.currentTimeMillis() - SKYBLOCK_EPOCH; } - private static int getSkyblockYear() { - return (int) (Math.floor(getSkyblockMillis() / 446400000.0) + 1); + private static int calculateSkyblockYear() { + return (int) (Math.floor(getSkyblockMillis() / YEAR_LENGTH) + 1); + } + + private static int calculateSkyblockMonth() { + return (int) (Math.floor(getSkyblockMillis() / MONTH_LENGTH) % 12); } - private static int getSkyblockMonth() { - return (int) (Math.floor(getSkyblockMillis() / 37200000.0) % 12); + private static int calculateSkyblockDay() { + return (int) (Math.floor(getSkyblockMillis() / DAY_LENGTH) % 31 + 1); } - private static int getSkyblockDay() { - return (int) (Math.floor(getSkyblockMillis() / 1200000.0) % 31 + 1); + private static int calculateSkyblockHour() { + return (int) (Math.floor(getSkyblockMillis() / HOUR_LENGTH) % 24); } + //This could probably be compacted by abstracting the logic into a method that takes a Supplier and a Consumer, etc. but there's really no need private static void updateTime() { - skyblockYear.set(getSkyblockYear()); - skyblockSeason.set(Season.values()[getSkyblockMonth() / 3]); - skyblockMonth.set(Month.values()[getSkyblockMonth()]); - skyblockDay.set(getSkyblockDay()); - LOGGER.info("[Skyblocker Time] Skyblock time updated to Year {}, Season {}, Month {}, Day {}", skyblockYear.get(), skyblockSeason.get(), skyblockMonth.get(), skyblockDay.get()); + int year = calculateSkyblockYear(); + if (skyblockYear.get() != year) { + skyblockYear.set(year); + YEAR_CHANGE.invoker().onYearChange(year); + } + Season season = Season.values()[calculateSkyblockMonth() / 3]; + if (skyblockSeason.get() != season) { + skyblockSeason.set(season); + SEASON_CHANGE.invoker().onSeasonChange(season); + } + Month month = Month.values()[calculateSkyblockMonth()]; + if (skyblockMonth.get() != month) { + skyblockMonth.set(month); + MONTH_CHANGE.invoker().onMonthChange(month); + } + int day = calculateSkyblockDay(); + if (skyblockDay.get() != day) { + skyblockDay.set(day); + DAY_CHANGE.invoker().onDayChange(day); + } + int hour = calculateSkyblockHour(); + if (skyblockHour.get() != hour) { + skyblockHour.set(hour); + HOUR_CHANGE.invoker().onHourChange(hour); + } + LOGGER.info("[Skyblocker Time] Skyblock time updated to Year {}, Season {}, Month {}, Day {}, Hour {}", year, season, month, day, hour); } public enum Season { @@ -58,4 +98,54 @@ public class SkyblockTime { EARLY_FALL, FALL, LATE_FALL, EARLY_WINTER, WINTER, LATE_WINTER } + + public interface OnHourChange { + void onHourChange(int hour); + } + + public interface OnDayChange { + void onDayChange(int day); + } + + public interface OnMonthChange { + void onMonthChange(Month month); + } + + public interface OnSeasonChange { + void onSeasonChange(Season season); + } + + public interface OnYearChange { + void onYearChange(int year); + } + + public static final Event HOUR_CHANGE = EventFactory.createArrayBacked(OnHourChange.class, listeners -> hour -> { + for (OnHourChange listener : listeners) { + listener.onHourChange(hour); + } + }); + + public static final Event DAY_CHANGE = EventFactory.createArrayBacked(OnDayChange.class, listeners -> day -> { + for (OnDayChange listener : listeners) { + listener.onDayChange(day); + } + }); + + public static final Event MONTH_CHANGE = EventFactory.createArrayBacked(OnMonthChange.class, listeners -> month -> { + for (OnMonthChange listener : listeners) { + listener.onMonthChange(month); + } + }); + + public static final Event SEASON_CHANGE = EventFactory.createArrayBacked(OnSeasonChange.class, listeners -> season -> { + for (OnSeasonChange listener : listeners) { + listener.onSeasonChange(season); + } + }); + + public static final Event YEAR_CHANGE = EventFactory.createArrayBacked(OnYearChange.class, listeners -> year -> { + for (OnYearChange listener : listeners) { + listener.onYearChange(year); + } + }); } -- cgit From 9dcab1a19ceb27fb2cd6e6f553f58a3951ff9b0b Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Mon, 15 Jul 2024 11:34:00 +0300 Subject: Add a method for concatenating block pos fields with spaces in between --- src/main/java/de/hysky/skyblocker/utils/PosUtils.java | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src/main/java') diff --git a/src/main/java/de/hysky/skyblocker/utils/PosUtils.java b/src/main/java/de/hysky/skyblocker/utils/PosUtils.java index 4ca37a83..b6205088 100644 --- a/src/main/java/de/hysky/skyblocker/utils/PosUtils.java +++ b/src/main/java/de/hysky/skyblocker/utils/PosUtils.java @@ -25,4 +25,8 @@ public final class PosUtils { public static String getPosString(BlockPos blockPos) { return blockPos.getX() + "," + blockPos.getY() + "," + blockPos.getZ(); } + + public static String toSpaceSeparatedString(BlockPos blockPos) { + return blockPos.getX() + " " + blockPos.getY() + " " + blockPos.getZ(); + } } -- cgit From aacf590ee7e81ad3fbde3e904354e5a7382e109a Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Mon, 15 Jul 2024 11:34:51 +0300 Subject: Add ray tracing to EggFinder to make it fairer --- .../skyblock/chocolatefactory/EggFinder.java | 55 +++++++++++++++------- 1 file changed, 39 insertions(+), 16 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/EggFinder.java b/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/EggFinder.java index 6926fda8..004579d0 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/EggFinder.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/EggFinder.java @@ -12,6 +12,7 @@ import de.hysky.skyblocker.utils.scheduler.MessageScheduler; import de.hysky.skyblocker.utils.waypoint.Waypoint; import it.unimi.dsi.fastutil.objects.ObjectImmutableList; 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.message.v1.ClientReceiveMessageEvents; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents; import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; @@ -39,6 +40,7 @@ public class EggFinder { private static final Pattern eggFoundPattern = Pattern.compile("^(?:HOPPITY'S HUNT You found a Chocolate|You have already collected this Chocolate) (Breakfast|Lunch|Dinner)"); private static final Pattern newEggPattern = Pattern.compile("^HOPPITY'S HUNT A Chocolate (Breakfast|Lunch|Dinner) Egg has appeared!$"); private static final Logger logger = LoggerFactory.getLogger("Skyblocker Egg Finder"); + //This is most likely unnecessary with the addition of the location change packet, but it works fine and might be doing something so might as well keep it private static final LinkedList armorStandQueue = new LinkedList<>(); private static final Location[] possibleLocations = {Location.CRIMSON_ISLE, Location.CRYSTAL_HOLLOWS, Location.DUNGEON_HUB, Location.DWARVEN_MINES, Location.HUB, Location.THE_END, Location.THE_PARK, Location.GOLD_MINE, Location.DEEP_CAVERNS, Location.SPIDERS_DEN, Location.THE_FARMING_ISLAND}; private static boolean isLocationCorrect = false; @@ -51,6 +53,15 @@ public class EggFinder { SkyblockEvents.LOCATION_CHANGE.register(EggFinder::handleLocationChange); ClientReceiveMessageEvents.GAME.register(EggFinder::onChatMessage); WorldRenderEvents.AFTER_TRANSLUCENT.register(EggFinder::renderWaypoints); + ClientTickEvents.END_CLIENT_TICK.register(client -> { + if (!SkyblockerConfigManager.get().helpers.chocolateFactory.enableEggFinder || client.player == null) return; + for (EggType type : EggType.entries) { + Egg egg = type.egg; + if (egg != null && !egg.seen && client.player.canSee(egg.entity)) { + type.setSeen(); + } + } + }); ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register(literal(SkyblockerMod.NAMESPACE) .then(literal("eggFinder") .then(literal("shareLocation") @@ -73,7 +84,6 @@ public class EggFinder { armorStandQueue.clear(); return; } - while (!armorStandQueue.isEmpty()) { handleArmorStand(armorStandQueue.poll()); } @@ -87,7 +97,7 @@ public class EggFinder { if (!SkyblockerConfigManager.get().helpers.chocolateFactory.enableEggFinder) return; if (SkyblockTime.skyblockSeason.get() != SkyblockTime.Season.SPRING) return; if (armorStand.hasCustomName() || !armorStand.isInvisible() || !armorStand.shouldHideBasePlate()) return; - if (Utils.getLocation() == Location.UNKNOWN) { //The location is unknown upon world change and will be changed via /locraw soon, so we can queue it for now + if (Utils.getLocation() == Location.UNKNOWN) { //The location is unknown upon world change and will be changed via location change packets soon, so we can queue it for now armorStandQueue.add(armorStand); return; } @@ -116,25 +126,14 @@ public class EggFinder { } private static void handleFoundEgg(ArmorStandEntity entity, EggType eggType) { - eggType.egg = new Egg(entity, new Waypoint(entity.getBlockPos().up(2), SkyblockerConfigManager.get().helpers.chocolateFactory.waypointType, ColorUtils.getFloatComponents(eggType.color))); - - if (!SkyblockerConfigManager.get().helpers.chocolateFactory.sendEggFoundMessages || System.currentTimeMillis() - eggType.messageLastSent < 1000) return; - eggType.messageLastSent = System.currentTimeMillis(); - MinecraftClient.getInstance().player.sendMessage( - Constants.PREFIX.get() - .append("Found a ") - .append(Text.literal("Chocolate " + eggType + " Egg") - .withColor(eggType.color)) - .append(" at " + entity.getBlockPos().up(2).toShortString() + "!") - .styled(style -> style.withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/skyblocker eggFinder shareLocation " + entity.getBlockX() + " " + (entity.getBlockY() + 2) + " " + entity.getBlockZ() + " " + eggType)) - .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Text.literal("Click to share the location in chat!").formatted(Formatting.GREEN))))); + eggType.egg = new Egg(entity, new Waypoint(entity.getBlockPos().up(2), SkyblockerConfigManager.get().helpers.chocolateFactory.waypointType, ColorUtils.getFloatComponents(eggType.color)), false); } private static void renderWaypoints(WorldRenderContext context) { if (!SkyblockerConfigManager.get().helpers.chocolateFactory.enableEggFinder) return; for (EggType type : EggType.entries) { Egg egg = type.egg; - if (egg != null && egg.waypoint.shouldRender()) egg.waypoint.render(context); + if (egg != null && egg.waypoint.shouldRender() && egg.seen) egg.waypoint.render(context); } } @@ -160,7 +159,17 @@ public class EggFinder { } } - record Egg(ArmorStandEntity entity, Waypoint waypoint) {} + static class Egg { + private final ArmorStandEntity entity; + private final Waypoint waypoint; + private boolean seen; + + Egg(ArmorStandEntity entity, Waypoint waypoint, boolean seen) { + this.entity = entity; + this.waypoint = waypoint; + this.seen = seen; + } + } @SuppressWarnings("DataFlowIssue") //Removes that pesky "unboxing of Integer might cause NPE" warning when we already know it's not null public enum EggType { @@ -188,6 +197,20 @@ public class EggFinder { this.texture = texture; } + public void setSeen() { + egg.seen = true; + if (!SkyblockerConfigManager.get().helpers.chocolateFactory.sendEggFoundMessages || System.currentTimeMillis() - messageLastSent < 1000) return; + messageLastSent = System.currentTimeMillis(); + MinecraftClient.getInstance().player.sendMessage( + Constants.PREFIX.get() + .append("Found a ") + .append(Text.literal("Chocolate " + this + " Egg") + .withColor(color)) + .append(" at " + egg.entity.getBlockPos().up(2).toShortString() + "!") + .styled(style -> style.withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/skyblocker eggFinder shareLocation " + PosUtils.toSpaceSeparatedString(egg.waypoint.pos) + " " + this)) + .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Text.literal("Click to share the location in chat!").formatted(Formatting.GREEN))))); + } + @Override @SuppressWarnings("deprecation") // It's either a new dependency or a deprecated method, and I'd rather use the deprecated method public String toString() { -- cgit From 714e3948501986ec23a62b01886643ebed6c66f3 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Mon, 15 Jul 2024 11:45:05 +0300 Subject: Add apache commons text library to the project --- .../java/de/hysky/skyblocker/skyblock/chocolatefactory/EggFinder.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/EggFinder.java b/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/EggFinder.java index 004579d0..72de71d3 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/EggFinder.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/EggFinder.java @@ -25,7 +25,7 @@ import net.minecraft.text.ClickEvent; import net.minecraft.text.HoverEvent; import net.minecraft.text.Text; import net.minecraft.util.Formatting; -import org.apache.commons.lang3.text.WordUtils; +import org.apache.commons.text.WordUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -212,7 +212,6 @@ public class EggFinder { } @Override - @SuppressWarnings("deprecation") // It's either a new dependency or a deprecated method, and I'd rather use the deprecated method public String toString() { return WordUtils.capitalizeFully(this.name()); } -- cgit From 0c183f6a183ffaa53eeaf301e7cc9bb34be28adf Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Mon, 15 Jul 2024 11:45:23 +0300 Subject: Javadoc additions --- .../skyblocker/skyblock/chocolatefactory/EggFinder.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/EggFinder.java b/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/EggFinder.java index 72de71d3..e2e70653 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/EggFinder.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/EggFinder.java @@ -42,7 +42,14 @@ public class EggFinder { private static final Logger logger = LoggerFactory.getLogger("Skyblocker Egg Finder"); //This is most likely unnecessary with the addition of the location change packet, but it works fine and might be doing something so might as well keep it private static final LinkedList armorStandQueue = new LinkedList<>(); + /** + * The locations that the egg finder should work while the player is in. + */ private static final Location[] possibleLocations = {Location.CRIMSON_ISLE, Location.CRYSTAL_HOLLOWS, Location.DUNGEON_HUB, Location.DWARVEN_MINES, Location.HUB, Location.THE_END, Location.THE_PARK, Location.GOLD_MINE, Location.DEEP_CAVERNS, Location.SPIDERS_DEN, Location.THE_FARMING_ISLAND}; + /** + * Whether the player is in a location where the egg finder should work. + * This is set to false upon world change and will be checked with the location change event afterward. + */ private static boolean isLocationCorrect = false; private EggFinder() { @@ -182,10 +189,12 @@ public class EggFinder { public final String texture; /* When a new egg spawns in the player's range, the order of packets/messages goes like this: - set_equipment -> new egg message -> set_entity_data + set_equipment → new egg message → set_entity_data We have to set the egg to null to prevent the highlight from staying where it was before the new egg spawned, - and doing so causes the found message to get sent twice. This is the reason for the existence of this field, so that we can not send the 2nd message. - This doesn't fix the field being set twice, but that's not an issue anyway. It'd be much harder to fix the highlight issue mentioned above if it wasn't being set twice. + and doing so causes the found message to get sent twice. + This is the reason for the existence of this field, so that we don't send the 2nd message. + This doesn't fix the field being set twice, but that's not an issue anyway. + It'd be much harder to fix the highlight issue mentioned above if it wasn't being set twice. */ private long messageLastSent = 0; -- cgit From eecce3d586317dea4c1adbdd16b51904c3e3d71d Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Mon, 15 Jul 2024 12:07:13 +0300 Subject: Don't highlight eggs if the same egg was found on another island --- .../skyblock/chocolatefactory/EggFinder.java | 45 +++++++++++----------- 1 file changed, 23 insertions(+), 22 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/EggFinder.java b/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/EggFinder.java index e2e70653..83d0c3ce 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/EggFinder.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/EggFinder.java @@ -52,11 +52,10 @@ public class EggFinder { */ private static boolean isLocationCorrect = false; - private EggFinder() { - } + private EggFinder() {} public static void init() { - ClientPlayConnectionEvents.JOIN.register((ignored, ignored2, ignored3) -> invalidateState()); + ClientPlayConnectionEvents.JOIN.register((ignored, ignored2, ignored3) -> isLocationCorrect = false); SkyblockEvents.LOCATION_CHANGE.register(EggFinder::handleLocationChange); ClientReceiveMessageEvents.GAME.register(EggFinder::onChatMessage); WorldRenderEvents.AFTER_TRANSLUCENT.register(EggFinder::renderWaypoints); @@ -69,6 +68,11 @@ public class EggFinder { } } }); + SkyblockTime.HOUR_CHANGE.register(hour -> { + for (EggType type : EggType.entries) { + if (hour == type.resetHour) type.collected = false; + } + }); ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register(literal(SkyblockerMod.NAMESPACE) .then(literal("eggFinder") .then(literal("shareLocation") @@ -116,7 +120,7 @@ public class EggFinder { ItemUtils.getHeadTextureOptional(itemStack).ifPresent(texture -> { for (EggType type : EggType.entries) { //Compare blockPos rather than entity to avoid incorrect matches when the entity just moves rather than a new one being spawned elsewhere if (texture.equals(type.texture) && (type.egg == null || !type.egg.entity.getBlockPos().equals(armorStand.getBlockPos()))) { - handleFoundEgg(armorStand, type); + type.egg = new Egg(armorStand, new Waypoint(armorStand.getBlockPos().up(2), SkyblockerConfigManager.get().helpers.chocolateFactory.waypointType, ColorUtils.getFloatComponents(type.color)), false); return; } } @@ -124,18 +128,6 @@ public class EggFinder { } } - private static void invalidateState() { - if (!SkyblockerConfigManager.get().helpers.chocolateFactory.enableEggFinder) return; - isLocationCorrect = false; - for (EggType type : EggType.entries) { - type.egg = null; - } - } - - private static void handleFoundEgg(ArmorStandEntity entity, EggType eggType) { - eggType.egg = new Egg(entity, new Waypoint(entity.getBlockPos().up(2), SkyblockerConfigManager.get().helpers.chocolateFactory.waypointType, ColorUtils.getFloatComponents(eggType.color)), false); - } - private static void renderWaypoints(WorldRenderContext context) { if (!SkyblockerConfigManager.get().helpers.chocolateFactory.enableEggFinder) return; for (EggType type : EggType.entries) { @@ -149,7 +141,9 @@ public class EggFinder { Matcher matcher = eggFoundPattern.matcher(text.getString()); if (matcher.find()) { try { - Egg egg = EggType.valueOf(matcher.group(1).toUpperCase()).egg; + EggType eggType = EggType.valueOf(matcher.group(1).toUpperCase()); + eggType.collected = true; + Egg egg = eggType.egg; if (egg != null) egg.waypoint.setFound(); } catch (IllegalArgumentException e) { logger.error("[Skyblocker Egg Finder] Failed to find egg type for egg found message. Tried to match against: " + matcher.group(0), e); @@ -159,7 +153,7 @@ public class EggFinder { matcher.usePattern(newEggPattern); if (matcher.find()) { try { - EggType.valueOf(matcher.group(1).toUpperCase()).egg = null; + EggType.valueOf(matcher.group(1).toUpperCase()); } catch (IllegalArgumentException e) { logger.error("[Skyblocker Egg Finder] Failed to find egg type for egg spawn message. Tried to match against: " + matcher.group(0), e); } @@ -180,13 +174,15 @@ public class EggFinder { @SuppressWarnings("DataFlowIssue") //Removes that pesky "unboxing of Integer might cause NPE" warning when we already know it's not null public enum EggType { - LUNCH(Formatting.BLUE.getColorValue(), "ewogICJ0aW1lc3RhbXAiIDogMTcxMTQ2MjU2ODExMiwKICAicHJvZmlsZUlkIiA6ICI3NzUwYzFhNTM5M2Q0ZWQ0Yjc2NmQ4ZGUwOWY4MjU0NiIsCiAgInByb2ZpbGVOYW1lIiA6ICJSZWVkcmVsIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzdhZTZkMmQzMWQ4MTY3YmNhZjk1MjkzYjY4YTRhY2Q4NzJkNjZlNzUxZGI1YTM0ZjJjYmM2NzY2YTAzNTZkMGEiCiAgICB9CiAgfQp9"), - DINNER(Formatting.GREEN.getColorValue(), "ewogICJ0aW1lc3RhbXAiIDogMTcxMTQ2MjY0OTcwMSwKICAicHJvZmlsZUlkIiA6ICI3NGEwMzQxNWY1OTI0ZTA4YjMyMGM2MmU1NGE3ZjJhYiIsCiAgInByb2ZpbGVOYW1lIiA6ICJNZXp6aXIiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZTVlMzYxNjU4MTlmZDI4NTBmOTg1NTJlZGNkNzYzZmY5ODYzMTMxMTkyODNjMTI2YWNlMGM0Y2M0OTVlNzZhOCIKICAgIH0KICB9Cn0"), - BREAKFAST(Formatting.GOLD.getColorValue(), "ewogICJ0aW1lc3RhbXAiIDogMTcxMTQ2MjY3MzE0OSwKICAicHJvZmlsZUlkIiA6ICJiN2I4ZTlhZjEwZGE0NjFmOTY2YTQxM2RmOWJiM2U4OCIsCiAgInByb2ZpbGVOYW1lIiA6ICJBbmFiYW5hbmFZZzciLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYTQ5MzMzZDg1YjhhMzE1ZDAzMzZlYjJkZjM3ZDhhNzE0Y2EyNGM1MWI4YzYwNzRmMWI1YjkyN2RlYjUxNmMyNCIKICAgIH0KICB9Cn0"); + LUNCH(Formatting.BLUE.getColorValue(), 14, "ewogICJ0aW1lc3RhbXAiIDogMTcxMTQ2MjU2ODExMiwKICAicHJvZmlsZUlkIiA6ICI3NzUwYzFhNTM5M2Q0ZWQ0Yjc2NmQ4ZGUwOWY4MjU0NiIsCiAgInByb2ZpbGVOYW1lIiA6ICJSZWVkcmVsIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzdhZTZkMmQzMWQ4MTY3YmNhZjk1MjkzYjY4YTRhY2Q4NzJkNjZlNzUxZGI1YTM0ZjJjYmM2NzY2YTAzNTZkMGEiCiAgICB9CiAgfQp9"), + DINNER(Formatting.GREEN.getColorValue(), 21, "ewogICJ0aW1lc3RhbXAiIDogMTcxMTQ2MjY0OTcwMSwKICAicHJvZmlsZUlkIiA6ICI3NGEwMzQxNWY1OTI0ZTA4YjMyMGM2MmU1NGE3ZjJhYiIsCiAgInByb2ZpbGVOYW1lIiA6ICJNZXp6aXIiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZTVlMzYxNjU4MTlmZDI4NTBmOTg1NTJlZGNkNzYzZmY5ODYzMTMxMTkyODNjMTI2YWNlMGM0Y2M0OTVlNzZhOCIKICAgIH0KICB9Cn0"), + BREAKFAST(Formatting.GOLD.getColorValue(), 7, "ewogICJ0aW1lc3RhbXAiIDogMTcxMTQ2MjY3MzE0OSwKICAicHJvZmlsZUlkIiA6ICJiN2I4ZTlhZjEwZGE0NjFmOTY2YTQxM2RmOWJiM2U4OCIsCiAgInByb2ZpbGVOYW1lIiA6ICJBbmFiYW5hbmFZZzciLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYTQ5MzMzZDg1YjhhMzE1ZDAzMzZlYjJkZjM3ZDhhNzE0Y2EyNGM1MWI4YzYwNzRmMWI1YjkyN2RlYjUxNmMyNCIKICAgIH0KICB9Cn0"); private Egg egg = null; public final int color; public final String texture; + public final int resetHour; + boolean collected = false; /* When a new egg spawns in the player's range, the order of packets/messages goes like this: set_equipment → new egg message → set_entity_data @@ -201,14 +197,19 @@ public class EggFinder { //This is to not create an array each time we iterate over the values public static final ObjectImmutableList entries = ObjectImmutableList.of(EggType.values()); - EggType(int color, String texture) { + EggType(int color, int resetHour, String texture) { this.color = color; + this.resetHour = resetHour; this.texture = texture; } public void setSeen() { egg.seen = true; if (!SkyblockerConfigManager.get().helpers.chocolateFactory.sendEggFoundMessages || System.currentTimeMillis() - messageLastSent < 1000) return; + if (collected) { + egg.waypoint.setFound(); + return; + } messageLastSent = System.currentTimeMillis(); MinecraftClient.getInstance().player.sendMessage( Constants.PREFIX.get() -- cgit From 1b66bf714c3c758c2c3c996f3b99eefd2ecc4fe6 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Mon, 15 Jul 2024 12:19:21 +0300 Subject: Add another SkyblockTime event for when the time changes, with all time variables --- src/main/java/de/hysky/skyblocker/utils/SkyblockTime.java | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'src/main/java') diff --git a/src/main/java/de/hysky/skyblocker/utils/SkyblockTime.java b/src/main/java/de/hysky/skyblocker/utils/SkyblockTime.java index 175156c0..300d902e 100644 --- a/src/main/java/de/hysky/skyblocker/utils/SkyblockTime.java +++ b/src/main/java/de/hysky/skyblocker/utils/SkyblockTime.java @@ -85,6 +85,7 @@ public class SkyblockTime { skyblockHour.set(hour); HOUR_CHANGE.invoker().onHourChange(hour); } + TIME_UPDATE.invoker().onTimeUpdate(year, season, month, day, hour); LOGGER.info("[Skyblocker Time] Skyblock time updated to Year {}, Season {}, Month {}, Day {}, Hour {}", year, season, month, day, hour); } @@ -119,6 +120,10 @@ public class SkyblockTime { void onYearChange(int year); } + public interface OnTimeUpdate { + void onTimeUpdate(int year, Season season, Month month, int day, int hour); + } + public static final Event HOUR_CHANGE = EventFactory.createArrayBacked(OnHourChange.class, listeners -> hour -> { for (OnHourChange listener : listeners) { listener.onHourChange(hour); @@ -148,4 +153,10 @@ public class SkyblockTime { listener.onYearChange(year); } }); + + public static final Event TIME_UPDATE = EventFactory.createArrayBacked(OnTimeUpdate.class, listeners -> (year, season, month, day, hour) -> { + for (OnTimeUpdate listener : listeners) { + listener.onTimeUpdate(year, season, month, day, hour); + } + }); } -- cgit From 9cd356c1bbba90d16bd05524248bc499fced6963 Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Fri, 2 Aug 2024 20:34:15 +0800 Subject: Apply code review suggestions --- .../skyblock/chocolatefactory/EggFinder.java | 1 + .../de/hysky/skyblocker/utils/SkyblockTime.java | 67 ++++++++++------------ 2 files changed, 32 insertions(+), 36 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/EggFinder.java b/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/EggFinder.java index 83d0c3ce..6d390039 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/EggFinder.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/EggFinder.java @@ -61,6 +61,7 @@ public class EggFinder { WorldRenderEvents.AFTER_TRANSLUCENT.register(EggFinder::renderWaypoints); ClientTickEvents.END_CLIENT_TICK.register(client -> { if (!SkyblockerConfigManager.get().helpers.chocolateFactory.enableEggFinder || client.player == null) return; + if (!isLocationCorrect || SkyblockTime.skyblockSeason.get() != SkyblockTime.Season.SPRING) return; for (EggType type : EggType.entries) { Egg egg = type.egg; if (egg != null && !egg.seen && client.player.canSee(egg.entity)) { diff --git a/src/main/java/de/hysky/skyblocker/utils/SkyblockTime.java b/src/main/java/de/hysky/skyblocker/utils/SkyblockTime.java index 300d902e..739fd148 100644 --- a/src/main/java/de/hysky/skyblocker/utils/SkyblockTime.java +++ b/src/main/java/de/hysky/skyblocker/utils/SkyblockTime.java @@ -25,6 +25,37 @@ public class SkyblockTime { public static final double SEASON_LENGTH = MONTH_LENGTH * 3; public static final double YEAR_LENGTH = SEASON_LENGTH * 4; + public static final Event HOUR_CHANGE = EventFactory.createArrayBacked(OnHourChange.class, listeners -> hour -> { + for (OnHourChange listener : listeners) { + listener.onHourChange(hour); + } + }); + public static final Event DAY_CHANGE = EventFactory.createArrayBacked(OnDayChange.class, listeners -> day -> { + for (OnDayChange listener : listeners) { + listener.onDayChange(day); + } + }); + public static final Event MONTH_CHANGE = EventFactory.createArrayBacked(OnMonthChange.class, listeners -> month -> { + for (OnMonthChange listener : listeners) { + listener.onMonthChange(month); + } + }); + public static final Event SEASON_CHANGE = EventFactory.createArrayBacked(OnSeasonChange.class, listeners -> season -> { + for (OnSeasonChange listener : listeners) { + listener.onSeasonChange(season); + } + }); + public static final Event YEAR_CHANGE = EventFactory.createArrayBacked(OnYearChange.class, listeners -> year -> { + for (OnYearChange listener : listeners) { + listener.onYearChange(year); + } + }); + public static final Event TIME_UPDATE = EventFactory.createArrayBacked(OnTimeUpdate.class, listeners -> (year, season, month, day, hour) -> { + for (OnTimeUpdate listener : listeners) { + listener.onTimeUpdate(year, season, month, day, hour); + } + }); + private SkyblockTime() { } @@ -123,40 +154,4 @@ public class SkyblockTime { public interface OnTimeUpdate { void onTimeUpdate(int year, Season season, Month month, int day, int hour); } - - public static final Event HOUR_CHANGE = EventFactory.createArrayBacked(OnHourChange.class, listeners -> hour -> { - for (OnHourChange listener : listeners) { - listener.onHourChange(hour); - } - }); - - public static final Event DAY_CHANGE = EventFactory.createArrayBacked(OnDayChange.class, listeners -> day -> { - for (OnDayChange listener : listeners) { - listener.onDayChange(day); - } - }); - - public static final Event MONTH_CHANGE = EventFactory.createArrayBacked(OnMonthChange.class, listeners -> month -> { - for (OnMonthChange listener : listeners) { - listener.onMonthChange(month); - } - }); - - public static final Event SEASON_CHANGE = EventFactory.createArrayBacked(OnSeasonChange.class, listeners -> season -> { - for (OnSeasonChange listener : listeners) { - listener.onSeasonChange(season); - } - }); - - public static final Event YEAR_CHANGE = EventFactory.createArrayBacked(OnYearChange.class, listeners -> year -> { - for (OnYearChange listener : listeners) { - listener.onYearChange(year); - } - }); - - public static final Event TIME_UPDATE = EventFactory.createArrayBacked(OnTimeUpdate.class, listeners -> (year, season, month, day, hour) -> { - for (OnTimeUpdate listener : listeners) { - listener.onTimeUpdate(year, season, month, day, hour); - } - }); } -- cgit