diff options
| author | viciscat <51047087+viciscat@users.noreply.github.com> | 2025-07-03 22:11:56 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-07-03 22:11:56 +0200 |
| commit | e484c60e4d2b3749566c2fd7a974b1877f1f7c34 (patch) | |
| tree | 804ed4ac452c926eb3863e0eb70d07769ac3b225 /src/main/java | |
| parent | b2fd451ec4feff31f525b9738ea85149bcadfd2e (diff) | |
| download | Skyblocker-e484c60e4d2b3749566c2fd7a974b1877f1f7c34.tar.gz Skyblocker-e484c60e4d2b3749566c2fd7a974b1877f1f7c34.tar.bz2 Skyblocker-e484c60e4d2b3749566c2fd7a974b1877f1f7c34.zip | |
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>
Diffstat (limited to 'src/main/java')
6 files changed, 140 insertions, 5 deletions
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<List<Pair<String, ResourcePackOptions>>> implements IdentifiableResourceReloadListener { + + private static final ResourceMetadataSerializer<String> ID_SERIALIZER = new ResourceMetadataSerializer<>( + "resource_pack_id", + Codec.STRING + ); + private static final ResourceMetadataSerializer<ResourcePackOptions> SKYBLOCKER_SERIALIZER = new ResourceMetadataSerializer<>( + "skyblocker", + ResourcePackOptions.CODEC + ); + + @Override + public Identifier getFabricId() { + return Identifier.of(SkyblockerMod.NAMESPACE, "reload_listener"); + } + + @Override + protected List<Pair<String, ResourcePackOptions>> 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<Pair<String, ResourcePackOptions>> 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<ResourcePackOptions> 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<Boolean> renameAuctionBrowser, + Optional<Boolean> renameInventoryScreen, + Optional<Boolean> renameCraftingTable + ) { + public static final ResourcePackOptions EMPTY = new ResourcePackOptions(Optional.empty(), Optional.empty(), Optional.empty()); + + public static final Codec<ResourcePackOptions> 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<ResourcePackOptions> 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<T extends ScreenHandler> { 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<PlayerScreenHan recipeBookToggleCallbacks.clear(); } + @Inject(method = "<init>", at = @At("TAIL"), order = 900) // run it a little earlier in case firmament do stuff + private void skyblocker$furfskyCompat(CallbackInfo ci) { + if (Utils.isOnSkyblock() && ResourcePackCompatibility.options.renameInventoryScreen().orElse(false)) { + ((ScreenAccessor) this).setTitle(Text.literal(SkyblockerConfigManager.get().quickNav.enableQuickNav ? "InventoryScreenQuickNavSkyblocker": "InventoryScreenSkyblocker")); + } + } + @Override public void registerRecipeBookToggleCallback(Runnable runnable) { recipeBookToggleCallbacks.add(runnable); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionBrowserScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionBrowserScreen.java index 342b9f8a..a7ff1883 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionBrowserScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionBrowserScreen.java @@ -1,6 +1,7 @@ package de.hysky.skyblocker.skyblock.auction; import de.hysky.skyblocker.SkyblockerMod; +import de.hysky.skyblocker.compatibility.ResourcePackCompatibility; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.skyblock.auction.widgets.AuctionTypeWidget; import de.hysky.skyblocker.skyblock.auction.widgets.CategoryTabWidget; @@ -73,7 +74,7 @@ public class AuctionBrowserScreen extends AbstractCustomHypixelGUI<AuctionHouseS private String search = ""; public AuctionBrowserScreen(AuctionHouseScreenHandler handler, PlayerInventory inventory) { - super(handler, inventory, Text.literal("Auctions Browser")); + super(handler, inventory, ResourcePackCompatibility.options.renameAuctionBrowser().orElse(false) ? Text.literal("AuctionBrowserSkyblocker") : Text.literal("Auctions Browser")); this.backgroundHeight = 187; this.playerInventoryTitleY = 92; this.titleX = 999; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java index 6667faf5..c1446251 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java @@ -3,8 +3,11 @@ package de.hysky.skyblocker.skyblock.item; import com.mojang.serialization.Codec; import de.hysky.skyblocker.SkyblockerMod; import de.hysky.skyblocker.annotations.Init; +import de.hysky.skyblocker.compatibility.ResourcePackCompatibility; +import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.events.SkyblockEvents; import de.hysky.skyblocker.mixins.accessors.HandledScreenAccessor; +import de.hysky.skyblocker.mixins.accessors.ScreenAccessor; import de.hysky.skyblocker.mixins.accessors.SlotAccessor; import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.Utils; @@ -21,6 +24,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtIo; import net.minecraft.nbt.NbtOps; import net.minecraft.screen.slot.Slot; +import net.minecraft.text.Text; import net.minecraft.util.Identifier; import org.apache.commons.lang3.ArrayUtils; import org.slf4j.Logger; @@ -110,6 +114,9 @@ public class SkyblockInventoryScreen extends InventoryScreen { public SkyblockInventoryScreen(PlayerEntity player) { super(player); + if (ResourcePackCompatibility.options.renameInventoryScreen().orElse(false)) { + ((ScreenAccessor) this).setTitle(Text.literal(SkyblockerConfigManager.get().quickNav.enableQuickNav ? "InventoryScreenEquipmentQuickNavSkyblocker": "InventoryScreenEquipmentSkyblocker")); + } SimpleInventory inventory = new SimpleInventory(Utils.isInTheRift() ? equipment_rift: equipment); for (int i = 0; i < 4; i++) { equipmentSlots[i] = new EquipmentSlot(inventory, i, 77, 8 + i * 18); @@ -169,9 +176,11 @@ public class SkyblockInventoryScreen extends InventoryScreen { @Override protected void drawBackground(DrawContext context, float delta, int mouseX, int mouseY) { super.drawBackground(context, delta, mouseX, mouseY); - for (int i = 0; i < 4; i++) { - context.drawGuiTexture(RenderLayer::getGuiTextured, SLOT_TEXTURE, x + 76 + (i == 3 ? 21 : 0), y + 7 + i * 18, 18, 18); + for (int i = 0; i < 3; i++) { + context.drawGuiTexture(RenderLayer::getGuiTextured, SLOT_TEXTURE, x + 76, y + 7 + i * 18, 18, 18); } + Slot slot = handler.slots.get(45); + context.drawGuiTexture(RenderLayer::getGuiTextured, SLOT_TEXTURE, x + slot.x - 1, y + slot.y - 1, 18, 18); } @Override diff --git a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/recipebook/SkyblockRecipeResults.java b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/recipebook/SkyblockRecipeResults.java index f2142a76..8d7a2626 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/recipebook/SkyblockRecipeResults.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/recipebook/SkyblockRecipeResults.java @@ -8,6 +8,7 @@ import com.google.common.collect.Lists; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.skyblock.item.WikiLookup; +import de.hysky.skyblocker.skyblock.item.tooltip.TooltipManager; import de.hysky.skyblocker.skyblock.itemlist.ItemRepository; import de.hysky.skyblocker.skyblock.itemlist.recipes.SkyblockCraftingRecipe; import de.hysky.skyblocker.skyblock.itemlist.recipes.SkyblockForgeRecipe; @@ -18,6 +19,7 @@ import de.hysky.skyblocker.utils.scheduler.MessageScheduler; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.recipebook.RecipeBookResults; import net.minecraft.client.gui.widget.ToggleButtonWidget; import net.minecraft.component.DataComponentTypes; @@ -209,7 +211,8 @@ public class SkyblockRecipeResults implements RecipeAreaDisplay { for (ItemStack stack : ItemRepository.getItems()) { String name = stack.getName().getString().toLowerCase(Locale.ENGLISH); if (!filterOption.test(name)) continue; - List<Text> lore = ItemUtils.getLore(stack); + + List<Text> lore = Screen.getTooltipFromItem(MinecraftClient.getInstance(), stack); if (name.contains(query) || lore.stream().map(Text::getString) .map(string -> string.toLowerCase(Locale.ENGLISH)) |
