1717
1818package dev .terminalmc .moremousetweaks .mixin .quick .craft ;
1919
20- import dev .terminalmc .moremousetweaks .MoreMouseTweaks ;
2120import dev .terminalmc .moremousetweaks .inventory .helper .InteractionHelper ;
2221import dev .terminalmc .moremousetweaks .network .InteractionManager ;
2322import dev .terminalmc .moremousetweaks .util .InputUtil ;
2726import net .minecraft .client .gui .screens .recipebook .RecipeBookPage ;
2827import net .minecraft .client .gui .screens .recipebook .RecipeCollection ;
2928import net .minecraft .network .protocol .game .ServerboundPlaceRecipePacket ;
30- import net .minecraft .world .entity .player .StackedContents ;
29+ import net .minecraft .world .inventory .AbstractCraftingMenu ;
30+ import net .minecraft .world .inventory .AbstractFurnaceMenu ;
3131import net .minecraft .world .inventory .RecipeBookMenu ;
3232import net .minecraft .world .inventory .Slot ;
33- import net .minecraft .world .item .crafting .RecipeHolder ;
33+ import net .minecraft .world .item .crafting .display . RecipeDisplayId ;
3434import org .spongepowered .asm .mixin .Final ;
3535import org .spongepowered .asm .mixin .Mixin ;
3636import org .spongepowered .asm .mixin .Shadow ;
4141import org .spongepowered .asm .mixin .injection .callback .CallbackInfoReturnable ;
4242import yalter .mousetweaks .MouseButton ;
4343
44+ import java .util .Collection ;
45+ import java .util .List ;
4446import java .util .concurrent .atomic .AtomicBoolean ;
4547
4648import static dev .terminalmc .moremousetweaks .config .Config .options ;
@@ -81,10 +83,7 @@ public abstract class RecipeBookComponentMixin {
8183
8284 @ Shadow
8385 @ Final
84- private StackedContents stackedContents ;
85-
86- @ Shadow
87- protected RecipeBookMenu <?, ?> menu ;
86+ protected RecipeBookMenu menu ;
8887
8988 /**
9089 * Quick-crafting via RMB click.
@@ -93,7 +92,7 @@ public abstract class RecipeBookComponentMixin {
9392 method = "mouseClicked" ,
9493 at = @ At (
9594 value = "INVOKE" ,
96- target = "Lnet/minecraft/client/multiplayer/MultiPlayerGameMode;handlePlaceRecipe(ILnet/minecraft/world/item/crafting/RecipeHolder;Z)V " ,
95+ target = "Lnet/minecraft/client/gui/screens/recipebook/RecipeBookComponent;isOffsetNextToMainGUI()Z " ,
9796 shift = Shift .AFTER
9897 )
9998 )
@@ -106,7 +105,7 @@ public void mouseClicked(
106105 if (!options ().useQuickCrafting || mouseButton != MouseButton .RIGHT .getValue ())
107106 return ;
108107
109- int resultSlotId = menu . getResultSlotIndex ();
108+ int resultSlotId = mmt$ getResultSlotIndex (menu );
110109 if (Screen .hasShiftDown () && InputUtil .isMatchingSlotsKeyDown ()) {
111110 mmt$bulkQuickCraft (resultSlotId , false );
112111 } else {
@@ -150,12 +149,12 @@ public void keyPressed(
150149 if (!clickSuccess )
151150 return ;
152151
153- RecipeHolder <?> recipe = recipeBookPage .getLastClickedRecipe ();
152+ RecipeDisplayId recipe = recipeBookPage .getLastClickedRecipe ();
154153 RecipeCollection collection = recipeBookPage .getLastClickedRecipeCollection ();
155154 if (recipe == null || collection == null )
156155 return ;
157156
158- int resultSlotId = menu . getResultSlotIndex ();
157+ int resultSlotId = mmt$ getResultSlotIndex (menu );
159158
160159 // Select the recipe
161160 InteractionManager .pushPacketEvent (
@@ -171,7 +170,7 @@ public void keyPressed(
171170 mmt$bulkQuickCraft (resultSlotId , true );
172171 } else {
173172 if (Screen .hasShiftDown ()) {
174- mmt$dropAll (recipe , resultSlotId );
173+ mmt$dropAll (resultSlotId );
175174 } else {
176175 InteractionHelper .drop (menu .containerId , resultSlotId );
177176 }
@@ -189,7 +188,7 @@ public void keyPressed(
189188 */
190189 @ Unique
191190 private void mmt$bulkQuickCraft (int resultSlotId , boolean drop ) {
192- RecipeHolder <?> recipe = recipeBookPage .getLastClickedRecipe ();
191+ RecipeDisplayId recipe = recipeBookPage .getLastClickedRecipe ();
193192 RecipeCollection collection = recipeBookPage .getLastClickedRecipeCollection ();
194193 if (recipe == null || collection == null )
195194 return ;
@@ -223,12 +222,12 @@ public void keyPressed(
223222 InteractionManager .clear ();
224223 return false ;
225224 }
226- return MoreMouseTweaks . lastUpdatedSlot >= menu . getSize () ;
225+ return true ;
227226 }
228227 );
229228 // Shift-click or drop the result slot
230229 if (drop ) {
231- mmt$dropAll (recipe , resultSlotId );
230+ mmt$dropAll (resultSlotId );
232231 } else {
233232 InteractionHelper .quickMove (menu .containerId , resultSlotId );
234233 }
@@ -265,14 +264,37 @@ public void keyPressed(
265264 }
266265
267266 @ Unique
268- private void mmt$dropAll (RecipeHolder <?> recipe , int resSlot ) {
269- int maxOps = stackedContents .getBiggestCraftableStack (
270- recipe ,
271- recipe .value ().getResultItem (minecraft .level .registryAccess ()).getMaxStackSize (),
272- null
273- );
267+ private void mmt$dropAll (int resSlot ) {
268+ int maxOps = mmt$getBiggestCraftingStackSize ();
274269 for (int i = 0 ; i < maxOps ; i ++) {
275270 InteractionHelper .drop (menu .containerId , resSlot );
276271 }
277272 }
273+
274+ @ Unique
275+ private int mmt$getResultSlotIndex (RecipeBookMenu menu ) {
276+ return switch (menu ) {
277+ case AbstractCraftingMenu m -> m .getResultSlot ().index ;
278+ case AbstractFurnaceMenu m -> m .getResultSlot ().index ;
279+ default -> 0 ;
280+ };
281+ }
282+
283+ @ Unique
284+ public Collection <Slot > mmt$getInputSlots () {
285+ if (menu instanceof AbstractCraftingMenu m ) {
286+ return m .getInputGridSlots ();
287+ } else {
288+ return List .of ();
289+ }
290+ }
291+
292+ @ Unique
293+ private int mmt$getBiggestCraftingStackSize () {
294+ int max = 0 ;
295+ for (Slot slot : mmt$getInputSlots ()) {
296+ max = Math .max (max , slot .getItem ().getCount ());
297+ }
298+ return max ;
299+ }
278300}
0 commit comments