MCBBS Wiki欢迎您共同参与编辑!在参与编辑之前请先阅读Wiki方针。
如果在编辑的过程中遇到了什么问题,可以去讨论板提问。
为了您能够无阻碍地参与编辑 未验证/绑定过邮箱的用户,请尽快绑定/验证。
MCBBS Wiki GitHub群组已上线!
您可以在回声洞中发表吐槽!
服务器状态监控。点击进入
本站由MCBBS用户自行搭建,与MCBBS及东银河系漫游指南(北京)科技有限公司没有从属关系。点此了解 MCBBS Wiki 不是什么>>
用户:MashKJo/1.12.2模组开发教程/12.高级物品和方块 - 常用的待覆写方法
< 用户:MashKJo | 1.12.2模组开发教程
对于高级物品,Item类有如下常用的方法值得覆写:
- onItemUseFirst、onItemUse:在物品被玩家手持,且右键非空气方块时触发,均返回一个EnumActionResult,前者先于后者被触发。对于前者而言,返回EnumActionResult.PASS,则代表会继续执行原版的相关逻辑。
- onItemUseFinish:该方法和上述2个方法有所区别——该方法限定的实体并不仅仅是玩家(EntityPlayer)了,而是所有生物(EntityLivingBase)。它返回一个ItemStack,代表某个ItemStack被使用后的结果。
- onItemRightClick:该方法会在玩家手持物品右键时触发——没错,它不要求玩家必须选中某个非空气方块,只要右键就行,实际上它也先于onItemUseFirst和onItemUse触发。Minecraft本身只提供了修改右键物品的逻辑的该方法,那么如果我们想干涉左键逻辑怎么办?考虑监听这两个事件:PlayerInteractEvent.LeftClickBlock和PlayerInteractEvent.LeftClickEmpty,具体在监听时可以判断玩家的手持物品,再写入相关逻辑,即可。
- canHarvestBlock:返回一个布尔值,注意该方法有2个重载,其中一个是原版的,还有一个是Forge塞进来的,当然推荐使用后者。用于判断某个BlockState是否可以被该Item对应的某个ItemStack挖掘并产生掉落物,原版中该方法的实现很丑陋,全是面向结果编程的味道,且鉴于Forge patch的
Block#setHarvestLevel
这一方法的存在,一般你不该动这个方法,不过如果你想做出像剪刀那样比较特殊的挖掘、掉落效果,就可以覆写这个方法。 - onUpdate:这是一个比较重要的方法,它在游戏主循环中,每一tick都会被调用一次,也就是说理想状态下每秒钟内两个逻辑端各会调用该方法20次。因此如果我们覆写了该方法,便可以赋予相应的ItemStack一秒刷新20次的能力,我们利用它可以做出一些很高级的物品,例如计时器之类的东西。从该方法中我们可以拿到持有该ItemStack的实体(没错,Entity,甚至都非EntityLivingBase),以及“该物品是否被选中”(isSelected)。
- onEntityItemUpdate:决定当前ItemStack对应的EntityItem的刷新逻辑。
- onCreated:在该物品被合成出来后触发。
- getMaxItemUseDuration:用于指定物品被右键按住使用后,持续的最长时间——如右键弓后弓会逐渐拉伸至蓄满力状态,蓄满力后一段时间内,如果不松开右键,弓会一直紧绷着。注意这个方法的返回值是一个int值,单位实际上是tick。
- onPlayerStoppedUsing:配合着getMaxItemUseDuration使用的——即玩家松开右键后执行的游戏逻辑,原版的弓在这里即会召唤出一发箭矢实体(EntityArrow)。
- addInformation:@SideOnly(Side.CLIENT),用于给ItemStack添加tooltip,具体为向一个List<String>中添加新元素的过程,一般是搭配
I18n#format
实现,甚至我们可以通过当前ItemStack的附加NBT信息来决定添加的tooltip。 - hasEffect:@SideOnly(Side.CLIENT),用于决定该ItemStack是否有附魔光泽——没错,ItemStack有无附魔和有无附魔光泽的对应关系并不是写死的,只是Item类对该方法的默认实现即为:有附魔才有附魔光泽,你大可给你的Item子类在这里无脑返回一个true。
- getItemBurnTime:如果你想添加熔炉燃料,那么覆写这个方法即可。返回一个正整数,则默认它是一个熔炉燃料,且单位为tick;若返回0,则代表它不可燃;返回-1,则代表它的可燃状态交给原版Minecraft去决定。
- getIsRepairable:用于决定该ItemStack可被什么ItemStack修复。两个参数中,toRepair是被修复的,repair是修复材料。
对于高级方块,Block类下有如下常用方法值得覆写:
- isPassable:决定实体是否可以从该方块中穿过,参考原版的门方块,就不难理解了。
- isReplacable:决定该方块是否可以在其他方块被放置时取代——如果不能,则方块会被放置在该方块的侧面。如原版的液体方块和空气方块在这里返回true。
- neighborChanged:覆写该方法,即可自定义该种方块的周围发生方块更新时执行的游戏逻辑。一般有两个用途:1.激发红石信号,如观察者方块;2.触发对该方块的状态的合法性检验(这里的“状态”不仅仅包括BlockState,是一种抽象的概念),如悬空的沙子在周围有方块更新时会立刻下坠。
- breakBlock:在方块被破坏后触发,注意不限于被玩家破坏(如果想要限定被玩家破坏才执行逻辑,可以考虑覆写onBlockDestroyedByPlayer),但使用
World#setBlockState
替换该方块时,不会触发这个方法。 - onBlockActivated:玩家右键点击该方块后触发,注意两只手都会触发一次,所以最好先判定传入的EnumHand。原版的工作台和熔炉,在这里,就是让玩家打开相应的GUI界面。
- getStateForPlacement:上一节已经提到过,不再赘述。
- onBlockClicked:这个方法从MCP得到的名字可能会很有迷惑性,读者可能会以为它在左键、右键被按下时都会触发,实际上不对,只有左键点击它会触发该方法。
- onBlockPlacedBy:在某个生物实体放置该方块时被触发,注意不限于玩家,像末影人这种非玩家生物也可以。
- isFlammable、getFlammability等一系列方法:用于决定该方块是否可燃、燃烧能力等一系列和火方块相关的参数。按照Minecraft原版的设计,这些东西本来应该通过
BlockFire#setFireInfo
这个公开方法指定,不过经过Forge的patch后,我们便可以在Block类中覆写方法指定了。 - getDrops:得到该方块所有可能的掉落物(以一个NonNullList<ItemStack>的形式呈现),由于每破坏一次该种方块,该方法就会调用一次,所以在这里可以利用利用随机数。
- getExpDrop:得到该方块被采集时,掉落的经验量。
- isReplacableOreGen:决定:在区块生成的过程中,已经被生成的该种方块是否可以被矿石取代。