Skip to content

Commit

Permalink
Add Garden Plots Widget (#929)
Browse files Browse the repository at this point in the history
* Add Garden Plots Widget

* small fix

* make for loop more boring

* exclusion zones

* rebase oopsie daisy and JEI exclusion zone

* ctrl+shift+up arrow

* Fix init merge conflicts

* merge and port

* 1.21.4

---------

Co-authored-by: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com>
  • Loading branch information
viciscat and kevinthegreat1 authored Dec 23, 2024
1 parent 7e7020b commit 6177e51
Show file tree
Hide file tree
Showing 8 changed files with 429 additions and 5 deletions.
Original file line number Diff line number Diff line change
@@ -1,14 +1,20 @@
package de.hysky.skyblocker.compatibility.emi;

import de.hysky.skyblocker.SkyblockerMod;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.mixins.accessors.HandledScreenAccessor;
import de.hysky.skyblocker.skyblock.itemlist.ItemRepository;
import de.hysky.skyblocker.utils.ItemUtils;
import de.hysky.skyblocker.utils.Location;
import de.hysky.skyblocker.utils.Utils;
import dev.emi.emi.api.EmiPlugin;
import dev.emi.emi.api.EmiRegistry;
import dev.emi.emi.api.recipe.EmiRecipeCategory;
import dev.emi.emi.api.render.EmiTexture;
import dev.emi.emi.api.stack.Comparison;
import dev.emi.emi.api.stack.EmiStack;
import dev.emi.emi.api.widget.Bounds;
import net.minecraft.client.gui.screen.ingame.InventoryScreen;
import net.minecraft.item.Items;
import net.minecraft.util.Identifier;

Expand All @@ -29,5 +35,10 @@ public void register(EmiRegistry registry) {
registry.addCategory(SKYBLOCK);
registry.addWorkstation(SKYBLOCK, EmiStack.of(Items.CRAFTING_TABLE));
ItemRepository.getRecipesStream().map(SkyblockEmiRecipe::new).forEach(registry::addRecipe);
registry.addExclusionArea(InventoryScreen.class, (screen, consumer) -> {
if (!SkyblockerConfigManager.get().farming.garden.gardenPlotsWidget || !Utils.getLocation().equals(Location.GARDEN)) return;
HandledScreenAccessor accessor = (HandledScreenAccessor) screen;
consumer.accept(new Bounds(accessor.getX() + accessor.getBackgroundWidth() + 4, accessor.getY(), 104, 127));
});
}
}
Original file line number Diff line number Diff line change
@@ -1,23 +1,33 @@
package de.hysky.skyblocker.compatibility.jei;

import de.hysky.skyblocker.SkyblockerMod;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.mixins.accessors.HandledScreenAccessor;
import de.hysky.skyblocker.skyblock.itemlist.ItemRepository;
import de.hysky.skyblocker.utils.Location;
import de.hysky.skyblocker.utils.Utils;
import de.hysky.skyblocker.utils.datafixer.ItemStackComponentizationFixer;
import mezz.jei.api.IModPlugin;
import mezz.jei.api.JeiPlugin;
import mezz.jei.api.constants.VanillaTypes;
import mezz.jei.api.gui.handlers.IGuiContainerHandler;
import mezz.jei.api.registration.IGuiHandlerRegistration;
import mezz.jei.api.registration.IRecipeCategoryRegistration;
import mezz.jei.api.registration.IRecipeRegistration;
import mezz.jei.api.registration.ISubtypeRegistration;
import mezz.jei.library.ingredients.subtypes.SubtypeInterpreters;
import mezz.jei.library.load.registration.SubtypeRegistration;
import mezz.jei.library.plugins.vanilla.crafting.CraftingCategoryExtension;
import net.minecraft.client.gui.screen.ingame.InventoryScreen;
import net.minecraft.client.util.math.Rect2i;
import net.minecraft.item.ItemStack;
import net.minecraft.recipe.*;
import net.minecraft.recipe.book.CraftingRecipeCategory;
import net.minecraft.util.Identifier;
import org.jetbrains.annotations.NotNull;

import java.util.Collections;
import java.util.List;
import java.util.Map;

@JeiPlugin
Expand Down Expand Up @@ -45,6 +55,11 @@ public void registerCategories(@NotNull IRecipeCategoryRegistration registration
registration.addRecipeCategories(skyblockCraftingRecipeCategory);
}

@Override
public void registerGuiHandlers(@NotNull IGuiHandlerRegistration registration) {
registration.addGuiContainerHandler(InventoryScreen.class, new InventoryContainerHandler());
}

@Override
public void registerRecipes(@NotNull IRecipeRegistration registration) {
//FIXME no clue what to replace any of this with, we can't use items as that does not work
Expand All @@ -63,4 +78,13 @@ public void registerRecipes(@NotNull IRecipeRegistration registration) {
), "abc", "def", "ghi"), recipe.getResult()))
).toList());*/
}

private static class InventoryContainerHandler implements IGuiContainerHandler<InventoryScreen> {
@Override
public @NotNull List<Rect2i> getGuiExtraAreas(@NotNull InventoryScreen containerScreen) {
if (!SkyblockerConfigManager.get().farming.garden.gardenPlotsWidget || !Utils.getLocation().equals(Location.GARDEN)) return List.of();
HandledScreenAccessor accessor = (HandledScreenAccessor) containerScreen;
return Collections.singletonList(new Rect2i(accessor.getX() + accessor.getBackgroundWidth() + 4, accessor.getY(), 104, 127));
}
}
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,24 @@
package de.hysky.skyblocker.compatibility.rei;

import de.hysky.skyblocker.SkyblockerMod;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.mixins.accessors.HandledScreenAccessor;
import de.hysky.skyblocker.skyblock.itemlist.ItemRepository;
import de.hysky.skyblocker.utils.Location;
import de.hysky.skyblocker.utils.Utils;
import me.shedaniel.math.Rectangle;
import me.shedaniel.rei.api.client.plugins.REIClientPlugin;
import me.shedaniel.rei.api.client.registry.category.CategoryRegistry;
import me.shedaniel.rei.api.client.registry.display.DisplayRegistry;
import me.shedaniel.rei.api.client.registry.entry.EntryRegistry;
import me.shedaniel.rei.api.client.registry.screen.ExclusionZones;
import me.shedaniel.rei.api.common.category.CategoryIdentifier;
import me.shedaniel.rei.api.common.util.EntryStacks;
import net.minecraft.client.gui.screen.ingame.InventoryScreen;
import net.minecraft.item.Items;

import java.util.List;

/**
* REI integration
*/
Expand All @@ -31,4 +40,13 @@ public void registerDisplays(DisplayRegistry displayRegistry) {
public void registerEntries(EntryRegistry entryRegistry) {
entryRegistry.addEntries(ItemRepository.getItemsStream().map(EntryStacks::of).toList());
}

@Override
public void registerExclusionZones(ExclusionZones zones) {
zones.register(InventoryScreen.class, screen -> {
if (!SkyblockerConfigManager.get().farming.garden.gardenPlotsWidget || !Utils.getLocation().equals(Location.GARDEN)) return List.of();
HandledScreenAccessor accessor = (HandledScreenAccessor) screen;
return List.of(new Rectangle(accessor.getX() + accessor.getBackgroundWidth() + 4, accessor.getY(), 104, 127));
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,7 @@
import de.hysky.skyblocker.skyblock.garden.FarmingHudWidget;
import de.hysky.skyblocker.skyblock.tabhud.config.WidgetsConfigurationScreen;
import de.hysky.skyblocker.utils.Location;
import dev.isxander.yacl3.api.ButtonOption;
import dev.isxander.yacl3.api.ConfigCategory;
import dev.isxander.yacl3.api.Option;
import dev.isxander.yacl3.api.OptionGroup;
import dev.isxander.yacl3.api.*;
import net.minecraft.client.MinecraftClient;
import net.minecraft.text.Text;

Expand Down Expand Up @@ -62,6 +59,22 @@ public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig
newValue -> config.farming.garden.lockMouseGroundOnly = newValue)
.controller(ConfigUtils::createBooleanController)
.build())
.option(Option.<Boolean>createBuilder()
.name(Text.translatable("skyblocker.config.farming.garden.gardenPlotsWidget"))
.description(OptionDescription.of(Text.translatable("skyblocker.config.farming.garden.gardenPlotsWidget.@Tooltip")))
.binding(defaults.farming.garden.gardenPlotsWidget,
() -> config.farming.garden.gardenPlotsWidget,
newValue -> config.farming.garden.gardenPlotsWidget = newValue)
.controller(ConfigUtils::createBooleanController)
.build())
.option(Option.<Boolean>createBuilder()
.name(Text.translatable("skyblocker.config.farming.garden.closeScreenOnPlotClick"))
.description(OptionDescription.of(Text.translatable("skyblocker.config.farming.garden.closeScreenOnPlotClick.@Tooltip")))
.binding(defaults.farming.garden.closeScreenOnPlotClick,
() -> config.farming.garden.closeScreenOnPlotClick,
newValue -> config.farming.garden.closeScreenOnPlotClick = newValue)
.controller(ConfigUtils::createBooleanController)
.build())
.build())
.build();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,12 @@ public static class Garden {

@SerialEntry
public boolean lockMouseGroundOnly = false;

@SerialEntry
public boolean gardenPlotsWidget = true;

@SerialEntry
public boolean closeScreenOnPlotClick = false;
}

public static class FarmingHud {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,36 @@
import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;

import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.skyblock.garden.GardenPlotsWidget;
import de.hysky.skyblocker.skyblock.itemlist.recipebook.SkyblockRecipeBookWidget;
import de.hysky.skyblocker.utils.Location;
import de.hysky.skyblocker.utils.Utils;
import net.minecraft.client.gui.DrawContext;
import de.hysky.skyblocker.utils.scheduler.MessageScheduler;
import net.minecraft.client.gui.screen.ingame.HandledScreen;
import net.minecraft.client.gui.screen.ingame.InventoryScreen;
import net.minecraft.client.gui.screen.ingame.StatusEffectsDisplay;
import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget;
import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.screen.PlayerScreenHandler;
import net.minecraft.text.Text;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

@Mixin(InventoryScreen.class)
public abstract class InventoryScreenMixin {
public abstract class InventoryScreenMixin extends HandledScreen<PlayerScreenHandler> {

@Unique
private GardenPlotsWidget gardenPlotsWidget;
@Unique
private ButtonWidget deskButton;

public InventoryScreenMixin(PlayerScreenHandler handler, PlayerInventory inventory, Text title) {
super(handler, inventory, title);
}


@ModifyArg(method = "<init>", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/ingame/RecipeBookScreen;<init>(Lnet/minecraft/screen/AbstractRecipeScreenHandler;Lnet/minecraft/client/gui/screen/recipebook/RecipeBookWidget;Lnet/minecraft/entity/player/PlayerInventory;Lnet/minecraft/text/Text;)V"))
private static RecipeBookWidget<?> skyblocker$replaceRecipeBook(RecipeBookWidget<?> original, @Local(argsOnly = true) PlayerEntity player) {
Expand All @@ -40,4 +61,26 @@ public abstract class InventoryScreenMixin {
private boolean skyblocker$markStatusEffectsHidden(boolean original) {
return Utils.isOnSkyblock() ? !SkyblockerConfigManager.get().uiAndVisuals.hideStatusEffectOverlay : original;
}

@Inject(method = "onRecipeBookToggled", at = @At("TAIL"))
private void skyblocker$moveGardenPlotsWdiget(CallbackInfo ci) {
if (Utils.getLocation().equals(Location.GARDEN) && gardenPlotsWidget != null) {
gardenPlotsWidget.setPosition(x + backgroundWidth + 4, y);
if (deskButton != null) deskButton.setPosition(gardenPlotsWidget.getX() + 4, y + 108);
}
}

@Inject(method = "init", at = @At("TAIL"))
private void skyblocker$addGardenPlotsWidget(CallbackInfo ci) {
if (Utils.getLocation().equals(Location.GARDEN) && SkyblockerConfigManager.get().farming.garden.gardenPlotsWidget) {
gardenPlotsWidget = new GardenPlotsWidget(x + backgroundWidth + 4, y);
deskButton = ButtonWidget.builder(Text.translatable("skyblocker.gardenPlots.openDesk"), button -> MessageScheduler.INSTANCE.sendMessageAfterCooldown("/desk"))
.dimensions(gardenPlotsWidget.getX() + 7, y + 108, 60, 15)
.build();
// make desk button get selected before the widget but render after the widget
addSelectableChild(deskButton);
addDrawableChild(gardenPlotsWidget);
addDrawable(deskButton);
}
}
}
Loading

0 comments on commit 6177e51

Please sign in to comment.