<?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.21.1%E6%A8%A1%E7%BB%84%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B%2F6.2.%E6%96%B9%E5%9D%97%E6%8E%89%E8%90%BD</id>
	<title>用户:MashKJo/1.21.1模组开发教程/6.2.方块掉落 - 版本历史</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.21.1%E6%A8%A1%E7%BB%84%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B%2F6.2.%E6%96%B9%E5%9D%97%E6%8E%89%E8%90%BD"/>
	<link rel="alternate" type="text/html" href="https://mcbbs.wiki/index.php?title=%E7%94%A8%E6%88%B7:MashKJo/1.21.1%E6%A8%A1%E7%BB%84%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B/6.2.%E6%96%B9%E5%9D%97%E6%8E%89%E8%90%BD&amp;action=history"/>
	<updated>2026-05-01T19:11:08Z</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.21.1%E6%A8%A1%E7%BB%84%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B/6.2.%E6%96%B9%E5%9D%97%E6%8E%89%E8%90%BD&amp;diff=55293&amp;oldid=prev</id>
		<title>MashKJo：​创建页面，内容为“== 方块的战利品表 == 你可能注意到了，你的新方块在生存模式下被挖掘，什么都不会掉落，这是因为该方块还没有对应的战利品表。  方块的战利品表位于路径&lt;code&gt;data/&lt;modid&gt;/loot_table/blocks&lt;/code&gt;下（没错，这下block又是复数形式了，Mojang一会用单数一会用复数着实让人火大），对于一般的方块，一般就是掉落它的物品形式，没啥特殊的，因此我们可以仿…”</title>
		<link rel="alternate" type="text/html" href="https://mcbbs.wiki/index.php?title=%E7%94%A8%E6%88%B7:MashKJo/1.21.1%E6%A8%A1%E7%BB%84%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B/6.2.%E6%96%B9%E5%9D%97%E6%8E%89%E8%90%BD&amp;diff=55293&amp;oldid=prev"/>
		<updated>2025-09-07T12:14:02Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“== 方块的战利品表 == 你可能注意到了，你的新方块在生存模式下被挖掘，什么都不会掉落，这是因为该方块还没有对应的战利品表。  方块的战利品表位于路径&amp;lt;code&amp;gt;data/&amp;lt;modid&amp;gt;/loot_table/blocks&amp;lt;/code&amp;gt;下（没错，这下block又是复数形式了，Mojang一会用单数一会用复数着实让人火大），对于一般的方块，一般就是掉落它的物品形式，没啥特殊的，因此我们可以仿…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== 方块的战利品表 ==&lt;br /&gt;
你可能注意到了，你的新方块在生存模式下被挖掘，什么都不会掉落，这是因为该方块还没有对应的战利品表。&lt;br /&gt;
&lt;br /&gt;
方块的战利品表位于路径&amp;lt;code&amp;gt;data/&amp;lt;modid&amp;gt;/loot_table/blocks&amp;lt;/code&amp;gt;下（没错，这下block又是复数形式了，Mojang一会用单数一会用复数着实让人火大），对于一般的方块，一般就是掉落它的物品形式，没啥特殊的，因此我们可以仿照原版的绝大多数方块战利品表写一个：&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;minecraft:block&amp;quot;,&lt;br /&gt;
  &amp;quot;pools&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;bonus_rolls&amp;quot;: 0.0,&lt;br /&gt;
      &amp;quot;conditions&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;condition&amp;quot;: &amp;quot;minecraft:survives_explosion&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;entries&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;type&amp;quot;: &amp;quot;minecraft:item&amp;quot;,&lt;br /&gt;
          &amp;quot;name&amp;quot;: &amp;quot;&amp;lt;modid&amp;gt;:&amp;lt;name&amp;gt;&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;rolls&amp;quot;: 1.0&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;random_sequence&amp;quot;: &amp;quot;&amp;lt;modid&amp;gt;:blocks/&amp;lt;name&amp;gt;&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== 数据生成 ===&lt;br /&gt;
战利品表对应的DataProvider是LootTableProvider，使用它并非要覆写方法，它的构造器接受List&amp;lt;LootTableProvider.SubProviderEntry&amp;gt;——没错，我们实际使用的是LootTableSubProvider，毕竟战利品表的类型有很多，有给方块掉落用的，还有给实体掉落用的，还有给箱子战利品生成用的，它们都是战利品表的“子”（Sub）类型。&lt;br /&gt;
&lt;br /&gt;
我们要生成的是方块掉落战利品表，因此要用到的LootTableSubProvider实现类是BlockLootSubProvider：&lt;br /&gt;
&lt;br /&gt;
 public class MyBlockLootSubProvider extends BlockLootSubProvider {&lt;br /&gt;
    public MyBlockLootSubProvider(HolderLookup.Provider lookupProvider) {&lt;br /&gt;
        //第一个参数是Set&amp;lt;Item&amp;gt;，意为“能在爆炸中保存下来的物品类型”，这里我们填入一个空集合。&lt;br /&gt;
        super(Set.of(), FeatureFlags.DEFAULT_FLAGS, lookupProvider);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    //这个方法用于获取所有生成战利品表的方块，既然是给我们的模组datagen，这里不能填写BuiltInRegistries.BLOCK。&lt;br /&gt;
    @Override&lt;br /&gt;
    protected Iterable&amp;lt;Block&amp;gt; getKnownBlocks() {&lt;br /&gt;
        return MyBlockClass.BLOCKS.getEntries()&lt;br /&gt;
            .stream()&lt;br /&gt;
            .map(holder -&amp;gt; (Block)holder.value())&lt;br /&gt;
            .toList();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    @Override&lt;br /&gt;
    protected void generate() {&lt;br /&gt;
        //最简单的例子：掉落自身的物品形式&lt;br /&gt;
        dropSelf(MyBlockClass.DROP_SELF_BLOCK.get());&lt;br /&gt;
 &lt;br /&gt;
        //掉落别的物品。&lt;br /&gt;
        dropOther(MyBlockClass.DROP_OTHER_BLOCK.get(), Items.DIAMOND);&lt;br /&gt;
 &lt;br /&gt;
        //自定义复杂的战利品表。&lt;br /&gt;
        //第二个参数是Function&amp;lt;Block, LootTable.Builder&amp;gt;。&lt;br /&gt;
        add(MyBlockClass.BLOCK_WITH_COMPLEX_DROP.get(),&lt;br /&gt;
            block -&amp;gt; aCertainLootTableBuilder);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
然后就能在GatherDataEvent的监听器中添加LootTableProvider了：&lt;br /&gt;
&lt;br /&gt;
 //这里的LootParamSets.BLOCK是战利品上下文参数列表，由于生成的是方块掉落战利品表，因此填BLOCK，填其他的可能会出现缺失必要的战利品上下文参数的情况，导致runData失败。&lt;br /&gt;
 event.addProvider(new LootTableProvider(output, Set.of(), List.of(&lt;br /&gt;
    new LootTableProvider.SubProviderEntry(MyBlockLootSubProvider::new, LootParamSets.BLOCK)), lookupProvider));&lt;br /&gt;
&lt;br /&gt;
== 挖掘工具与挖掘等级 ==&lt;br /&gt;
Minecraft原版提供了4个与挖掘工具相关的方块标签：minecraft:mineable/axe、minecraft:mineable/hoe、minecraft:mineable/pickaxe和minecraft:mineable/shovel，分别代表方块在被斧头、锄头、镐头和铲子挖掘时挖掘速度会提高。如果你想要方块被特定种类的工具挖掘时才会掉落（即对应的战利品表才会生效），那么你需要在传入的BlockBehaviour.Properties中调用#requiresCorrectToolForDrops。&lt;br /&gt;
&lt;br /&gt;
在Minecraft 1.21中，挖掘等级也标签化了，例如，如果我想要让某方块至少被铁制工具挖掘才会掉落，则只需将方块加入标签minecraft:needs_iron_tool即可，读者可以自行查看原版的相关方块标签。&lt;br /&gt;
&lt;br /&gt;
== #getDrops ==&lt;br /&gt;
如果我想要更加动态的方块掉落，如依据方块状态，甚至破坏前方块持有的方块实体来决定掉落呢？一个方法是自己写一个符合自己需求的战利品表函数类型，但你如果不想考虑对数据包的兼容性，或者干脆就不想让数据包修改掉落，你可以直接覆写BlockBehaviour#getDrops：&lt;br /&gt;
&lt;br /&gt;
 @Override&lt;br /&gt;
 protected List&amp;lt;ItemStack&amp;gt; getDrops(BlockState state, LootParams.Builder builder) {&lt;br /&gt;
    //由这个LootParams.Builder，你可以获取到方块的位置，及该方块持有的方块实体（如果有的话）。&lt;br /&gt;
    ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== 修改已有方块的掉落物 ==&lt;br /&gt;
要修改已有方块的掉落物，战利品表覆盖就能做到这一点，但其兼容性毕竟等于没有，因此最好的方法是：&lt;br /&gt;
* 监听BlockDropsEvent&lt;br /&gt;
* 或者，应用NeoForge的全局战利品修饰符（Global Loot Modifier）到相应的方块战利品表&lt;/div&gt;</summary>
		<author><name>MashKJo</name></author>
	</entry>
</feed>