diff --git a/src/api/java/yalter/mousetweaks/api/IMTModGuiContainer2.java b/src/api/java/yalter/mousetweaks/api/IMTModGuiContainer2.java
new file mode 100644
index 00000000000..e9618b22984
--- /dev/null
+++ b/src/api/java/yalter/mousetweaks/api/IMTModGuiContainer2.java
@@ -0,0 +1,87 @@
+package yalter.mousetweaks.api;
+
+import net.minecraft.inventory.Container;
+import net.minecraft.inventory.Slot;
+
+/**
+ * This is the interface you want to implement in your GuiScreen to make it compatible with Mouse Tweaks.
+ * If this interface is not enough (for example, you need a custom slot click function, or if you use a custom Container
+ * which happens to be incompatible), check IMTModGuiContainer2Ex instead.
+ * If you just need to disable Mouse Tweaks or the wheel tweak, see the MouseTweaksIgnore
+ * or the MouseTweaksDisableWheelTweak annotations.
+ */
+public interface IMTModGuiContainer2 {
+ /**
+ * If you want to disable Mouse Tweaks in your GuiScreen, return true from this method.
+ *
+ * @return True if Mouse Tweaks should be disabled, false otherwise.
+ */
+ boolean MT_isMouseTweaksDisabled();
+
+ /**
+ * If you want to disable the Wheel Tweak in your GuiScreen, return true from this method.
+ *
+ * @return True if the Wheel Tweak should be disabled, false otherwise.
+ */
+ boolean MT_isWheelTweakDisabled();
+
+ /**
+ * Returns the Container.
+ *
+ * @return Container that is currently in use.
+ */
+ Container MT_getContainer();
+
+ /**
+ * Returns the Slot that is currently selected by the player, or null if no Slot is selected.
+ *
+ * @return Slot that is located under the mouse, or null if no Slot it currently under the mouse.
+ */
+ Slot MT_getSlotUnderMouse();
+
+ /**
+ * Return true if the given Slot behaves like the vanilla crafting output slots (inside the crafting table,
+ * or the furnace output slot, or the anvil output slot, etc.). These slots are handled differently by Mouse Tweaks.
+ *
+ * @param slot the slot to check
+ * @return True if slot is a crafting output slot.
+ */
+ boolean MT_isCraftingOutput(Slot slot);
+
+ /**
+ * Return true if the given Slot should be ignored by Mouse Tweaks. Examples of ignored slots are the item select
+ * slots and the Destroy Item slot in the vanilla creative inventory.
+ *
+ * @param slot the slot to check
+ * @return Tru if slot should be ignored by Mouse Tweaks.
+ */
+ boolean MT_isIgnored(Slot slot);
+
+ /**
+ * If your container has an RMB dragging functionality (like vanilla containers), disable it inside this method.
+ * This method is called every frame (render tick), which is after all mouseClicked / mouseClickMove / mouseReleased
+ * events are handled (although note these events are handled every game tick, which is far less frequent than every
+ * render tick).
+ *
+ * If true is returned from this method, Mouse Tweaks (after checking other conditions like isIgnored) will click
+ * the slot on which the right mouse button was initially pressed (in most cases this is the slot currently under
+ * mouse). This is needed because the vanilla RMB dragging functionality prevents the initial slot click.
+ *
+ * For vanilla containers this method looks like this: + *
+ * this.ignoreMouseUp = true; + * + * if (this.dragSplitting) { + * if (this.dragSplittingButton == 1) { + * this.dragSplitting = false; + * return true; + * } + * } + * + * return false; + *+ * + * @return True if Mouse Tweaks should click the slot on which the RMB was pressed. + */ + boolean MT_disableRMBDraggingFunctionality(); +} \ No newline at end of file diff --git a/src/api/java/yalter/mousetweaks/api/MouseTweaksIgnore.java b/src/api/java/yalter/mousetweaks/api/MouseTweaksIgnore.java deleted file mode 100644 index 78737d128b6..00000000000 --- a/src/api/java/yalter/mousetweaks/api/MouseTweaksIgnore.java +++ /dev/null @@ -1,14 +0,0 @@ -package yalter.mousetweaks.api; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Put this on your GuiScreen to disable Mouse Tweaks. - */ -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.TYPE) -public @interface MouseTweaksIgnore { -} \ No newline at end of file diff --git a/src/main/java/appeng/client/gui/AEBaseGui.java b/src/main/java/appeng/client/gui/AEBaseGui.java index 7b76eed1f30..f919874884b 100644 --- a/src/main/java/appeng/client/gui/AEBaseGui.java +++ b/src/main/java/appeng/client/gui/AEBaseGui.java @@ -72,7 +72,7 @@ import org.lwjgl.input.Keyboard; import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; -import yalter.mousetweaks.api.MouseTweaksIgnore; +import yalter.mousetweaks.api.IMTModGuiContainer2; import java.awt.*; import java.io.IOException; @@ -85,9 +85,8 @@ import static appeng.integration.modules.jei.JEIPlugin.aeGuiHandler; import static appeng.integration.modules.jei.JEIPlugin.runtime; - -@MouseTweaksIgnore -public abstract class AEBaseGui extends GuiContainer { +@Optional.Interface(iface = "yalter.mousetweaks.api.IMTModGuiContainer2", modid = "mousetweaks") +public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContainer2 { private final List