Added new pick block hook for blocks and entites to allow for better grained control of the result.

This commit is contained in:
LexManos 2012-08-10 02:09:11 -07:00
parent d14b1b4e1f
commit acdcfd0a56
4 changed files with 215 additions and 3 deletions

View file

@ -221,7 +221,68 @@ public class ForgeHooks
public static boolean onEntityInteract(EntityPlayer entityPlayer, Entity par1Entity, boolean b) public static boolean onEntityInteract(EntityPlayer entityPlayer, Entity par1Entity, boolean b)
{ {
return false; return false;
} }
/**
* Called when a player uses 'pick block', calls new Entity and Block hooks.
*/
public static boolean onPickBlock(MovingObjectPosition target, EntityPlayer player, World world)
{
ItemStack result = null;
boolean isCreative = player.capabilities.isCreativeMode;
if (target.typeOfHit == EnumMovingObjectType.TILE)
{
int x = target.blockX;
int y = target.blockY;
int z = target.blockZ;
Block var8 = Block.blocksList[world.getBlockId(x, y, z)];
if (var8 == null)
{
return false;
}
result = var8.getPickBlock(target, world, x, y, z);
}
else
{
if (target.typeOfHit != EnumMovingObjectType.ENTITY || target.entityHit == null || !isCreative)
{
return false;
}
result = target.entityHit.getPickedResult(target);
}
if (result == null)
{
return false;
}
for (int x = 0; x < 9; x++)
{
ItemStack stack = player.inventory.getStackInSlot(x);
if (stack != null && stack.isItemEqual(result))
{
player.inventory.currentItem = x;
return true;
}
}
if (!isCreative)
{
return false;
}
int slot = player.inventory.getFirstEmptyStack();
if (slot < 0 || slot >= 9)
{
return false;
}
player.inventory.setInventorySlotContents(slot, result);
return true;
}
} }

View file

@ -104,7 +104,7 @@
{ {
ItemStack var8 = this.createStackedBlock(par6); ItemStack var8 = this.createStackedBlock(par6);
@@ -1249,4 +1257,645 @@ @@ -1249,4 +1257,669 @@
canBlockGrass[0] = true; canBlockGrass[0] = true;
StatList.initBreakableStats(); StatList.initBreakableStats();
} }
@ -748,5 +748,29 @@
+ public boolean canRenderInPass(int pass) + public boolean canRenderInPass(int pass)
+ { + {
+ return pass == getRenderBlockPass(); + return pass == getRenderBlockPass();
+ }
+
+ /**
+ * Called when a user uses the creative pick block button on this block
+ *
+ * @param target The full target the player is looking at
+ * @return A ItemStack to add to the player's inventory, Null if nothing should be added.
+ */
+ public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z)
+ {
+ int id = idPicked(world, x, y, z);
+
+ if (id == 0)
+ {
+ return null;
+ }
+
+ Item item = Item.itemsList[id];
+ if (item == null)
+ {
+ return null;
+ }
+
+ return new ItemStack(id, 1, getDamageValue(world, x, y, z));
+ } + }
} }

View file

@ -67,11 +67,12 @@
} }
/** /**
@@ -2107,4 +2128,27 @@ @@ -2107,4 +2128,59 @@
{ {
return String.format("%s[\'%s\'/%d, l=\'%s\', x=%.2f, y=%.2f, z=%.2f]", new Object[] {this.getClass().getSimpleName(), this.getEntityName(), Integer.valueOf(this.entityId), this.worldObj == null ? "~NULL~" : this.worldObj.getWorldInfo().getWorldName(), Double.valueOf(this.posX), Double.valueOf(this.posY), Double.valueOf(this.posZ)}); return String.format("%s[\'%s\'/%d, l=\'%s\', x=%.2f, y=%.2f, z=%.2f]", new Object[] {this.getClass().getSimpleName(), this.getEntityName(), Integer.valueOf(this.entityId), this.worldObj == null ? "~NULL~" : this.worldObj.getWorldInfo().getWorldName(), Double.valueOf(this.posX), Double.valueOf(this.posY), Double.valueOf(this.posZ)});
} }
+ +
+ /* ================================== Forge Start =====================================*/
+ /** + /**
+ * Returns a NBTTagCompound that can be used to store custom data for this entity. + * Returns a NBTTagCompound that can be used to store custom data for this entity.
+ * It will be written, and read from disc, so it persists over world saves. + * It will be written, and read from disc, so it persists over world saves.
@ -93,5 +94,36 @@
+ public boolean shouldRiderSit() + public boolean shouldRiderSit()
+ { + {
+ return true; + return true;
+ }
+
+ /**
+ * Called when a user uses the creative pick block button on this entity.
+ *
+ * @param target The full target the player is looking at
+ * @return A ItemStack to add to the player's inventory, Null if nothing should be added.
+ */
+ public ItemStack getPickedResult(MovingObjectPosition target)
+ {
+ if (this instanceof EntityPainting)
+ {
+ return new ItemStack(Item.painting);
+ }
+ else if (this instanceof EntityMinecart)
+ {
+ return ((EntityMinecart)this).getCartItem();
+ }
+ else if (this instanceof EntityBoat)
+ {
+ return new ItemStack(Item.boat);
+ }
+ else
+ {
+ int id = EntityList.getEntityID(this);
+ if (id > 0 || EntityList.entityEggs.containsKey(id))
+ {
+ return new ItemStack(Item.monsterPlacer, 1, id);
+ }
+ }
+ return null;
+ } + }
} }

View file

@ -0,0 +1,95 @@
--- ../src_base/minecraft/net/minecraft/client/Minecraft.java
+++ ../src_work/minecraft/net/minecraft/client/Minecraft.java
@@ -17,6 +17,7 @@
import javax.swing.JPanel;
import net.minecraft.src.*;
+import net.minecraftforge.common.ForgeHooks;
import org.lwjgl.LWJGLException;
import org.lwjgl.Sys;
@@ -2102,80 +2103,12 @@
if (this.objectMouseOver != null)
{
boolean var1 = this.thePlayer.capabilities.isCreativeMode;
- int var3 = 0;
- boolean var4 = false;
- int var2;
int var5;
- if (this.objectMouseOver.typeOfHit == EnumMovingObjectType.TILE)
- {
- var5 = this.objectMouseOver.blockX;
- int var6 = this.objectMouseOver.blockY;
- int var7 = this.objectMouseOver.blockZ;
- Block var8 = Block.blocksList[this.theWorld.getBlockId(var5, var6, var7)];
-
- if (var8 == null)
- {
- return;
- }
-
- var2 = var8.idPicked(this.theWorld, var5, var6, var7);
-
- if (var2 == 0)
- {
- return;
- }
-
- var4 = Item.itemsList[var2].getHasSubtypes();
- int var9 = var2 >= 256 ? var8.blockID : var2;
- var3 = Block.blocksList[var9].getDamageValue(this.theWorld, var5, var6, var7);
- }
- else
- {
- if (this.objectMouseOver.typeOfHit != EnumMovingObjectType.ENTITY || this.objectMouseOver.entityHit == null || !var1)
- {
- return;
- }
-
- if (this.objectMouseOver.entityHit instanceof EntityPainting)
- {
- var2 = Item.painting.shiftedIndex;
- }
- else if (this.objectMouseOver.entityHit instanceof EntityMinecart)
- {
- EntityMinecart var10 = (EntityMinecart)this.objectMouseOver.entityHit;
-
- if (var10.minecartType == 2)
- {
- var2 = Item.minecartPowered.shiftedIndex;
- }
- else if (var10.minecartType == 1)
- {
- var2 = Item.minecartCrate.shiftedIndex;
- }
- else
- {
- var2 = Item.minecartEmpty.shiftedIndex;
- }
- }
- else if (this.objectMouseOver.entityHit instanceof EntityBoat)
- {
- var2 = Item.boat.shiftedIndex;
- }
- else
- {
- var2 = Item.monsterPlacer.shiftedIndex;
- var3 = EntityList.getEntityID(this.objectMouseOver.entityHit);
- var4 = true;
-
- if (var3 <= 0 || !EntityList.entityEggs.containsKey(Integer.valueOf(var3)))
- {
- return;
- }
- }
- }
-
- this.thePlayer.inventory.setCurrentItem(var2, var3, var4, var1);
+ if (!ForgeHooks.onPickBlock(this.objectMouseOver, this.thePlayer, this.theWorld))
+ {
+ return;
+ }
if (var1)
{