aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorviciscat <51047087+viciscat@users.noreply.github.com>2025-07-03 22:11:56 +0200
committerGitHub <noreply@github.com>2025-07-03 22:11:56 +0200
commite484c60e4d2b3749566c2fd7a974b1877f1f7c34 (patch)
tree804ed4ac452c926eb3863e0eb70d07769ac3b225 /src/main/java
parentb2fd451ec4feff31f525b9738ea85149bcadfd2e (diff)
downloadSkyblocker-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')
-rw-r--r--src/main/java/de/hysky/skyblocker/compatibility/ResourcePackCompatibility.java111
-rw-r--r--src/main/java/de/hysky/skyblocker/mixins/HandledScreenProviderMixin.java4
-rw-r--r--src/main/java/de/hysky/skyblocker/mixins/InventoryScreenMixin.java9
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionBrowserScreen.java3
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java13
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/itemlist/recipebook/SkyblockRecipeResults.java5
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))