MCBBS Wiki欢迎您共同参与编辑!在参与编辑之前请先阅读Wiki方针

如果在编辑的过程中遇到了什么问题,可以去讨论板提问。

为了您能够无阻碍地参与编辑 未验证/绑定过邮箱的用户,请尽快绑定/验证

MCBBS Wiki GitHub群组已上线!

您可以在回声洞中发表吐槽!

服务器状态监控。点击进入

本站由MCBBS用户自行搭建,与MCBBS及东银河系漫游指南(北京)科技有限公司没有从属关系。点此了解 MCBBS Wiki 不是什么>>

用户:MashKJo/1.12.2模组开发教程/12.高级物品和方块 - 常用的待覆写方法

来自MCBBS Wiki
跳到导航 跳到搜索

对于高级物品,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:决定:在区块生成的过程中,已经被生成的该种方块是否可以被矿石取代。