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 enum Result
{
DENY,
DEFAULT,
ALLOW
}
private boolean isCanceled = false;
private final boolean isCancelable;
private static ListenerList listeners = new ListenerList();

View File

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

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_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;
}

View File

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

View File

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