From 6f49568c983d5a7b30951d09461e85f06112ad7e Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Tue, 31 Oct 2017 19:47:47 +0100 Subject: [PATCH] Add InputUpdateEvent (#4356) --- .../client/entity/EntityPlayerSP.java.patch | 10 +++- .../client/ForgeHooksClient.java | 7 +++ .../client/event/InputUpdateEvent.java | 26 ++++++++++ .../debug/InputUpdateEventTest.java | 48 +++++++++++++++++++ 4 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 src/main/java/net/minecraftforge/client/event/InputUpdateEvent.java create mode 100644 src/test/java/net/minecraftforge/debug/InputUpdateEventTest.java 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; + } + } + } + } + +}