Minecraft 1.19.2 Fabric模组开发 07.自定义NBT标签

我们本次使用NBT标签来实现一个生物传送工具:

在这里插入图片描述

演示效果 演示效果 演示效果

Q:什么是NBT标签?

A:NBT标签代表着物体的许多特性。玩家可以利用NBT标签存储生物(品种、是否无敌)、物品(伤害加成、耐久)、方块(是否点燃、是否充能)的许多信息。

1.在Java包中新建一个util包,里面新建一个NBT工具类NBTHelper

NBTHelper.java

package net.joy187.joyggd.utils;

import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NbtCompound;

public class NBTHelper {
    
    //查看物品是否含有名为keyName的nbt
	public static boolean hasNbt(ItemStack itemStack, String keyName) {
		return !itemStack.isEmpty() && itemStack.getNbt() != null && itemStack.getNbt().contains(keyName);
	}
	
	private static void initCompoundNBT(ItemStack itemStack) {
		if (itemStack.getNbt() == null) {
			itemStack.setNbt(new NbtCompound());
		}
	}
    
    //得到物品一个名为keyName的nbt
	public static NbtCompound getNbt(ItemStack stack, String keyName) {
		initCompoundNBT(stack);

		if (!stack.getNbt().contains(keyName)) {
			putNbt(stack, keyName, new NbtCompound());
		}

		return stack.getNbt().getCompound(keyName);
	}

	public static void putNbt(ItemStack stack, String keyName, NbtCompound compound) {
		initCompoundNBT(stack);

		stack.getNbt().put(keyName, compound);
	}

	public static void removeNbt(ItemStack stack, String keyName) {
		if (stack.getNbt() != null) {
			stack.getNbt().remove(keyName);
		}
	}

}

2.之后我们新建一个物品,并用NBT存储一些信息:

ItemCounter.java

package net.joy187.joyggd.items;

import java.util.List;

import org.jetbrains.annotations.NotNull;

import net.joy187.joyggd.config.ModConfigs;
import net.joy187.joyggd.init.ItemInit;
import net.joy187.joyggd.utils.NBTHelper;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.item.TooltipContext;
import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.sound.SoundCategory;
import net.minecraft.sound.SoundEvents;
import net.minecraft.text.Text;
import net.minecraft.util.ActionResult;
import net.minecraft.util.Formatting;
import net.minecraft.util.Hand;
import net.minecraft.util.TypedActionResult;
import net.minecraft.world.World;

public class ItemCounter extends Item {

	public ItemCounter(Settings settings) {
		super(settings);
	}

    //右键使用物品
    @Override
    public TypedActionResult<ItemStack> use(World level, PlayerEntity playerIn, Hand hand) {
        ItemStack itemstack = playerIn.getMainHandStack();
        //如果使用后物品没有字段为"used"的nbt标签,就新建一个nbt
        if(!NBTHelper.hasNbt(itemstack,"used"))
        {
        	NbtCompound counter = new NbtCompound();
        	//在新建的nbt中将玩家的坐标x,y,z分别保留2位小数存入nbt标签中,同时增加一个标签"used"并标记为"1"
            counter.putString("x",String.format("%.2f", playerIn.getX()));
            counter.putString("y",String.format("%.2f", playerIn.getY()));
            counter.putString("z",String.format("%.2f", playerIn.getZ()));
            counter.putString("used","1");
            //将nbt标签与该物品绑定
            itemstack.setNbt(counter);
        }
        return TypedActionResult.success(itemstack);
    }
    
    //对着一个生物右键
    @Override
    public ActionResult useOnEntity(ItemStack stack, PlayerEntity playerIn, LivingEntity entity, Hand hand) {
    	ItemStack itemstack = playerIn.getMainHandStack();
    	//如果说该物品为我们的传送物品并且有"used"这个标签
    	if(itemstack.getItem() == ItemInit.COUNTER)
    	{
    		if(NBTHelper.hasNbt(itemstack,"used"))
    		{
    		    //就把该生物传送到该物品所记录的那个坐标去
    			entity.teleport(Double.parseDouble(itemstack.getNbt().getString("x")),
                        Double.parseDouble(itemstack.getNbt().getString("y")),
                        Double.parseDouble(itemstack.getNbt().getString("z")));
                //传送过后就把"used"这个标签给移除掉,方便下次使用
                itemstack.getNbt().remove("used");
    		}
    	}
    	
    	return ActionResult.SUCCESS;
	}

    //物品是否闪烁附魔效果
    @Override
    public boolean hasGlint(ItemStack itemstack) {
        return NBTHelper.hasNbt(itemstack,"used");
    }
    
    //添加物品信息
    @Override
    public void appendTooltip(ItemStack stack, World worldIn, List<Text> tooltip, TooltipContext flagIn) {


    }
    
	
}
在ItemInit中添加物品注册语句:

ItemInit.java

    public static final Item COUNTER = registerItem("counter",
    		new ItemCounter(new FabricItemSettings().group(ModMain.ITEMTAB).maxCount(1)));

3.在资源包中添加物品的名称、贴图、模型

物品名称

en_us.json

  "item.joyggd.counter":"C",
物品模型

counter.json

{
  "parent":"minecraft:item/generated",
  "textures":{
    "layer0":"joyggd:item/drool"
  }
}
物品贴图

在这里插入图片描述

4.启动游戏调试

通信相关 1.C#HttpHelper,Httpwebrequest,请求时无视编码,无视证书,无视Cookie,网页抓取 访问数据库相关 1.SqlHelper类 2.一个操作Sql2005数据库的类(备份,还原,分离,附加,添加删除用户等操作) 帮助类 1.最新的Functions 类 2.最新的 PageValidate 类 3.JavascriptHelp 4.最新的皮肤帮助类 UI_Misc_Helper JavaScript|Jquery相关 1.jQuery.cookie帮助类 访问系统相关 1.C#计算机信息类ComputerInfo 2.Api_Win32_Mac类工具包 3.在c#程序中放音乐的帮助类 GDI+相关,图像相关 1.生成缩略图的类文件SmallImage C#基础类库 1.Chart图形 Assistant创建显示图像的标签和文件 OWCChart统计图的封装类 2.Cookie&Session;&Cache;缓存帮助类 CacheHelper C#操作缓存的帮助类 CookieHelper C#操作Cookie的帮助类,添加,删除,修改,清理 SessionHelper C#关于Session的操作,获取,设置,删除 SessionHelper2 C#关于Session的一些高级操作,比如取对象,取数据等等 3.CSV文件转换 CsvHelper CSV文件导入DataTable和DataTable导出到Csv 4.DEncrypt 加密/解密帮助类 DEncrypt C# DEncrypt加密/解密帮助类 DESEncrypt Encrypt HashEncode MySecurity RSACryption 5.DLL COM.Excel.dll Excel.dll ICSharpCode.SharpZipLib.dll itextsharp.dll Microsoft.Office.Interop.Owc11.dll Microsoft.Web.UI.WebControls.dll OWC10Chart.dll 6.FTP操作类 FTPClient FTPHelper FTPOperater 7.JS操作类 JsHelper 8.JSON 转化类 ConvertJson List转成Json|对象转成Json|集合转成Json|DataSet转成Json|DataTable转成Json|DataReader转成Json等 9.Mime MediaTypes MimeEntity MimeHeaders MimeReader QuotedPrintableEncoding 10.PDF 转化类 PDFOperation 11.ResourceManager 操作类 AppMessage ResourceManager ResourceManagerWrapper Resources Sample.xml 12.XML操作类 XmlHelper XMLProcess 13.弹出消息类 MessageBox ShowMessageBox 14.导出Excel 操作类 DataToExcel ExcelHelper ExportExcel GridViewExport 15.分词辅助类 SegList 16.汉字转拼音 EcanConvertToCh PinYin 17.配置文件操作类 ConfigHelper 18.日历 CNDate 19.上传下载 DownLoadHelper FileDown FileUp UpLoadFiles 20.时间操作类 DateFormat TimeHelper TimeParser 21.视频转换类 VideoConvert 22.随机数类 BaseRandom RandomHelper RandomOperate 23.条形码 BarCodeToHTML 本类是个条码生成类,大家可根据需要自己设置,非常好用 24.图片 ImageClass ImageDown ImageUpload 25.网络 NetHelper 26.文件操作类 DirFile FileOperate INIFile 27.序列化 Serialize SerializeHelper 28.压缩解压缩 SharpZip 29.验证码 YZMHelper Captcha 验证码类,一个很个性的验证码类 30.页面辅助类 HTMLHelper UploadEventArgs JavaScriptPlus PageHelper 31.邮件 MailHelper MailPoper MailSender SmtpServerHelper 32.邮件2 ConnectCommand ConnectResponse DeleCommand ListCommand ListResponse MailHeaders MailMessageEx NoopCommand PassCommand Pop3Client Pop3Command Pop3Commands Pop3Exception Pop3ListItem Pop3Response Pop3Responses Pop3State QuitCommand RetrCommand RetrResponse RsetCommand Stat StatCommand StatResponse TopCommand UserCommand 33.正则表达式 RegexHelper 34.字符串 StringHelper 35.其它 BasePage BindDataControl ConvertHelper DataCache FormulaExpress GridViewHelper IpHelper MediaHandler PageValidate PicDeal QueryString Rmb StringPlus SysHelper Tools UrlOper Utility ValidateImg WebSitePathHelper
### 回答1: Minecraft Fabric模组开发是指使用Fabric API和Minecraft游戏的Java版本开发自定义模组的过程。Fabric是一种轻量级的模组API,它提供了一种简单的方式来创建和管理Minecraft模组开发者可以使用Java语言编写自己的模组,并通过Fabric API与Minecraft游戏进行交互。Fabric模组开发可以为玩家提供更多的游戏内容和功能,使游戏更加有趣和多样化。 ### 回答2: Minecraft Fabric是一个轻量级的模组平台,它与MinecraftJava版兼容。与其他模组平台相比,它具有更高的灵活性和自由度。因此,Fabric模组开发对于有一定编程知识的人来说是一个不错的选择。 首先,要开始Fabric模组开发,需要下载和安装Minecraft FabricJava开发工具包。然后,需要学习Java编程语言。如果你已经有了Java编程经验,那么你可以开始学习Fabric API,其提供的开发框架和API使你的开发更加容易上手。在这个过程中,你也可以参考Fabric官方文档和其他开发者的经验分享,尤其是那些已经开发出成功模组开发者学习他们的思路和技巧是非常重要的。 在进行开发的过程中,需要有一些基本的开发工具,比如开发IDE、代码管理工具和构建工具等,这些工具能够提高开发效率,让你更好地掌控开发进程。在具有一定的基础后,可以开发各种各样的模组,比如新方块,新物品,新生物和新机制等。其中,当你开发出一个好的模组后可以将其分享给其他玩家,在资源网站发布自己开发模组,也可以帮助广大玩家增加游戏的趣味性。 最后,Fabric模组开发需要耐心和热情,在掌握基础知识后,勇于尝试和不断的思考能够使你的模组更加优秀,同时也需要和其他开发者积极交流和分享,在大家的共同努力下,可以让我们的Minecraft更加完美。 ### 回答3: Minecraft Fabric模组开发是介于游戏基础和高级开发之间的活动,它结合了游戏玩法和软件编程技术。FabricMinecraft的一个轻量级模组库,通过将模组代码嵌入游戏的核心运行环境中,实现了游戏机制的修改和扩展。 在Fabric模组开发中,需要掌握Java编程语言以及各种API和工具。首先要学会使用Gradle进行项目管理以及构建模组,其次要熟悉Fabric API的各种类和方法,以及在游戏中使用的相关命令和配置文件的编写。此外,还需要了解模组的相关概念,包括模组结构和生命周期等。 在开发具体的模组时,需要有一定的创意和设计能力。例如,可以通过添加新的生物、方块、物品等来扩展游戏内容,或者修改游戏机制,实现新的游戏玩法。不过,在进行模组开发时,需要注意游戏的性能和稳定性,避免过多的资源消耗和崩溃等问题。 总之,Minecraft Fabric模组开发是一项高度具有创造性和技术性的活动,它让玩家可以更加深入地了解游戏机制,并且可以通过自己的努力创造出属于自己的独特游戏体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jay_fearless

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值