diff --git a/common/net/minecraftforge/event/Event.java b/common/net/minecraftforge/event/Event.java index 8d260135b..15947ca86 100644 --- a/common/net/minecraftforge/event/Event.java +++ b/common/net/minecraftforge/event/Event.java @@ -6,6 +6,13 @@ package net.minecraftforge.event; */ public class Event { + public enum Result + { + DENY, + DEFAULT, + ALLOW + } + private boolean isCanceled = false; private final boolean isCancelable; private static ListenerList listeners = new ListenerList(); diff --git a/common/net/minecraftforge/event/ForgeEventFactory.java b/common/net/minecraftforge/event/ForgeEventFactory.java index 3b7a6cfdc..d170ab281 100644 --- a/common/net/minecraftforge/event/ForgeEventFactory.java +++ b/common/net/minecraftforge/event/ForgeEventFactory.java @@ -1,7 +1,8 @@ package net.minecraftforge.event; import net.minecraft.src.*; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.entity.player.PlayerEvent; +import net.minecraftforge.event.entity.player.*; +import net.minecraftforge.event.entity.player.PlayerInteractEvent.Action; public class ForgeEventFactory { @@ -17,4 +18,16 @@ public class ForgeEventFactory PlayerEvent.BreakSpeed event = new PlayerEvent.BreakSpeed(player, block, metadata, original); return (MinecraftForge.EVENT_BUS.post(event) ? -1 : event.newSpeed); } + + public static PlayerInteractEvent onPlayerInteract(EntityPlayer player, Action action, int x, int y, int z, int face) + { + PlayerInteractEvent event = new PlayerInteractEvent(player, action, x, y, z, face); + MinecraftForge.EVENT_BUS.post(event); + return event; + } + + public static void onPlayerDestroyItem(EntityPlayer player, ItemStack stack) + { + MinecraftForge.EVENT_BUS.post(new PlayerDestroyItemEvent(player, stack)); + } } diff --git a/common/net/minecraftforge/event/entity/player/PlayerInteractEvent.java b/common/net/minecraftforge/event/entity/player/PlayerInteractEvent.java new file mode 100644 index 000000000..6a74f368d --- /dev/null +++ b/common/net/minecraftforge/event/entity/player/PlayerInteractEvent.java @@ -0,0 +1,46 @@ +package net.minecraftforge.event.entity.player; + +import net.minecraft.src.EntityPlayer; +import net.minecraft.src.World; +import net.minecraftforge.event.Cancelable; +import net.minecraftforge.event.Event; +import static net.minecraftforge.event.Event.Result; +import static net.minecraftforge.event.Event.Result.*; + +@Cancelable +public class PlayerInteractEvent extends PlayerEvent +{ + public static enum Action + { + RIGHT_CLICK_AIR, + RIGHT_CLICK_BLOCK, + LEFT_CLICK_BLOCK + } + + public final Action action; + public final int x; + public final int y; + public final int z; + public final int face; + + public Result useBlock = DEFAULT; + public Result useItem = DEFAULT; + + public PlayerInteractEvent(EntityPlayer player, Action action, int x, int y, int z, int face) + { + super(player); + this.action = action; + this.x = x; + this.y = y; + this.z = z; + this.face = face; + if (face == -1) useBlock = DENY; + } + + @Override + public void setCanceled(boolean cancel) + { + useBlock = (cancel ? DENY : useBlock == DENY ? DEFAULT : useBlock); + useItem = (cancel ? DENY : useItem == DENY ? DEFAULT : useItem); + } +} diff --git a/patches/common/net/minecraft/src/ItemInWorldManager.java.patch b/patches/common/net/minecraft/src/ItemInWorldManager.java.patch index b05d26b84..ab2e83911 100644 --- a/patches/common/net/minecraft/src/ItemInWorldManager.java.patch +++ b/patches/common/net/minecraft/src/ItemInWorldManager.java.patch @@ -1,11 +1,15 @@ --- ../src_base/common/net/minecraft/src/ItemInWorldManager.java +++ ../src_work/common/net/minecraft/src/ItemInWorldManager.java -@@ -1,7 +1,13 @@ +@@ -1,7 +1,17 @@ package net.minecraft.src; + +import net.minecraftforge.common.ForgeHooks; +import net.minecraftforge.common.MinecraftForge; ++import net.minecraftforge.event.Event; ++import net.minecraftforge.event.ForgeEventFactory; +import net.minecraftforge.event.entity.player.PlayerDestroyItemEvent; ++import net.minecraftforge.event.entity.player.PlayerInteractEvent; ++import net.minecraftforge.event.entity.player.PlayerInteractEvent.Action; public class ItemInWorldManager { @@ -14,7 +18,20 @@ /** The world object that this object is connected to. */ public World theWorld; -@@ -225,7 +231,7 @@ +@@ -134,6 +144,12 @@ + { + if (!this.gameType.isAdventure()) + { ++ if (!ForgeEventFactory.onPlayerInteract(thisPlayerMP, Action.LEFT_CLICK_BLOCK, par1, par2, par3, par4)) ++ { ++ thisPlayerMP.playerNetServerHandler.sendPacketToPlayer(new Packet53BlockChange(par1, par2, par3, theWorld)); ++ return; ++ } ++ + if (this.isCreative()) + { + if (!this.theWorld.extinguishFire((EntityPlayer)null, par1, par2, par3, par4)) +@@ -225,7 +241,7 @@ var4.onBlockHarvested(this.theWorld, par1, par2, par3, var5, this.thisPlayerMP); } @@ -23,7 +40,7 @@ if (var4 != null && var6) { -@@ -246,19 +252,30 @@ +@@ -246,19 +262,30 @@ } else { @@ -56,7 +73,7 @@ if (var7 != null) { -@@ -267,9 +284,11 @@ +@@ -267,9 +294,11 @@ if (var7.stackSize == 0) { this.thisPlayerMP.destroyCurrentEquippedItem(); @@ -68,7 +85,7 @@ if (var6 && var8) { Block.blocksList[var4].harvestBlock(this.theWorld, this.thisPlayerMP, par1, par2, par3, var5); -@@ -306,6 +325,7 @@ +@@ -306,6 +335,7 @@ if (var6.stackSize == 0) { par1EntityPlayer.inventory.mainInventory[par1EntityPlayer.inventory.currentItem] = null; @@ -76,37 +93,84 @@ } return true; -@@ -318,6 +338,12 @@ +@@ -318,29 +348,54 @@ */ public boolean activateBlockOrUseItem(EntityPlayer par1EntityPlayer, World par2World, ItemStack par3ItemStack, int par4, int par5, int par6, int par7, float par8, float par9, float par10) { -+ if (par3ItemStack != null && -+ par3ItemStack.getItem() != null && -+ par3ItemStack.getItem().onItemUseFirst(par3ItemStack, par1EntityPlayer, par2World, par4, par5, par6, par7, par8, par9, par10)) ++ PlayerInteractEvent event = ForgeEventFactory.onPlayerInteract(par1EntityPlayer, Action.RIGHT_CLICK_BLOCK, par4, par5, par6, par7); ++ if (event.isCanceled()) ++ { ++ thisPlayerMP.playerNetServerHandler.sendPacketToPlayer(new Packet53BlockChange(par4, par5, par6, theWorld)); ++ return false; ++ } ++ ++ Item item = (par3ItemStack != null ? par3ItemStack.getItem() : null); ++ if (item != null && item.onItemUseFirst(par3ItemStack, par1EntityPlayer, par2World, par4, par5, par6, par7, par8, par9, par10)) + { + return true; + } ++ int var11 = par2World.getBlockId(par4, par5, par6); - - if (var11 > 0 && Block.blocksList[var11].onBlockActivated(par2World, par4, par5, par6, par1EntityPlayer, par7, par8, par9, par10)) -@@ -339,7 +365,15 @@ - } - else - { +- +- if (var11 > 0 && Block.blocksList[var11].onBlockActivated(par2World, par4, par5, par6, par1EntityPlayer, par7, par8, par9, par10)) +- { +- return true; +- } +- else if (par3ItemStack == null) +- { +- return false; +- } +- else if (this.isCreative()) +- { +- int var12 = par3ItemStack.getItemDamage(); +- int var13 = par3ItemStack.stackSize; +- boolean var14 = par3ItemStack.tryPlaceItemIntoWorld(par1EntityPlayer, par2World, par4, par5, par6, par7, par8, par9, par10); +- par3ItemStack.setItemDamage(var12); +- par3ItemStack.stackSize = var13; +- return var14; +- } +- else +- { - return par3ItemStack.tryPlaceItemIntoWorld(par1EntityPlayer, par2World, par4, par5, par6, par7, par8, par9, par10); -+ if (!par3ItemStack.tryPlaceItemIntoWorld(par1EntityPlayer, par2World, par4, par5, par6, par7, par8, par9, par10)) +- } ++ Block block = Block.blocksList[var11]; ++ boolean result = false; ++ ++ if (block != null) ++ { ++ if (event.useBlock != Event.Result.DENY) + { -+ return false; ++ result = block.onBlockActivated(par2World, par4, par5, par6, par1EntityPlayer, par7, par8, par9, par10); + } -+ if (par3ItemStack.stackSize <= 0) ++ else + { -+ MinecraftForge.EVENT_BUS.post(new PlayerDestroyItemEvent(thisPlayerMP, par3ItemStack)); ++ thisPlayerMP.playerNetServerHandler.sendPacketToPlayer(new Packet53BlockChange(par4, par5, par6, theWorld)); ++ result = event.useItem != Event.Result.ALLOW; + } -+ return true; - } ++ } ++ ++ if (par3ItemStack != null && !result) ++ { ++ int meta = par3ItemStack.getItemDamage(); ++ int size = par3ItemStack.stackSize; ++ result = par3ItemStack.tryPlaceItemIntoWorld(par1EntityPlayer, par2World, par4, par5, par6, par7, par8, par9, par10); ++ if (isCreative()) ++ { ++ par3ItemStack.setItemDamage(meta); ++ par3ItemStack.stackSize = size; ++ } ++ if (par3ItemStack.stackSize <= 0) ForgeEventFactory.onPlayerDestroyItem(thisPlayerMP, par3ItemStack); ++ } ++ ++ if (par3ItemStack != null && ((!result && event.useItem != Event.Result.DENY) || event.useItem == Event.Result.ALLOW)) ++ { ++ this.tryUseItem(thisPlayerMP, par2World, par3ItemStack); ++ } ++ return result; } -@@ -350,4 +384,13 @@ + /** +@@ -350,4 +405,13 @@ { this.theWorld = par1WorldServer; } diff --git a/patches/common/net/minecraft/src/NetServerHandler.java.patch b/patches/common/net/minecraft/src/NetServerHandler.java.patch index 8548928d1..7ad34beee 100644 --- a/patches/common/net/minecraft/src/NetServerHandler.java.patch +++ b/patches/common/net/minecraft/src/NetServerHandler.java.patch @@ -1,6 +1,15 @@ --- ../src_base/common/net/minecraft/src/NetServerHandler.java +++ ../src_work/common/net/minecraft/src/NetServerHandler.java -@@ -310,7 +310,7 @@ +@@ -10,6 +10,8 @@ + + import cpw.mods.fml.common.network.FMLNetworkHandler; + import net.minecraft.server.MinecraftServer; ++import net.minecraftforge.event.ForgeEventFactory; ++import net.minecraftforge.event.entity.player.PlayerInteractEvent; + + public class NetServerHandler extends NetHandler + { +@@ -310,7 +312,7 @@ this.playerEntity.setPositionAndRotation(var5, var7, var9, var11, var12); boolean var32 = var2.getCollidingBoundingBoxes(this.playerEntity, this.playerEntity.boundingBox.copy().contract((double)var27, (double)var27, (double)var27)).isEmpty(); @@ -9,7 +18,7 @@ { this.setPlayerLocation(this.lastPosX, this.lastPosY, this.lastPosZ, var11, var12); return; -@@ -318,7 +318,7 @@ +@@ -318,7 +320,7 @@ AxisAlignedBB var33 = this.playerEntity.boundingBox.copy().expand((double)var27, (double)var27, (double)var27).addCoord(0.0D, -0.55D, 0.0D); @@ -18,7 +27,7 @@ { if (var29 >= -0.03125D) { -@@ -395,7 +395,10 @@ +@@ -395,7 +397,10 @@ double var12 = this.playerEntity.posZ - ((double)var7 + 0.5D); double var14 = var8 * var8 + var10 * var10 + var12 * var12; @@ -30,7 +39,7 @@ { return; } -@@ -417,7 +420,7 @@ +@@ -417,7 +422,7 @@ if (par1Packet14BlockDig.status == 0) { @@ -39,7 +48,27 @@ { this.playerEntity.playerNetServerHandler.sendPacketToPlayer(new Packet53BlockChange(var5, var6, var7, var2)); } -@@ -497,7 +500,9 @@ +@@ -463,6 +468,7 @@ + + public void handlePlace(Packet15Place par1Packet15Place) + { ++ System.out.println("15: " + par1Packet15Place.creationTimeMillis); + WorldServer var2 = this.mcServer.worldServerForDimension(this.playerEntity.dimension); + ItemStack var3 = this.playerEntity.inventory.getCurrentItem(); + boolean var4 = false; +@@ -479,7 +485,10 @@ + return; + } + +- this.playerEntity.theItemInWorldManager.tryUseItem(this.playerEntity, var2, var3); ++ if (ForgeEventFactory.onPlayerInteract(playerEntity, PlayerInteractEvent.Action.RIGHT_CLICK_AIR, 0, 0, 0, -1)) ++ { ++ this.playerEntity.theItemInWorldManager.tryUseItem(this.playerEntity, var2, var3); ++ } + } + else if (par1Packet15Place.getYPosition() >= this.mcServer.getBuildLimit() - 1 && (par1Packet15Place.getDirection() == 1 || par1Packet15Place.getYPosition() >= this.mcServer.getBuildLimit())) + { +@@ -497,7 +506,9 @@ var12 = var11; } @@ -50,7 +79,7 @@ { this.playerEntity.theItemInWorldManager.activateBlockOrUseItem(this.playerEntity, var2, var3, var5, var6, var7, var8, par1Packet15Place.getXOffset(), par1Packet15Place.getYOffset(), par1Packet15Place.getZOffset()); } -@@ -798,7 +803,7 @@ +@@ -798,7 +809,7 @@ return; } diff --git a/patches/minecraft/net/minecraft/client/Minecraft.java.patch b/patches/minecraft/net/minecraft/client/Minecraft.java.patch index 608bd2d20..0a04cdf98 100644 --- a/patches/minecraft/net/minecraft/client/Minecraft.java.patch +++ b/patches/minecraft/net/minecraft/client/Minecraft.java.patch @@ -1,14 +1,16 @@ --- ../src_base/minecraft/net/minecraft/client/Minecraft.java +++ ../src_work/minecraft/net/minecraft/client/Minecraft.java -@@ -118,6 +118,7 @@ +@@ -118,6 +118,9 @@ import net.minecraft.src.WorldInfo; import net.minecraft.src.WorldRenderer; import net.minecraft.src.WorldSettings; +import net.minecraftforge.common.ForgeHooks; ++import net.minecraftforge.event.ForgeEventFactory; ++import net.minecraftforge.event.entity.player.PlayerInteractEvent.Action; import org.lwjgl.LWJGLException; import org.lwjgl.Sys; -@@ -1245,7 +1246,7 @@ +@@ -1245,7 +1248,7 @@ if (this.thePlayer.canPlayerEdit(var3, var4, var5)) { @@ -17,7 +19,27 @@ this.thePlayer.swingItem(); } } -@@ -2221,80 +2222,12 @@ +@@ -1311,7 +1314,8 @@ + { + int var8 = var3 != null ? var3.stackSize : 0; + +- if (this.playerController.onPlayerRightClick(this.thePlayer, this.theWorld, var3, var4, var5, var6, var7, this.objectMouseOver.hitVec)) ++ boolean result = ForgeEventFactory.onPlayerInteract(thePlayer, Action.RIGHT_CLICK_BLOCK, var4, var5, var6, var7); ++ if (result && this.playerController.onPlayerRightClick(this.thePlayer, this.theWorld, var3, var4, var5, var6, var7, this.objectMouseOver.hitVec)) + { + var2 = false; + this.thePlayer.swingItem(); +@@ -1337,7 +1341,8 @@ + { + ItemStack var9 = this.thePlayer.inventory.getCurrentItem(); + +- if (var9 != null && this.playerController.sendUseItem(this.thePlayer, this.theWorld, var9)) ++ boolean result = ForgeEventFactory.onPlayerInteract(thePlayer, Action.RIGHT_CLICK_AIR, 0, 0, 0, -1); ++ if (result && var9 != null && this.playerController.sendUseItem(this.thePlayer, this.theWorld, var9)) + { + this.entityRenderer.itemRenderer.func_78445_c(); + } +@@ -2221,80 +2226,12 @@ if (this.objectMouseOver != null) { boolean var1 = this.thePlayer.capabilities.isCreativeMode;