Hey! I was inspired by williewuss's primer to create a guide on what is changing in 1.16, from mostly a worldgen perspective. This guide is just an overview on what Mojang changed, not what Forge changed.
However, I know that not everyone makes worldgen mods so I'll also include a section on non-worldgen stuff.
For the Forge people, this guide uses Yarn names! You can find the conversion at the bottom.
If you have more info, feel free to contact me and I'll add it to this list.
Cheers, SuperCoder79
Last updated: 6/6/2020, 1.16-pre2
- There is now a new type of
Identifiercalled aRegistryKey, which is a mapping of a registry to anIdentifier. BlockandBlockStatehave been split into an abstract class and their implementation.BlockPosandBlockPos.Mutablehave been refactored quite a bit, andBlockPos.PooledMutablehas been deleted.- The advancement format has changed, there was a minecraft.net article about it a while ago (TODO add that here)
- Most uses for
Dynamic<?>for serialization has been replaced withCodec<?>. It's a pretty technical change so I'll have to make a bigger explanation on that eventually - Entity Attributes have been made much more generic than they were before, and they're now stored in a central location (needs more info).
- GUIs have been changed slightly to use the new rendering system with
MatrixStacks. - Gamerule stuff has been changed a little bit.
- There is now a new world interface! Yaaaaaaay! It's called
ServerWorldAccessand it's literally justWorldAccesswith agetSeed()function. That's it. LevelPropertieshas been given the world treatment, as they are now split into multiple interfaces.- Some AI stuff changed, noteably with the hoglins and piglins, as they use helper classes filled with static methods (great programming, i know) instead of the old AI system for certain things.
There have been a lot of worldgen changes. Basically, if you touched anything with worldgen you have work to do.
- The parameters for features have changed a bit, as they now take in a
ServerWorldAccessinstead of anWorldAccess/IWorldand the have a new field, for aStructureAccessor. - The
StructureAccessorparameter allows you to detect the structures in the current chunk. Vanilla uses this to stop lake generation in chunks with villages.
- Structure gen has recieved a pretty major overhaul, with them becoming more distinct from normal features. They don't even extend
Featureanymore! - Most of the user facing functions haven't changed much, but some of the legacy stuff like
getRadius()andgetName()has been removed. - Some stuff has been streamlined as well, such as the
shouldStartAtmethod, as it assumes that structure can fit in biome instead of needing an explicit check unless it's a massive structure (mansions and monuments) - Registration has also changed, as biomes now just set the structure with a
setStructurecall, using a wrapper class for configs. - Generally speaking, structure gen has been streamlined a bit.
- Tree generation has been changed.... again.
- Essentially, it's been flattened and split into
FoliagePlacers,TrunkPlacers, andFeatureSizes. - First, the tree's
FeatureSizechecks if it can spawn in a given position. TrunkPlacerss then generate the trunk and then generate places for leaves to generate throughTreeNodes.- For each
TreeNode, the tree'sFoliagePlacergenerates it's leaves. - If you have
FoliagePlacersfrom 1.15, my advice to you is to throw it out and rewrite it. Unless you're a tree gen god it's probably faster and easier that way.
- Nether Biomes! Yay!
- Biomes' water color and water fog color parameters have now been moved to a new class called
BiomeEffects, where you can now specify other things as well, such as particles, fog color, and sounds. - Fog color specified in the effects will only work in the Nether. It won't work in the Overworld.
- You can now have particles spawn in biomes, this works for both the nether and the overworld. You can make some cool stuff with this, like flying sand in desert biomes.
- Sounds can also be specified per biome, and you can specify 3 different sound types.
- Loop sounds are continously played when a player is in the biome (useful for ocean waves on beaches).
- Mood sounds are played when the player is in an area with 0 sky light and less than 7 light. Overworld biomes use the cave sounds as mood sounds while the nether biomes have their own unique variants.
- Additions sounds have a 1.1% chance to play every tick. The nether biomes use these to add to their atmosphere, but you can probably use them for other stuff in the overworld, like bird sounds or something.
- Now have a new field for
MixedNoisePoints, which are theoretical points on a 4d plane used for biome calculation in the Nether. I know that sounds really confusing but it's not that bad, keep reading to find out how they're used.
- Now have most of the location stuff built in, so you don't need to copy it from the overworld one anymore.
- The nether uses a new type of biome generator, which has 4 perlin noise generators calculating the values for each plane. The biome with the closest
MixedNoisePointto the calculated value is the chosen biome. - For reference, this is how the Alpha and Beta biome generation used to work, but instead of temperature and rainfall there are now 4 values.
- This does come with a lot of caveats however: if two biomes use the same
MixedNoisePoint, one of them will be overwritten. In addition, every biome added to the nether makes everything smaller - so nether biome mod incompatibility may become a real problem. - For the record, this generation is NOT 3D!!!! It's 2D generation that is slightly magnified and distorted in a 3D fashion, so while certain bits of the nether are 3D, it only happens on biome edges.
SurfaceChunkGeneratorhas been completely refactored and made final. All of the data passed to it now is now controlled by data classes, making it much more limited.- If you want to keep vanilla's look and feel while doing more unique stuff, your only choice now is to copy the entire class.
- ChunkGenerators now need to implement a
getColumnSamplemethod, which returns aBlockView/IBlockReaderimplementation of all of the blocks in a given column, usually through aVerticalBlockSample. - This is needed for ruined portals as well as fossils to properly generate.
- Dimensions are gone. No, seriously. Dimensions have been replaced by a single
DimensionTypeclass, which has a constructor with booleans for stuff you can toggle. Anything else and you're gonna need mixin/forge hooks for stuff. - This is because of the 20w21a change with infinite dimensions available to map creators.
MCP Warning!
Identifier->ResourceLocationWorldAccess->IWorldLevelProperties->WorldInfoMatrixStack->PoseStackSurfaceChunkGenerator->NoiseChunkGeneratorBiomeSource->BiomeProvider