Added preliminarty Player Interact event heavily based on the bukkit event.

This commit is contained in:
LexManos 2012-09-26 21:18:18 -07:00
parent a421e51805
commit 0e5c0be23e
6 changed files with 213 additions and 32 deletions

View File

@ -6,6 +6,13 @@ package net.minecraftforge.event;
*/ */
public class Event public class Event
{ {
public enum Result
{
DENY,
DEFAULT,
ALLOW
}
private boolean isCanceled = false; private boolean isCanceled = false;
private final boolean isCancelable; private final boolean isCancelable;
private static ListenerList listeners = new ListenerList(); private static ListenerList listeners = new ListenerList();

View File

@ -1,7 +1,8 @@
package net.minecraftforge.event; package net.minecraftforge.event;
import net.minecraft.src.*; import net.minecraft.src.*;
import net.minecraftforge.common.MinecraftForge; 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 public class ForgeEventFactory
{ {
@ -17,4 +18,16 @@ public class ForgeEventFactory
PlayerEvent.BreakSpeed event = new PlayerEvent.BreakSpeed(player, block, metadata, original); PlayerEvent.BreakSpeed event = new PlayerEvent.BreakSpeed(player, block, metadata, original);
return (MinecraftForge.EVENT_BUS.post(event) ? -1 : event.newSpeed); 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));
}
} }

View File

@ -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);
}
}

View File

@ -1,11 +1,15 @@
--- ../src_base/common/net/minecraft/src/ItemInWorldManager.java --- ../src_base/common/net/minecraft/src/ItemInWorldManager.java
+++ ../src_work/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; package net.minecraft.src;
+ +
+import net.minecraftforge.common.ForgeHooks; +import net.minecraftforge.common.ForgeHooks;
+import net.minecraftforge.common.MinecraftForge; +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.PlayerDestroyItemEvent;
+import net.minecraftforge.event.entity.player.PlayerInteractEvent;
+import net.minecraftforge.event.entity.player.PlayerInteractEvent.Action;
public class ItemInWorldManager public class ItemInWorldManager
{ {
@ -14,7 +18,20 @@
/** The world object that this object is connected to. */ /** The world object that this object is connected to. */
public World theWorld; 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); var4.onBlockHarvested(this.theWorld, par1, par2, par3, var5, this.thisPlayerMP);
} }
@ -23,7 +40,7 @@
if (var4 != null && var6) if (var4 != null && var6)
{ {
@@ -246,19 +252,30 @@ @@ -246,19 +262,30 @@
} }
else else
{ {
@ -56,7 +73,7 @@
if (var7 != null) if (var7 != null)
{ {
@@ -267,9 +284,11 @@ @@ -267,9 +294,11 @@
if (var7.stackSize == 0) if (var7.stackSize == 0)
{ {
this.thisPlayerMP.destroyCurrentEquippedItem(); this.thisPlayerMP.destroyCurrentEquippedItem();
@ -68,7 +85,7 @@
if (var6 && var8) if (var6 && var8)
{ {
Block.blocksList[var4].harvestBlock(this.theWorld, this.thisPlayerMP, par1, par2, par3, var5); Block.blocksList[var4].harvestBlock(this.theWorld, this.thisPlayerMP, par1, par2, par3, var5);
@@ -306,6 +325,7 @@ @@ -306,6 +335,7 @@
if (var6.stackSize == 0) if (var6.stackSize == 0)
{ {
par1EntityPlayer.inventory.mainInventory[par1EntityPlayer.inventory.currentItem] = null; par1EntityPlayer.inventory.mainInventory[par1EntityPlayer.inventory.currentItem] = null;
@ -76,37 +93,84 @@
} }
return true; 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) 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 && + PlayerInteractEvent event = ForgeEventFactory.onPlayerInteract(par1EntityPlayer, Action.RIGHT_CLICK_BLOCK, par4, par5, par6, par7);
+ par3ItemStack.getItem() != null && + if (event.isCanceled())
+ par3ItemStack.getItem().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
{
- return par3ItemStack.tryPlaceItemIntoWorld(par1EntityPlayer, par2World, par4, par5, par6, par7, par8, par9, par10);
+ if (!par3ItemStack.tryPlaceItemIntoWorld(par1EntityPlayer, par2World, par4, par5, par6, par7, par8, par9, par10))
+ { + {
+ thisPlayerMP.playerNetServerHandler.sendPacketToPlayer(new Packet53BlockChange(par4, par5, par6, theWorld));
+ return false; + return false;
+ } + }
+ if (par3ItemStack.stackSize <= 0) +
+ Item item = (par3ItemStack != null ? par3ItemStack.getItem() : null);
+ if (item != null && item.onItemUseFirst(par3ItemStack, par1EntityPlayer, par2World, par4, par5, par6, par7, par8, par9, par10))
+ { + {
+ MinecraftForge.EVENT_BUS.post(new PlayerDestroyItemEvent(thisPlayerMP, par3ItemStack));
+ }
+ return true; + 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);
+ }
+
+ 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; this.theWorld = par1WorldServer;
} }

View File

@ -1,6 +1,15 @@
--- ../src_base/common/net/minecraft/src/NetServerHandler.java --- ../src_base/common/net/minecraft/src/NetServerHandler.java
+++ ../src_work/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); 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(); 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); this.setPlayerLocation(this.lastPosX, this.lastPosY, this.lastPosZ, var11, var12);
return; 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); 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) if (var29 >= -0.03125D)
{ {
@@ -395,7 +395,10 @@ @@ -395,7 +397,10 @@
double var12 = this.playerEntity.posZ - ((double)var7 + 0.5D); double var12 = this.playerEntity.posZ - ((double)var7 + 0.5D);
double var14 = var8 * var8 + var10 * var10 + var12 * var12; double var14 = var8 * var8 + var10 * var10 + var12 * var12;
@ -30,7 +39,7 @@
{ {
return; return;
} }
@@ -417,7 +420,7 @@ @@ -417,7 +422,7 @@
if (par1Packet14BlockDig.status == 0) if (par1Packet14BlockDig.status == 0)
{ {
@ -39,7 +48,27 @@
{ {
this.playerEntity.playerNetServerHandler.sendPacketToPlayer(new Packet53BlockChange(var5, var6, var7, var2)); 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; var12 = var11;
} }
@ -50,7 +79,7 @@
{ {
this.playerEntity.theItemInWorldManager.activateBlockOrUseItem(this.playerEntity, var2, var3, var5, var6, var7, var8, par1Packet15Place.getXOffset(), par1Packet15Place.getYOffset(), par1Packet15Place.getZOffset()); 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; return;
} }

View File

@ -1,14 +1,16 @@
--- ../src_base/minecraft/net/minecraft/client/Minecraft.java --- ../src_base/minecraft/net/minecraft/client/Minecraft.java
+++ ../src_work/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.WorldInfo;
import net.minecraft.src.WorldRenderer; import net.minecraft.src.WorldRenderer;
import net.minecraft.src.WorldSettings; import net.minecraft.src.WorldSettings;
+import net.minecraftforge.common.ForgeHooks; +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.LWJGLException;
import org.lwjgl.Sys; import org.lwjgl.Sys;
@@ -1245,7 +1246,7 @@ @@ -1245,7 +1248,7 @@
if (this.thePlayer.canPlayerEdit(var3, var4, var5)) if (this.thePlayer.canPlayerEdit(var3, var4, var5))
{ {
@ -17,7 +19,27 @@
this.thePlayer.swingItem(); 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) if (this.objectMouseOver != null)
{ {
boolean var1 = this.thePlayer.capabilities.isCreativeMode; boolean var1 = this.thePlayer.capabilities.isCreativeMode;