mirror of
https://github.com/MinecraftForge/MinecraftForge.git
synced 2026-11-13 16:54:22 +00:00
229 lines
9.4 KiB
Diff
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;
|
|
+ }
|
|
}
|