Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

[1.7.10] Adding Custom Villager trades to a new Villager


xchow
 Share

Recommended Posts

Recently in my mod I started working on a new villager and after doing so I could not figure out to assign new trades to this villager.

 

Registering the villager

VillagerRegistry.instance().registerVillageTradeHandler(i, new TradeHandler());}

        VillagerRegistry.instance().registerVillagerId(8);

        VillagerRegistry.instance().registerVillagerSkin(8, new ResourceLocation("chow", "textures/dealer.png"));

        VillagerRegistry.instance().getRegisteredVillagers();

 

In my trade handler for vanilla villagers it goes off case 0 for instance being the farmer. I thought that it being case 8 would represent the id 8 for the custom villager but it still doesn't work. Could anyone help me out with this please?

Link to comment
Share on other sites

First, you'll need to make a new class that extends IVillageTradeHandler.

In the constructor, add ItemStacks of the items you want it to trade to an ArrayList, then in the manipulateTradesForVillager method, have it make sure the villager is yours by using villager.getProfession() and your villager ID, then in a for loop use recipeList.addToListWithCheck to add new instances of MerchantRecipe to your villager's trade list.

 

Then, in your mod's main class, register the trade handler with VillageRegistry.instance().registerVillagerTradeHandler(villagerId, instanceOfTradeHandler);

Link to comment
Share on other sites

First, you'll need to make a new class that extends IVillageTradeHandler.

In the constructor, add ItemStacks of the items you want it to trade to an ArrayList, then in the manipulateTradesForVillager method, have it make sure the villager is yours by using villager.getProfession() and your villager ID, then in a for loop use recipeList.addToListWithCheck to add new instances of MerchantRecipe to your villager's trade list.

 

Then, in your mod's main class, register the trade handler with VillageRegistry.instance().registerVillagerTradeHandler(villagerId, instanceOfTradeHandler);

 

Thanks it worked. do you know how to make it spawn default in the village?

Link to comment
Share on other sites

Thanks it worked. do you know how to make it spawn default in the village?

 

To spawn in the Village, as far as I know, you can only do it with a custom house. If you already have a custom house, override the getVillagerType method in your house's class and make it return the id of your villager. if you don't, I suggest you look at some open source mods that add villager houses to get a feel of how to do it. (TConstruct helped me get mine)

Link to comment
Share on other sites

 

To spawn in the Village, as far as I know, you can only do it with a custom house. If you already have a custom house, override the getVillagerType method in your house's class and make it return the id of your villager. if you don't, I suggest you look at some open source mods that add villager houses to get a feel of how to do it. (TConstruct helped me get mine)

 

Could I make it spawn in a premade village building for example the normal house?

Link to comment
Share on other sites

If you don't want to add a custom structure to the village, an alternate (and pretty hacky) way of doing it is to hitch a ride on the regular villagers using EntityJoinWorldEvent.

 

Check if the event.entity.getClass().isAssignableFrom(EntityVillager.class) to make sure you only target vanilla villagers (and not every subclass thereof), then you could cast to EntityVillager and make sure the profession was vanilla as well, if that's important to you.

 

Then, so you don't spawn with every single villager, do a rand check like "if (event.entity.worldObj.rand.nextFloat() < 0.1F)" for 1 of your villagers per 10 regular, on average, and spawn one in at the same location as the other villager.

Link to comment
Share on other sites

If you don't want to add a custom structure to the village, an alternate (and pretty hacky) way of doing it is to hitch a ride on the regular villagers using EntityJoinWorldEvent.

 

Check if the event.entity.getClass().isAssignableFrom(EntityVillager.class) to make sure you only target vanilla villagers (and not every subclass thereof), then you could cast to EntityVillager and make sure the profession was vanilla as well, if that's important to you.

 

Then, so you don't spawn with every single villager, do a rand check like "if (event.entity.worldObj.rand.nextFloat() < 0.1F)" for 1 of your villagers per 10 regular, on average, and spawn one in at the same location as the other villager.

 

Well there was no entity class in it.

 

            VillagerRegistry.instance().registerVillagerId(8);

        VillagerRegistry.instance().registerVillagerSkin(8, new ResourceLocation("ruffles", "textures/dealer.png"));

        VillagerRegistry.instance().registerVillageTradeHandler(8, new TradeHandler());

        VillagerRegistry.instance().getRegisteredVillagers();

 

That was all needed to make the villager. Is there a way I could make it just spawn randomly around the world ? or would that require a entity class?

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



  • Recently Browsing

    No registered users viewing this page.

  • Posts

    • So this is probably something very difficult to accomplish, but is there a way to have chunks generate vertically in a certain dimension, as I have a vertical dungeon. Due to chunks only having an x and a y it has to do procedural generation, which I'm not very good at making efficiently, on every floor for every chunk, so it can lag a lot.
    • I'm trying to get the item meta of all the items if that helps. like the lore and stuff.
    • Hello. When i tried making another server but for another version i cant seem to find a mods folder. and making one doesn't help.
    • public abstract class NitroglycerinFluid extends ForgeFlowingFluid { // Directly reference a log4j logger. private static final Logger LOGGER = LogManager.getLogger(); protected NitroglycerinFluid(Properties properties) { super(properties); } public static Properties createProperties() { return new Properties(() -> ModFluids.NITROGLYCERIN, () -> ModFluids.FLOWING_NITROGLYCERIN, FluidAttributes.builder(new ResourceLocation("sussybakaplus:block/nitroglycerin_still"), new ResourceLocation("sussybakaplus:block/nitroglycerin_flow")).overlay(new ResourceLocation("sussybakaplus:block/nitroglycerin_overlay")).density(3000).viscosity(1000).luminosity(15).temperature(1300)).tickRate(1).canMultiply().bucket(() -> ModItems.NITROGLYCERIN_BUCKET).block(() -> ModBlocks.NITROGLYCERIN); } @Override public boolean isSource(FluidState state) { return false; } @Override public int getAmount(FluidState state) { return state.getValue(LEVEL); } public void animateTick(Level p_76445_, BlockPos p_76446_, FluidState p_76447_, Random p_76448_) { LOGGER.info("animate"); if (!p_76447_.isSource() && !p_76447_.getValue(FALLING)) { if (p_76448_.nextInt(64) == 0) { p_76445_.playLocalSound((double)p_76446_.getX() + 0.5D, (double)p_76446_.getY() + 0.5D, (double)p_76446_.getZ() + 0.5D, SoundEvents.WATER_AMBIENT, SoundSource.BLOCKS, p_76448_.nextFloat() * 0.25F + 0.75F, p_76448_.nextFloat() + 0.5F, false); } } else if (p_76448_.nextInt(10) == 0) { p_76445_.addParticle(ParticleTypes.UNDERWATER, (double)p_76446_.getX() + p_76448_.nextDouble(), (double)p_76446_.getY() + p_76448_.nextDouble(), (double)p_76446_.getZ() + p_76448_.nextDouble(), 0.0D, 0.0D, 0.0D); } } @Nullable public ParticleOptions getDripParticle() { return ParticleTypes.DRIPPING_WATER; } @Override protected void beforeDestroyingBlock(LevelAccessor accessor, BlockPos pos, BlockState state) { BlockEntity blockentity = state.hasBlockEntity() ? accessor.getBlockEntity(pos) : null; LOGGER.info("spread to " + state.getBlock().getRegistryName().toString()); if (state.getBlock().getRegistryName().getPath().equals("fire")) { float f = 4.0F; Minecraft.getInstance().level.explode(null, pos.getX(), pos.getY(), pos.getZ(), f, Explosion.BlockInteraction.BREAK); } //Block.dropResources(state, accessor, pos, blockentity); } @Override public void tick(Level level, BlockPos pos, FluidState state) { //super.tick(level, pos, state); LOGGER.info("tick"); if (this.hasBurningNeighbors(level, pos)) { LOGGER.info("EXPLODING!!!"); float f = 4.0F; level.explode(null, pos.getX(), pos.getY(), pos.getZ(), f, Explosion.BlockInteraction.BREAK); } else { LOGGER.info(pos.toShortString() + " doesn't have any buring neighbors"); } } private boolean hasBurningNeighbors(LevelReader levelReader, BlockPos pos) { for(Direction direction : Direction.values()) { if (this.isBurning(levelReader, pos.relative(direction))) { return true; } } return false; } private boolean isBurning(LevelReader levelReader, BlockPos pos) { return (pos.getY() < levelReader.getMinBuildHeight() || pos.getY() >= levelReader.getMaxBuildHeight() || levelReader.hasChunkAt(pos)) && levelReader.getBlockState(pos).isBurning(levelReader, pos); } protected float getExplosionResistance() { return 0.0F; } public int getTickDelay(LevelReader p_76226_) { return p_76226_.dimensionType().ultraWarm() ? 1 : 1; } protected boolean isRandomlyTicking() { return true; } public Optional<SoundEvent> getPickupSound() { return Optional.of(SoundEvents.BUCKET_FILL); } } My Fluid Class
  • Topics

  • Who's Online (See full list)

×
×
  • Create New...

Important Information

By using this site, you agree to our Privacy Policy.