diff --git a/src/dev/w1zzrd/invtweaks/listener/GhostClickListener.java b/src/dev/w1zzrd/invtweaks/listener/GhostClickListener.java
index 9c33934..98cf8a4 100644
--- a/src/dev/w1zzrd/invtweaks/listener/GhostClickListener.java
+++ b/src/dev/w1zzrd/invtweaks/listener/GhostClickListener.java
@@ -1,11 +1,6 @@
 package dev.w1zzrd.invtweaks.listener;
 
 import dev.w1zzrd.invtweaks.InvTweaksPlugin;
-import net.minecraft.core.BlockPosition;
-import net.minecraft.core.EnumDirection;
-import net.minecraft.world.EnumHand;
-import net.minecraft.world.phys.MovingObjectPositionBlock;
-import net.minecraft.world.phys.Vec3D;
 import org.bukkit.Bukkit;
 import org.bukkit.Material;
 import org.bukkit.block.Block;
@@ -15,6 +10,7 @@ import org.bukkit.event.Listener;
 import org.bukkit.event.player.PlayerInteractEntityEvent;
 import org.bukkit.inventory.EquipmentSlot;
 
+import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
@@ -22,7 +18,6 @@ import java.lang.reflect.Method;
 public class GhostClickListener implements Listener {
     @EventHandler(priority = EventPriority.LOWEST)
     public void onEntityClick(final PlayerInteractEntityEvent clickEvent) {
-
         if (clickEvent.getPlayer().getInventory().getItemInMainHand().getType() == Material.AIR &&
                 clickEvent.getPlayer().getInventory().getItemInOffHand().getType() == Material.AIR &&
                 clickEvent.getHand() == EquipmentSlot.HAND) {
@@ -59,26 +54,63 @@ public class GhostClickListener implements Listener {
                     }
                     entity.setAccessible(true);
 
-                    final BlockPosition pos = new BlockPosition(b.getX(), b.getY(), b.getZ());
+                    final Class<?> enumHand = interact.getParameterTypes()[2];
+
+                    final Field enumHandA = enumHand.getDeclaredField("a");
+                    enumHandA.setAccessible(true);
+
+                    final Class<?> movingObjectPositionBlock = interact.getParameterTypes()[3];
+                    final Method mopb_a = findDeclaredMethod(movingObjectPositionBlock, "a", 3);
+                    if (mopb_a == null) {
+                        Bukkit.getLogger().warning(InvTweaksPlugin.LOG_PLUGIN_NAME + " Cannot find movingObjectPositionBlock function: ghost click will not function!");
+                        return;
+                    }
+                    mopb_a.setAccessible(true);
+
+                    final Constructor<?> newVec3D = mopb_a.getParameterTypes()[0].getConstructor(double.class, double.class, double.class);
+                    newVec3D.setAccessible(true);
+
+                    final Field enumDirection = findDeclaredField(mopb_a.getParameterTypes()[1], "e");
+                    if (enumDirection == null) {
+                        Bukkit.getLogger().warning(InvTweaksPlugin.LOG_PLUGIN_NAME + " Cannot find EnumDirection value 'e': ghost click will not function!");
+                        return;
+                    }
+                    enumDirection.setAccessible(true);
+
+                    final Constructor<?> newBlockPosition = mopb_a.getParameterTypes()[2].getDeclaredConstructor(int.class, int.class, int.class);
+                    newBlockPosition.setAccessible(true);
 
                     interact.invoke(
                             nmsBlock,
                             world.get(b),
                             entity.get(clickEvent.getPlayer()),
-                            EnumHand.a,
-                            MovingObjectPositionBlock.a(
-                                    new Vec3D(clickEvent.getPlayer().getLocation().getX(), clickEvent.getPlayer().getLocation().getY(), clickEvent.getPlayer().getLocation().getZ()),
-                                    EnumDirection.e,
-                                    pos
+                            enumHandA.get(null),
+                            mopb_a.invoke(
+                                    null,
+                                    newVec3D.newInstance(
+                                            clickEvent.getPlayer().getLocation().getX(),
+                                            clickEvent.getPlayer().getLocation().getY(),
+                                            clickEvent.getPlayer().getLocation().getZ()
+                                    ),
+                                    enumDirection.get(null),
+                                    newBlockPosition.newInstance(b.getX(), b.getY(), b.getZ())
                             )
                     );
-                } catch (IllegalAccessException | InvocationTargetException e) {
+                } catch (IllegalAccessException | InvocationTargetException | NoSuchFieldException | NoSuchMethodException | InstantiationException e) {
                     e.printStackTrace();
                 }
             }
         }
     }
 
+    private static Method findDeclaredMethod(final Class<?> in, final String name, final int paramLen) {
+        for (final Method check : in.getDeclaredMethods())
+            if (check.getParameterTypes().length == paramLen && check.getName().equals(name))
+                return check;
+
+        return null;
+    }
+
     private static Method findDeclaredMethod(Class<?> start, final String name) {
         do {
             for (final Method check : start.getDeclaredMethods())