NeoForge-1.20.4Mod开发教程之战利品表

本篇教程参考为Flandre芙兰的NeoForge1.20.4Mod开发的视频,这篇教程是我边学边总结的,与其说是教程更像我的学习笔记,如有不清楚的地方,大家可以在评论区提问。在我力所能及的范围内,我都会解答的。

这里就不展示手写的json了,想要了解的可以去wiki查看或者去看制作数据包的教程,会提到各种战利品表的写法

我直接展示数据生成的写法,不过这里只涉及到了最简单的战利品表

创建ModBlockLootProvider类

public class ModBlockLootProvider extends BlockLootSubProvider {
 ​
     public static final Set<Block> BLOCKS = Set.of(//包含所有需要生成战利品表的自定义方块
         ModBlocks.RUBY_BLOCK.get()
    );
 ​
     public ModBlockLootProvider() {
         super(Collections.emptySet(), FeatureFlags.REGISTRY.allFlags());//Collections.emptySet()表示没有爆炸免疫方块列表(默认不传入额外设置),这个空集合是给父类用来判断方块爆炸后是否掉落的问题
    }
 ​
     @Override
     protected void generate() {
         this.dropSelf(ModBlocks.RUBY_BLOCK.get());//掉落自身,如果是矿石(比如矿石掉落原料、经验等),通常会用 add(...) 配合额外规则
    }
 ​
     @Override
     protected Iterable<Block> getKnownBlocks() {//返回所有已注册战利品表的方块,用此方法验证所有方块都已正确注册
         return BLOCKS;
    }
 }

 

创建ModLootTableProvider类

public class ModLootTableProvider extends LootTableProvider {
     public ModLootTableProvider(PackOutput output, Set<ResourceLocation> requiredTables, List<SubProviderEntry> subProviders) {
         super(output, requiredTables, subProviders);
    }
 }

这个类是一个 Loot Table 数据生成器提供者(Loot Table Provider)它本身不包含掉落逻辑,而是作为一个壳(容器)用来把具体的子生成器(比如 BlockLootSubProvider)组合起来传给数据生成系统

 

注册战利品表

event.getGenerator().addProvider(
                 event.includeServer(),
                (DataProvider.Factory<ModLootTableProvider>) pOutput -> new ModLootTableProvider(pOutput, Collections.emptySet(),
                     List.of(
                         new LootTableProvider.SubProviderEntry(ModBlockLootProvider::new, LootContextParamSets.BLOCK)//后面的参数表示它生成的是方块相关的掉落表
                ))
        );
参数 作用
pOutput 数据生成输出目录(生成的 JSON 文件会写到这里)
Collections.emptySet() 指定哪些 loot table 是必须生成的(这里没特意指定)
List.of(...) 一串子生成器(SubProviderEntry),负责具体生成不同类型的 loot 数据
© 版权声明
THE END
喜欢就支持一下吧
点赞2赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容