The title mostly explains it. I have a tile entity that is called Energizer. I want this energizer to check to see if there is an EntityItem on top of it and if so, consume it and create energy. The only problem is, I can't figure out how to check for (and receive) an EntityItem in a certain location (on top of it). I considered using a method that searches for nearby entities and then seeing if they were instanceof EntityItem, but I can't even find a method to do that.
\$\begingroup\$ \$\endgroup\$
6 - \$\begingroup\$ Please consider expanding the question with some more details. For example I'm sure you have an event or a specific method that is called when the EntityItem is placed somewhere. It would be useful for better answers to know the sequence of actions that happens when doing this. \$\endgroup\$Steak Overflow– Steak Overflow2015-04-21 11:07:59 +00:00Commented Apr 21, 2015 at 11:07
- \$\begingroup\$ no, I don't have an event like that, because I am hoping to control this all from only the machine, so that it works with all items without me having to modify them. \$\endgroup\$Andrew Graber– Andrew Graber2015-04-21 16:54:50 +00:00Commented Apr 21, 2015 at 16:54
- \$\begingroup\$ Ok. And have you already considered using a collider on top of your Energizer and use OnTriggerEnter to make the association? (Or something like that if not Unity) \$\endgroup\$Steak Overflow– Steak Overflow2015-04-21 17:20:09 +00:00Commented Apr 21, 2015 at 17:20
- \$\begingroup\$ It's not unity. It's minecraft, so there isnt such a thing as a collider (as far as I know) \$\endgroup\$Andrew Graber– Andrew Graber2015-04-21 17:38:26 +00:00Commented Apr 21, 2015 at 17:38
- \$\begingroup\$ i don't know Minecraft Forge well enough but there must be the way to check the distance between two objects or just get their positions so you can compare distance on the X and Y plane and if EntityItem's Z if higher that your Energizer's. \$\endgroup\$Steak Overflow– Steak Overflow2015-04-21 17:59:56 +00:00Commented Apr 21, 2015 at 17:59
| Show 1 more comment
1 Answer
\$\begingroup\$ \$\endgroup\$
First off, you want to override ITickable#update() in your Energizer TileEntity. Inside here is where you can scan for nearby EntityItems. With the TileEntity#worldObj member you can use World#getEntitiesWithinAABB(Class, AxisAlignedBB) to find any entities of a given class within the defined bounding box (i.e., right above your tile entity).
@Override public void update() { // Create bounding box for block directly above this tile entity. double x = (double)this.pos.getX(); double y = (double)this.pos.getY() + 1.0d; double z = (double)this.pos.getZ(); AxisAlignedBB scanAbove = new AxisAlignedBB(x, y, z, x, y, z); // Find entities above this tile entity. List entities = worldObj.getEntitiesWithinAABB(EntityItem.class, scanAbove); // TODO: Consume entities. } Imports:
import java.util.List; import net.minecraft.entity.item.EntityItem; import net.minecraft.util.AxisAlignedBB;