首页 > 其他分享 >我的世界1.20.1模组开发---10.添加自己的镐子、斧子、铲子和剑

我的世界1.20.1模组开发---10.添加自己的镐子、斧子、铲子和剑

时间:2023-11-26 17:55:06浏览次数:38  
标签:10 int public --- 材质 new 工具 1.20 我们

介绍

  之前介绍了如何添加自己的物品和有特殊功能的物品,都和Item类息息相关。之前我们新增特殊功能物品时,新建了一个专门的类,这个类继承了Item类,然后我们重写里面的方法就可以实现特殊的功能。原版中有很多种类的Item,比如一些挖掘类的工具、武器、装备等等,我们进入Item类中,使用快捷键CTRL+H(IDEA中),就可以看到所有项目中继承了Item类的类,我们如果想创建类似的物品,可以直接继承官方已经封装好的类再进行修改即可。我们主要介绍工具、武器、装备之类的常用到的物品的创建,这次先来介绍镐子、斧子、铲子和剑的创建。

  我们在开发中大部分写法都可以参考原版的写法,但首先我们需要知道去哪里才能找到这些东西。之前我们用到过Items类,这个类里面放了所有被注册过的原版的物品,类似的还要Blocks类,里面放了所有原版的方块。这里面的物品和方块就涵盖了所有我们会添加的类型的方块,就从这里一点一点往下查找就能知道具体怎么实现的了。我们先进入Items类中,搜索diamond关键字,查看钻石一套的工具和武器是怎么创建的。

  这里以钻石镐为例,我们可以看到是通过new一个PickaxeItem类创建的钻石镐,其他的也都一样,一步一步往下找可以发现他们都是继承的Item类,我们可以把这些类理解成官方封装好的类,我们直接继承并重写一些方法或者修改一下参数就能创建我们的工具和武器。

  这些物品的参数也都一样,含义也相同,这里就以PickaxeItem类的创建为例,介绍一下具体含义。

  我们需要传入四个参数,分别是工具的材质攻击伤害攻击速度物品属性

  我们只需要关键前三个属性即可,最后一个属性new一个空的属性使用默认值即可,其中攻击伤害攻击速度不难理解,我们传入数值即可,第一个工具材质属性才是我们关注的重点。

new PickaxeItem(Tiers.DIAMOND, 1, -2.8F, new Item.Properties()));

  我们想知道这是个什么东西,就需要进到Tiers类中看一下源码是什么,我们按住CTRL并把鼠标移到Tiers身上点击左键就能跳到这个东西里面看源码。

  可以看到这是一个枚举,里面是各种工具的材质,里面定义了各种属性:

  1. 挖掘等级决定了我们的工具可以破坏什么样的方块。
  2. 耐久度决定了工具的使用次数。
  3. 挖掘速度主要针对工具来说的,决定了工具破坏方块的速度,new 相应的工具类时传入的是攻击速度,不要把两个速度弄混了。
  4. 这个参数也是攻击伤害,准确来说一个是这个材质的基础攻击伤害(我进源码看了一下, 总攻击伤害 = 基础攻击伤害 + 我们传入的攻击伤害)。
  5. 最小附魔等级决定了这个材质的工具可以被附魔的最小等级。
  6. 修复材料指明了在铁砧中修复对应材质的工具所需要的原材料。

  好的,现在我们知道了创建一个自定义的工具类需要new一个对应的xxxItem类,并传入相应的材质和一些基础属性,如果我们想自定义工具的话,只能在工具的材质身上下手,所以我们就需要新建一个枚举并继承原版的Tiers,然后创建对应的工具时选择我们的材质即可。下面给出具体代码。

代码

   首先我们需要在我们的mod目录下新建一个tiers包,存放我们的材质,在这个包下新建ModItemTiers的枚举类型,并继承Tiers

public enum ModItemTiers implements Tier {
    //参数为挖掘等级(主要对挖掘工具用,对武器没什么影响)、      耐久度、        速度、          攻击伤害、         附魔等级(可接受的最高附魔等级)
    RED(3, 2000, 10.0F, 6.0F, 15, () -> {
        //返回的是需要的修复材料
        return Ingredient.of(ModItems.JIUCHANZHIYUAN.get());
    });

    private final int harvestLevel;
    private final int maxUses;
    private final float efficiency;
    private final float attackDamage;
    private final int enchantability;
    private final LazyLoadedValue<Ingredient> repairMaterial;

    ModItemTiers(int harvestLevel, int maxUses, float efficiency, float attackDamage, int enchantability, Supplier<Ingredient> repairMaterial) {
        this.harvestLevel = harvestLevel;
        this.maxUses = maxUses;
        this.efficiency = efficiency;
        this.attackDamage = attackDamage;
        this.enchantability = enchantability;
        this.repairMaterial = new LazyLoadedValue<>(repairMaterial);
    }

    @Override
    public int getUses() {
        return this.maxUses;
    }

    @Override
    public float getSpeed() {
        return this.efficiency;
    }

    @Override
    public float getAttackDamageBonus() {
        return this.attackDamage;
    }

    @Override
    public int getLevel() {
        return this.harvestLevel;
    }

    @Override
    public int getEnchantmentValue() {
        return this.enchantability;
    }

    @Override
    public Ingredient getRepairIngredient() {
        return this.repairMaterial.get();
    }
}

  设置好我们的材质之后,就可以在创建工具的时候使用这个材质了,接下来我们就到ModItems类下新建我们的工具(这里以稿子和剑为例),并且第一个参数选择我们的RED材质。

    //添加剑
    public static final RegistryObject<Item> REDSWORD =ITEMS.register("redsword",
            ()->new SwordItem(ModItemTiers.RED,3, -2.4F,new Item.Properties()));

    //添加稿子(用PickaxeItem类),自定义耐久等属性
    public static final RegistryObject<Item>RED_PICKAXE=ITEMS.register("red_pickaxe",
            ()->new PickaxeItem(ModItemTiers.RED,1, -2.8F, new Item.Properties()));

  然后就完成物品的添加了,之后就是老生常谈的把物品添加到创造模式物品栏、设置模型文件、设置语言文件、添加贴图等操作,这里不再过多演示,直接生成一下数据进入游戏即可。

  然后就可以看到我们的攻击伤害已经发生变化,测试一下也会发现耐久值也发生了变化。

标签:10,int,public,---,材质,new,工具,1.20,我们
From: https://www.cnblogs.com/xiaomingbook/p/17857608.html

相关文章

  • 2023-2024-1 20232407 《网络》 第三周学习内容
    教材学习内容总结教材学习中的问题和解决过程问题1:对于协议的理解不深问题1的解决方案:查找chatgpt基于AI的学习思考网络安全基础是指在实现信息化建设的过程中,保护计算机网络、通信网络、信息资源以及信息社会等安全的技术、管理和法律保障基础。在数字化时代,网络已经深......
  • XCTF-Web_php_unserialize
    访问查看是一道经典的反序列化题目,尝试解题,大概一下脚本,需要传入var进行反序列化php代码会先将var传入的值进行base64解码,然后进行perg_match()正则匹配判断,如果匹配成立就执行die()方法终止脚本运行使用unserialize()方法反序列化我们传入的值__wakeup()在反序列化时候执......
  • Linux三剑客-sed
    今天继续介绍Linux三剑客中的sedsed是streameditor(流编辑器)的缩写。它最常见的用法是进行文本替换。下面介绍一些sed的常见用法。sed最常见的功能,是用它进行文本替换。它的替换形式和vim非常相似,具体语法如下:$sed's/pattern/replace_string/'file其中pattern代表替换用......
  • 2023-2024-1 20232403 《网络》第1周学习总结
    2023-2024-120232403《网络空间安全导论》第3周学习总结安全攻击的分类及常见形式1.被动攻击被动攻击的特性是对所传信息进行窃听和监测。攻击者的目标是获得线路上所传输的信息。信息泄露和流量分析就是被动攻击的例子。其中流量攻击较为熟悉,本周学习使用的工具wireshark就......
  • 分布式锁-redis
    packageredis.clients.jedis;importjava.net.URI;importjavax.net.ssl.HostnameVerifier;importjavax.net.ssl.SSLParameters;importjavax.net.ssl.SSLSocketFactory;importorg.apache.commons.pool2.impl.GenericObjectPool;importorg.apache.commons.pool2.im......
  • 无涯教程-Linux - 条件判断
    在本章中,我们将了解Unix中的Shell判断语句。if...else语句case...esac语句if...else语句UnixShell支持以下形式的if…else语句-if...fi语句if...else...fi语句if...elif...else...fi语句CASE...ESAC声明您可以使用多个if...elif......
  • 2023-2024-1 20231405《计算机基础与程序设计》第九周学习总结
    2023-2024-120231405《计算机基础与程序设计》第九周学习总结作业信息作业属于哪个课程https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP作业要求在哪里https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP/homework/13009作业的目标自学《计算......
  • iwtgm-30
    题目链接A.解决题所花时间要小于总时间-路程时间解题所花时间为5n(n+1)/2voidsolve(){intn,k;cin>>n>>k;for(inti=1;i<=n;i++){inta=5*i*(i+1);intb=480-2*k;if(a>b){cout<<i-1;return;}}cout&l......
  • P1090 [NOIP2004 提高组] 合并果子
    原题链接题解每次从所有果子堆中选重量最小的两堆并累加,观察到只需要找出最小因此考虑用堆代码#include<bits/stdc++.h>usingnamespacestd;intpile[10005]={0};intlen=0;voidin(intx){pile[++len]=x;intnow=len;while(pile[now]<pile[now/2]......
  • 自定义的结构的内存问题-字节对齐
    字节对齐在写结构体时养成习惯,一定要按内存从小到大写,要不然在创建结构体的时候会导致创建的结构体明显的大。因为每创建一个结构体时,内存都需要对齐。一般都是1,4,8的整数倍//字符对齐时,字符可以和整数在一起,字符数组可以任意拆分。structA{ chara; //1+3 intb; //......