Jump to content

[1.9] Add biomes to world


JimiIT92

Recommended Posts

In 1.8 i used this to let a custom biome spawn in a world without making a new World Type

WorldChunkManager.allowedBiomes.add(AppleForest);

 

But in 1.9 i can't find the WorldChunkManager class. So how can i add a custom biome in the world? I'm using the Forge version 12.16.0.1767

Don't blame me if i always ask for your help. I just want to learn to be better :)

Link to comment
Share on other sites

WorldChunkManager

was renamed to

BiomeProvider

in 1.9.

 

BiomeProvider#allowedBiomes

doesn't control which biomes generate, it only controls which biomes can be used as the world spawn point.

 

To allow a biome to generate, call

BiomeManager.addBiome

. To allow a biome to used as the world spawn point, call

BiomeManager.addSpawnBiome

.

  • Like 1

Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.

Link to comment
Share on other sites

Thanks for the quick answer :) Also is there an easy way to check if a biome has generated in the world? Just to avoid the "exploring world for 20 minutes found nothing so create a new world and see if i find it"?

Don't blame me if i always ask for your help. I just want to learn to be better :)

Link to comment
Share on other sites

BiomeProvider#findBiomePosition will try to find the position of one of the specified biomes in a fixed range around the starting coordinates and return null if none was found. Note that this uses the biomes that would currently generate at each position rather than the biomes that have already generated at each position. This is an important distinction if the world was generated with a different set of biomes to those currently registered.

 

To check for biomes that have already generated, use World#getBiomeGenForCoordsBlockPos.getAllInBoxMutable can be used to create an Iterable<BlockPos> that iterates through every BlockPos between two positions.

Edited by Choonster
Fixed formatting errors caused by forum migration

Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.

Link to comment
Share on other sites

Thanks for the answer. After generating several worlds it looks like the biome isn't spawing, even if it have a really high weight. Maybe i'm wrong registering it, this is the class i'm using for that

package com.mineworld.core;

import com.mineworld.world.WorldGenMinableMW;
import com.mineworld.world.biomes.BiomeGenAppleForest;
import com.mojang.realmsclient.util.RealmsTasks.WorldCreationTask;

import net.minecraft.client.multiplayer.WorldClient;
import net.minecraft.world.WorldManager;
import net.minecraft.world.WorldProvider;
import net.minecraft.world.WorldSettings;
import net.minecraft.world.biome.BiomeGenBase;
import net.minecraft.world.biome.BiomeProvider;
import net.minecraft.world.gen.ChunkProviderSettings;
import net.minecraft.world.gen.feature.WorldGenerator;
import net.minecraftforge.common.BiomeDictionary;
import net.minecraftforge.common.BiomeDictionary.Type;
import net.minecraftforge.common.BiomeManager;
import net.minecraftforge.common.BiomeManager.BiomeType;
import net.minecraftforge.event.terraingen.ChunkGeneratorEvent;
import net.minecraftforge.event.terraingen.WorldTypeEvent;
import net.minecraftforge.event.world.WorldEvent;
import net.minecraftforge.fml.common.registry.GameRegistry;

public class MWWorld {

public static BiomeGenBase appleForest;

//Called by preInit
public static void addComponents() {
	appleForest = new BiomeGenAppleForest();
}

//Called by Init
public static void registerComponents() {

	BiomeDictionary.registerBiomeType(appleForest, Type.FOREST);
	BiomeManager.addSpawnBiome(appleForest);
}

//Called by postInit
public static void addBiomesToWorld() {
	BiomeManager.addBiome(BiomeType.WARM, new BiomeManager.BiomeEntry(appleForest,1000000000));

	BiomeProvider.allowedBiomes.add(appleForest);
}
}

 

And this is the biome class

package com.mineworld.world.biomes;

import java.util.Random;

import com.mineworld.world.gen.feature.WorldGenAppleTree;
import com.mineworld.world.gen.feature.WorldGenBigAppleTree;

import net.minecraft.block.BlockDoublePlant;
import net.minecraft.block.BlockFlower;
import net.minecraft.entity.passive.EntityRabbit;
import net.minecraft.entity.passive.EntityWolf;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.world.World;
import net.minecraft.world.biome.BiomeGenBase;
import net.minecraft.world.gen.feature.WorldGenAbstractTree;
import net.minecraft.world.gen.feature.WorldGenBigMushroom;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

public class BiomeGenAppleForest extends BiomeGenBase {
protected static final WorldGenAppleTree worldGenAppleTree = new WorldGenAppleTree(false);
protected static final WorldGenBigAppleTree worldGenBigAppleTree = new WorldGenBigAppleTree(false);

public BiomeGenAppleForest() {
	super(new BiomeProperties("Apple Forest"));
	this.theBiomeDecorator.treesPerChunk = 10;
	this.theBiomeDecorator.grassPerChunk = 2;
}

public WorldGenAbstractTree genBigTreeChance(Random rand) {
	return (WorldGenAbstractTree) ((rand.nextInt(10) == 0 ? worldGenBigAppleTree : worldGenAppleTree));
}

public void decorate(World worldIn, Random rand, BlockPos pos) {
	this.decorateBiome(worldIn, rand, pos);
	super.decorate(worldIn, rand, pos);
}

public void decorateBiome(World worldIn, Random rand, BlockPos pos) {
	for (int i = 0; i < 4; ++i) {
		for (int j = 0; j < 4; ++j) {
			int k = i * 4 + 1 + 8 + rand.nextInt(3);
			int l = j * 4 + 1 + 8 + rand.nextInt(3);
			BlockPos blockpos = worldIn.getHeight(pos.add(k, 0, l));

			WorldGenAbstractTree worldgenabstracttree = this.genBigTreeChance(rand);
			worldgenabstracttree.func_175904_e();

			if (worldgenabstracttree.generate(worldIn, rand, blockpos)) {
				worldgenabstracttree.func_180711_a(worldIn, rand, blockpos);

			}
		}
	}
}
}

 

Is there something wrong with this class? Because otherwise i can't undesrtand why a biome with that high probability of spawning doesn't spawn :/

Don't blame me if i always ask for your help. I just want to learn to be better :)

Link to comment
Share on other sites

You need to register your biome with

GameRegistry.register

in preInit, just like every other singleton class that implements

IForgeRegistryEntry

.

Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.

Link to comment
Share on other sites

If you're not using the latest version of Forge, update. Recent versions overhauled the registry system, adding the

GameRegistry.register

method to register any

IForgeRegistryEntry

object (e.g.

Block

,

Item

,

BiomeGenBase

).

  • Like 1

Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.

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.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
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.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • They were already updated, and just to double check I even did a cleanup and fresh update from that same page. I'm quite sure drivers are not the problem here. 
    • i tried downloading the drivers but it says no AMD graphics hardware has been detected    
    • Update your AMD/ATI drivers - get the drivers from their website - do not update via system  
    • As the title says i keep on crashing on forge 1.20.1 even without any mods downloaded, i have the latest drivers (nvidia) and vanilla minecraft works perfectly fine for me logs: https://pastebin.com/5UR01yG9
    • Hello everyone, I'm making this post to seek help for my modded block, It's a special block called FrozenBlock supposed to take the place of an old block, then after a set amount of ticks, it's supposed to revert its Block State, Entity, data... to the old block like this :  The problem I have is that the system breaks when handling multi blocks (I tried some fix but none of them worked) :  The bug I have identified is that the function "setOldBlockFields" in the item's "setFrozenBlock" function gets called once for the 1st block of multiblock getting frozen (as it should), but gets called a second time BEFORE creating the first FrozenBlock with the data of the 1st block, hence giving the same data to the two FrozenBlock :   Old Block Fields set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=head] BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@73681674 BlockEntityData : id:"minecraft:bed",x:3,y:-60,z:-6} Old Block Fields set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} Frozen Block Entity set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockPos{x=3, y=-60, z=-6} BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} Frozen Block Entity set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockPos{x=2, y=-60, z=-6} BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} here is the code inside my custom "freeze" item :    @Override     public @NotNull InteractionResult useOn(@NotNull UseOnContext pContext) {         if (!pContext.getLevel().isClientSide() && pContext.getHand() == InteractionHand.MAIN_HAND) {             BlockPos blockPos = pContext.getClickedPos();             BlockPos secondBlockPos = getMultiblockPos(blockPos, pContext.getLevel().getBlockState(blockPos));             if (secondBlockPos != null) {                 createFrozenBlock(pContext, secondBlockPos);             }             createFrozenBlock(pContext, blockPos);             return InteractionResult.SUCCESS;         }         return super.useOn(pContext);     }     public static void createFrozenBlock(UseOnContext pContext, BlockPos blockPos) {         BlockState oldState = pContext.getLevel().getBlockState(blockPos);         BlockEntity oldBlockEntity = oldState.hasBlockEntity() ? pContext.getLevel().getBlockEntity(blockPos) : null;         CompoundTag oldBlockEntityData = oldState.hasBlockEntity() ? oldBlockEntity.serializeNBT() : null;         if (oldBlockEntity != null) {             pContext.getLevel().removeBlockEntity(blockPos);         }         BlockState FrozenBlock = setFrozenBlock(oldState, oldBlockEntity, oldBlockEntityData);         pContext.getLevel().setBlockAndUpdate(blockPos, FrozenBlock);     }     public static BlockState setFrozenBlock(BlockState blockState, @Nullable BlockEntity blockEntity, @Nullable CompoundTag blockEntityData) {         BlockState FrozenBlock = BlockRegister.FROZEN_BLOCK.get().defaultBlockState();         ((FrozenBlock) FrozenBlock.getBlock()).setOldBlockFields(blockState, blockEntity, blockEntityData);         return FrozenBlock;     }  
  • Topics

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.