From e484c60e4d2b3749566c2fd7a974b1877f1f7c34 Mon Sep 17 00:00:00 2001 From: viciscat <51047087+viciscat@users.noreply.github.com> Date: Thu, 3 Jul 2025 22:11:56 +0200 Subject: resourcepack compatibility (#1407) * furfsky compatibility v1 * different title if quick nav is enabled in inventory screen * oops * change how slot is rendered * fix slot and check for firmament first * Update src/main/java/de/hysky/skyblocker/skyblock/itemlist/recipebook/SkyblockCraftingRecipeResults.java Co-authored-by: Yasin <19829407+LifeIsAParadox@users.noreply.github.com> * Update SkyblockCraftingRecipeResults.java * Update SkyblockCraftingRecipeResults.java * Update SkyblockCraftingRecipeResults.java * edit id * make it more general --------- Co-authored-by: Yasin <19829407+LifeIsAParadox@users.noreply.github.com> --- .../compatibility/ResourcePackCompatibility.java | 111 +++++++++++++++++++++ .../mixins/HandledScreenProviderMixin.java | 4 +- .../skyblocker/mixins/InventoryScreenMixin.java | 9 ++ .../skyblock/auction/AuctionBrowserScreen.java | 3 +- .../skyblock/item/SkyblockInventoryScreen.java | 13 ++- .../itemlist/recipebook/SkyblockRecipeResults.java | 5 +- 6 files changed, 140 insertions(+), 5 deletions(-) create mode 100644 src/main/java/de/hysky/skyblocker/compatibility/ResourcePackCompatibility.java (limited to 'src/main/java') diff --git a/src/main/java/de/hysky/skyblocker/compatibility/ResourcePackCompatibility.java b/src/main/java/de/hysky/skyblocker/compatibility/ResourcePackCompatibility.java new file mode 100644 index 00000000..d50f72a6 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/compatibility/ResourcePackCompatibility.java @@ -0,0 +1,111 @@ +package de.hysky.skyblocker.compatibility; + +import com.mojang.logging.LogUtils; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import de.hysky.skyblocker.SkyblockerMod; +import de.hysky.skyblocker.annotations.Init; +import it.unimi.dsi.fastutil.Pair; +import net.fabricmc.fabric.api.resource.IdentifiableResourceReloadListener; +import net.fabricmc.fabric.api.resource.ResourceManagerHelper; +import net.minecraft.resource.ResourceManager; +import net.minecraft.resource.ResourceType; +import net.minecraft.resource.SinglePreparationResourceReloader; +import net.minecraft.resource.metadata.ResourceMetadataSerializer; +import net.minecraft.util.Identifier; +import net.minecraft.util.profiler.Profiler; +import org.jetbrains.annotations.Nullable; +import org.slf4j.Logger; + +import java.io.IOException; +import java.util.*; + +public class ResourcePackCompatibility { + + public static final Logger LOGGER = LogUtils.getLogger(); + + public static ResourcePackOptions options = ResourcePackOptions.EMPTY; + + @Init(priority = -1) + public static void init() { + ResourceManagerHelper.get(ResourceType.CLIENT_RESOURCES).registerReloadListener(new ReloadListener()); + } + + private static final class ReloadListener extends SinglePreparationResourceReloader>> implements IdentifiableResourceReloadListener { + + private static final ResourceMetadataSerializer ID_SERIALIZER = new ResourceMetadataSerializer<>( + "resource_pack_id", + Codec.STRING + ); + private static final ResourceMetadataSerializer SKYBLOCKER_SERIALIZER = new ResourceMetadataSerializer<>( + "skyblocker", + ResourcePackOptions.CODEC + ); + + @Override + public Identifier getFabricId() { + return Identifier.of(SkyblockerMod.NAMESPACE, "reload_listener"); + } + + @Override + protected List> prepare(ResourceManager manager, Profiler profiler) { + return manager.streamResourcePacks().map( + resourcePack -> { + try { + return Pair.of(resourcePack.parseMetadata(ID_SERIALIZER), resourcePack.parseMetadata(SKYBLOCKER_SERIALIZER)); + } catch (IOException e) { + LOGGER.error("Failed to parse resource pack metadata", e); + return null; + } + } + ).toList(); + } + + @Override + protected void apply(List> prepared, ResourceManager manager, Profiler profiler) { + if (prepared.stream().anyMatch(p -> "FURFSKY_GUI".equals(p.first()))) { + options = new ResourcePackOptions(Optional.of(true), Optional.of(true), Optional.of(true)); + LOGGER.info("FURFSKY_GUI detected. Enabling compatibility names."); + return; + } + List list = new ArrayList<>(prepared.stream().map(Pair::right).filter(Objects::nonNull).toList()); + if (!list.isEmpty()) { + options = merge(null, list); + } else { + options = ResourcePackOptions.EMPTY; + } + LOGGER.info(options.toString()); + + } + } + + public record ResourcePackOptions( + Optional renameAuctionBrowser, + Optional renameInventoryScreen, + Optional renameCraftingTable + ) { + public static final ResourcePackOptions EMPTY = new ResourcePackOptions(Optional.empty(), Optional.empty(), Optional.empty()); + + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Codec.BOOL.optionalFieldOf("rename_auction_browser").forGetter(ResourcePackOptions::renameAuctionBrowser), + Codec.BOOL.optionalFieldOf("rename_inventory_screen").forGetter(ResourcePackOptions::renameInventoryScreen), + Codec.BOOL.optionalFieldOf("rename_crafting_table").forGetter(ResourcePackOptions::renameCraftingTable) + ).apply(instance, ResourcePackOptions::new)); + } + + public static ResourcePackOptions merge(@Nullable ResourcePackOptions a, List b) { + ResourcePackOptions above = b.removeFirst(); + if (a == null) { + return b.isEmpty() ? above : merge(above, b); + } + ResourcePackOptions merged = new ResourcePackOptions( + above.renameAuctionBrowser().isPresent() ? above.renameAuctionBrowser() : a.renameAuctionBrowser(), + above.renameInventoryScreen().isPresent() ? above.renameInventoryScreen() : a.renameInventoryScreen(), + above.renameCraftingTable().isPresent() ? above.renameCraftingTable() : a.renameCraftingTable() + ); + if (b.isEmpty()) { + return merged; + } + return merge(merged, b); + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/HandledScreenProviderMixin.java b/src/main/java/de/hysky/skyblocker/mixins/HandledScreenProviderMixin.java index 5d04fea4..d1edb51c 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/HandledScreenProviderMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/HandledScreenProviderMixin.java @@ -1,5 +1,6 @@ package de.hysky.skyblocker.mixins; +import de.hysky.skyblocker.compatibility.ResourcePackCompatibility; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.skyblock.auction.AuctionBrowserScreen; import de.hysky.skyblocker.skyblock.auction.AuctionHouseScreenHandler; @@ -90,7 +91,8 @@ public interface HandledScreenProviderMixin { case GenericContainerScreenHandler containerScreenHandler when SkyblockerConfigManager.get().uiAndVisuals.fancyCraftingTable && name.getString().toLowerCase().contains("craft item") -> { SkyblockCraftingTableScreenHandler skyblockCraftingTableScreenHandler = new SkyblockCraftingTableScreenHandler(containerScreenHandler, player.getInventory()); client.player.currentScreenHandler = skyblockCraftingTableScreenHandler; - client.setScreen(new SkyblockCraftingTableScreen(skyblockCraftingTableScreenHandler, player.getInventory(), Text.literal("Craft Item"))); + client.setScreen(new SkyblockCraftingTableScreen(skyblockCraftingTableScreenHandler, player.getInventory(), + ResourcePackCompatibility.options.renameCraftingTable().orElse(false) ? Text.literal("CraftingTableSkyblocker") : Text.literal("Craft Item"))); ci.cancel(); } diff --git a/src/main/java/de/hysky/skyblocker/mixins/InventoryScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixins/InventoryScreenMixin.java index 7d85500c..44674a14 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/InventoryScreenMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/InventoryScreenMixin.java @@ -1,7 +1,9 @@ package de.hysky.skyblocker.mixins; import com.llamalad7.mixinextras.sugar.Local; +import de.hysky.skyblocker.compatibility.ResourcePackCompatibility; import de.hysky.skyblocker.injected.RecipeBookHolder; +import de.hysky.skyblocker.mixins.accessors.ScreenAccessor; import net.minecraft.entity.player.PlayerEntity; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -76,6 +78,13 @@ public abstract class InventoryScreenMixin extends HandledScreen lore = ItemUtils.getLore(stack); + + List lore = Screen.getTooltipFromItem(MinecraftClient.getInstance(), stack); if (name.contains(query) || lore.stream().map(Text::getString) .map(string -> string.toLowerCase(Locale.ENGLISH)) -- cgit