From 8297e9662968d6707b0408120b8a2accb51e08fc Mon Sep 17 00:00:00 2001
From: Player <player@player.to>
Date: Thu, 20 May 2021 01:15:25 +0200
Subject: [PATCH] 21w20a

Co-authored-by: modmuss50 <modmuss50@gmail.com>
---
 build.gradle                                  |   6 +-
 .../MixinCreativePlayerInventoryGui.java      |   4 +-
 .../networking/channeltest/ChannelList.java   |   6 +
 .../networking/channeltest/ChannelScreen.java |   6 +-
 .../FabricModelPredicateProviderRegistry.java |   6 +-
 ...odelPredicateProviderRegistryAccessor.java |   4 +-
 ...icateProviderRegistrySpecificAccessor.java |   4 +-
 .../api/client/screen/v1/ScreenEvents.java    |   1 -
 .../fabric/api/client/screen/v1/Screens.java  |   4 +-
 .../fabric/impl/client/screen/ButtonList.java | 104 ++++++++++--------
 .../impl/client/screen/ScreenExtensions.java  |   4 +-
 .../fabric/mixin/screen/KeyboardMixin.java    |  31 ++----
 .../fabric/mixin/screen/MouseMixin.java       |  59 ++++++----
 .../fabric/mixin/screen/ScreenMixin.java      |  13 ++-
 .../fabric/test/screen/ScreenTests.java       |   8 +-
 .../fabric/test/screen/SoundButton.java       |   9 +-
 .../fabric/test/screen/StopSoundButton.java   |   9 +-
 .../structure/StructureManagerMixin.java      |  51 ---------
 .../fabric-structure-api-v1.mixins.json       |   1 -
 .../tool/attribute/ToolAttributeTest.java     |   4 +-
 20 files changed, 159 insertions(+), 175 deletions(-)
 delete mode 100644 fabric-structure-api-v1/src/main/java/net/fabricmc/fabric/mixin/structure/StructureManagerMixin.java

diff --git a/build.gradle b/build.gradle
index 36bc4a726..c496030a0 100644
--- a/build.gradle
+++ b/build.gradle
@@ -9,7 +9,7 @@ plugins {
 	id "eclipse"
 	id "idea"
 	id "maven-publish"
-	id "fabric-loom" version "0.8.3" apply false
+	id "fabric-loom" version "0.8.7" apply false
 	id "org.cadixdev.licenser" version "0.5.0"
 	id "org.ajoberstar.grgit" version "3.1.0"
 	id "com.matthewprenger.cursegradle" version "1.4.0"
@@ -20,8 +20,8 @@ def ENV = System.getenv()
 
 class Globals {
 	static def baseVersion = "0.34.4"
-	static def mcVersion = "21w19a"
-	static def yarnVersion = "+build.1"
+	static def mcVersion = "21w20a"
+	static def yarnVersion = "+build.2"
 	static def loaderVersion = "0.11.3"
 	static def preRelease = true
 }
diff --git a/fabric-item-groups-v0/src/main/java/net/fabricmc/fabric/mixin/item/group/client/MixinCreativePlayerInventoryGui.java b/fabric-item-groups-v0/src/main/java/net/fabricmc/fabric/mixin/item/group/client/MixinCreativePlayerInventoryGui.java
index 64aa295c4..857efa61e 100644
--- a/fabric-item-groups-v0/src/main/java/net/fabricmc/fabric/mixin/item/group/client/MixinCreativePlayerInventoryGui.java
+++ b/fabric-item-groups-v0/src/main/java/net/fabricmc/fabric/mixin/item/group/client/MixinCreativePlayerInventoryGui.java
@@ -123,8 +123,8 @@ public abstract class MixinCreativePlayerInventoryGui extends AbstractInventoryS
 		int xpos = x + 116;
 		int ypos = y - 10;
 
-		addButton(new FabricCreativeGuiComponents.ItemGroupButtonWidget(xpos + 11, ypos, FabricCreativeGuiComponents.Type.NEXT, this));
-		addButton(new FabricCreativeGuiComponents.ItemGroupButtonWidget(xpos, ypos, FabricCreativeGuiComponents.Type.PREVIOUS, this));
+		method_37063(new FabricCreativeGuiComponents.ItemGroupButtonWidget(xpos + 11, ypos, FabricCreativeGuiComponents.Type.NEXT, this));
+		method_37063(new FabricCreativeGuiComponents.ItemGroupButtonWidget(xpos, ypos, FabricCreativeGuiComponents.Type.PREVIOUS, this));
 	}
 
 	@Inject(method = "setSelectedTab", at = @At("HEAD"), cancellable = true)
diff --git a/fabric-networking-api-v1/src/testmod/java/net/fabricmc/fabric/test/networking/channeltest/ChannelList.java b/fabric-networking-api-v1/src/testmod/java/net/fabricmc/fabric/test/networking/channeltest/ChannelList.java
index 7977bd722..b9e2fa101 100644
--- a/fabric-networking-api-v1/src/testmod/java/net/fabricmc/fabric/test/networking/channeltest/ChannelList.java
+++ b/fabric-networking-api-v1/src/testmod/java/net/fabricmc/fabric/test/networking/channeltest/ChannelList.java
@@ -16,6 +16,7 @@
 
 package net.fabricmc.fabric.test.networking.channeltest;
 
+import net.minecraft.class_6382;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.widget.EntryListWidget;
 import net.minecraft.client.util.math.MatrixStack;
@@ -37,6 +38,11 @@ final class ChannelList extends EntryListWidget<ChannelList.Entry> {
 		this.clearEntries();
 	}
 
+	@Override
+	public void method_37020(class_6382 arg) {
+		// TODO seems to be possibly accessibility related
+	}
+
 	class Entry extends EntryListWidget.Entry<Entry> {
 		private final Identifier channel;
 
diff --git a/fabric-networking-api-v1/src/testmod/java/net/fabricmc/fabric/test/networking/channeltest/ChannelScreen.java b/fabric-networking-api-v1/src/testmod/java/net/fabricmc/fabric/test/networking/channeltest/ChannelScreen.java
index 2a1f1cd22..f727e0cd6 100644
--- a/fabric-networking-api-v1/src/testmod/java/net/fabricmc/fabric/test/networking/channeltest/ChannelScreen.java
+++ b/fabric-networking-api-v1/src/testmod/java/net/fabricmc/fabric/test/networking/channeltest/ChannelScreen.java
@@ -40,13 +40,13 @@ final class ChannelScreen extends Screen {
 
 	@Override
 	protected void init() {
-		this.s2cButton = this.addButton(new ButtonWidget(this.width / 2 - 55, 5, 50, 20, new LiteralText("S2C"), this::toS2C, (button, matrices, mouseX, mouseY) -> {
+		this.s2cButton = this.method_37063(new ButtonWidget(this.width / 2 - 55, 5, 50, 20, new LiteralText("S2C"), this::toS2C, (button, matrices, mouseX, mouseY) -> {
 			this.renderTooltip(matrices, new LiteralText("Packets this client can receive"), mouseX, mouseY);
 		}));
-		this.c2sButton = this.addButton(new ButtonWidget(this.width / 2 + 5, 5, 50, 20, new LiteralText("C2S"), this::toC2S, (button, matrices, mouseX, mouseY) -> {
+		this.c2sButton = this.method_37063(new ButtonWidget(this.width / 2 + 5, 5, 50, 20, new LiteralText("C2S"), this::toC2S, (button, matrices, mouseX, mouseY) -> {
 			this.renderTooltip(matrices, new LiteralText("Packets the server can receive"), mouseX, mouseY);
 		}));
-		this.closeButton = this.addButton(new ButtonWidget(this.width / 2 - 60, this.height - 25, 120, 20, new LiteralText("Close"), button -> this.onClose()));
+		this.closeButton = this.method_37063(new ButtonWidget(this.width / 2 - 60, this.height - 25, 120, 20, new LiteralText("Close"), button -> this.onClose()));
 		this.channelList = this.addChild(new ChannelList(this.client, this.width, this.height - 60, 30, this.height - 30, this.textRenderer.fontHeight + 2));
 	}
 
diff --git a/fabric-object-builder-api-v1/src/main/java/net/fabricmc/fabric/api/object/builder/v1/client/model/FabricModelPredicateProviderRegistry.java b/fabric-object-builder-api-v1/src/main/java/net/fabricmc/fabric/api/object/builder/v1/client/model/FabricModelPredicateProviderRegistry.java
index 56e7208f6..877bd3125 100644
--- a/fabric-object-builder-api-v1/src/main/java/net/fabricmc/fabric/api/object/builder/v1/client/model/FabricModelPredicateProviderRegistry.java
+++ b/fabric-object-builder-api-v1/src/main/java/net/fabricmc/fabric/api/object/builder/v1/client/model/FabricModelPredicateProviderRegistry.java
@@ -16,9 +16,9 @@
 
 package net.fabricmc.fabric.api.object.builder.v1.client.model;
 
-import net.minecraft.client.item.ModelPredicateProvider;
 import net.minecraft.item.Item;
 import net.minecraft.util.Identifier;
+import net.minecraft.class_6395;
 
 import net.fabricmc.fabric.mixin.object.builder.ModelPredicateProviderRegistryAccessor;
 import net.fabricmc.fabric.mixin.object.builder.ModelPredicateProviderRegistrySpecificAccessor;
@@ -38,7 +38,7 @@ public final class FabricModelPredicateProviderRegistry {
 	 * @param id       the identifier of the provider
 	 * @param provider the provider
 	 */
-	public static void register(Identifier id, ModelPredicateProvider provider) {
+	public static void register(Identifier id, class_6395 provider) {
 		ModelPredicateProviderRegistryAccessor.callRegister(id, provider);
 	}
 
@@ -49,7 +49,7 @@ public final class FabricModelPredicateProviderRegistry {
 	 * @param id       the identifier of the provider
 	 * @param provider the provider
 	 */
-	public static void register(Item item, Identifier id, ModelPredicateProvider provider) {
+	public static void register(Item item, Identifier id, class_6395 provider) {
 		ModelPredicateProviderRegistrySpecificAccessor.callRegister(item, id, provider);
 	}
 }
diff --git a/fabric-object-builder-api-v1/src/main/java/net/fabricmc/fabric/mixin/object/builder/ModelPredicateProviderRegistryAccessor.java b/fabric-object-builder-api-v1/src/main/java/net/fabricmc/fabric/mixin/object/builder/ModelPredicateProviderRegistryAccessor.java
index d33a122eb..1104c55e1 100644
--- a/fabric-object-builder-api-v1/src/main/java/net/fabricmc/fabric/mixin/object/builder/ModelPredicateProviderRegistryAccessor.java
+++ b/fabric-object-builder-api-v1/src/main/java/net/fabricmc/fabric/mixin/object/builder/ModelPredicateProviderRegistryAccessor.java
@@ -19,14 +19,14 @@ package net.fabricmc.fabric.mixin.object.builder;
 import org.spongepowered.asm.mixin.Mixin;
 import org.spongepowered.asm.mixin.gen.Invoker;
 
-import net.minecraft.client.item.ModelPredicateProvider;
+import net.minecraft.class_6395;
 import net.minecraft.client.item.ModelPredicateProviderRegistry;
 import net.minecraft.util.Identifier;
 
 @Mixin(ModelPredicateProviderRegistry.class)
 public interface ModelPredicateProviderRegistryAccessor {
 	@Invoker
-	static ModelPredicateProvider callRegister(Identifier id, ModelPredicateProvider provider) {
+	static class_6395 callRegister(Identifier id, class_6395 provider) {
 		throw new AssertionError("mixin dummy");
 	}
 }
diff --git a/fabric-object-builder-api-v1/src/main/java/net/fabricmc/fabric/mixin/object/builder/ModelPredicateProviderRegistrySpecificAccessor.java b/fabric-object-builder-api-v1/src/main/java/net/fabricmc/fabric/mixin/object/builder/ModelPredicateProviderRegistrySpecificAccessor.java
index c5fad82e8..e6787c2eb 100644
--- a/fabric-object-builder-api-v1/src/main/java/net/fabricmc/fabric/mixin/object/builder/ModelPredicateProviderRegistrySpecificAccessor.java
+++ b/fabric-object-builder-api-v1/src/main/java/net/fabricmc/fabric/mixin/object/builder/ModelPredicateProviderRegistrySpecificAccessor.java
@@ -19,7 +19,7 @@ package net.fabricmc.fabric.mixin.object.builder;
 import org.spongepowered.asm.mixin.Mixin;
 import org.spongepowered.asm.mixin.gen.Invoker;
 
-import net.minecraft.client.item.ModelPredicateProvider;
+import net.minecraft.class_6395;
 import net.minecraft.client.item.ModelPredicateProviderRegistry;
 import net.minecraft.item.Item;
 import net.minecraft.util.Identifier;
@@ -28,7 +28,7 @@ import net.minecraft.util.Identifier;
 @Mixin(ModelPredicateProviderRegistry.class)
 public interface ModelPredicateProviderRegistrySpecificAccessor {
 	@Invoker
-	static void callRegister(Item item, Identifier id, ModelPredicateProvider provider) {
+	static void callRegister(Item item, Identifier id, class_6395 provider) {
 		throw new AssertionError("mixin dummy");
 	}
 }
diff --git a/fabric-screen-api-v1/src/main/java/net/fabricmc/fabric/api/client/screen/v1/ScreenEvents.java b/fabric-screen-api-v1/src/main/java/net/fabricmc/fabric/api/client/screen/v1/ScreenEvents.java
index 4acd331cb..8ab224676 100644
--- a/fabric-screen-api-v1/src/main/java/net/fabricmc/fabric/api/client/screen/v1/ScreenEvents.java
+++ b/fabric-screen-api-v1/src/main/java/net/fabricmc/fabric/api/client/screen/v1/ScreenEvents.java
@@ -20,7 +20,6 @@ import java.util.Objects;
 
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.screen.Screen;
-import net.minecraft.client.gui.screen.TickableElement;
 import net.minecraft.client.util.math.MatrixStack;
 
 import net.fabricmc.api.EnvType;
diff --git a/fabric-screen-api-v1/src/main/java/net/fabricmc/fabric/api/client/screen/v1/Screens.java b/fabric-screen-api-v1/src/main/java/net/fabricmc/fabric/api/client/screen/v1/Screens.java
index ab5870ac2..a2306bd11 100644
--- a/fabric-screen-api-v1/src/main/java/net/fabricmc/fabric/api/client/screen/v1/Screens.java
+++ b/fabric-screen-api-v1/src/main/java/net/fabricmc/fabric/api/client/screen/v1/Screens.java
@@ -22,7 +22,7 @@ import java.util.Objects;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.font.TextRenderer;
 import net.minecraft.client.gui.screen.Screen;
-import net.minecraft.client.gui.widget.AbstractButtonWidget;
+import net.minecraft.client.gui.widget.ClickableWidget;
 import net.minecraft.client.render.item.ItemRenderer;
 
 import net.fabricmc.api.EnvType;
@@ -44,7 +44,7 @@ public final class Screens {
 	 *
 	 * @return a list of all of a screen's buttons
 	 */
-	public static List<AbstractButtonWidget> getButtons(Screen screen) {
+	public static List<ClickableWidget> getButtons(Screen screen) {
 		Objects.requireNonNull(screen, "Screen cannot be null");
 
 		return ScreenExtensions.getExtensions(screen).fabric_getButtons();
diff --git a/fabric-screen-api-v1/src/main/java/net/fabricmc/fabric/impl/client/screen/ButtonList.java b/fabric-screen-api-v1/src/main/java/net/fabricmc/fabric/impl/client/screen/ButtonList.java
index ff2b0458d..2e0f00591 100644
--- a/fabric-screen-api-v1/src/main/java/net/fabricmc/fabric/impl/client/screen/ButtonList.java
+++ b/fabric-screen-api-v1/src/main/java/net/fabricmc/fabric/impl/client/screen/ButtonList.java
@@ -21,9 +21,9 @@ import java.util.List;
 
 import org.jetbrains.annotations.ApiStatus;
 
+import net.minecraft.class_6379;
 import net.minecraft.client.gui.Element;
-import net.minecraft.client.gui.screen.Screen;
-import net.minecraft.client.gui.widget.AbstractButtonWidget;
+import net.minecraft.client.gui.widget.ClickableWidget;
 
 import net.fabricmc.api.EnvType;
 import net.fabricmc.api.Environment;
@@ -31,50 +31,57 @@ import net.fabricmc.api.Environment;
 // TODO: When events for listening to addition of child elements are added, fire events from this list.
 @ApiStatus.Internal
 @Environment(EnvType.CLIENT)
-public final class ButtonList<T extends AbstractButtonWidget> extends AbstractList<T> {
-	private final Screen screen;
-	private final List<T> buttons;
+public final class ButtonList extends AbstractList<ClickableWidget> {
+	private final List<class_6379> listeners;
 	private final List<Element> children;
 
-	public ButtonList(Screen screen, List<T> buttons, List<Element> children) {
-		this.screen = screen;
-		this.buttons = buttons;
+	public ButtonList(List<class_6379> listeners, List<Element> children) {
+		this.listeners = listeners;
 		this.children = children;
 	}
 
 	@Override
-	public T get(int index) {
-		return this.buttons.get(index);
+	public ClickableWidget get(int index) {
+		return (ClickableWidget) listeners.get(translateIndex(index, false));
 	}
 
 	@Override
-	public T set(int index, T element) {
-		this.remove(element); // verify / ensure no duplicates
-
-		final T existingButton = this.buttons.get(index);
-		int elementIndex = this.children.indexOf(existingButton);
-
-		if (elementIndex > -1) {
-			this.children.set(elementIndex, element);
+	public ClickableWidget set(int index, ClickableWidget element) {
+		index = translateIndex(index, false);
+		int prevIndex = listeners.indexOf(element);
+		
+		if (prevIndex >= 0 && prevIndex != index) {
+			if (prevIndex < index) index--;
+			listeners.remove(prevIndex);
 		}
-
-		return this.buttons.set(index, element);
+		
+		int childIndex = children.indexOf(element);
+		
+		if (childIndex >= 0) {
+			children.set(childIndex, element);
+		}
+		
+		return (ClickableWidget) listeners.set(index, element);
 	}
 
 	@Override
-	public void add(int index, T element) {
-		this.rangeCheckForAdd(index); // verify index bounds
-		this.remove(element); // ensure no duplicates
-
-		this.buttons.add(index, element);
-		this.children.add(Math.min(this.children.size(), index), element);
+	public void add(int index, ClickableWidget element) {
+		index = translateIndex(index, true);
+		
+		if (listeners.remove(element)) { // ensure no duplicates
+			children.remove(element);
+			index--;
+		}
+		
+		listeners.add(index, element);
+		this.children.add(element);
 	}
 
 	@Override
-	public T remove(int index) {
-		this.rangeCheck(index); // verify index bounds
-
-		final T removedButton = this.buttons.remove(index);
+	public ClickableWidget remove(int index) {
+		index = translateIndex(index, false);
+		
+		final ClickableWidget removedButton = (ClickableWidget) listeners.remove(index);
 		this.children.remove(removedButton);
 
 		return removedButton;
@@ -82,23 +89,32 @@ public final class ButtonList<T extends AbstractButtonWidget> extends AbstractLi
 
 	@Override
 	public int size() {
-		return this.buttons.size();
-	}
-
-	private void rangeCheck(int index) {
-		if (index >= this.size()) {
-			throw createOutOfBoundsException(index);
+		int ret = 0;
+		
+		for (class_6379 listener : listeners) {
+			if (listener instanceof ClickableWidget) {
+				ret++;
+			}
 		}
+		
+		return ret;
 	}
-
-	private void rangeCheckForAdd(int index) {
-		if (index > this.size() || index < 0) {
-			throw createOutOfBoundsException(index);
+	
+	private int translateIndex(int index, boolean allowAfter) {
+		int remaining = index;
+		
+		for (int i = 0, max = listeners.size(); i < max; i++) {
+			if (listeners.get(i) instanceof ClickableWidget) {
+				if (remaining == 0) return i;
+				remaining--;
+			}
 		}
-	}
-
-	private IndexOutOfBoundsException createOutOfBoundsException(int index) {
-		return new IndexOutOfBoundsException("Index: " + index + ", Size: "+ this.size());
+		
+		if (allowAfter && remaining == 0) {
+			return listeners.size();
+		}
+		
+		throw new IndexOutOfBoundsException(String.format("Index: %d, Size: %d", index, index - remaining));
 	}
 }
 
diff --git a/fabric-screen-api-v1/src/main/java/net/fabricmc/fabric/impl/client/screen/ScreenExtensions.java b/fabric-screen-api-v1/src/main/java/net/fabricmc/fabric/impl/client/screen/ScreenExtensions.java
index 3f480c0de..b050f297b 100644
--- a/fabric-screen-api-v1/src/main/java/net/fabricmc/fabric/impl/client/screen/ScreenExtensions.java
+++ b/fabric-screen-api-v1/src/main/java/net/fabricmc/fabric/impl/client/screen/ScreenExtensions.java
@@ -21,7 +21,7 @@ import java.util.List;
 import org.jetbrains.annotations.ApiStatus;
 
 import net.minecraft.client.gui.screen.Screen;
-import net.minecraft.client.gui.widget.AbstractButtonWidget;
+import net.minecraft.client.gui.widget.ClickableWidget;
 
 import net.fabricmc.api.EnvType;
 import net.fabricmc.api.Environment;
@@ -37,7 +37,7 @@ public interface ScreenExtensions {
 		return (ScreenExtensions) screen;
 	}
 
-	List<AbstractButtonWidget> fabric_getButtons();
+	List<ClickableWidget> fabric_getButtons();
 
 	Event<ScreenEvents.Remove> fabric_getRemoveEvent();
 
diff --git a/fabric-screen-api-v1/src/main/java/net/fabricmc/fabric/mixin/screen/KeyboardMixin.java b/fabric-screen-api-v1/src/main/java/net/fabricmc/fabric/mixin/screen/KeyboardMixin.java
index 66be6c211..b431273d1 100644
--- a/fabric-screen-api-v1/src/main/java/net/fabricmc/fabric/mixin/screen/KeyboardMixin.java
+++ b/fabric-screen-api-v1/src/main/java/net/fabricmc/fabric/mixin/screen/KeyboardMixin.java
@@ -22,18 +22,15 @@ import org.spongepowered.asm.mixin.injection.Inject;
 import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
 
 import net.minecraft.client.Keyboard;
-import net.minecraft.client.gui.ParentElement;
 import net.minecraft.client.gui.screen.Screen;
 
 import net.fabricmc.fabric.api.client.screen.v1.ScreenKeyboardEvents;
 
 @Mixin(Keyboard.class)
 abstract class KeyboardMixin {
-	// private synthetic method_1454(I[ZLnet/minecraft/client/gui/ParentElement;III)V
-	@Inject(method = "method_1454(I[ZLnet/minecraft/client/gui/ParentElement;III)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/ParentElement;keyPressed(III)Z"), cancellable = true)
-	private void beforeKeyPressedEvent(int code, boolean[] resultHack, ParentElement parentElement, int key, int scancode, int modifiers, CallbackInfo ci) {
-		final Screen screen = (Screen) parentElement;
-
+	// private synthetic method_1454(ILnet/minecraft/client/gui/screen/Screen;[ZIII)V
+	@Inject(method = "method_1454(ILnet/minecraft/client/gui/screen/Screen;[ZIII)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/Screen;keyPressed(III)Z"), cancellable = true)
+	private void beforeKeyPressedEvent(int code, Screen screen, boolean[] resultHack, int key, int scancode, int modifiers, CallbackInfo ci) {
 		if (!ScreenKeyboardEvents.allowKeyPress(screen).invoker().allowKeyPress(screen, key, scancode, modifiers)) {
 			resultHack[0] = true; // Set this press action as handled.
 			ci.cancel(); // Exit the lambda
@@ -43,18 +40,15 @@ abstract class KeyboardMixin {
 		ScreenKeyboardEvents.beforeKeyPress(screen).invoker().beforeKeyPress(screen, key, scancode, modifiers);
 	}
 
-	// private synthetic method_1454(I[ZLnet/minecraft/client/gui/ParentElement;III)V
-	@Inject(method = "method_1454(I[ZLnet/minecraft/client/gui/ParentElement;III)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/ParentElement;keyPressed(III)Z", shift = At.Shift.AFTER))
-	private void afterKeyPressedEvent(int code, boolean[] resultHack, ParentElement parentElement, int key, int scancode, int modifiers, CallbackInfo ci) {
-		final Screen screen = (Screen) parentElement;
+	// private synthetic method_1454(ILnet/minecraft/client/gui/screen/Screen;[ZIII)V
+	@Inject(method = "method_1454(ILnet/minecraft/client/gui/screen/Screen;[ZIII)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/Screen;keyPressed(III)Z", shift = At.Shift.AFTER))
+	private void afterKeyPressedEvent(int code, Screen screen, boolean[] resultHack, int key, int scancode, int modifiers, CallbackInfo ci) {
 		ScreenKeyboardEvents.afterKeyPress(screen).invoker().afterKeyPress(screen, key, scancode, modifiers);
 	}
 
-	// private synthetic method_1454(I[ZLnet/minecraft/client/gui/ParentElement;III)V
-	@Inject(method = "method_1454(I[ZLnet/minecraft/client/gui/ParentElement;III)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/ParentElement;keyReleased(III)Z"), cancellable = true)
-	private void beforeKeyReleasedEvent(int code, boolean[] resultHack, ParentElement parentElement, int key, int scancode, int modifiers, CallbackInfo ci) {
-		final Screen screen = (Screen) parentElement;
-
+	// private synthetic method_1454(ILnet/minecraft/client/gui/screen/Screen;[ZIII)V
+	@Inject(method = "method_1454(ILnet/minecraft/client/gui/screen/Screen;[ZIII)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/Screen;keyReleased(III)Z"), cancellable = true)
+	private void beforeKeyReleasedEvent(int code, Screen screen, boolean[] resultHack, int key, int scancode, int modifiers, CallbackInfo ci) {
 		if (!ScreenKeyboardEvents.allowKeyRelease(screen).invoker().allowKeyRelease(screen, key, scancode, modifiers)) {
 			resultHack[0] = true; // Set this press action as handled.
 			ci.cancel(); // Exit the lambda
@@ -64,10 +58,9 @@ abstract class KeyboardMixin {
 		ScreenKeyboardEvents.beforeKeyRelease(screen).invoker().beforeKeyRelease(screen, key, scancode, modifiers);
 	}
 
-	// private synthetic method_1454(I[ZLnet/minecraft/client/gui/ParentElement;III)V
-	@Inject(method = "method_1454(I[ZLnet/minecraft/client/gui/ParentElement;III)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/ParentElement;keyReleased(III)Z", shift = At.Shift.AFTER))
-	private void afterKeyReleasedEvent(int code, boolean[] resultHack, ParentElement parentElement, int key, int scancode, int modifiers, CallbackInfo ci) {
-		final Screen screen = (Screen) parentElement;
+	// private synthetic method_1454(ILnet/minecraft/client/gui/screen/Screen;[ZIII)V
+	@Inject(method = "method_1454(ILnet/minecraft/client/gui/screen/Screen;[ZIII)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/Screen;keyReleased(III)Z", shift = At.Shift.AFTER))
+	private void afterKeyReleasedEvent(int code, Screen screen, boolean[] resultHack, int key, int scancode, int modifiers, CallbackInfo ci) {
 		ScreenKeyboardEvents.afterKeyRelease(screen).invoker().afterKeyRelease(screen, key, scancode, modifiers);
 	}
 }
diff --git a/fabric-screen-api-v1/src/main/java/net/fabricmc/fabric/mixin/screen/MouseMixin.java b/fabric-screen-api-v1/src/main/java/net/fabricmc/fabric/mixin/screen/MouseMixin.java
index 66b2a5940..06f3b7df7 100644
--- a/fabric-screen-api-v1/src/main/java/net/fabricmc/fabric/mixin/screen/MouseMixin.java
+++ b/fabric-screen-api-v1/src/main/java/net/fabricmc/fabric/mixin/screen/MouseMixin.java
@@ -42,67 +42,78 @@ abstract class MouseMixin {
 	private Double horizontalScrollAmount;
 
 	// private synthetic method_1611([ZDDI)V
-	@Inject(method = "method_1611([ZDDI)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/Screen;mouseClicked(DDI)Z"), cancellable = true)
-	private void beforeMouseClickedEvent(boolean[] resultHack, double mouseX, double mouseY, int button, CallbackInfo ci) {
+	@Inject(method = "method_1611([ZLnet/minecraft/client/gui/screen/Screen;DDI)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/Screen;mouseClicked(DDI)Z"), cancellable = true)
+	private static void beforeMouseClickedEvent(boolean[] resultHack, Screen screen, double mouseX, double mouseY, int button, CallbackInfo ci) {
+		@SuppressWarnings("resource")
+		MouseMixin thisRef = (MouseMixin) (Object) MinecraftClient.getInstance().mouse;
 		// Store the screen in a variable in case someone tries to change the screen during this before event.
 		// If someone changes the screen, the after event will likely have class cast exceptions or throw a NPE.
-		this.currentScreen = this.client.currentScreen;
+		thisRef.currentScreen = thisRef.client.currentScreen;
 
-		if (this.currentScreen == null) {
+		if (thisRef.currentScreen == null) {
 			return;
 		}
 
-		if (!ScreenMouseEvents.allowMouseClick(this.currentScreen).invoker().allowMouseClick(this.currentScreen, mouseX, mouseY, button)) {
+		if (!ScreenMouseEvents.allowMouseClick(thisRef.currentScreen).invoker().allowMouseClick(thisRef.currentScreen, mouseX, mouseY, button)) {
 			resultHack[0] = true; // Set this press action as handled.
-			this.currentScreen = null;
+			thisRef.currentScreen = null;
 			ci.cancel(); // Exit the lambda
 			return;
 		}
 
-		ScreenMouseEvents.beforeMouseClick(this.currentScreen).invoker().beforeMouseClick(this.currentScreen, mouseX, mouseY, button);
+		ScreenMouseEvents.beforeMouseClick(thisRef.currentScreen).invoker().beforeMouseClick(thisRef.currentScreen, mouseX, mouseY, button);
 	}
 
 	// private synthetic method_1611([ZDDI)V
-	@Inject(method = "method_1611([ZDDI)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/Screen;mouseClicked(DDI)Z", shift = At.Shift.AFTER))
-	private void afterMouseClickedEvent(boolean[] resultHack, double mouseX, double mouseY, int button, CallbackInfo ci) {
-		if (this.currentScreen == null) {
+	@Inject(method = "method_1611([ZLnet/minecraft/client/gui/screen/Screen;DDI)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/Screen;mouseClicked(DDI)Z", shift = At.Shift.AFTER))
+	private static void afterMouseClickedEvent(boolean[] resultHack, Screen screen, double mouseX, double mouseY, int button, CallbackInfo ci) {
+		@SuppressWarnings("resource")
+		MouseMixin thisRef = (MouseMixin) (Object) MinecraftClient.getInstance().mouse;
+		
+		if (thisRef.currentScreen == null) {
 			return;
 		}
 
-		ScreenMouseEvents.afterMouseClick(this.currentScreen).invoker().afterMouseClick(this.currentScreen, mouseX, mouseY, button);
-		this.currentScreen = null;
+		ScreenMouseEvents.afterMouseClick(thisRef.currentScreen).invoker().afterMouseClick(thisRef.currentScreen, mouseX, mouseY, button);
+		thisRef.currentScreen = null;
 	}
 
 	// private synthetic method_1605([ZDDI)V
-	@Inject(method = "method_1605([ZDDI)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/Screen;mouseReleased(DDI)Z"), cancellable = true)
-	private void beforeMouseReleasedEvent(boolean[] resultHack, double mouseX, double mouseY, int button, CallbackInfo ci) {
+	@Inject(method = "method_1605([ZLnet/minecraft/client/gui/screen/Screen;DDI)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/Screen;mouseReleased(DDI)Z"), cancellable = true)
+	private static void beforeMouseReleasedEvent(boolean[] resultHack, Screen screen, double mouseX, double mouseY, int button, CallbackInfo ci) {
+		@SuppressWarnings("resource")
+		MouseMixin thisRef = (MouseMixin) (Object) MinecraftClient.getInstance().mouse;
+		
 		// Store the screen in a variable in case someone tries to change the screen during this before event.
 		// If someone changes the screen, the after event will likely have class cast exceptions or throw a NPE.
-		this.currentScreen = this.client.currentScreen;
+		thisRef.currentScreen = thisRef.client.currentScreen;
 
-		if (this.currentScreen == null) {
+		if (thisRef.currentScreen == null) {
 			return;
 		}
 
-		if (!ScreenMouseEvents.allowMouseRelease(this.currentScreen).invoker().allowMouseRelease(this.currentScreen, mouseX, mouseY, button)) {
+		if (!ScreenMouseEvents.allowMouseRelease(thisRef.currentScreen).invoker().allowMouseRelease(thisRef.currentScreen, mouseX, mouseY, button)) {
 			resultHack[0] = true; // Set this press action as handled.
-			this.currentScreen = null;
+			thisRef.currentScreen = null;
 			ci.cancel(); // Exit the lambda
 			return;
 		}
 
-		ScreenMouseEvents.beforeMouseRelease(this.currentScreen).invoker().beforeMouseRelease(this.currentScreen, mouseX, mouseY, button);
+		ScreenMouseEvents.beforeMouseRelease(thisRef.currentScreen).invoker().beforeMouseRelease(thisRef.currentScreen, mouseX, mouseY, button);
 	}
 
 	// private synthetic method_1605([ZDDI)V
-	@Inject(method = "method_1605([ZDDI)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/Screen;mouseReleased(DDI)Z", shift = At.Shift.AFTER))
-	private void afterMouseReleasedEvent(boolean[] resultHack, double mouseX, double mouseY, int button, CallbackInfo ci) {
-		if (this.currentScreen == null) {
+	@Inject(method = "method_1605([ZLnet/minecraft/client/gui/screen/Screen;DDI)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/Screen;mouseReleased(DDI)Z", shift = At.Shift.AFTER))
+	private static void afterMouseReleasedEvent(boolean[] resultHack, Screen screen, double mouseX, double mouseY, int button, CallbackInfo ci) {
+		@SuppressWarnings("resource")
+		MouseMixin thisRef = (MouseMixin) (Object) MinecraftClient.getInstance().mouse;
+		
+		if (thisRef.currentScreen == null) {
 			return;
 		}
 
-		ScreenMouseEvents.afterMouseRelease(this.currentScreen).invoker().afterMouseRelease(this.currentScreen, mouseX, mouseY, button);
-		this.currentScreen = null;
+		ScreenMouseEvents.afterMouseRelease(thisRef.currentScreen).invoker().afterMouseRelease(thisRef.currentScreen, mouseX, mouseY, button);
+		thisRef.currentScreen = null;
 	}
 
 	@Inject(method = "onMouseScroll", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/Screen;mouseScrolled(DDD)Z"), locals = LocalCapture.CAPTURE_FAILEXCEPTION, cancellable = true)
diff --git a/fabric-screen-api-v1/src/main/java/net/fabricmc/fabric/mixin/screen/ScreenMixin.java b/fabric-screen-api-v1/src/main/java/net/fabricmc/fabric/mixin/screen/ScreenMixin.java
index 1f6f92c2c..ca4458053 100644
--- a/fabric-screen-api-v1/src/main/java/net/fabricmc/fabric/mixin/screen/ScreenMixin.java
+++ b/fabric-screen-api-v1/src/main/java/net/fabricmc/fabric/mixin/screen/ScreenMixin.java
@@ -26,30 +26,31 @@ import org.spongepowered.asm.mixin.injection.At;
 import org.spongepowered.asm.mixin.injection.Inject;
 import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
 
+import net.minecraft.class_6379;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.Element;
 import net.minecraft.client.gui.screen.Screen;
-import net.minecraft.client.gui.widget.AbstractButtonWidget;
+import net.minecraft.client.gui.widget.ClickableWidget;
 
 import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents;
-import net.fabricmc.fabric.impl.client.screen.ScreenExtensions;
 import net.fabricmc.fabric.api.client.screen.v1.ScreenKeyboardEvents;
 import net.fabricmc.fabric.api.client.screen.v1.ScreenMouseEvents;
 import net.fabricmc.fabric.api.event.Event;
 import net.fabricmc.fabric.impl.client.screen.ButtonList;
 import net.fabricmc.fabric.impl.client.screen.ScreenEventFactory;
+import net.fabricmc.fabric.impl.client.screen.ScreenExtensions;
 
 @Mixin(Screen.class)
 abstract class ScreenMixin implements ScreenExtensions {
 	@Shadow
 	@Final
-	protected List<AbstractButtonWidget> buttons;
+	protected List<class_6379> field_33815;
 	@Shadow
 	@Final
 	protected List<Element> children;
 
 	@Unique
-	private ButtonList<AbstractButtonWidget> fabricButtons;
+	private ButtonList fabricButtons;
 	@Unique
 	private Event<ScreenEvents.Remove> removeEvent;
 	@Unique
@@ -133,10 +134,10 @@ abstract class ScreenMixin implements ScreenExtensions {
 	}
 
 	@Override
-	public List<AbstractButtonWidget> fabric_getButtons() {
+	public List<ClickableWidget> fabric_getButtons() {
 		// Lazy init to make the list access safe after Screen#init
 		if (this.fabricButtons == null) {
-			this.fabricButtons = new ButtonList<>((Screen) (Object) this, this.buttons, this.children);
+			this.fabricButtons = new ButtonList(this.field_33815, this.children);
 		}
 
 		return this.fabricButtons;
diff --git a/fabric-screen-api-v1/src/testmod/java/net/fabricmc/fabric/test/screen/ScreenTests.java b/fabric-screen-api-v1/src/testmod/java/net/fabricmc/fabric/test/screen/ScreenTests.java
index c8e2afe21..e17b23120 100644
--- a/fabric-screen-api-v1/src/testmod/java/net/fabricmc/fabric/test/screen/ScreenTests.java
+++ b/fabric-screen-api-v1/src/testmod/java/net/fabricmc/fabric/test/screen/ScreenTests.java
@@ -26,7 +26,7 @@ import net.minecraft.client.gui.DrawableHelper;
 import net.minecraft.client.gui.hud.InGameHud;
 import net.minecraft.client.gui.screen.Screen;
 import net.minecraft.client.gui.screen.TitleScreen;
-import net.minecraft.client.gui.widget.AbstractButtonWidget;
+import net.minecraft.client.gui.widget.ClickableWidget;
 
 import net.fabricmc.api.ClientModInitializer;
 import net.fabricmc.api.EnvType;
@@ -53,10 +53,10 @@ public final class ScreenTests implements ClientModInitializer {
 		LOGGER.info("Initializing {}", screen.getClass().getName());
 
 		if (screen instanceof TitleScreen) {
-			final List<AbstractButtonWidget> buttons = Screens.getButtons(screen);
+			final List<ClickableWidget> buttons = Screens.getButtons(screen);
 
 			// Shrink the realms button, should be the third button on the list
-			final AbstractButtonWidget optionsButton = buttons.get(2);
+			final ClickableWidget optionsButton = buttons.get(2);
 			optionsButton.setWidth(98);
 
 			// Add a new button
@@ -85,7 +85,7 @@ public final class ScreenTests implements ClientModInitializer {
 
 			ScreenKeyboardEvents.allowKeyPress(screen).register((_screen, key, scancode, modifiers) -> {
 				LOGGER.info("After Pressed, Code: {}, Scancode: {}, Modifiers: {}", key, scancode, modifiers);
-				return false; // Let actions continue
+				return true; // Let actions continue
 			});
 
 			ScreenKeyboardEvents.afterKeyPress(screen).register((_screen, key, scancode, modifiers) -> {
diff --git a/fabric-screen-api-v1/src/testmod/java/net/fabricmc/fabric/test/screen/SoundButton.java b/fabric-screen-api-v1/src/testmod/java/net/fabricmc/fabric/test/screen/SoundButton.java
index 3c9461229..fa8d2d4f5 100644
--- a/fabric-screen-api-v1/src/testmod/java/net/fabricmc/fabric/test/screen/SoundButton.java
+++ b/fabric-screen-api-v1/src/testmod/java/net/fabricmc/fabric/test/screen/SoundButton.java
@@ -21,7 +21,8 @@ import java.util.Random;
 import org.jetbrains.annotations.Nullable;
 
 import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.gui.widget.AbstractPressableButtonWidget;
+import net.minecraft.class_6382;
+import net.minecraft.client.gui.widget.PressableWidget;
 import net.minecraft.client.sound.PositionedSoundInstance;
 import net.minecraft.sound.SoundEvent;
 import net.minecraft.sound.SoundEvents;
@@ -29,7 +30,7 @@ import net.minecraft.text.Text;
 import net.minecraft.util.registry.Registry;
 import net.minecraft.util.registry.SimpleRegistry;
 
-class SoundButton extends AbstractPressableButtonWidget {
+class SoundButton extends PressableWidget {
 	private static final Random RANDOM = new Random();
 
 	SoundButton(int x, int y, int width, int height) {
@@ -44,4 +45,8 @@ class SoundButton extends AbstractPressableButtonWidget {
 
 		MinecraftClient.getInstance().getSoundManager().play(PositionedSoundInstance.master(event != null ? event : SoundEvents.ENTITY_GENERIC_EXPLODE, 1.0F, 1.0F));
 	}
+
+	@Override
+	public void method_37020(class_6382 arg) {
+	}
 }
diff --git a/fabric-screen-api-v1/src/testmod/java/net/fabricmc/fabric/test/screen/StopSoundButton.java b/fabric-screen-api-v1/src/testmod/java/net/fabricmc/fabric/test/screen/StopSoundButton.java
index 8689d9858..0e31bf844 100644
--- a/fabric-screen-api-v1/src/testmod/java/net/fabricmc/fabric/test/screen/StopSoundButton.java
+++ b/fabric-screen-api-v1/src/testmod/java/net/fabricmc/fabric/test/screen/StopSoundButton.java
@@ -18,16 +18,17 @@ package net.fabricmc.fabric.test.screen;
 
 import com.mojang.blaze3d.systems.RenderSystem;
 
+import net.minecraft.class_6382;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.DrawableHelper;
 import net.minecraft.client.gui.hud.InGameHud;
 import net.minecraft.client.gui.screen.Screen;
-import net.minecraft.client.gui.widget.AbstractPressableButtonWidget;
+import net.minecraft.client.gui.widget.PressableWidget;
 import net.minecraft.client.util.math.MatrixStack;
 import net.minecraft.text.LiteralText;
 import net.minecraft.text.Text;
 
-class StopSoundButton extends AbstractPressableButtonWidget {
+class StopSoundButton extends PressableWidget {
 	private final Screen screen;
 
 	StopSoundButton(Screen screen, int x, int y, int width, int height) {
@@ -50,4 +51,8 @@ class StopSoundButton extends AbstractPressableButtonWidget {
 	public void onPress() {
 		MinecraftClient.getInstance().getSoundManager().stopAll();
 	}
+
+	@Override
+	public void method_37020(class_6382 arg) {
+	}
 }
diff --git a/fabric-structure-api-v1/src/main/java/net/fabricmc/fabric/mixin/structure/StructureManagerMixin.java b/fabric-structure-api-v1/src/main/java/net/fabricmc/fabric/mixin/structure/StructureManagerMixin.java
deleted file mode 100644
index 3fe33cc3d..000000000
--- a/fabric-structure-api-v1/src/main/java/net/fabricmc/fabric/mixin/structure/StructureManagerMixin.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 2016, 2017, 2018, 2019 FabricMC
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.fabricmc.fabric.mixin.structure;
-
-import java.util.Collections;
-import java.util.Map;
-
-import org.spongepowered.asm.mixin.Final;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Mutable;
-import org.spongepowered.asm.mixin.Shadow;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-import net.minecraft.structure.Structure;
-import net.minecraft.structure.StructureManager;
-import net.minecraft.util.Identifier;
-
-/**
- * This fixes a rare CME in the StructureManager when using Java 11 or newer.
- *
- * <p>See: https://bugs.mojang.com/browse/MC-149777
- *
- */
-@Mixin(StructureManager.class)
-public abstract class StructureManagerMixin {
-	@Shadow
-	@Final
-	@Mutable
-	private Map<Identifier, Structure> structures;
-
-	@Inject(method = "<init>", at = @At(value = "RETURN"))
-	private void init(CallbackInfo info) {
-		structures = Collections.synchronizedMap(structures);
-	}
-}
diff --git a/fabric-structure-api-v1/src/main/resources/fabric-structure-api-v1.mixins.json b/fabric-structure-api-v1/src/main/resources/fabric-structure-api-v1.mixins.json
index fa1414c07..822eb8c62 100644
--- a/fabric-structure-api-v1/src/main/resources/fabric-structure-api-v1.mixins.json
+++ b/fabric-structure-api-v1/src/main/resources/fabric-structure-api-v1.mixins.json
@@ -9,7 +9,6 @@
     "MixinChunkGeneratorSettings",
     "MixinStructuresConfig",
     "StructureFeatureAccessor",
-    "StructureManagerMixin",
     "StructuresConfigAccessor"
   ],
   "client": [
diff --git a/fabric-tool-attribute-api-v1/src/testmod/java/net/fabricmc/fabric/test/tool/attribute/ToolAttributeTest.java b/fabric-tool-attribute-api-v1/src/testmod/java/net/fabricmc/fabric/test/tool/attribute/ToolAttributeTest.java
index 2ae7b58ba..cd17c0d27 100644
--- a/fabric-tool-attribute-api-v1/src/testmod/java/net/fabricmc/fabric/test/tool/attribute/ToolAttributeTest.java
+++ b/fabric-tool-attribute-api-v1/src/testmod/java/net/fabricmc/fabric/test/tool/attribute/ToolAttributeTest.java
@@ -134,7 +134,7 @@ public class ToolAttributeTest implements ModInitializer {
 		testToolOnBlock(new ItemStack(Items.IRON_PICKAXE), Blocks.STONE, true, ((ToolItem) Items.IRON_PICKAXE).getMaterial().getMiningSpeedMultiplier());
 		testToolOnBlock(new ItemStack(Items.IRON_PICKAXE), Blocks.OBSIDIAN, false, ((ToolItem) Items.IRON_PICKAXE).getMaterial().getMiningSpeedMultiplier());
 		testToolOnBlock(new ItemStack(Items.STONE_SHOVEL), Blocks.STONE, false, 1.0F);
-		testToolOnBlock(new ItemStack(Items.STONE_SHOVEL), Blocks.GRAVEL, false, ((ToolItem) Items.STONE_SHOVEL).getMaterial().getMiningSpeedMultiplier());
+		testToolOnBlock(new ItemStack(Items.STONE_SHOVEL), Blocks.GRAVEL, true, ((ToolItem) Items.STONE_SHOVEL).getMaterial().getMiningSpeedMultiplier());
 
 		//Test vanilla tools don't bypass fabric mining levels
 		testToolOnBlock(new ItemStack(Items.STONE_PICKAXE), stoneBlock, false, ((ToolItem) Items.STONE_PICKAXE).getMaterial().getMiningSpeedMultiplier());
@@ -155,7 +155,7 @@ public class ToolAttributeTest implements ModInitializer {
 
 		//Test dynamic tools on vanilla blocks
 		testToolOnBlock(new ItemStack(testShovel), Blocks.STONE, false, DEFAULT_BREAK_SPEED);
-		testToolOnBlock(new ItemStack(testShovel), Blocks.GRAVEL, false, TOOL_BREAK_SPEED);
+		testToolOnBlock(new ItemStack(testShovel), Blocks.GRAVEL, true, TOOL_BREAK_SPEED);
 		testToolOnBlock(new ItemStack(testPickaxe), Blocks.GRAVEL, false, DEFAULT_BREAK_SPEED);
 		testToolOnBlock(new ItemStack(testPickaxe), Blocks.STONE, true, TOOL_BREAK_SPEED);