<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://mcbbs.wiki/index.php?action=history&amp;feed=atom&amp;title=%E7%94%A8%E6%88%B7%3AMashKJo%2F1.12.2%E6%A8%A1%E7%BB%84%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B%2F12.%E9%AB%98%E7%BA%A7%E7%89%A9%E5%93%81%E5%92%8C%E6%96%B9%E5%9D%97_-_%E5%B8%B8%E7%94%A8%E7%9A%84%E5%BE%85%E8%A6%86%E5%86%99%E6%96%B9%E6%B3%95</id>
	<title>用户:MashKJo/1.12.2模组开发教程/12.高级物品和方块 - 常用的待覆写方法 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://mcbbs.wiki/index.php?action=history&amp;feed=atom&amp;title=%E7%94%A8%E6%88%B7%3AMashKJo%2F1.12.2%E6%A8%A1%E7%BB%84%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B%2F12.%E9%AB%98%E7%BA%A7%E7%89%A9%E5%93%81%E5%92%8C%E6%96%B9%E5%9D%97_-_%E5%B8%B8%E7%94%A8%E7%9A%84%E5%BE%85%E8%A6%86%E5%86%99%E6%96%B9%E6%B3%95"/>
	<link rel="alternate" type="text/html" href="https://mcbbs.wiki/index.php?title=%E7%94%A8%E6%88%B7:MashKJo/1.12.2%E6%A8%A1%E7%BB%84%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B/12.%E9%AB%98%E7%BA%A7%E7%89%A9%E5%93%81%E5%92%8C%E6%96%B9%E5%9D%97_-_%E5%B8%B8%E7%94%A8%E7%9A%84%E5%BE%85%E8%A6%86%E5%86%99%E6%96%B9%E6%B3%95&amp;action=history"/>
	<updated>2026-05-06T07:15:10Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.40.3</generator>
	<entry>
		<id>https://mcbbs.wiki/index.php?title=%E7%94%A8%E6%88%B7:MashKJo/1.12.2%E6%A8%A1%E7%BB%84%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B/12.%E9%AB%98%E7%BA%A7%E7%89%A9%E5%93%81%E5%92%8C%E6%96%B9%E5%9D%97_-_%E5%B8%B8%E7%94%A8%E7%9A%84%E5%BE%85%E8%A6%86%E5%86%99%E6%96%B9%E6%B3%95&amp;diff=55029&amp;oldid=prev</id>
		<title>MashKJo：​创建页面，内容为“对于高级物品，Item类有如下常用的方法值得覆写： * onItemUseFirst、onItemUse：在物品被玩家手持，且右键非空气方块时触发，均返回一个EnumActionResult，前者先于后者被触发。对于前者而言，返回EnumActionResult.PASS，则代表会继续执行原版的相关逻辑。 * onItemUseFinish：该方法和上述2个方法有所区别——该方法限定的实体并不仅仅是玩家（EntityPlayer）了，而…”</title>
		<link rel="alternate" type="text/html" href="https://mcbbs.wiki/index.php?title=%E7%94%A8%E6%88%B7:MashKJo/1.12.2%E6%A8%A1%E7%BB%84%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B/12.%E9%AB%98%E7%BA%A7%E7%89%A9%E5%93%81%E5%92%8C%E6%96%B9%E5%9D%97_-_%E5%B8%B8%E7%94%A8%E7%9A%84%E5%BE%85%E8%A6%86%E5%86%99%E6%96%B9%E6%B3%95&amp;diff=55029&amp;oldid=prev"/>
		<updated>2025-01-03T12:36:26Z</updated>

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