diff --git a/patches/minecraft/net/minecraft/client/entity/EntityPlayerSP.java.patch b/patches/minecraft/net/minecraft/client/entity/EntityPlayerSP.java.patch
index 3bdced55ac..eafdab10a9 100644
--- a/patches/minecraft/net/minecraft/client/entity/EntityPlayerSP.java.patch
+++ b/patches/minecraft/net/minecraft/client/entity/EntityPlayerSP.java.patch
@@ -89,7 +89,15 @@
}
public boolean func_70613_aW()
-@@ -859,10 +880,13 @@
+@@ -840,6 +861,7 @@
+ float f = 0.8F;
+ boolean flag2 = this.field_71158_b.field_192832_b >= 0.8F;
+ this.field_71158_b.func_78898_a();
++ net.minecraftforge.client.ForgeHooksClient.onInputUpdate(this, this.field_71158_b);
+ this.field_71159_c.func_193032_ao().func_193293_a(this.field_71158_b);
+
+ if (this.func_184587_cr() && !this.func_184218_aH())
+@@ -859,10 +881,13 @@
}
AxisAlignedBB axisalignedbb = this.func_174813_aQ();
diff --git a/src/main/java/net/minecraftforge/client/ForgeHooksClient.java b/src/main/java/net/minecraftforge/client/ForgeHooksClient.java
index 01b8090b7d..178caa20f8 100644
--- a/src/main/java/net/minecraftforge/client/ForgeHooksClient.java
+++ b/src/main/java/net/minecraftforge/client/ForgeHooksClient.java
@@ -81,6 +81,7 @@ import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.BlockRenderLayer;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
+import net.minecraft.util.MovementInput;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
@@ -94,6 +95,7 @@ import net.minecraftforge.client.event.DrawBlockHighlightEvent;
import net.minecraftforge.client.event.EntityViewRenderEvent;
import net.minecraftforge.client.event.FOVUpdateEvent;
import net.minecraftforge.client.event.GuiScreenEvent;
+import net.minecraftforge.client.event.InputUpdateEvent;
import net.minecraftforge.client.event.ModelBakeEvent;
import net.minecraftforge.client.event.MouseEvent;
import net.minecraftforge.client.event.RenderGameOverlayEvent;
@@ -730,4 +732,9 @@ public class ForgeHooksClient
if(!tr.equals(TRSRTransformation.identity())) mat = tr.getMatrix();
return Pair.of(model, mat);
}
+
+ public static void onInputUpdate(EntityPlayer player, MovementInput movementInput)
+ {
+ MinecraftForge.EVENT_BUS.post(new InputUpdateEvent(player, movementInput));
+ }
}
diff --git a/src/main/java/net/minecraftforge/client/event/InputUpdateEvent.java b/src/main/java/net/minecraftforge/client/event/InputUpdateEvent.java
new file mode 100644
index 0000000000..a0380642ad
--- /dev/null
+++ b/src/main/java/net/minecraftforge/client/event/InputUpdateEvent.java
@@ -0,0 +1,26 @@
+package net.minecraftforge.client.event;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.util.MovementInput;
+import net.minecraftforge.event.entity.player.PlayerEvent;
+
+/**
+ * This event is fired after player movement inputs are updated.
+ * Handlers can freely manipulate {@link MovementInput} to cancel movement.
+ */
+public class InputUpdateEvent extends PlayerEvent
+{
+ private final MovementInput movementInput;
+
+ public InputUpdateEvent(EntityPlayer player, MovementInput movementInput)
+ {
+ super(player);
+ this.movementInput = movementInput;
+ }
+
+ public MovementInput getMovementInput()
+ {
+ return movementInput;
+ }
+
+}
diff --git a/src/test/java/net/minecraftforge/debug/InputUpdateEventTest.java b/src/test/java/net/minecraftforge/debug/InputUpdateEventTest.java
new file mode 100644
index 0000000000..11b7e0c09c
--- /dev/null
+++ b/src/test/java/net/minecraftforge/debug/InputUpdateEventTest.java
@@ -0,0 +1,48 @@
+package net.minecraftforge.debug;
+
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.util.math.MathHelper;
+import net.minecraft.util.text.TextComponentString;
+import net.minecraftforge.client.event.InputUpdateEvent;
+import net.minecraftforge.fml.common.Mod;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+import net.minecraftforge.fml.relauncher.Side;
+
+@Mod(modid = InputUpdateEventTest.MODID, name = "InputUpdateTest", version = "1.0", acceptableRemoteVersions = "*")
+public class InputUpdateEventTest
+{
+ static final String MODID = "input_update_test";
+
+ @Mod.EventBusSubscriber(value = Side.CLIENT, modid = MODID)
+ public static class Registration
+ {
+ @SubscribeEvent
+ public static void onInputUpdate(InputUpdateEvent evt)
+ {
+ EntityPlayer player = evt.getEntityPlayer();
+ final int x = MathHelper.floor(player.posX);
+ final int y = MathHelper.floor(player.getEntityBoundingBox().minY) - 1;
+ final int z = MathHelper.floor(player.posZ);
+ final BlockPos pos = new BlockPos(x, y, z);
+ IBlockState blockUnder = player.world.getBlockState(pos);
+ if (blockUnder.getBlock() == Blocks.BLACK_GLAZED_TERRACOTTA)
+ {
+ if (evt.getMovementInput().jump)
+ {
+ player.sendMessage(new TextComponentString("NO JUMPING!"));
+ evt.getMovementInput().jump = false;
+ }
+
+ if (evt.getMovementInput().sneak)
+ {
+ player.sendMessage(new TextComponentString("NO SNEAKING!"));
+ evt.getMovementInput().sneak = false;
+ }
+ }
+ }
+ }
+
+}