Minecraft 1.19.2 Fabric模组开发 13.自定义村民

创建了一个名为GashaponMan的新村民职业,使用自定义职业方块进行职业获取。在1.1.19版本中,配置了村民交易系统,包括不同级别的交易选项,如用绿宝石交换特定物品。同时,为新村民职业设计了皮肤并添加了英文名称。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

在这里插入图片描述

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

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标签:

poi.png
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));
	
	@Override
	public 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中添加该职业村民的皮肤:

vt.png

4.保存代码进行测试:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Jay_fearless

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

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

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

打赏作者

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

抵扣说明:

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

余额充值