package io.gitlab.jfronny.respackopts.mixin; import com.mojang.blaze3d.systems.RenderSystem; import io.gitlab.jfronny.libjf.config.api.v2.ConfigInstance; import io.gitlab.jfronny.libjf.config.api.v2.dsl.DSL; import io.gitlab.jfronny.libjf.config.api.v2.ui.ConfigScreenFactory; import io.gitlab.jfronny.respackopts.model.cache.CacheKey; import io.gitlab.jfronny.respackopts.util.MetaCache; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.pack.PackListWidget; import net.minecraft.client.gui.screen.pack.ResourcePackOrganizer; import net.minecraft.util.Identifier; import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(PackListWidget.ResourcePackEntry.class) public abstract class ResourcePackEntryMixin { @Final @Shadow private PackListWidget widget; @Shadow protected abstract boolean isSelectable(); @Shadow @Final private ResourcePackOrganizer.Pack pack; @Unique boolean rpo$selected; @Inject(at = @At("TAIL"), method = "render(Lnet/minecraft/client/gui/DrawContext;IIIIIIIZF)V") private void render(DrawContext context, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta, CallbackInfo info) { if (this.isSelectable() && MetaCache.getKeyByDisplayName(pack.getDisplayName().getString()) != null) { int d = mouseX - x; d = widget.getRowWidth() - d; int e = mouseY - y; rpo$selected = d <= 32 && d >= 12 && e <= entryHeight / 2 + 10 && e >= entryHeight / 2 - 10; rpo$renderButton(context, rpo$selected, new Identifier("modmenu", "textures/gui/configure_button.png"), x + entryWidth - 30, y + entryHeight / 2 - 10); } } @Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/widget/AlwaysSelectedEntryListWidget$Entry;mouseClicked(DDI)Z"), method = "mouseClicked(DDI)Z", cancellable = true) public void mouseClicked(double mouseX, double mouseY, int button, CallbackInfoReturnable info) { // Inject before super call if (this.isSelectable()) { CacheKey dataLocation = MetaCache.getKeyByDisplayName(pack.getDisplayName().getString()); if (dataLocation != null && rpo$selected) { info.setReturnValue(true); MinecraftClient c = MinecraftClient.getInstance(); String id = MetaCache.getId(dataLocation); ConfigInstance ci = DSL.create(id).config(builder -> MetaCache.getBranch(dataLocation).buildConfig(builder, id, dataLocation.dataLocation())); ConfigScreenFactory.Built screen = ConfigScreenFactory.getInstance().create(ci, c.currentScreen); c.setScreen(screen.get()); } } } @Unique private void rpo$renderButton(DrawContext context, boolean hovered, Identifier texture, int x, int y) { RenderSystem.setShaderColor(1, 1, 1, 1f); RenderSystem.disableDepthTest(); context.drawTexture(texture, x, y, 0, hovered ? 20 : 0, 20, 20, 32, 64); RenderSystem.enableDepthTest(); } }