Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -49,12 +49,12 @@ apiPackage =
accessTransformersFile =

# Provides setup for Mixins if enabled. If you don't know what mixins are: Keep it disabled!
usesMixins = false
usesMixins = true
# Specify the package that contains all of your Mixins. You may only place Mixins in this package or the build will fail!
mixinsPackage =
mixinsPackage = impl.mixin
# Specify the core mod entry class if you use a core mod. This class must implement IFMLLoadingPlugin!
# Example value: coreModClass = asm.FMLPlugin + modGroup = com.myname.mymodid -> com.myname.mymodid.asm.FMLPlugin
coreModClass =
coreModClass = impl.MouseTweaksMixinLoader
# If your project is only a consolidation of mixins or a core mod and does NOT contain a 'normal' mod (meaning that
# there is no class annotated with @Mod) you want this to be true. When in doubt: leave it on false!
containsMixinsAndOrCoreModOnly = false
Expand Down
6 changes: 4 additions & 2 deletions src/main/java/yalter/mousetweaks/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
import yalter.mousetweaks.api.IMTModGuiContainer2Ex;
import yalter.mousetweaks.impl.*;
import yalter.mousetweaks.handlers.*;
import yalter.mousetweaks.reflect.Reflection;
import yalter.mousetweaks.impl.mixin.AccessGuiContainer;
import yalter.mousetweaks.util.MTLog;

import java.util.List;
Expand All @@ -38,7 +38,9 @@ public static boolean initialize() {
return true;
initialized = true;

Reflection.reflectGuiContainer();
if (!AccessGuiContainer.class.isAssignableFrom(GuiContainer.class)) {
MTLog.logger.fatal("Unable to find injected mixin for GuiContainer class");
}

MTLog.logger.fatal("Mouse Tweaks has been initialized.");

Expand Down
62 changes: 17 additions & 45 deletions src/main/java/yalter/mousetweaks/handlers/GuiContainerHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,32 +2,25 @@

import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.crash.CrashReport;
import net.minecraft.inventory.*;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ReportedException;
import org.lwjgl.input.Mouse;
import yalter.mousetweaks.MouseTweaks;
import yalter.mousetweaks.util.Constants;
import yalter.mousetweaks.impl.mixin.AccessGuiContainer;
import yalter.mousetweaks.impl.IGuiScreenHandler;
import yalter.mousetweaks.impl.MouseButton;
import yalter.mousetweaks.reflect.Reflection;
import yalter.mousetweaks.api.MouseTweaksDisableWheelTweak;
import yalter.mousetweaks.api.MouseTweaksIgnore;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;

public class GuiContainerHandler implements IGuiScreenHandler {
protected Minecraft mc;
protected GuiContainer guiContainer;
protected Method handleMouseClick;

public GuiContainerHandler(GuiContainer guiContainer) {
this.mc = Minecraft.getMinecraft();
this.guiContainer = guiContainer;
this.handleMouseClick = Reflection.getHMCMethod(guiContainer);
}

private int getDisplayWidth() {
Expand All @@ -48,8 +41,9 @@ private int getRequiredMouseY() {

@Override
public boolean isMouseTweaksDisabled() {
return guiContainer.getClass().isAnnotationPresent(MouseTweaksIgnore.class) || (Reflection.guiContainerClass
== null) || MouseTweaks.instance.isMouseTweakDisabled(guiContainer.getClass());
return guiContainer.getClass().isAnnotationPresent(MouseTweaksIgnore.class)
|| !(guiContainer instanceof AccessGuiContainer)
|| MouseTweaks.instance.isMouseTweakDisabled(guiContainer.getClass());
}

@Override
Expand All @@ -65,30 +59,18 @@ public List<Slot> getSlots() {

@Override
public Slot getSlotUnderMouse() {
try {
return (Slot) Reflection.guiContainerClass.invokeMethod(guiContainer,
Constants.GETSLOTATPOSITION_NAME.forgeName,
getRequiredMouseX(),
getRequiredMouseY());
} catch (InvocationTargetException e) {
CrashReport crashreport = CrashReport.makeCrashReport(e,
"GuiContainer.getSlotAtPosition() threw an exception"
+ " when called from MouseTweaks.");
throw new ReportedException(crashreport);
}
return ((AccessGuiContainer) guiContainer).invokeGetSlotAtPosition(getRequiredMouseX(), getRequiredMouseY());
}

@Override
public boolean disableRMBDraggingFunctionality() {
Reflection.guiContainerClass.setFieldValue(guiContainer, Constants.IGNOREMOUSEUP_NAME.forgeName, true);

if ((Boolean) Reflection.guiContainerClass.getFieldValue(guiContainer,
Constants.DRAGSPLITTING_NAME.forgeName)) {
if ((Integer) Reflection.guiContainerClass.getFieldValue(guiContainer,
Constants.DRAGSPLITTINGBUTTON_NAME.forgeName)
== 1) {
Reflection.guiContainerClass.setFieldValue(guiContainer, Constants.DRAGSPLITTING_NAME.forgeName,
false);
var access = (AccessGuiContainer) guiContainer;

access.setIgnoreMouseUp(true);

if (access.getDragSplitting()) {
if (access.getDragSplittingButton() == 1) {
access.setIgnoreMouseUp(false);
return true;
}
}
Expand All @@ -98,21 +80,11 @@ public boolean disableRMBDraggingFunctionality() {

@Override
public void clickSlot(Slot slot, MouseButton mouseButton, boolean shiftPressed) {
try {
handleMouseClick.invoke(guiContainer,
slot,
slot.slotNumber,
mouseButton.getValue(),
shiftPressed ? ClickType.QUICK_MOVE : ClickType.PICKUP);
} catch (InvocationTargetException e) {
CrashReport crashreport = CrashReport.makeCrashReport(e,
"handleMouseClick() threw an exception when called "
+ "from MouseTweaks.");
throw new ReportedException(crashreport);
} catch (IllegalAccessException e) {
CrashReport crashreport = CrashReport.makeCrashReport(e, "Calling handleMouseClick() from MouseTweaks.");
throw new ReportedException(crashreport);
}
((AccessGuiContainer) this.guiContainer).invokeHandleMouseClick(
slot,
slot.slotNumber,
mouseButton.getValue(),
shiftPressed ? ClickType.QUICK_MOVE : ClickType.PICKUP);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,29 +1,23 @@
package yalter.mousetweaks.handlers;

import net.minecraft.client.Minecraft;
import net.minecraft.crash.CrashReport;
import net.minecraft.inventory.ClickType;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ReportedException;
import yalter.mousetweaks.impl.IGuiScreenHandler;
import yalter.mousetweaks.impl.MouseButton;
import yalter.mousetweaks.reflect.Reflection;
import yalter.mousetweaks.impl.mixin.AccessGuiContainer;
import yalter.mousetweaks.api.IMTModGuiContainer2;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;

public class IMTModGuiContainer2Handler implements IGuiScreenHandler {
protected Minecraft mc;
protected IMTModGuiContainer2 modGuiContainer;
protected Method handleMouseClick;

public IMTModGuiContainer2Handler(IMTModGuiContainer2 modGuiContainer) {
this.mc = Minecraft.getMinecraft();
this.modGuiContainer = modGuiContainer;
this.handleMouseClick = Reflection.getHMCMethod(modGuiContainer);
}

@Override
Expand Down Expand Up @@ -53,23 +47,12 @@ public boolean disableRMBDraggingFunctionality() {

@Override
public void clickSlot(Slot slot, MouseButton mouseButton, boolean shiftPressed) {
if (handleMouseClick != null) {
try {
handleMouseClick.invoke(modGuiContainer,
slot,
slot.slotNumber,
mouseButton.getValue(),
shiftPressed ? ClickType.QUICK_MOVE : ClickType.PICKUP);
} catch (InvocationTargetException e) {
CrashReport crashreport = CrashReport.makeCrashReport(e,
"handleMouseClick() threw an exception when "
+ "called from MouseTweaks.");
throw new ReportedException(crashreport);
} catch (IllegalAccessException e) {
CrashReport crashreport = CrashReport.makeCrashReport(e,
"Calling handleMouseClick() from MouseTweaks.");
throw new ReportedException(crashreport);
}
if (modGuiContainer instanceof AccessGuiContainer access) {
access.invokeHandleMouseClick(
slot,
slot.slotNumber,
mouseButton.getValue(),
shiftPressed ? ClickType.QUICK_MOVE : ClickType.PICKUP);
} else {
mc.playerController.windowClick(modGuiContainer.MT_getContainer().windowId,
slot.slotNumber,
Expand Down
41 changes: 41 additions & 0 deletions src/main/java/yalter/mousetweaks/impl/MouseTweaksMixinLoader.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package yalter.mousetweaks.impl;

import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin;
import org.jetbrains.annotations.Nullable;
import zone.rong.mixinbooter.IEarlyMixinLoader;

import java.util.Collections;
import java.util.List;
import java.util.Map;

public class MouseTweaksMixinLoader implements IFMLLoadingPlugin, IEarlyMixinLoader {

@Override
public List<String> getMixinConfigs() {
return Collections.singletonList("mixins.mousetweaks.json");
}

@Override
public String[] getASMTransformerClass() {
return new String[0];
}

@Override
public String getModContainerClass() {
return null;
}

@Override
public @Nullable String getSetupClass() {
return null;
}

@Override
public void injectData(Map<String, Object> data) {
}

@Override
public String getAccessTransformerClass() {
return null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package yalter.mousetweaks.impl.mixin;

import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.inventory.ClickType;
import net.minecraft.inventory.Slot;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import org.spongepowered.asm.mixin.gen.Invoker;

/**
* @author ZZZank
*/
@Mixin(GuiContainer.class)
public interface AccessGuiContainer {

@Invoker
void invokeHandleMouseClick(Slot slotIn, int slotId, int mouseButton, ClickType type);

@Invoker
Slot invokeGetSlotAtPosition(int x, int y);

@Accessor
void setIgnoreMouseUp(boolean value);

@Accessor
boolean getDragSplitting();

@Accessor
int getDragSplittingButton();
}
1 change: 1 addition & 0 deletions src/main/java/yalter/mousetweaks/reflect/Reflection.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import java.lang.reflect.Method;
import java.util.HashMap;

@Deprecated
public class Reflection {
private static Obfuscation obfuscation;
private static boolean checkObfuscation = true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import java.lang.reflect.Method;
import java.util.HashMap;

@Deprecated
public class ReflectionCache {

private final HashMap<String, Method> methods = new HashMap<>();
Expand Down
12 changes: 12 additions & 0 deletions src/main/resources/mixins.mousetweaks.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"package" : "yalter.mousetweaks.impl.mixin",
"refmap" : "mixins.mousetweaks.refmap.json",
"target" : "@env(DEFAULT)",
"minVersion" : "0.8",
"compatibilityLevel" : "JAVA_8",
"mixins" : [],
"client" : [
"AccessGuiContainer"
],
"server": []
}