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 000000000..dd77c4ef9 --- /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(); +} diff --git a/src/main/java/appeng/client/gui/AEBaseGui.java b/src/main/java/appeng/client/gui/AEBaseGui.java index 3576e306f..a30431ecd 100644 --- a/src/main/java/appeng/client/gui/AEBaseGui.java +++ b/src/main/java/appeng/client/gui/AEBaseGui.java @@ -35,6 +35,7 @@ import com.google.common.base.Joiner; import com.google.common.base.Stopwatch; import com.google.common.collect.Lists; +import net.minecraftforge.fml.common.Optional; import org.lwjgl.input.Keyboard; import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; @@ -87,9 +88,11 @@ import appeng.core.sync.packets.PacketSwapSlots; import appeng.fluids.client.render.FluidStackSizeRenderer; import appeng.fluids.container.slots.IMEFluidSlot; import appeng.helpers.InventoryAction; +import yalter.mousetweaks.api.IMTModGuiContainer2; -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 meSlots = new ArrayList<>(); // drag y @@ -961,4 +964,53 @@ public abstract class AEBaseGui extends GuiContainer { return this.meSlots; } + + @Override + @Optional.Method( modid = "mousetweaks" ) + public boolean MT_isMouseTweaksDisabled() + { + return false; + } + + @Override + @Optional.Method( modid = "mousetweaks" ) + public boolean MT_isWheelTweakDisabled() + { + return true; + } + + @Override + @Optional.Method( modid = "mousetweaks" ) + public Container MT_getContainer() + { + return this.inventorySlots; + } + + @Override + @Optional.Method( modid = "mousetweaks" ) + public Slot MT_getSlotUnderMouse() + { + return getSlotUnderMouse(); + } + + @Override + @Optional.Method( modid = "mousetweaks" ) + public boolean MT_isCraftingOutput( Slot slot ) + { + return slot instanceof SlotOutput || slot instanceof AppEngCraftingSlot; + } + + @Override + @Optional.Method( modid = "mousetweaks" ) + public boolean MT_isIgnored( Slot slot ) + { + return false; + } + + @Override + @Optional.Method( modid = "mousetweaks" ) + public boolean MT_disableRMBDraggingFunctionality() + { + return false; + } }