Mod开发-掉落
今日有人群里提问,“怎么生成掉落物”。
如果是你,你会怎么回答他?
如果你不分类讨论,直接回答了这个问题,那答案一定是错的。
方块打碎和实体打碎都有掉落物;修改自己引入的方块或实体,与修改原版的又不同。排列组合一下,这就四种情况了。遇到这种情况,最好是问清楚他要干什么。
固然,本质上掉落物都是EntityItem类的对象,一个个对应着ItemStack的实体,但是如何找准修改掉落物的接口,调用哪些接口生成这些掉落物,是因情况而异的。
先讨论那些可以修改原版内容的情况。
生物的死亡战利品,我推荐监听LivingDropsEvent事件,往getDrops获得的list里塞EntityItem。
方块的摧毁战利品,我推荐监听BlockEvent.HarvestDropsEvent,往getDrops获得的list里塞ItemStack。
如果是你自己构造的新方块呢?
Block::getDrops(NonNullList<ItemStack> drops, IBlockAccess world, BlockPos pos, IBlockState state, int fortune)
覆写一下,往drops列表里塞东西。
如果是自己的新实体呢?
EntityLiving::dropLoot(boolean wasRecentlyHit, int lootingModifier, DamageSource source)
覆写一下,调用EntityLiving::dropItem,这个参数传的是Item,简单,但不适合掉落具有复杂nbt的道具。
或者调用entityDropItem,这个参数传的是ItemStack,方便掉落具有复杂nbt的道具。
LootTable这种东西不是不能用,它只是很不方便debug。如果你想用,可以去看其他的教程。