我们本次在模组中实现一个自定义村民并与其进行交易

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

1.1.19版本村民职业获取需要一个所谓的职业方块,所以我们要先准备一个方块给村民进行职业获取:

在BlockInit中增加一个职业方块:

BlockInit.java

public class BlockInit {//职业方块public static final Block STOVE = registerBlock("gashapon" ,new StoveBlock(FabricBlockSettings.copy(Blocks.IRON_BLOCK).strength(1.5F, 4.0F).requiresTool().nonOpaque()),ModMain.ITEMTAB);private static Block registerBlockWithoutBlockItem(String name, Block block) {return Registry.register(Registry.BLOCK, new Identifier(ModMain.MOD_ID, name), block);}private static Block registerBlock(String name, Block block, ItemGroup group) {registerBlockItem(name, block, group);return Registry.register(Registry.BLOCK, new Identifier(ModMain.MOD_ID, name), block);}private static Item registerBlockItem(String name, Block block, ItemGroup group) {return Registry.register(Registry.ITEM, new Identifier(ModMain.MOD_ID, name),new BlockItem(block, new FabricItemSettings().group(group)));}public static void registerModBlocks() {System.out.println("Registering Mod Blocks for " + ModMain.MOD_ID);}}

在资源包的data包中添加对该职业方块的tag标签:


acquirable_job_site.json

{"values": ["joyggd:gas_poi"]
}

2.在Init包中新建一个VillagerInit类:

VillagerInit.java

package net.joy187.joyggd.init;import com.google.common.collect.ImmutableSet;
import net.fabricmc.fabric.api.object.builder.v1.trade.TradeOfferHelper;
import net.fabricmc.fabric.api.object.builder.v1.villager.VillagerProfessionBuilder;
import net.fabricmc.fabric.api.object.builder.v1.world.poi.PointOfInterestHelper;
import net.joy187.joyggd.ModMain;
import net.minecraft.block.Block;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.sound.SoundEvents;
import net.minecraft.util.Identifier;
import net.minecraft.util.registry.Registry;
import net.minecraft.util.registry.RegistryKey;
import net.minecraft.village.TradeOffer;
import net.minecraft.village.VillagerProfession;
import net.minecraft.world.poi.PointOfInterestType;public class VillagerInit {//该村民对应的职业方块设定public static final PointOfInterestType GAS_POI = registerPOI("gas_poi", BlockInit.STOVE);//该村民的职业设定public static final VillagerProfession GAS_MASTER = registerProfession("gasmaster",RegistryKey.of(Registry.POINT_OF_INTEREST_TYPE_KEY, new Identifier(ModMain.MOD_ID, "gas_poi")));public static VillagerProfession registerProfession(String name, RegistryKey<PointOfInterestType> type) {return Registry.register(Registry.VILLAGER_PROFESSION, new Identifier(ModMain.MOD_ID, name),VillagerProfessionBuilder.create().id(new Identifier(ModMain.MOD_ID, name)).workstation(type).workSound(SoundEvents.ENTITY_VILLAGER_WORK_ARMORER).build());}public static PointOfInterestType registerPOI(String name, Block block) {return PointOfInterestHelper.register(new Identifier(ModMain.MOD_ID, name),1, 1, ImmutableSet.copyOf(block.getStateManager().getStates()));}public static void registerVillagers() {ModMain.LOGGER.debug("Registering Villagers for " + ModMain.MOD_ID);}//可以与该职业下的村民交易什么物品public static void registerTrades() {TradeOfferHelper.registerVillagerOffers(GAS_MASTER,1,factories -> {factories.add(((entity, random) -> new TradeOffer(new ItemStack(Items.EMERALD, 20),new ItemStack(BlockInit.STOVE2, 1),6, 2, 0.02f)));});TradeOfferHelper.registerVillagerOffers(GAS_MASTER,1,factories -> {factories.add(((entity, random) -> new TradeOffer(new ItemStack(Items.EMERALD, 10),new ItemStack(ItemInit.ASSASSIN, 1),6, 2, 0.02f)));});TradeOfferHelper.registerVillagerOffers(GAS_MASTER,2,factories -> {factories.add(((entity, random) -> new TradeOffer(new ItemStack(Items.EMERALD, 15),new ItemStack(ItemInit.DRESS, 1),6, 20, 0.02f)));});}
}

交易参数说明

registerVillagerOffers(职业,交易等级,交易详情factories)
factories.add(拿什么换,换到了什么,最大交易次数,交易一次得到的经验奖励,激怒村民后涨价幅度)

在项目主类中添加VillagerInit的注册:

ModMain.java

public class ModMain implements ModInitializer {public static final String MOD_ID = "joyggd";public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID);public static final ItemGroup ITEMTAB = FabricItemGroupBuilder.build(new Identifier(MOD_ID, "itemtab"), () -> new ItemStack(ItemInit.SHERIFF));@Overridepublic void onInitialize() {ModConfigs.registerConfigs();ItemInit.registerModItems();BlockInit.registerModBlocks();EffectInit.registerEffects();SoundInit.registerSounds();BlockEntityInit.registerAllBlockEntities();//添加这两个事件的注册VillagerInit.registerVillagers();VillagerInit.registerTrades();}
}

3.在资源包中添加职业名称:

en_us.json

  "entity.minecraft.villager.gasmaster": "Gashapon Man",

textures\entity\villager\profession中添加该职业村民的皮肤:

4.保存代码进行测试:

Minecraft 1.19.2 Fabric模组开发 13.自定义村民相关推荐

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

    我们本次使用NBT标签来实现一个生物传送工具: 演示效果 演示效果 演示效果 Q:什么是NBT标签? A:NBT标签代表着物体的许多特性.玩家可以利用NBT标签存储生物(品种.是否无敌).物品(伤害加 ...

  2. Minecraft 1.19.2 Fabric模组开发 03.动画生物实体

    我们本次尝试在1.19.2 Fabric中添加一个能够具有各种动画效果动作的生物实体. 效果展示 效果展示 效果展示 1.首先,为了实现这些动画效果,我们需要首先使用到一个模组:geckolib(下载 ...

  3. Minecraft 1.19.2 Fabric模组开发 02.物品栏+物品

    我们本次在Fabric下创建自己模组中的物品栏和物品. 1.在Java包中新建一个init包,在init包中新建一个物品注册类ItemInit用于注册所有物品: ItemInit.java packa ...

  4. Minecraft 1.19.2 Forge模组开发 12.自定义鞘翅

    本次我们在模组中实现一个可用于飞行的鞘翅. 1.首先参考3D动画盔甲的教程一.二步制作盔甲的模型.动画文件. 2.模型制作完成,接下来需要制作我们的盔甲类 在items包中新建armor包 -> ...

  5. Minecraft 1.19.2 Fabric模组开发 10.建筑生成

    我们本次尝试在Fabric 1.19.2中生成一个自定义的建筑. 效果展示 效果展示 效果展示 由于版本更新缘故,1.19的建筑生成将不涉及任何Java包的代码编写,只需要在数据包中对建筑生成进行自定 ...

  6. Minecraft 1.19.2 Forge模组开发 05.矿石生成

    我们本次尝试在主世界生成模组中自定义的矿石 1.由于1.19的版本出现了深板岩层的矿石,我们要在BlockInit类中声明一个矿石的两种岩层形态: BlockInit.java package com ...

  7. Minecraft 1.19.2 Forge模组开发 04.动画效果物品

    我们本次实现一个具有动画效果的物品,本次演示的模型代码均在文末给出 效果演示效果演示效果演示 首先,请确保你的开发包中引入了geckolib依赖,相关教程请参考:Minecraft 1.19.2 Fo ...

  8. Minecraft 1.19.2 Forge模组开发 10.3D动画盔甲

    Minecraft 1.16.5模组开发3D盔甲 Minecraft 1.12.2模组开发3D盔甲 Minecraft 1.18.2模组开发3D动画盔甲 我们本次在1.19.2的版本中实现具有动画效果 ...

  9. Minecraft 1.19.2 Forge模组开发 08.生物生成

    Minecraft 1.18.2 生物生成 我们今天尝试在1.19中生成模组中的生物 效果演示效果演示效果演示 1.在你的项目主类中的commonSetup方法中添加模组中生物的生成规则(可参考文末M ...

最新文章

  1. Android app动态加载
  2. 2021年4月19日 深圳头条后台开发实习面试(二面)(含总结)
  3. Practical Lessons from Predicting Clicks on Ads at Facebook (2014)论文阅读
  4. DIV+CSS中标签ul ol li dl dt dd用法
  5. Cuboid特征提取算法
  6. [体感游戏]关于体感游戏的一些思考(三) --- 射击
  7. java异步处理同步化_java 异步查询转同步多种实现方式:循环等待,CountDownLatch,Spring Even...
  8. spring cloud 路由
  9. matplotlib学习笔记.CookBook
  10. Java 结构体之 JavaStruct 使用教程一 初识 JavaStruct
  11. C#: Writing a CookieContainer to Disk and Loading Back In For Use
  12. mysql java safe model_被 MySQL sql_mode 深深伤害( 中 )
  13. Java框架之SpringMVC 05-拦截器-异常映射-Spring工作流程
  14. Spring源码之bean的加载(五)准备创建bean
  15. QQ 木子版 vs 现在的某些修改版
  16. Egret + TiledMap 快速上手
  17. handlersocket mysql,MySQL插件HandlerSocket
  18. Hibernate annotation配置方式的MappedBy使用详解
  19. 电路实验---全桥整流电路
  20. quicktime不能成功安装

热门文章

  1. Uniapp|image无法显示图片
  2. 计算机以太网,局域网,互联网,令牌网,ATM网络
  3. 当老师帮学生作弊的时候
  4. C#多线程顺序依赖执行控制
  5. 王者荣耀在android目录下的名字,王者荣耀名字空白代码怎么弄_名字空白代码设置方法...
  6. 【ESP32-IDF】04-2 存储-NVS
  7. 2022LOL微博杯模糊问题,1080p高清看微博杯the shy比赛直播
  8. 【持续更新】2006-2023历代AMD 服务器Instinct桌面显卡列表,Instinct显卡发布日期
  9. Matlab中的persistent变量
  10. 【VS开发】免费打工仔:一个完善的ActiveX Web控件教程