Files
MinecraftForge/patches/common/net/minecraft/src/ItemInWorldManager.java.patch
T

229 lines
9.4 KiB
Diff

--- ../src_base/common/net/minecraft/src/ItemInWorldManager.java
+++ ../src_work/common/net/minecraft/src/ItemInWorldManager.java
@@ -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
{
+ /** Forge reach distance */
+ private double blockReachDistance = 5.0d;
/** The world object that this object is connected to. */
public World theWorld;
@@ -134,6 +144,13 @@
{
if (!this.gameType.func_82752_c() || this.thisPlayerMP.func_82246_f(par1, par2, par3))
{
+ PlayerInteractEvent event = ForgeEventFactory.onPlayerInteract(thisPlayerMP, Action.LEFT_CLICK_BLOCK, par1, par2, par3, par4);
+ if (event.isCanceled())
+ {
+ thisPlayerMP.playerNetServerHandler.sendPacketToPlayer(new Packet53BlockChange(par1, par2, par3, theWorld));
+ return;
+ }
+
if (this.isCreative())
{
if (!this.theWorld.extinguishFire((EntityPlayer)null, par1, par2, par3, par4))
@@ -143,15 +160,32 @@
}
else
{
- this.theWorld.extinguishFire(this.thisPlayerMP, par1, par2, par3, par4);
this.initialDamage = this.curblockDamage;
float var5 = 1.0F;
int var6 = this.theWorld.getBlockId(par1, par2, par3);
-
- if (var6 > 0)
- {
- Block.blocksList[var6].onBlockClicked(this.theWorld, par1, par2, par3, this.thisPlayerMP);
- var5 = Block.blocksList[var6].getPlayerRelativeBlockHardness(this.thisPlayerMP, this.thisPlayerMP.worldObj, par1, par2, par3);
+ Block block = Block.blocksList[var6];
+
+ if (block != null)
+ {
+ if (event.useBlock != Event.Result.DENY)
+ {
+ block.onBlockClicked(theWorld, par1, par2, par3, thisPlayerMP);
+ theWorld.extinguishFire(thisPlayerMP, par1, par2, par3, par4);
+ }
+ else
+ {
+ thisPlayerMP.playerNetServerHandler.sendPacketToPlayer(new Packet53BlockChange(par1, par2, par3, theWorld));
+ }
+ var5 = block.getPlayerRelativeBlockHardness(thisPlayerMP, thisPlayerMP.worldObj, par1, par2, par3);
+ }
+
+ if (event.useItem == Event.Result.DENY)
+ {
+ if (var5 >= 1.0f)
+ {
+ thisPlayerMP.playerNetServerHandler.sendPacketToPlayer(new Packet53BlockChange(par1, par2, par3, theWorld));
+ }
+ return;
}
if (var6 > 0 && var5 >= 1.0F)
@@ -225,7 +259,7 @@
var4.onBlockHarvested(this.theWorld, par1, par2, par3, var5, this.thisPlayerMP);
}
- boolean var6 = this.theWorld.setBlockWithNotify(par1, par2, par3, 0);
+ boolean var6 = (var4 != null && var4.removeBlockByPlayer(theWorld, thisPlayerMP, par1, par2, par3));
if (var4 != null && var6)
{
@@ -246,19 +280,30 @@
}
else
{
+ ItemStack stack = thisPlayerMP.getCurrentEquippedItem();
+ if (stack != null && stack.getItem().onBlockStartBreak(stack, par1, par2, par3, thisPlayerMP))
+ {
+ return false;
+ }
int var4 = this.theWorld.getBlockId(par1, par2, par3);
int var5 = this.theWorld.getBlockMetadata(par1, par2, par3);
this.theWorld.playAuxSFXAtEntity(this.thisPlayerMP, 2001, par1, par2, par3, var4 + (this.theWorld.getBlockMetadata(par1, par2, par3) << 12));
- boolean var6 = this.removeBlock(par1, par2, par3);
+ boolean var6 = false;
if (this.isCreative())
{
+ var6 = this.removeBlock(par1, par2, par3);
this.thisPlayerMP.playerNetServerHandler.sendPacketToPlayer(new Packet53BlockChange(par1, par2, par3, this.theWorld));
}
else
{
ItemStack var7 = this.thisPlayerMP.getCurrentEquippedItem();
- boolean var8 = this.thisPlayerMP.canHarvestBlock(Block.blocksList[var4]);
+ boolean var8 = false;
+ Block block = Block.blocksList[var4];
+ if (block != null)
+ {
+ var8 = block.canHarvestBlock(thisPlayerMP, var5);
+ }
if (var7 != null)
{
@@ -267,9 +312,11 @@
if (var7.stackSize == 0)
{
this.thisPlayerMP.destroyCurrentEquippedItem();
+ MinecraftForge.EVENT_BUS.post(new PlayerDestroyItemEvent(thisPlayerMP, var7));
}
}
+ var6 = this.removeBlock(par1, par2, par3);
if (var6 && var8)
{
Block.blocksList[var4].harvestBlock(this.theWorld, this.thisPlayerMP, par1, par2, par3, var5);
@@ -310,6 +357,7 @@
if (var6.stackSize == 0)
{
par1EntityPlayer.inventory.mainInventory[par1EntityPlayer.inventory.currentItem] = null;
+ MinecraftForge.EVENT_BUS.post(new PlayerDestroyItemEvent(thisPlayerMP, var6));
}
if (!par1EntityPlayer.isUsingItem())
@@ -327,29 +375,56 @@
*/
public boolean activateBlockOrUseItem(EntityPlayer par1EntityPlayer, World par2World, ItemStack par3ItemStack, int par4, int par5, int par6, int par7, float par8, float par9, float 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))
+ {
+ if (par3ItemStack.stackSize <= 0) ForgeEventFactory.onPlayerDestroyItem(thisPlayerMP, par3ItemStack);
+ 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))
- {
- 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);
- }
+ Block block = Block.blocksList[var11];
+ boolean result = false;
+
+ if (block != null)
+ {
+ if (event.useBlock != Event.Result.DENY)
+ {
+ result = block.onBlockActivated(par2World, par4, par5, par6, par1EntityPlayer, par7, par8, par9, par10);
+ }
+ else
+ {
+ thisPlayerMP.playerNetServerHandler.sendPacketToPlayer(new Packet53BlockChange(par4, par5, par6, theWorld));
+ result = event.useItem != Event.Result.ALLOW;
+ }
+ }
+
+ 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);
+ }
+
+ /* Re-enable if this causes bukkit incompatibility, or re-write client side to only send a single packet per right click.
+ if (par3ItemStack != null && ((!result && event.useItem != Event.Result.DENY) || event.useItem == Event.Result.ALLOW))
+ {
+ this.tryUseItem(thisPlayerMP, par2World, par3ItemStack);
+ }*/
+ return result;
}
/**
@@ -359,4 +434,13 @@
{
this.theWorld = par1WorldServer;
}
+
+ public double getBlockReachDistance()
+ {
+ return blockReachDistance;
+ }
+ public void setBlockReachDistance(double distance)
+ {
+ blockReachDistance = distance;
+ }
}