1
0
forked from Clones/Controlify

recipe book snapping

This commit is contained in:
isXander
2023-04-21 18:13:20 +01:00
parent 7703b79f5a
commit 0c364d08c1
7 changed files with 161 additions and 0 deletions

View File

@ -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<T extends AbstractFurnaceMenu> extends AbstractContainerScreenMixin<T> {
@Shadow @Final public AbstractFurnaceRecipeBookComponent recipeBookComponent;
protected AbstractFurnaceScreenMixin(Component title) {
super(title);
}
@Override
public Set<SnapPoint> getSnapPoints() {
Set<SnapPoint> points = new HashSet<>(super.getSnapPoints());
SnapUtils.addRecipeSnapPoints(recipeBookComponent, points);
return points;
}
}

View File

@ -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<CraftingMenu> {
@Shadow @Final private RecipeBookComponent recipeBookComponent;
protected CraftingScreenMixin(Component title) {
super(title);
}
@Override
public Set<SnapPoint> getSnapPoints() {
Set<SnapPoint> points = new HashSet<>(super.getSnapPoints());
SnapUtils.addRecipeSnapPoints(recipeBookComponent, points);
return points;
}
}

View File

@ -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<InventoryMenu> implements ISnapBehaviour {
@Shadow @Final private RecipeBookComponent recipeBookComponent;
protected InventoryScreenMixin(Component title) {
super(title);
}
@Override
public Set<SnapPoint> getSnapPoints() {
Set<SnapPoint> points = new HashSet<>(super.getSnapPoints());
SnapUtils.addRecipeSnapPoints(recipeBookComponent, points);
return points;
}
}

View File

@ -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<RecipeBookTabButton> getTabButtons();
}

View File

@ -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<RecipeButton> getButtons();
}

View File

@ -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<SnapPoint> 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));
});
}
}
}

View File

@ -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"
]
}