Posted May 7, 20169 yr Hey guys, So as the title says, I want to know if it's possible to make vanilla mob spawners drop, with the correct mob inside. I believe that mob spawners use NBT tags, but I'm not sure. And I have no idea if it's possible to make blocks drop with NBT tags, or whatever else mob spawners use to determin what kind of mob spawner it is. I haven't tried to code this yet, because I would like to know if it's possible or if I have to make custom spawners.
May 7, 20169 yr Look at TileEntityMobSpawner and MobSpawnerBaseLogic to see how they read from/write to NBT. ItemBlock will call TileEntity#readFromNBT with the "BlockEntityTag" sub-compound of the ItemStack when the block is placed. You can see an example of this here. The NBT structure changed slightly in 1.9, look at the 1.9 branch of the repository for the updated code. Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.
May 7, 20169 yr Author Look at TileEntityMobSpawner and MobSpawnerBaseLogic to see how they read from/write to NBT. ItemBlock will call TileEntity#readFromNBT with the "BlockEntityTag" sub-compound of the ItemStack when the block is placed. You can see an example of this here. The NBT structure changed slightly in 1.9, look at the 1.9 branch of the repository for the updated code. I have been able to change the spawner that is dropped, using the example code you linked. Now I just need to get the tag from the block that is being mined. At the moment all spawners drop a Zombie spawner in stead of a Pig spawner
May 7, 20169 yr Unfortunately BlockEvent.HarvestDropsEvent is fired after the Block and its TileEntity have been removed from the world (unless the Block specifically delays the removal, which BlockMobSpawner doesn't). This means that you don't have access to the TileEntity from BlockEvent.HarvestDropsEvent . A possible workaround would be to cache the TileEntity in BlockEvent.BreakEvent and then use it in BlockEvent.HarvestDropsEvent to create the dropped ItemStack . Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.
May 7, 20169 yr Author Unfortunately BlockEvent.HarvestDropsEvent is fired after the Block and its TileEntity have been removed from the world (unless the Block specifically delays the removal, which BlockMobSpawner doesn't). This means that you don't have access to the TileEntity from BlockEvent.HarvestDropsEvent . A possible workaround would be to cache the TileEntity in BlockEvent.BreakEvent and then use it in BlockEvent.HarvestDropsEvent to create the dropped ItemStack . Would it be easier to make 'custom' blocks and replace the orignal mobspawner? Or should I just forget about this?
May 7, 20169 yr Would it be easier to make 'custom' blocks and replace the orignal mobspawner? Or should I just forget about this? It would be easy enough to create your own mob spawner block, but replacing the vanilla one will be difficult. In theory you could use the substitution alias system to do this, but I don't think it actually works properly for blocks. There's no easy way to achieve what you want, but it may be possible using the work around I described previously. Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.
May 7, 20169 yr Author It would be easy enough to create your own mob spawner block, but replacing the vanilla one will be difficult. In theory you could use the substitution alias system to do this, but I don't think it actually works properly for blocks. There's no easy way to achieve what you want, but it may be possible using the work around I described previously. I'll give it a try, and see if I can make it work.
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.