From dc18da2f30251bd6ed55550e34cd0bec09c0a600 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ampflower=20=F0=9F=8C=BA?= Date: Tue, 11 Mar 2025 22:53:46 -0700 Subject: [PATCH] feature: Joy's splashes now load alongside vanilla's --- .../java/gay/pridecraft/joy/JoyClient.java | 3 + .../gay/pridecraft/joy/client/SplashUtil.java | 112 ++++++++++++++++++ .../SplashTextResourceSupplierMixin.java | 45 +++---- .../{minecraft => joy}/texts/splashes.txt | 0 4 files changed, 129 insertions(+), 31 deletions(-) create mode 100644 src/client/java/gay/pridecraft/joy/client/SplashUtil.java rename src/main/resources/assets/{minecraft => joy}/texts/splashes.txt (100%) diff --git a/src/client/java/gay/pridecraft/joy/JoyClient.java b/src/client/java/gay/pridecraft/joy/JoyClient.java index 9573e9f..22fa978 100644 --- a/src/client/java/gay/pridecraft/joy/JoyClient.java +++ b/src/client/java/gay/pridecraft/joy/JoyClient.java @@ -1,5 +1,6 @@ package gay.pridecraft.joy; +import gay.pridecraft.joy.client.SplashUtil; import gay.pridecraft.joy.registry.JoyBlockEntityTypes; import gay.pridecraft.joy.registry.JoyBlocks; import gay.pridecraft.joy.registry.JoyEntities; @@ -45,6 +46,8 @@ public class JoyClient implements ClientModInitializer { JoyUtil.registerEnabledPack("menu", Text.of("Joy's Main Menu & HUD")); JoyUtil.registerEnabledPack("glint", Text.of("Joy's Enchantment Glint")); + + SplashUtil.init(); } private static void registerBedBlockRenderLayers() { diff --git a/src/client/java/gay/pridecraft/joy/client/SplashUtil.java b/src/client/java/gay/pridecraft/joy/client/SplashUtil.java new file mode 100644 index 0000000..0681c70 --- /dev/null +++ b/src/client/java/gay/pridecraft/joy/client/SplashUtil.java @@ -0,0 +1,112 @@ +package gay.pridecraft.joy.client; + +import com.mojang.logging.LogUtils; +import gay.pridecraft.joy.JoyUtil; +import net.minecraft.resource.ResourceManager; +import net.minecraft.util.Identifier; +import org.slf4j.Logger; + +import java.io.IOException; +import java.time.LocalDate; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.stream.Stream; + +/** + * @author Ampflower + * @since 1.0.0 + **/ +public final class SplashUtil { + private static final Logger logger = LogUtils.getLogger(); + private static final Random random = new Random(); + private static final Identifier joySplashes = JoyUtil.id("texts/splashes.txt"); + private static final Map> birthdays = new HashMap<>(); + private static final List contributors = makeContributors(); + + private static final byte + JAN = 1, + FEB = 2, + MAR = 3, + APR = 4, + MAY = 5, + JUN = 6, + JUL = 7, + AUG = 8, + SEP = 9, + OCT = 10, + NOV = 11, + DEC = 12; + + public static void init() { + putBirthday(MAR, 18, "TheClashFruit"); + putBirthday(SEP, 14, "Blurry"); + putBirthday(NOV, 8, "Fery"); + } + + private static List makeContributors() { + final var metadata = JoyUtil.joyContainer.getMetadata(); + + final var authors = metadata.getAuthors() + .stream() + .map(person -> "Joy, made by " + person.getName() + "!"); + + final var contributors = metadata.getContributors() + .stream() + .map(person -> "Joy, aided by " + person.getName() + "!"); + + return Stream.concat(authors, contributors).toList(); + } + + public static List prepare(ResourceManager manager) { + try (final var reader = manager.openAsReader(joySplashes)) { + return Stream.concat(reader.lines(), contributors.stream()).toList(); + } catch (IOException ioe) { + logger.warn("Could not read Joy splashes", ioe); + } + + return contributors; + } + + private static void putBirthday(int month, int day, String... name) { + birthdays.put(new Birthday(month, day), List.of(name)); + } + + public static List getBirthdays() { + return birthdays.get(Birthday.now()); + } + + public static String getBirthday(double chance) { + if (random.nextDouble() < chance) { + return null; + } + + final var list = getBirthdays(); + if (list == null || list.isEmpty()) { + return null; + } + + return "Happy birthday, " + getRandom(list) + "!"; + } + + private static T getRandom(List list) { + return list.get(random.nextInt(list.size())); + } + + private record Birthday(byte month, byte day) { + private Birthday(int month, int day) { + this((byte) month, (byte) day); + } + + public static Birthday now() { + final var now = LocalDate.now(); + return new Birthday(now.getMonthValue(), now.getDayOfMonth()); + } + + @Override + public int hashCode() { + return (month << 8) | day; + } + } +} diff --git a/src/client/java/gay/pridecraft/joy/mixin/client/SplashTextResourceSupplierMixin.java b/src/client/java/gay/pridecraft/joy/mixin/client/SplashTextResourceSupplierMixin.java index 9320bd6..627f8c9 100644 --- a/src/client/java/gay/pridecraft/joy/mixin/client/SplashTextResourceSupplierMixin.java +++ b/src/client/java/gay/pridecraft/joy/mixin/client/SplashTextResourceSupplierMixin.java @@ -1,52 +1,35 @@ package gay.pridecraft.joy.mixin.client; import com.llamalad7.mixinextras.injector.ModifyReturnValue; -import gay.pridecraft.joy.Joy; -import net.fabricmc.loader.api.FabricLoader; +import com.llamalad7.mixinextras.sugar.Local; +import gay.pridecraft.joy.client.SplashUtil; +import net.minecraft.client.gui.screen.SplashTextRenderer; import net.minecraft.client.resource.SplashTextResourceSupplier; import org.spongepowered.asm.mixin.Mixin; import net.minecraft.resource.ResourceManager; -import net.minecraft.util.profiler.Profiler; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import java.time.LocalDateTime; -import java.time.Month; -import java.util.ArrayList; import java.util.List; @Mixin(SplashTextResourceSupplier.class) public class SplashTextResourceSupplierMixin { - @ModifyReturnValue(method = "prepare(Lnet/minecraft/resource/ResourceManager;Lnet/minecraft/util/profiler/Profiler;)Ljava/util/List;", at = @At("RETURN")) - private List onPrepare(List original) { - List bdSplash = new ArrayList<>(); + @ModifyReturnValue(method = "prepare", at = @At("RETURN")) + private List onPrepare(List original, @Local(argsOnly = true) ResourceManager resourceManager) { + original.addAll(SplashUtil.prepare(resourceManager)); - FabricLoader - .getInstance() - .getModContainer(Joy.MOD_ID) - .ifPresent(modContainer -> - modContainer - .getMetadata() - .getAuthors() - .forEach(author -> - original.add("Made by " + author.getName() + "!") - ) - ); + return original; + } - LocalDateTime now = LocalDateTime.now(); + @Inject(method = "get", at = @At("HEAD"), cancellable = true) + private void onGet(CallbackInfoReturnable ci) { + String birthday = SplashUtil.getBirthday(.5); - if (now.getMonth() == Month.MARCH && now.getDayOfMonth() == 18) - bdSplash.add("Happy Birthday, TheClashFruit!"); - - if (now.getMonth() == Month.SEPTEMBER && now.getDayOfMonth() == 14) - bdSplash.add("Happy Birthday, Blurry!"); - - if (now.getMonth() == Month.NOVEMBER && now.getDayOfMonth() == 8) - bdSplash.add("Happy Birthday, Fery!"); - - return !bdSplash.isEmpty() ? bdSplash : original; + if (birthday != null) { + ci.setReturnValue(new SplashTextRenderer(birthday)); + } } } diff --git a/src/main/resources/assets/minecraft/texts/splashes.txt b/src/main/resources/assets/joy/texts/splashes.txt similarity index 100% rename from src/main/resources/assets/minecraft/texts/splashes.txt rename to src/main/resources/assets/joy/texts/splashes.txt