首页 > 其他分享 >我的世界1.20.1模组开发---5.设置方块掉落物

我的世界1.20.1模组开发---5.设置方块掉落物

时间:2023-11-01 16:57:54浏览次数:30  
标签:掉落 模组 pBlock --- add 设置 1.20 我们 方块

介绍

  正如这这节的标题一样,这次我们来设置方块的破坏掉落物。比如草方块被破坏后可以掉落泥土、石头被挖掉后会掉落原石、红石框被挖掉后会掉落红石和经验等等。我们可以在我们的mod中为我们的方块或矿物设置破坏后掉落物。

VanillaBlockLoot类

  我们想要设置方块的掉落物表,需要在对应的json文件中设置,这里我们仍然采用自动生成的方式获取我们的json文件。我们创建的类需要继承VanillaBlockLoot类这个类也是继承了更上一层的父类,我们只需要继承这个类就行。这个类里面写了原版方块的掉落物设置,所以我们大部分代码只需要在原版代码的基础上进行修改即可。

  我们只需要重写父类的generate()方法和getKnownBlocks()方法即可,我们只需要在generate()方法体中调用父类提供的add()方法和dropSelf()方法,就能实现方块掉落物的添加。

   //1
    protected void add(Block pBlock, Function<Block, LootTable.Builder> pFactory) {
      this.add(pBlock, pFactory.apply(pBlock));
   }
    //2
   protected void add(Block pBlock, LootTable.Builder pBuilder) {
      this.map.put(pBlock.getLootTable(), pBuilder);
   }

  我们先到源码中看一下add()方法,我们调用的是第一个方法,第一个参数是我们的方块;第二个参数是一个函数,这个函数的参数是Block类型返回值是一个LootTable.Builder类型,我们直接写Lambda表达式即可。add()方法的意思就是给我们的方块设置一个掉落物,掉落物由第二个参数的返回值设置,至于第二个参数怎么写,我们将参考原版的写法,后面再介绍。

   protected void dropOther(Block pBlock, ItemLike pItem) {
      this.add(pBlock, this.createSingleItemTable(pItem));
   }


   protected void dropSelf(Block pBlock) {
      this.dropOther(pBlock, pBlock);
   }

dropSelf()方法是设置方块被挖掉后掉落自己的,例如圆石挖掉后掉落的还是圆石这样的方块。进入源码后可以看到dropSelf()方法调用了dropOther()方法,但是dropOther()里面还是调用了add()方法。我们给被挖掉后掉落自己的方块使用dropSelf()方法就行了。

代码

  我们首先在我们mod的datagen包下创建一个ModLootTableGen类,这个类要继承VanillaBlockLoot类,并重写generate()方法和getKnownBlocks()方法,通过调用dropSelf()方法和add()方法为我们的方块设置对应的掉落物。

  下面上代码

public class ModLootTableGen extends VanillaBlockLoot {

    @Override
    protected void generate() {
        //这个方块破坏后掉落自己
        dropSelf(ModBlocks.BLUE_BLOCK.get());
        //这个方块破坏后掉落对应的矿石
        add(ModBlocks.BLUE_ORE.get(),(pBlock)->{
            return createBlueOreDrops(pBlock);
        });
    }

    //add方法的第二个参数的返回值,大部分照原版的写就行,只需要修改注释地方的参数即可
    protected LootTable.Builder createBlueOreDrops(Block pBlock) {
        return createSilkTouchDispatchTable(pBlock, 
                this.applyExplosionDecay(pBlock, 
                        LootItem.lootTableItem(ModItems.YUANSHI.get())//设置我们要破坏方块后掉落的物品
                                .apply(SetItemCountFunction.setCount(UniformGenerator.between(4.0F, 5.0F)))//设置物品的掉落数量范围
                                .apply(ApplyBonusCount.addUniformBonusCount(Enchantments.BLOCK_FORTUNE))));//受时运效果影响
    }

    //照这样写就行
    @Override
    protected Iterable<Block> getKnownBlocks() {
        return ForgeRegistries.BLOCKS.getEntries().stream()
                .filter(e->e.getKey().location().getNamespace().equals(Test1Mod.MOD_ID))
                .map(Map.Entry::getValue)
                .collect(Collectors.toList());
    }
}

  我们设置的第二个方块是一个矿石方块,破坏后会掉落经验(创建方块时已经设置过了)和对应的矿物,第二个参数我们传入一个Lambda表达式返回值通过调用createBlueOreDrops()方法获得,这个方法我们可以直接模仿原版红石矿的写法,只需要修改掉落的物品和物品数量以及是否受时运影响等配置即可。

  这个类写完后,我们还需要在数据生成的主类DataGenerators类里面添加我们的设置方块掉落物的类,具体写法就是这样子的,暂时写不论为什么这样写,记住就行了x.x。

        generator.addProvider(event.includeServer(), new LootTableProvider(output, Collections.emptySet(),
                List.of(new LootTableProvider.SubProviderEntry(ModLootTableGen::new, LootContextParamSets.BLOCK))));

  最后后我们执行RunData命令,系统会在src/generated/resources/data/modid/loot_tables_blocks目录下自动生成相应的json文件,之后就可以进入游戏测试了。

  下面就是在游戏中我们添加掉落物的方块,左边是矿物,右边是对应的矿物合成的方块。按我们的设置,左边的方块破坏后会掉落对应的矿物,右边的则掉落自己,下面我们就用稿子测试一下。

  哇塞,真的掉落了对应的矿物和方块了,是不是很神奇呢。

 

标签:掉落,模组,pBlock,---,add,设置,1.20,我们,方块
From: https://www.cnblogs.com/xiaomingbook/p/17803501.html

相关文章

  • Django实战项目-学习任务系统-自定义URL拦截器
    接着上期代码框架,6个主要功能基本实现,剩下的就是细节点的完善优化了。首先增加URL拦截器,你不会希望没有登录用户就可以进入用户主页各种功能的,所以增加URL拦截器可以解决这个问题。Django框架本身也有URL拦截器,但是因为本系统用户模型跟Django框架本身用户模型不匹配,所以没有用,......
  • javaweb--Mapper代理开发
     1、使Mapper接口和SQL映射文件放置在同一文件夹下,可以在resources文件夹下新建一个和SQL映射文件相同的文件夹(例如:com/avb/Mapper)不能用.分割文件夹,用/ 2、把SQL映射表里的namespace属性为Mapper接口的全限定名 3、在Mapper中定义方法,方法名是SQL映射文件中sql语句的id,并......
  • Hbuilderx运行uni-app项目到Android Studio模拟器只显示“同步手机端程序文件完成”界
    如图,开发工具也显示同步文件,模拟器也显示同步文件完成,但是就是不展示页面,遇到这种情况,一般是2种情况,一个是项目本身有问题跑不起来,另一个就是创建的模拟器设备参数不支持当前app。一.连接真机调试,排除项目本身问题:如果连接真机都跑不起来,那么看下控制台日志,先解决项目本身的问......
  • docker-compose 部署 emqx
    创建数据目录#mkdirdatalogsetc数据目录授权#chown1000data/logs/etc/docker-compose.yamlversion:'3'services:emqx1:image:emqx:5.3.0container_name:emqxrestart:alwaysenvironment:-TZ=Asia/Shanghaihealthcheck:......
  • 简易版-软件定时器
    main.c#include<stdio.h>#include<stdlib.h>#include"sw_timer.h"#include"windows.h"/*runthisprogramusingtheconsolepauseroraddyourowngetch,system("pause")orinputloop*/voidtimer1(void*par......
  • vue 在模板/v-bind中使用方法methods 的问题
    每当渲染发生时,就会调用该方法并运行该函数。每次组件渲染时都会运行。模板中的函数调用会带来更大的性能成本。(相比computed)每次组件重新渲染时,vue模板中调用的函数都会执行。如果这些函数的计算成本很高,它们可能会降低应用程序的性能。你不希望这样,是吗?......
  • vxe-table树状表格的实现(v3.5.9)
    这段时间改造了一个报表,需要在之前的基础上添加一个分类的维度,之前的报表样子找不到了,应该是用a-table写的普通表格,现在前端表格统一转到vxe-table上去了,记录一下开发树形表格过程中的坑。<vxe-tableborderid="xTable1"ref="xTable1"class="xTable1":column-con......
  • 前端歌谣-第贰拾壹课-函数基础
    前言我是歌谣最好的种树是十年前其次是现在今天继续给大家带来的是函数基础环境配置npminit-yyarnaddvite-D修改page.json配置端口{"name":"demo1","version":"1.0.0","description":"","main":"index.js",&q......
  • 前端歌谣-第贰拾贰课-函数参数默认值
    前言我是歌谣最好的种树是十年前其次是现在今天继续给大家带来的是this指向的讲解环境配置npminit-yyarnaddvite-D修改page.json配置端口{"name":"demo1","version":"1.0.0","description":"","main":"index.js",......
  • Golang语言快速上手到综合实战-高并发聊天室、豆瓣电影爬虫
    Golang语言快速上手到综合实战-高并发聊天室、豆瓣电影爬虫我们公司需要快速迭代一款产品,当时,我们团队的后端框架是springmvc,该框架结构清晰,上手快,但是由于我们的产品迭代速度快,底层数据库操作接口变动频繁,导致service层工作量巨大,不胜其烦。另外,随着项目的成长,代码......