首页 > 其他分享 >我的世界1.20.1模组开发---7.添加物品(进阶版)

我的世界1.20.1模组开发---7.添加物品(进阶版)

时间:2023-11-08 21:55:42浏览次数:36  
标签:pPlayer 进阶 Component --- literal pLevel 物品 1.20 public

介绍

  前面我们已经介绍过了如何添加我们mod的物品,单那些物品都只是一些用于合成的物品。例如我们的各种矿石、建筑方块等,这些物品只能用于合成或者装饰,这次我们就来添加一个具有实际功能的物品,比如一些模组里的魔法杖或者武器之类的。这些物品通过按下指定的按键会有其他的功能,功能我们可以自定义,要实现这种功能,我们需要在我们的item包下创建一个该物品的类,通过继承Item类并重写了里面的方法实现各种各样的功能。下面就来简单介绍一些Item类。

  Item类

  Item类用于表示游戏中的物品,可以用来设置物品的属性、特征等。这个类实现了一系列的接口,这些接口中定义了许多的方法,这些方法可以帮助我们获取一些该物品的信息,或者在指定的事件触发时执行该方法体。我们想触发某事件时执行某个方法时,我们只需要找到父类对应的回调方法并重写即可。下面介绍几个可能用到的方法。

//右键使用物品时触发
    @Override
    public InteractionResultHolder<ItemStack> use(Level pLevel, Player pPlayer, InteractionHand pUsedHand) {
        //主手右键
        if(!pLevel.isClientSide()&&pUsedHand==InteractionHand.MAIN_HAND){
            pPlayer.getCooldowns().addCooldown(this,50);//设置冷却时间
            pPlayer.sendSystemMessage(Component.literal("主手使用"));//向玩家发送一条信息
        }
        //副手右键
        if(!pLevel.isClientSide()&&pUsedHand==InteractionHand.OFF_HAND){
            pPlayer.getCooldowns().addCooldown(this,50);//设置冷却时间
            pPlayer.sendSystemMessage(Component.literal("副手使用"));//向玩家发送一条信息
        }
        return super.use(pLevel, pPlayer, pUsedHand);
    }

  父类中的use方法是当我们手持该物品右键时触发这个方法,从而执行方法体的内容。我们在自己的物品类里只需要重写这个方法,并添加自己的逻辑即可。这里我实现的功能就是当我们主手或副手手持该物品右键时,会向玩家发送一条信息提示我们是在主手使用的还是副手使用的物品。

  在use方法中有一个pLevel参数,我们可以用这个参数判断是在服务端还是客户端,use方法执行是客户端和服务器端都会执行,所以我们右键一次会收到2条消息。所以设置了只在服务器端执行。其实游戏分为客户端和服务器端,一般服务器端用于处理游戏的一些规则和逻辑(玩家之间的互动,交流等),客户端用于处理本地的事件(玩家与环境之间的交互)等。现阶段先不用纠结这些事情,以后会详细介绍一下的(等我搞明白之后x.x)。

    //当物品被玩家丢出时触发
    @Override
    public boolean onDroppedByPlayer(ItemStack item, Player player) {
        player.sendSystemMessage(Component.literal("我被丢弃了"));
        return super.onDroppedByPlayer(item, player);
    }

  onDroppedByPlayer方法是该物品被玩家丢出时触发的,这里我们设置的是玩家丢出该物品后向玩家发送一条“我被丢弃了”的信息。

  通过上面两个例子应该能很好的说明了怎么通过重写父类的方法实现我们自己的功能等等,下面就开始具体上代码。

代码

  我们在item包下再创建一个custom包,用于放我们有特殊功能的物品,在custom包下创建一个EightBalltem类,这个类是我们的有特殊功能的类,该类要继承Item类,之后再根据我们想实现的功能,重写父类对应的方法即可。

 

public class EightBallItem extends Item {
    public EightBallItem(Properties pProperties) {
        super(pProperties);
    }

    //物品右键使用
    @Override
    public InteractionResultHolder<ItemStack> use(Level pLevel, Player pPlayer, InteractionHand pUsedHand) {
        if(!pLevel.isClientSide()&&pUsedHand==InteractionHand.MAIN_HAND){
            ouputRandomNumber(pPlayer);
            pPlayer.getCooldowns().addCooldown(this,50);//设置冷却时间
            pPlayer.sendSystemMessage(Component.literal("主手使用"));
        }

        if(!pLevel.isClientSide()&&pUsedHand==InteractionHand.OFF_HAND){
            ouputRandomNumber(pPlayer);
            pPlayer.getCooldowns().addCooldown(this,50);//设置冷却时间
            pPlayer.sendSystemMessage(Component.literal("副手使用"));
        }
        return super.use(pLevel, pPlayer, pUsedHand);
    }

    //当物品被玩家丢出时触发
    @Override
    public boolean onDroppedByPlayer(ItemStack item, Player player) {
        player.sendSystemMessage(Component.literal("我被丢弃了"));
        return super.onDroppedByPlayer(item, player);
    }

    //鼠标经过物品时显示文字,按下shift键后显示另一行提示文字
    @Override
    public void appendHoverText(ItemStack pStack, @Nullable Level pLevel, List<Component> pTooltipComponents, TooltipFlag pIsAdvanced) {
        if(Screen.hasShiftDown()){//按下shift键
            //按下shift键显示的信息,字体设置为白色
            pTooltipComponents.add(Component.literal("right click to get a random number of 0-7").withStyle(ChatFormatting.BLUE));
        }
        else{
            //鼠标经过时的信息,字体设置为绿色
            pTooltipComponents.add(Component.literal("press shift to see more informant").withStyle(ChatFormatting.GREEN));
        }

        super.appendHoverText(pStack, pLevel, pTooltipComponents, pIsAdvanced);
    }
    
    //产生一个随机数发送给玩家
    public void ouputRandomNumber(Player player){
        player.sendSystemMessage(Component.literal("the number is "+Math.floor(Math.random()*8)));
    }
}

  这样我们的有特殊功能的物品类就写好了,之后再将该物品依次添加到物品注册表、、创造模式物品栏、语言文件生成器、贴图即可。

 在ModItems类添加物品到注册表

    //添加功能物品
    public static final RegistryObject<Item>EIGHTBALL=ITEMS.register("eight_ball",
            ()->new EightBallItem(new Item.Properties().stacksTo(1)));//最大堆叠数为1

  在ModCreativeModeTab类添加物品到创造模式物品栏

    public static final RegistryObject<CreativeModeTab>TEST1_TAB=CREATIVE_MODE_TABS.register("test1_tab",
            ()-> CreativeModeTab.builder()
                    .icon(()->new ItemStack(ModItems.YUANSHI.get()))//设置mod物品栏的图标
                    .title(Component.translatable(TEST1_TAB_STRING))//设置mod物品栏的标题
                    //开始向物品栏里添加我们新增的物品
                    .displayItems((pParameters, pOutput) -> {
                        //-----------------------------------
                        pOutput.accept(ModItems.EIGHTBALL.get());//这一行
                        //-----------------------------------
                    })
                    .build());//构建完成

   在ModLangGen类添加物品的语言文件

    @Override
    protected void addTranslations() {
        //物品
        //直接调用add方法,传入物品和物品对应的名字即可
        add(ModItems.EIGHTBALL.get(),"EightBall");

    }

  在对应位置放置贴图

  最后再执行RunData命令生成json文件即可进入游戏。

标签:pPlayer,进阶,Component,---,literal,pLevel,物品,1.20,public
From: https://www.cnblogs.com/xiaomingbook/p/17818428.html

相关文章

  • D - ABC Puzzle -- ATCODER ABC 326
    D-ABCPuzzlehttps://atcoder.jp/contests/abc326/tasks/abc326_dSampleInput1Copy5ABCBCACAABSampleOutput1CopyYesAC..B.BA.CC.BA.BA.C...CBA思路充分利用约束条件,构造算法,避免穷举所有情况,然后再根据约束条件判断情况的合法性。 如下代码,优......
  • vue2+antd 使用select 通过v-model 无法回显也不能修改?
    <template><a-tablesize="middle":data-source="dataList":pagination="false":locale="{emptyText:'暂无数据'}":scroll="{x:'max-content'}"><a-table-columntitle=......
  • 无涯教程-批处理 - Right String函数
    这用于从字符串末尾提取字符。RightString-示例@echooffsetstr=Thismessageneedschanged.echo%str%setstr=%str:~-8%echo%str%关于上述程序,需要注意的关键是,使用〜-"要提取的字符数"运算符来提取字符串的右边。上面的命令产生以下输出。Thismessagene......
  • [论文阅读] [SAGAN] Self-Attention Generative Adversarial Networks
    Self-AttentionGenerativeAdversarialNetworks(mlr.press)ZhangH,GoodfellowI,MetaxasD,etal.Self-attentiongenerativeadversarialnetworks[C]//Internationalconferenceonmachinelearning.PMLR,2019:7354-7363.引用:4501原作者代码:brain-research/self-......
  • Silt Dam--An Engineering Measure to Soil Erosion
    Whatissiltdam?Siltdam,referstothesoilerosionareaatalllevelsofditchesbuilttostopthemud,siltforthepurposeofsoilandwaterconservationengineeringmeasures. Howdoesitwork?SpecificpracticeisintheLoessPlateauregionoft......
  • 无涯教程-批处理 - Replace a String函数
    要将子字符串替换为另一个字符串,请使用字符串替换功能。ReplaceaString-示例@echooffsetstr=Thismessageneedschanged.echo%str%setstr=%str:needs=has%echo%str%关于上述程序,需要注意的关键是,该示例通过语句%str:needs=has%用字符串"has"替换了"needs"......
  • 2023-11-08:用go语言,字符串哈希原理和实现 比如p = 233, 也就是课上说的选择的质数进制
    2023-11-08:用go语言,字符串哈希原理和实现比如p=233,也就是课上说的选择的质数进制"31256..."01234hash[0]=3*p的0次方hash[1]=3*p的1次方+1*p的0次方hash[2]=3*p的2次方+1*p的1次方+2*p的0次方hash[3]=3*p的3次方+1*p的2次方+2*p......
  • Maven入门和进阶笔记
    一、Maven简介和快速入门1.1Maven介绍Maven是一款为Java项目构建管理、依赖管理的工具(软件),使用Maven可以自动化构建、测试、打包和发布项目,大大提高了开发效率和质量。Maven就是一个软件,掌握软件安装、配置、以及基本功能(项目构建、依赖管理)使用就是本课程的主要目标!1.2......
  • el-select实现全选功能 el-checkbox
    el-select实现全选功能el-checkbox文章分类 - vuevue开发el-select实现全选功能摘要:效果图依赖说明使用element-ui的el-select和el-option进行二次封装,故依赖element-ui功能介绍多选框支持选择全部新增【全部......
  • 1-visio studio2019使用
    1、visiostudio2019安装及使用1)下载地址:https://visualstudio.microsoft.com/zh-hans/vs/older-downloads/2)选择社区版进行下载3)安装环境:win10-X64①勾选使用C++桌面开发②除默认选项外,勾选适用于最新v142生产工具的C++MFC③勾选windows10SDK(10.0.17763.0)④自定义安......