From 0c364d08c1479b1bb427b06c5a921a0bd35f9371 Mon Sep 17 00:00:00 2001 From: isXander Date: Fri, 21 Apr 2023 18:13:20 +0100 Subject: [PATCH] recipe book snapping --- .../snapping/AbstractFurnaceScreenMixin.java | 30 +++++++++++++++++ .../snapping/CraftingScreenMixin.java | 30 +++++++++++++++++ .../snapping/InventoryScreenMixin.java | 32 +++++++++++++++++++ .../snapping/RecipeBookComponentAccessor.java | 18 +++++++++++ .../snapping/RecipeBookPageAccessor.java | 14 ++++++++ .../controlify/virtualmouse/SnapUtils.java | 32 +++++++++++++++++++ src/main/resources/controlify.mixins.json | 5 +++ 7 files changed, 161 insertions(+) create mode 100644 src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/AbstractFurnaceScreenMixin.java create mode 100644 src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/CraftingScreenMixin.java create mode 100644 src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/InventoryScreenMixin.java create mode 100644 src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/RecipeBookComponentAccessor.java create mode 100644 src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/RecipeBookPageAccessor.java create mode 100644 src/main/java/dev/isxander/controlify/virtualmouse/SnapUtils.java diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/AbstractFurnaceScreenMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/AbstractFurnaceScreenMixin.java new file mode 100644 index 0000000..258bc0f --- /dev/null +++ b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/AbstractFurnaceScreenMixin.java @@ -0,0 +1,30 @@ +package dev.isxander.controlify.mixins.feature.virtualmouse.snapping; + +import dev.isxander.controlify.api.vmousesnapping.SnapPoint; +import dev.isxander.controlify.virtualmouse.SnapUtils; +import net.minecraft.client.gui.screens.inventory.AbstractFurnaceScreen; +import net.minecraft.client.gui.screens.recipebook.AbstractFurnaceRecipeBookComponent; +import net.minecraft.network.chat.Component; +import net.minecraft.world.inventory.AbstractFurnaceMenu; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.HashSet; +import java.util.Set; + +@Mixin(AbstractFurnaceScreen.class) +public abstract class AbstractFurnaceScreenMixin extends AbstractContainerScreenMixin { + @Shadow @Final public AbstractFurnaceRecipeBookComponent recipeBookComponent; + + protected AbstractFurnaceScreenMixin(Component title) { + super(title); + } + + @Override + public Set getSnapPoints() { + Set points = new HashSet<>(super.getSnapPoints()); + SnapUtils.addRecipeSnapPoints(recipeBookComponent, points); + return points; + } +} diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/CraftingScreenMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/CraftingScreenMixin.java new file mode 100644 index 0000000..3a9a3a9 --- /dev/null +++ b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/CraftingScreenMixin.java @@ -0,0 +1,30 @@ +package dev.isxander.controlify.mixins.feature.virtualmouse.snapping; + +import dev.isxander.controlify.api.vmousesnapping.SnapPoint; +import dev.isxander.controlify.virtualmouse.SnapUtils; +import net.minecraft.client.gui.screens.inventory.CraftingScreen; +import net.minecraft.client.gui.screens.recipebook.RecipeBookComponent; +import net.minecraft.network.chat.Component; +import net.minecraft.world.inventory.CraftingMenu; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.HashSet; +import java.util.Set; + +@Mixin(CraftingScreen.class) +public abstract class CraftingScreenMixin extends AbstractContainerScreenMixin { + @Shadow @Final private RecipeBookComponent recipeBookComponent; + + protected CraftingScreenMixin(Component title) { + super(title); + } + + @Override + public Set getSnapPoints() { + Set points = new HashSet<>(super.getSnapPoints()); + SnapUtils.addRecipeSnapPoints(recipeBookComponent, points); + return points; + } +} diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/InventoryScreenMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/InventoryScreenMixin.java new file mode 100644 index 0000000..9455991 --- /dev/null +++ b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/InventoryScreenMixin.java @@ -0,0 +1,32 @@ +package dev.isxander.controlify.mixins.feature.virtualmouse.snapping; + +import dev.isxander.controlify.api.vmousesnapping.ISnapBehaviour; +import dev.isxander.controlify.api.vmousesnapping.SnapPoint; +import dev.isxander.controlify.virtualmouse.SnapUtils; +import net.minecraft.client.gui.screens.inventory.InventoryScreen; +import net.minecraft.client.gui.screens.recipebook.RecipeBookComponent; +import net.minecraft.network.chat.Component; +import net.minecraft.world.inventory.InventoryMenu; +import org.joml.Vector2i; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.HashSet; +import java.util.Set; + +@Mixin(InventoryScreen.class) +public abstract class InventoryScreenMixin extends AbstractContainerScreenMixin implements ISnapBehaviour { + @Shadow @Final private RecipeBookComponent recipeBookComponent; + + protected InventoryScreenMixin(Component title) { + super(title); + } + + @Override + public Set getSnapPoints() { + Set points = new HashSet<>(super.getSnapPoints()); + SnapUtils.addRecipeSnapPoints(recipeBookComponent, points); + return points; + } +} diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/RecipeBookComponentAccessor.java b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/RecipeBookComponentAccessor.java new file mode 100644 index 0000000..c147f52 --- /dev/null +++ b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/RecipeBookComponentAccessor.java @@ -0,0 +1,18 @@ +package dev.isxander.controlify.mixins.feature.virtualmouse.snapping; + +import net.minecraft.client.gui.screens.recipebook.RecipeBookComponent; +import net.minecraft.client.gui.screens.recipebook.RecipeBookPage; +import net.minecraft.client.gui.screens.recipebook.RecipeBookTabButton; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.List; + +@Mixin(RecipeBookComponent.class) +public interface RecipeBookComponentAccessor { + @Accessor + RecipeBookPage getRecipeBookPage(); + + @Accessor + List getTabButtons(); +} diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/RecipeBookPageAccessor.java b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/RecipeBookPageAccessor.java new file mode 100644 index 0000000..4dd3555 --- /dev/null +++ b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/RecipeBookPageAccessor.java @@ -0,0 +1,14 @@ +package dev.isxander.controlify.mixins.feature.virtualmouse.snapping; + +import net.minecraft.client.gui.screens.recipebook.RecipeBookPage; +import net.minecraft.client.gui.screens.recipebook.RecipeButton; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.List; + +@Mixin(RecipeBookPage.class) +public interface RecipeBookPageAccessor { + @Accessor + List getButtons(); +} diff --git a/src/main/java/dev/isxander/controlify/virtualmouse/SnapUtils.java b/src/main/java/dev/isxander/controlify/virtualmouse/SnapUtils.java new file mode 100644 index 0000000..ccd957a --- /dev/null +++ b/src/main/java/dev/isxander/controlify/virtualmouse/SnapUtils.java @@ -0,0 +1,32 @@ +package dev.isxander.controlify.virtualmouse; + +import dev.isxander.controlify.api.vmousesnapping.SnapPoint; +import dev.isxander.controlify.mixins.feature.virtualmouse.snapping.RecipeBookComponentAccessor; +import dev.isxander.controlify.mixins.feature.virtualmouse.snapping.RecipeBookPageAccessor; +import net.minecraft.client.gui.screens.recipebook.RecipeBookComponent; +import org.joml.Vector2i; + +import java.util.Collection; + +public final class SnapUtils { + private SnapUtils() { + } + + public static void addRecipeSnapPoints(RecipeBookComponent recipeBookComponent, Collection points) { + if (recipeBookComponent.isVisible()) { + RecipeBookComponentAccessor componentAccessor = (RecipeBookComponentAccessor) recipeBookComponent; + componentAccessor.getTabButtons().forEach(button -> { + int x = button.getX() + button.getWidth() / 2; + int y = button.getY() + button.getHeight() / 2; + points.add(new SnapPoint(new Vector2i(x, y), 20)); + }); + + RecipeBookPageAccessor pageAccessor = (RecipeBookPageAccessor) componentAccessor.getRecipeBookPage(); + pageAccessor.getButtons().forEach(button -> { + int x = button.getX() + button.getWidth() / 2; + int y = button.getY() + button.getHeight() / 2; + points.add(new SnapPoint(new Vector2i(x, y), 21)); + }); + } + } +} diff --git a/src/main/resources/controlify.mixins.json b/src/main/resources/controlify.mixins.json index 2b097f4..4f758cd 100644 --- a/src/main/resources/controlify.mixins.json +++ b/src/main/resources/controlify.mixins.json @@ -72,7 +72,12 @@ "feature.virtualmouse.MouseHandlerAccessor", "feature.virtualmouse.MouseHandlerMixin", "feature.virtualmouse.snapping.AbstractContainerScreenMixin", + "feature.virtualmouse.snapping.AbstractFurnaceScreenMixin", + "feature.virtualmouse.snapping.CraftingScreenMixin", "feature.virtualmouse.snapping.CreativeModeInventoryScreenMixin", + "feature.virtualmouse.snapping.InventoryScreenMixin", + "feature.virtualmouse.snapping.RecipeBookComponentAccessor", + "feature.virtualmouse.snapping.RecipeBookPageAccessor", "feature.virtualmouse.snapping.ScreenMixin" ] }