diff --git a/.github/ISSUE_TEMPLATE/1-standalone-bug.md b/.github/ISSUE_TEMPLATE/1-standalone-bug.md
new file mode 100644
index 0000000000..6b80eec4cb
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/1-standalone-bug.md
@@ -0,0 +1,27 @@
+---
+name: 1.16.3 Standalone Bug
+about: For bugs that occur with Biomes O' Plenty for 1.16.3. We do not support older versions!
+title: ''
+labels: bug-minor
+assignees: ''
+
+---
+
+## Bug Report
+
+[ Lines between [ ] (square brackets) should be removed before posting. ]
+
+### What's the issue you encountered?
+
+[ Describe the issue in detail and what you were doing beforehand. ]
+
+### How can the issue be reproduced?
+
+[ Include a detailed step by step process for recreating your issue with only Biomes O' Plenty installed. ]
+
+### Logs
+
+[ Please include any relevant logs here. This can be done by dragging and dropping your log files into the issue. ]
+
+### Mod Version
+[ Please put the version of the mod you were using here. ]
diff --git a/.github/ISSUE_TEMPLATE/2-standalone-crash.md b/.github/ISSUE_TEMPLATE/2-standalone-crash.md
new file mode 100644
index 0000000000..3997419860
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/2-standalone-crash.md
@@ -0,0 +1,23 @@
+---
+name: 1.16.3 Standalone Crash
+about: For crashes that occur with Biomes O' Plenty for 1.16.3. We do not support older versions!
+title: ''
+labels: crash
+assignees: ''
+
+---
+
+## Bug Report
+
+[ Lines between [ ] (square brackets) should be removed before posting. ]
+
+### How can the crash be reproduced?
+
+[ Include a detailed step by step process for recreating your crash with only Biomes O' Plenty installed. ]
+
+### Crash Report and Logs
+
+[ Please include your crash report and logs here. This can be done by dragging and dropping your log files and crash report files into the issue. ]
+
+### Mod Version
+[ Please put the version of the mod you were using here. ]
diff --git a/.github/ISSUE_TEMPLATE/3-feature-request.md b/.github/ISSUE_TEMPLATE/3-feature-request.md
new file mode 100644
index 0000000000..b5a2f54a51
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/3-feature-request.md
@@ -0,0 +1,20 @@
+---
+name: 1.16.3 Feature Request
+about: Feature requests for Biomes O' Plenty for 1.16.3. We do not support older versions!
+title: ''
+labels: feature
+assignees: ''
+
+---
+
+## Feature Request
+
+[ Lines between [ ] (square brackets) should be removed before posting. ]
+
+### What feature are you suggesting?
+
+[ Provide an overview of the feature being suggested. ]
+
+### Why should it be added?
+
+[ Describe the benefits of implementing this feature. ]
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
new file mode 100644
index 0000000000..b87b036065
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -0,0 +1,5 @@
+blank_issues_enabled: false
+contact_links:
+ - name: Glitchfiend Discord
+ url: https://discord.gg/GyyzU6T
+ about: Please ask general questions here instead of opening issues for them.
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000..cbe4ebe3e8
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,28 @@
+/build/
+/bin/
+/out/
+/Mixin/
+/repo/
+/run/
+/logs/
+.idea/*
+/.gradle/
+/.settings/
+/.classpath
+/.project
+
+# OS generated files
+*.DS_Store
+
+# IntelliJ project files
+*.iml
+*.ipr
+*.iws
+
+*.launch
+mappings/.gradle/
+#mappings/mcp/
+mappings/build/
+mappings/*.csv
+mappings/.project
+mappings/last_updated.json
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/Jenkinsfile b/Jenkinsfile
new file mode 100644
index 0000000000..0fb0afa150
--- /dev/null
+++ b/Jenkinsfile
@@ -0,0 +1,60 @@
+@Library('forge-shared-library')_
+
+pipeline {
+ options {
+ disableConcurrentBuilds()
+ }
+ agent {
+ docker {
+ image 'gradle:jdk8'
+ args '-v forgegc:/home/gradle/.gradle/'
+ }
+ }
+ environment {
+ GRADLE_ARGS = '--no-daemon --console=plain' // No daemon for now as FG3 kinda derps. //'-Dorg.gradle.daemon.idletimeout=5000'
+ JENKINS_HEAD = 'https://wiki.jenkins-ci.org/download/attachments/2916393/headshot.png'
+ }
+
+ stages {
+ stage('fetch') {
+ steps {
+ checkout scm
+ }
+ }
+ stage('setup') {
+ steps {
+ withGradle {
+ sh './gradlew ${GRADLE_ARGS} --refresh-dependencies'
+ }
+ script {
+ env.MYVERSION = sh(returnStdout: true, script: './gradlew :properties -q | grep "^version:" | awk \'{print $2}\'').trim()
+ }
+ }
+ }
+ stage('changelog') {
+ when {
+ not {
+ changeRequest()
+ }
+ }
+ steps {
+ writeChangelog(currentBuild, "build/BiomesOPlenty-${env.MYVERSION}-changelog.txt")
+ }
+ }
+ stage('publish') {
+ when {
+ not {
+ changeRequest()
+ }
+ }
+ environment {
+ CURSE_API_KEY = credentials('curse-api-key')
+ }
+ steps {
+ withGradle {
+ sh './gradlew ${GRADLE_ARGS} :uploadArchives curseforge -PcurseApiKey=${CURSE_API_KEY}'
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/LICENSE.txt b/LICENSE.txt
new file mode 100644
index 0000000000..31b14f50c0
--- /dev/null
+++ b/LICENSE.txt
@@ -0,0 +1,325 @@
+Creative Commons Attribution-NonCommercial-NoDerivatives 4.0
+International Public License
+
+By exercising the Licensed Rights (defined below), You accept and agree
+to be bound by the terms and conditions of this Creative Commons
+Attribution-NonCommercial-NoDerivatives 4.0 International Public
+License ("Public License"). To the extent this Public License may be
+interpreted as a contract, You are granted the Licensed Rights in
+consideration of Your acceptance of these terms and conditions, and the
+Licensor grants You such rights in consideration of benefits the
+Licensor receives from making the Licensed Material available under
+these terms and conditions.
+
+
+Section 1 -- Definitions.
+
+ a. Adapted Material means material subject to Copyright and Similar
+ Rights that is derived from or based upon the Licensed Material
+ and in which the Licensed Material is translated, altered,
+ arranged, transformed, or otherwise modified in a manner requiring
+ permission under the Copyright and Similar Rights held by the
+ Licensor. For purposes of this Public License, where the Licensed
+ Material is a musical work, performance, or sound recording,
+ Adapted Material is always produced where the Licensed Material is
+ synched in timed relation with a moving image.
+
+ b. Copyright and Similar Rights means copyright and/or similar rights
+ closely related to copyright including, without limitation,
+ performance, broadcast, sound recording, and Sui Generis Database
+ Rights, without regard to how the rights are labeled or
+ categorized. For purposes of this Public License, the rights
+ specified in Section 2(b)(1)-(2) are not Copyright and Similar
+ Rights.
+
+ c. Effective Technological Measures means those measures that, in the
+ absence of proper authority, may not be circumvented under laws
+ fulfilling obligations under Article 11 of the WIPO Copyright
+ Treaty adopted on December 20, 1996, and/or similar international
+ agreements.
+
+ d. Exceptions and Limitations means fair use, fair dealing, and/or
+ any other exception or limitation to Copyright and Similar Rights
+ that applies to Your use of the Licensed Material.
+
+ e. Licensed Material means the artistic or literary work, database,
+ or other material to which the Licensor applied this Public
+ License.
+
+ f. Licensed Rights means the rights granted to You subject to the
+ terms and conditions of this Public License, which are limited to
+ all Copyright and Similar Rights that apply to Your use of the
+ Licensed Material and that the Licensor has authority to license.
+
+ g. Licensor means the individual(s) or entity(ies) granting rights
+ under this Public License.
+
+ h. NonCommercial means not primarily intended for or directed towards
+ commercial advantage or monetary compensation. For purposes of
+ this Public License, the exchange of the Licensed Material for
+ other material subject to Copyright and Similar Rights by digital
+ file-sharing or similar means is NonCommercial provided there is
+ no payment of monetary compensation in connection with the
+ exchange.
+
+ i. Share means to provide material to the public by any means or
+ process that requires permission under the Licensed Rights, such
+ as reproduction, public display, public performance, distribution,
+ dissemination, communication, or importation, and to make material
+ available to the public including in ways that members of the
+ public may access the material from a place and at a time
+ individually chosen by them.
+
+ j. Sui Generis Database Rights means rights other than copyright
+ resulting from Directive 96/9/EC of the European Parliament and of
+ the Council of 11 March 1996 on the legal protection of databases,
+ as amended and/or succeeded, as well as other essentially
+ equivalent rights anywhere in the world.
+
+ k. You means the individual or entity exercising the Licensed Rights
+ under this Public License. Your has a corresponding meaning.
+
+
+Section 2 -- Scope.
+
+ a. License grant.
+
+ 1. Subject to the terms and conditions of this Public License,
+ the Licensor hereby grants You a worldwide, royalty-free,
+ non-sublicensable, non-exclusive, irrevocable license to
+ exercise the Licensed Rights in the Licensed Material to:
+
+ a. reproduce and Share the Licensed Material, in whole or
+ in part, for NonCommercial purposes only; and
+
+ b. produce and reproduce, but not Share, Adapted Material
+ for NonCommercial purposes only.
+
+ 2. Exceptions and Limitations. For the avoidance of doubt, where
+ Exceptions and Limitations apply to Your use, this Public
+ License does not apply, and You do not need to comply with
+ its terms and conditions.
+
+ 3. Term. The term of this Public License is specified in Section
+ 6(a).
+
+ 4. Media and formats; technical modifications allowed. The
+ Licensor authorizes You to exercise the Licensed Rights in
+ all media and formats whether now known or hereafter created,
+ and to make technical modifications necessary to do so. The
+ Licensor waives and/or agrees not to assert any right or
+ authority to forbid You from making technical modifications
+ necessary to exercise the Licensed Rights, including
+ technical modifications necessary to circumvent Effective
+ Technological Measures. For purposes of this Public License,
+ simply making modifications authorized by this Section 2(a)
+ (4) never produces Adapted Material.
+
+ 5. Downstream recipients.
+
+ a. Offer from the Licensor -- Licensed Material. Every
+ recipient of the Licensed Material automatically
+ receives an offer from the Licensor to exercise the
+ Licensed Rights under the terms and conditions of this
+ Public License.
+
+ b. No downstream restrictions. You may not offer or impose
+ any additional or different terms or conditions on, or
+ apply any Effective Technological Measures to, the
+ Licensed Material if doing so restricts exercise of the
+ Licensed Rights by any recipient of the Licensed
+ Material.
+
+ 6. No endorsement. Nothing in this Public License constitutes or
+ may be construed as permission to assert or imply that You
+ are, or that Your use of the Licensed Material is, connected
+ with, or sponsored, endorsed, or granted official status by,
+ the Licensor or others designated to receive attribution as
+ provided in Section 3(a)(1)(A)(i).
+
+ b. Other rights.
+
+ 1. Moral rights, such as the right of integrity, are not
+ licensed under this Public License, nor are publicity,
+ privacy, and/or other similar personality rights; however, to
+ the extent possible, the Licensor waives and/or agrees not to
+ assert any such rights held by the Licensor to the limited
+ extent necessary to allow You to exercise the Licensed
+ Rights, but not otherwise.
+
+ 2. Patent and trademark rights are not licensed under this
+ Public License.
+
+ 3. To the extent possible, the Licensor waives any right to
+ collect royalties from You for the exercise of the Licensed
+ Rights, whether directly or through a collecting society
+ under any voluntary or waivable statutory or compulsory
+ licensing scheme. In all other cases the Licensor expressly
+ reserves any right to collect such royalties, including when
+ the Licensed Material is used other than for NonCommercial
+ purposes.
+
+
+Section 3 -- License Conditions.
+
+Your exercise of the Licensed Rights is expressly made subject to the
+following conditions.
+
+ a. Attribution.
+
+ 1. If You Share the Licensed Material, You must:
+
+ a. retain the following if it is supplied by the Licensor
+ with the Licensed Material:
+
+ i. identification of the creator(s) of the Licensed
+ Material and any others designated to receive
+ attribution, in any reasonable manner requested by
+ the Licensor (including by pseudonym if
+ designated);
+
+ ii. a copyright notice;
+
+ iii. a notice that refers to this Public License;
+
+ iv. a notice that refers to the disclaimer of
+ warranties;
+
+ v. a URI or hyperlink to the Licensed Material to the
+ extent reasonably practicable;
+
+ b. indicate if You modified the Licensed Material and
+ retain an indication of any previous modifications; and
+
+ c. indicate the Licensed Material is licensed under this
+ Public License, and include the text of, or the URI or
+ hyperlink to, this Public License.
+
+ For the avoidance of doubt, You do not have permission under
+ this Public License to Share Adapted Material.
+
+ 2. You may satisfy the conditions in Section 3(a)(1) in any
+ reasonable manner based on the medium, means, and context in
+ which You Share the Licensed Material. For example, it may be
+ reasonable to satisfy the conditions by providing a URI or
+ hyperlink to a resource that includes the required
+ information.
+
+ 3. If requested by the Licensor, You must remove any of the
+ information required by Section 3(a)(1)(A) to the extent
+ reasonably practicable.
+
+
+Section 4 -- Sui Generis Database Rights.
+
+Where the Licensed Rights include Sui Generis Database Rights that
+apply to Your use of the Licensed Material:
+
+ a. for the avoidance of doubt, Section 2(a)(1) grants You the right
+ to extract, reuse, reproduce, and Share all or a substantial
+ portion of the contents of the database for NonCommercial purposes
+ only and provided You do not Share Adapted Material;
+
+ b. if You include all or a substantial portion of the database
+ contents in a database in which You have Sui Generis Database
+ Rights, then the database in which You have Sui Generis Database
+ Rights (but not its individual contents) is Adapted Material; and
+
+ c. You must comply with the conditions in Section 3(a) if You Share
+ all or a substantial portion of the contents of the database.
+
+For the avoidance of doubt, this Section 4 supplements and does not
+replace Your obligations under this Public License where the Licensed
+Rights include other Copyright and Similar Rights.
+
+
+Section 5 -- Disclaimer of Warranties and Limitation of Liability.
+
+ a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
+ EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
+ AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
+ ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
+ IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
+ WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
+ PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
+ ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
+ KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
+ ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
+
+ b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
+ TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
+ NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
+ INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
+ COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
+ USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
+ ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
+ DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
+ IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
+
+ c. The disclaimer of warranties and limitation of liability provided
+ above shall be interpreted in a manner that, to the extent
+ possible, most closely approximates an absolute disclaimer and
+ waiver of all liability.
+
+
+Section 6 -- Term and Termination.
+
+ a. This Public License applies for the term of the Copyright and
+ Similar Rights licensed here. However, if You fail to comply with
+ this Public License, then Your rights under this Public License
+ terminate automatically.
+
+ b. Where Your right to use the Licensed Material has terminated under
+ Section 6(a), it reinstates:
+
+ 1. automatically as of the date the violation is cured, provided
+ it is cured within 30 days of Your discovery of the
+ violation; or
+
+ 2. upon express reinstatement by the Licensor.
+
+ For the avoidance of doubt, this Section 6(b) does not affect any
+ right the Licensor may have to seek remedies for Your violations
+ of this Public License.
+
+ c. For the avoidance of doubt, the Licensor may also offer the
+ Licensed Material under separate terms or conditions or stop
+ distributing the Licensed Material at any time; however, doing so
+ will not terminate this Public License.
+
+ d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
+ License.
+
+
+Section 7 -- Other Terms and Conditions.
+
+ a. The Licensor shall not be bound by any additional or different
+ terms or conditions communicated by You unless expressly agreed.
+
+ b. Any arrangements, understandings, or agreements regarding the
+ Licensed Material not stated herein are separate from and
+ independent of the terms and conditions of this Public License.
+
+
+Section 8 -- Interpretation.
+
+ a. For the avoidance of doubt, this Public License does not, and
+ shall not be interpreted to, reduce, limit, restrict, or impose
+ conditions on any use of the Licensed Material that could lawfully
+ be made without permission under this Public License.
+
+ b. To the extent possible, if any provision of this Public License is
+ deemed unenforceable, it shall be automatically reformed to the
+ minimum extent necessary to make it enforceable. If the provision
+ cannot be reformed, it shall be severed from this Public License
+ without affecting the enforceability of the remaining terms and
+ conditions.
+
+ c. No term or condition of this Public License will be waived and no
+ failure to comply consented to unless expressly agreed to by the
+ Licensor.
+
+ d. Nothing in this Public License constitutes or may be interpreted
+ as a limitation upon, or waiver of, any privileges and immunities
+ that apply to the Licensor or You, including from the legal
+ processes of any jurisdiction or authority.
\ No newline at end of file
diff --git a/README.md b/README.md
index a0ebdf1632..e362fac559 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,17 @@
-# BiomesOPlentyDev
\ No newline at end of file
+
+
+
+
+https://discord.gg/GyyzU6T
+
+**Biomes O' Plenty** is a **Minecraft mod** that adds **over 50 new biomes** to the Overworld, Nether, and End. From Lavender Fields to Redwood Forests and many more, all of our biomes are decorated with a variety of **new trees, flowers, and plants!**
+
+-----------------
+
+**Note:** To use the mod on a **server**, you must set the **level-type** setting in your server's config file to **biomesoplenty**
+
+-----------------
+
+ [](http://creativecommons.org/licenses/by-nc-nd/4.0/deed.en_US)
+
+Biomes O' Plenty is licensed under a [Creative Commons Attribution-NonCommercial-NoDerivs 4.0 Unported License](http://creativecommons.org/licenses/by-nc-nd/4.0/deed.en_US).
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000000..81e991dc09
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,188 @@
+buildscript {
+ repositories {
+ mavenLocal()
+ maven { url = 'https://files.minecraftforge.net/maven' }
+ jcenter()
+ mavenCentral()
+ }
+ dependencies {
+ classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '3.+', changing: true
+ }
+}
+
+plugins {
+ id "com.matthewprenger.cursegradle" version "1.4.0"
+}
+
+apply plugin: 'net.minecraftforge.gradle'
+apply plugin: 'eclipse'
+apply plugin: 'idea'
+apply plugin: 'maven'
+
+repositories { mavenLocal() }
+
+group = "com.github.glitchfiend.biomesoplenty"
+archivesBaseName = "BiomesOPlenty"
+
+def getGitHash = {
+ def stdout = new ByteArrayOutputStream()
+ exec {
+ commandLine 'git', 'rev-parse', '--short', 'HEAD'
+ standardOutput = stdout
+ }
+ return stdout.toString().trim()
+}
+
+version = "${minecraft_version}-${mod_version}.${System.getenv().BUILD_NUMBER}"
+
+minecraft {
+ mappings channel: 'official', version: minecraft_version
+
+ accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg')
+
+ runs {
+ client = {
+ workingDirectory = project.file("run").canonicalPath
+ source sourceSets.main
+ }
+ server = {
+ workingDirectory = project.file("run").canonicalPath
+ source sourceSets.main
+ }
+ }
+}
+
+processResources {
+ from (sourceSets.main.resources.srcDirs) {
+ include 'META-INF/mods.toml'
+ expand 'version': project.version
+ }
+}
+
+jar {
+ classifier = 'universal'
+}
+
+dependencies {
+ minecraft 'net.minecraftforge:forge:' + minecraft_version + '-' + forge_version
+}
+
+task sourcesJar(type: Jar) {
+ from sourceSets.main.allJava
+ from (sourceSets.main.output) {
+ include 'LICENSE.txt'
+ }
+
+ classifier = 'sources'
+}
+
+task deobfJar(type: Jar) {
+ from sourceSets.main.output
+ classifier = 'deobf'
+}
+
+task apiJar(type: Jar) {
+ from(sourceSets.main.allJava) {
+ include 'biomesoplenty/api/**'
+ }
+ from (sourceSets.main.output) {
+ include 'LICENSE.txt'
+ include 'biomesoplenty/api/**'
+ }
+
+ classifier = 'api'
+}
+
+def changelog_file = rootProject.file("build/BiomesOPlenty-${version}-changelog.txt")
+
+curseforge {
+ if (project.hasProperty('curseApiKey')) {
+ apiKey = project.getProperty('curseApiKey')
+ project {
+ id = '220318'
+
+ if (changelog_file.exists()) {
+ changelog = changelog_file
+ }
+
+ releaseType = 'beta'
+
+ mainArtifact(jar) {
+ displayName = "Biomes O' Plenty ${version}"
+ }
+ addArtifact sourcesJar
+ addArtifact deobfJar
+ addArtifact apiJar
+ }
+ }
+}
+
+artifacts {
+ if (changelog_file.exists()) {
+ archives changelog_file
+ }
+ archives jar
+ archives sourcesJar
+ archives deobfJar
+ archives apiJar
+}
+
+uploadArchives {
+ repositories {
+ mavenDeployer {
+ if (project.hasProperty('forgeMavenPassword')) {
+ repository(url: "https://files.minecraftforge.net/maven/manage/upload") {
+ authentication(userName: project.getProperty('forgeMavenUsername'), password: project.getProperty('forgeMavenPassword'))
+ }
+ }
+ else {
+ // local repo folder. Might wanna juset use gradle install if you wanans end it to maven-local
+ repository(url: 'file://localhost/' + project.file('repo').getAbsolutePath())
+ }
+
+ pom {
+ groupId = project.group
+ version = project.version
+ artifactId = project.archivesBaseName
+ project {
+ name project.archivesBaseName
+ packaging 'jar'
+ description 'Biomes O Plenty'
+ url 'https://github.com/Glitchfiend/BiomesOPlenty'
+
+ scm {
+ url 'https://github.com/Glitchfiend/BiomesOPlenty'
+ connection 'scm:git:git://github.com/Glitchfiend/BiomesOPlenty.git'
+ developerConnection 'scm:git:git@github.com:Glitchfiend/BiomesOPlenty.git'
+ }
+
+ issueManagement {
+ system 'github'
+ url 'https://github.com/Glitchfiend/BiomesOPlenty/issues'
+ }
+
+ licenses {
+ license {
+ name 'Creative Commons Attribution-NonCommercial-NoDerivs 4.0 International Public License'
+ url 'http://creativecommons.org/licenses/by-nc-nd/4.0/'
+ distribution 'repo'
+ }
+ }
+
+ developers {
+ developer {
+ id 'Adubbz'
+ name 'Adubbz'
+ roles { role 'developer' }
+ }
+ developer {
+ id 'Forstride'
+ name 'Forstride'
+ roles { role 'developer' }
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 0000000000..e6562e4b44
--- /dev/null
+++ b/gradle.properties
@@ -0,0 +1,12 @@
+# Sets default memory used for gradle commands. Can be overridden by user or command line properties.
+# This is required to provide enough memory for the Minecraft decompilation process.
+org.gradle.jvmargs=-Xmx3G
+org.gradle.daemon=false
+
+mod_version=13.1.0
+
+minecraft_version=1.16.5
+minecraft_version_toml=16
+forge_version=36.1.0
+forge_version_toml=36
+forge_group=net.minecraftforge
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000000..7a3265ee94
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000000..949819d28a
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-bin.zip
diff --git a/gradlew b/gradlew
new file mode 100644
index 0000000000..cbe9e0dc67
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,172 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+ cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000000..8a0b282aa6
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,90 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windowz variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+if "%@eval[2+2]" == "4" goto 4NT_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+goto execute
+
+:4NT_args
+@rem Get arguments from the 4NT Shell from JP Software
+set CMD_LINE_ARGS=%$
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/src/main/java/biomesoplenty/api/biome/BOPBiomes.java b/src/main/java/biomesoplenty/api/biome/BOPBiomes.java
new file mode 100644
index 0000000000..bc157e3261
--- /dev/null
+++ b/src/main/java/biomesoplenty/api/biome/BOPBiomes.java
@@ -0,0 +1,104 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.api.biome;
+
+import biomesoplenty.core.BiomesOPlenty;
+import net.minecraft.util.RegistryKey;
+import net.minecraft.util.ResourceLocation;
+import net.minecraft.util.registry.Registry;
+import net.minecraft.world.biome.Biome;
+
+public class BOPBiomes
+{
+ public static RegistryKey alps = register("alps");
+ public static RegistryKey alps_foothills = register("alps_foothills");
+ public static RegistryKey bamboo_blossom_grove = register("bamboo_blossom_grove");
+ public static RegistryKey bayou = register("bayou");
+ public static RegistryKey bayou_mangrove = register("bayou_mangrove");
+ public static RegistryKey burnt_forest = register("burnt_forest");
+ public static RegistryKey cherry_blossom_grove = register("cherry_blossom_grove");
+ public static RegistryKey cold_desert = register("cold_desert");
+ public static RegistryKey coniferous_forest = register("coniferous_forest");
+ public static RegistryKey coniferous_lakes = register("coniferous_lakes");
+ public static RegistryKey dead_forest = register("dead_forest");
+ public static RegistryKey deep_bayou = register("deep_bayou");
+ public static RegistryKey dense_marsh = register("dense_marsh");
+ public static RegistryKey dense_woodland = register("dense_woodland");
+ public static RegistryKey dryland = register("dryland");
+ public static RegistryKey dry_boneyard = register("dry_boneyard");
+ public static RegistryKey fir_clearing = register("fir_clearing");
+ public static RegistryKey flower_meadow = register("flower_meadow");
+ public static RegistryKey fungal_field = register("fungal_field");
+ public static RegistryKey fungal_jungle = register("fungal_jungle");
+ public static RegistryKey golden_prairie = register("golden_prairie");
+ public static RegistryKey grassland = register("grassland");
+ public static RegistryKey grassland_clover_patch = register("grassland_clover_patch");
+ public static RegistryKey gravel_beach = register("gravel_beach");
+ public static RegistryKey grove = register("grove");
+ public static RegistryKey grove_clearing = register("grove_clearing");
+ public static RegistryKey grove_lakes = register("grove_lakes");
+ public static RegistryKey highland = register("highland");
+ public static RegistryKey highland_crag = register("highland_crag");
+ public static RegistryKey highland_moor = register("highland_moor");
+ public static RegistryKey jade_cliffs = register("jade_cliffs");
+ public static RegistryKey lavender_field = register("lavender_field");
+ public static RegistryKey lavender_forest = register("lavender_forest");
+ public static RegistryKey lush_desert = register("lush_desert");
+ public static RegistryKey lush_savanna = register("lush_savanna");
+ public static RegistryKey marsh = register("marsh");
+ public static RegistryKey meadow = register("meadow");
+ public static RegistryKey meadow_forest = register("meadow_forest");
+ public static RegistryKey muskeg = register("muskeg");
+ public static RegistryKey mystic_grove = register("mystic_grove");
+ public static RegistryKey mystic_plains = register("mystic_plains");
+ public static RegistryKey ominous_woods = register("ominous_woods");
+ public static RegistryKey ominous_mire = register("ominous_mire");
+ public static RegistryKey orchard = register("orchard");
+ public static RegistryKey origin_valley = register("origin_valley");
+ public static RegistryKey prairie = register("prairie");
+ public static RegistryKey rainbow_hills = register("rainbow_hills");
+ public static RegistryKey rainforest = register("rainforest");
+ public static RegistryKey rainforest_cliffs = register("rainforest_cliffs");
+ public static RegistryKey rainforest_floodplain = register("rainforest_floodplain");
+ public static RegistryKey redwood_forest = register("redwood_forest");
+ public static RegistryKey redwood_forest_edge = register("redwood_forest_edge");
+ public static RegistryKey redwood_hills = register("redwood_hills");
+ public static RegistryKey scrubland = register("scrubland");
+ public static RegistryKey seasonal_forest = register("seasonal_forest");
+ public static RegistryKey seasonal_orchard = register("seasonal_orchard");
+ public static RegistryKey seasonal_pumpkin_patch = register("seasonal_pumpkin_patch");
+ public static RegistryKey shroomy_wetland = register("shroomy_wetland");
+ public static RegistryKey shrubland = register("shrubland");
+ public static RegistryKey shrubland_hills = register("shrubland_hills");
+ public static RegistryKey snowy_coniferous_forest = register("snowy_coniferous_forest");
+ public static RegistryKey snowy_fir_clearing = register("snowy_fir_clearing");
+ public static RegistryKey snowy_maple_forest = register("snowy_maple_forest");
+ public static RegistryKey tall_dead_forest = register("tall_dead_forest");
+ public static RegistryKey tropic_beach = register("tropic_beach");
+ public static RegistryKey tropics = register("tropics");
+ public static RegistryKey tundra = register("tundra");
+ public static RegistryKey tundra_basin = register("tundra_basin");
+ public static RegistryKey tundra_bog = register("tundra_bog");
+ public static RegistryKey volcanic_plains = register("volcanic_plains");
+ public static RegistryKey volcano = register("volcano");
+ public static RegistryKey wasteland = register("wasteland");
+ public static RegistryKey wetland = register("wetland");
+ public static RegistryKey wetland_forest = register("wetland_forest");
+ public static RegistryKey wooded_scrubland = register("wooded_scrubland");
+ public static RegistryKey woodland = register("woodland");
+
+ public static RegistryKey crystalline_chasm = register("crystalline_chasm");
+ public static RegistryKey undergrowth = register("undergrowth");
+ public static RegistryKey visceral_heap = register("visceral_heap");
+ public static RegistryKey withered_abyss = register("withered_abyss");
+
+ private static RegistryKey register(String name)
+ {
+ return RegistryKey.create(Registry.BIOME_REGISTRY, new ResourceLocation(BiomesOPlenty.MOD_ID, name));
+ }
+}
diff --git a/src/main/java/biomesoplenty/api/block/BOPBlocks.java b/src/main/java/biomesoplenty/api/block/BOPBlocks.java
new file mode 100644
index 0000000000..c5400635e4
--- /dev/null
+++ b/src/main/java/biomesoplenty/api/block/BOPBlocks.java
@@ -0,0 +1,346 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.api.block;
+
+import net.minecraft.block.Block;
+
+public class BOPBlocks
+{
+ public static Block white_sand;
+ public static Block white_sandstone;
+ public static Block cut_white_sandstone;
+ public static Block cut_white_sandstone_slab;
+ public static Block chiseled_white_sandstone;
+ public static Block smooth_white_sandstone;
+ public static Block smooth_white_sandstone_slab;
+ public static Block smooth_white_sandstone_stairs;
+ public static Block white_sandstone_slab;
+ public static Block white_sandstone_stairs;
+ public static Block white_sandstone_wall;
+
+ public static Block orange_sand;
+ public static Block orange_sandstone;
+ public static Block cut_orange_sandstone;
+ public static Block cut_orange_sandstone_slab;
+ public static Block chiseled_orange_sandstone;
+ public static Block smooth_orange_sandstone;
+ public static Block smooth_orange_sandstone_slab;
+ public static Block smooth_orange_sandstone_stairs;
+ public static Block orange_sandstone_slab;
+ public static Block orange_sandstone_stairs;
+ public static Block orange_sandstone_wall;
+
+ public static Block black_sand;
+ public static Block black_sandstone;
+ public static Block cut_black_sandstone;
+ public static Block cut_black_sandstone_slab;
+ public static Block chiseled_black_sandstone;
+ public static Block smooth_black_sandstone;
+ public static Block smooth_black_sandstone_slab;
+ public static Block smooth_black_sandstone_stairs;
+ public static Block black_sandstone_slab;
+ public static Block black_sandstone_stairs;
+ public static Block black_sandstone_wall;
+
+ public static Block mud;
+ public static Block mud_bricks;
+ public static Block mud_brick_slab;
+ public static Block mud_brick_stairs;
+ public static Block mud_brick_wall;
+
+ public static Block origin_grass_block;
+ public static Block dried_salt;
+ public static Block flesh;
+ public static Block nether_crystal_block;
+ public static Block nether_crystal;
+
+ public static Block toadstool_block;
+ public static Block glowshroom_block;
+
+ public static Block origin_sapling;
+ public static Block origin_leaves;
+ public static Block flowering_oak_sapling;
+ public static Block flowering_oak_leaves;
+ public static Block rainbow_birch_sapling;
+ public static Block rainbow_birch_leaves;
+ public static Block yellow_autumn_sapling;
+ public static Block yellow_autumn_leaves;
+ public static Block orange_autumn_sapling;
+ public static Block orange_autumn_leaves;
+ public static Block maple_sapling;
+ public static Block maple_leaves;
+
+ public static Block fir_sapling;
+ public static Block fir_leaves;
+ public static Block fir_log;
+ public static Block stripped_fir_log;
+ public static Block fir_wood;
+ public static Block stripped_fir_wood;
+ public static Block fir_planks;
+ public static Block fir_slab;
+ public static Block fir_stairs;
+ public static Block fir_fence;
+ public static Block fir_fence_gate;
+ public static Block fir_door;
+ public static Block fir_trapdoor;
+ public static Block fir_pressure_plate;
+ public static Block fir_button;
+ public static Block fir_sign;
+ public static Block fir_wall_sign;
+
+ public static Block redwood_sapling;
+ public static Block redwood_leaves;
+ public static Block redwood_log;
+ public static Block stripped_redwood_log;
+ public static Block redwood_wood;
+ public static Block stripped_redwood_wood;
+ public static Block redwood_planks;
+ public static Block redwood_slab;
+ public static Block redwood_stairs;
+ public static Block redwood_fence;
+ public static Block redwood_fence_gate;
+ public static Block redwood_door;
+ public static Block redwood_trapdoor;
+ public static Block redwood_pressure_plate;
+ public static Block redwood_button;
+ public static Block redwood_sign;
+ public static Block redwood_wall_sign;
+
+ public static Block white_cherry_sapling;
+ public static Block white_cherry_leaves;
+ public static Block pink_cherry_sapling;
+ public static Block pink_cherry_leaves;
+ public static Block cherry_log;
+ public static Block stripped_cherry_log;
+ public static Block cherry_wood;
+ public static Block stripped_cherry_wood;
+ public static Block cherry_planks;
+ public static Block cherry_slab;
+ public static Block cherry_stairs;
+ public static Block cherry_fence;
+ public static Block cherry_fence_gate;
+ public static Block cherry_door;
+ public static Block cherry_trapdoor;
+ public static Block cherry_pressure_plate;
+ public static Block cherry_button;
+ public static Block cherry_sign;
+ public static Block cherry_wall_sign;
+
+ public static Block mahogany_sapling;
+ public static Block mahogany_leaves;
+ public static Block mahogany_log;
+ public static Block stripped_mahogany_log;
+ public static Block mahogany_wood;
+ public static Block stripped_mahogany_wood;
+ public static Block mahogany_planks;
+ public static Block mahogany_slab;
+ public static Block mahogany_stairs;
+ public static Block mahogany_fence;
+ public static Block mahogany_fence_gate;
+ public static Block mahogany_door;
+ public static Block mahogany_trapdoor;
+ public static Block mahogany_pressure_plate;
+ public static Block mahogany_button;
+ public static Block mahogany_sign;
+ public static Block mahogany_wall_sign;
+
+ public static Block jacaranda_sapling;
+ public static Block jacaranda_leaves;
+ public static Block jacaranda_log;
+ public static Block stripped_jacaranda_log;
+ public static Block jacaranda_wood;
+ public static Block stripped_jacaranda_wood;
+ public static Block jacaranda_planks;
+ public static Block jacaranda_slab;
+ public static Block jacaranda_stairs;
+ public static Block jacaranda_fence;
+ public static Block jacaranda_fence_gate;
+ public static Block jacaranda_door;
+ public static Block jacaranda_trapdoor;
+ public static Block jacaranda_pressure_plate;
+ public static Block jacaranda_button;
+ public static Block jacaranda_sign;
+ public static Block jacaranda_wall_sign;
+
+ public static Block palm_sapling;
+ public static Block palm_leaves;
+ public static Block palm_log;
+ public static Block stripped_palm_log;
+ public static Block palm_wood;
+ public static Block stripped_palm_wood;
+ public static Block palm_planks;
+ public static Block palm_slab;
+ public static Block palm_stairs;
+ public static Block palm_fence;
+ public static Block palm_fence_gate;
+ public static Block palm_door;
+ public static Block palm_trapdoor;
+ public static Block palm_pressure_plate;
+ public static Block palm_button;
+ public static Block palm_sign;
+ public static Block palm_wall_sign;
+
+ public static Block willow_sapling;
+ public static Block willow_leaves;
+ public static Block willow_log;
+ public static Block stripped_willow_log;
+ public static Block willow_wood;
+ public static Block stripped_willow_wood;
+ public static Block willow_planks;
+ public static Block willow_slab;
+ public static Block willow_stairs;
+ public static Block willow_fence;
+ public static Block willow_fence_gate;
+ public static Block willow_door;
+ public static Block willow_trapdoor;
+ public static Block willow_pressure_plate;
+ public static Block willow_button;
+ public static Block willow_sign;
+ public static Block willow_wall_sign;
+
+ public static Block dead_sapling;
+ public static Block dead_leaves;
+ public static Block dead_log;
+ public static Block stripped_dead_log;
+ public static Block dead_wood;
+ public static Block stripped_dead_wood;
+ public static Block dead_planks;
+ public static Block dead_slab;
+ public static Block dead_stairs;
+ public static Block dead_fence;
+ public static Block dead_fence_gate;
+ public static Block dead_door;
+ public static Block dead_trapdoor;
+ public static Block dead_pressure_plate;
+ public static Block dead_button;
+ public static Block dead_sign;
+ public static Block dead_wall_sign;
+
+ public static Block magic_sapling;
+ public static Block magic_leaves;
+ public static Block magic_log;
+ public static Block stripped_magic_log;
+ public static Block magic_wood;
+ public static Block stripped_magic_wood;
+ public static Block magic_planks;
+ public static Block magic_slab;
+ public static Block magic_stairs;
+ public static Block magic_fence;
+ public static Block magic_fence_gate;
+ public static Block magic_door;
+ public static Block magic_trapdoor;
+ public static Block magic_pressure_plate;
+ public static Block magic_button;
+ public static Block magic_sign;
+ public static Block magic_wall_sign;
+
+ public static Block umbran_sapling;
+ public static Block umbran_leaves;
+ public static Block umbran_log;
+ public static Block stripped_umbran_log;
+ public static Block umbran_wood;
+ public static Block stripped_umbran_wood;
+ public static Block umbran_planks;
+ public static Block umbran_slab;
+ public static Block umbran_stairs;
+ public static Block umbran_fence;
+ public static Block umbran_fence_gate;
+ public static Block umbran_door;
+ public static Block umbran_trapdoor;
+ public static Block umbran_pressure_plate;
+ public static Block umbran_button;
+ public static Block umbran_sign;
+ public static Block umbran_wall_sign;
+
+ public static Block hellbark_sapling;
+ public static Block hellbark_leaves;
+ public static Block hellbark_log;
+ public static Block stripped_hellbark_log;
+ public static Block hellbark_wood;
+ public static Block stripped_hellbark_wood;
+ public static Block hellbark_planks;
+ public static Block hellbark_slab;
+ public static Block hellbark_stairs;
+ public static Block hellbark_fence;
+ public static Block hellbark_fence_gate;
+ public static Block hellbark_door;
+ public static Block hellbark_trapdoor;
+ public static Block hellbark_pressure_plate;
+ public static Block hellbark_button;
+ public static Block hellbark_sign;
+ public static Block hellbark_wall_sign;
+
+ public static Block rose;
+ public static Block violet;
+ public static Block lavender;
+ public static Block wildflower;
+ public static Block orange_cosmos;
+ public static Block pink_daffodil;
+ public static Block pink_hibiscus;
+ public static Block glowflower;
+ public static Block wilted_lily;
+ public static Block burning_blossom;
+
+ public static Block blue_hydrangea;
+ public static Block goldenrod;
+
+ public static Block willow_vine;
+ public static Block spanish_moss;
+ public static Block spanish_moss_plant;
+
+ public static Block sprout;
+ public static Block bush;
+ public static Block clover;
+ public static Block huge_clover_petal;
+ public static Block dune_grass;
+ public static Block desert_grass;
+ public static Block dead_grass;
+ public static Block cattail;
+ public static Block barley;
+ public static Block reed;
+ public static Block watergrass;
+ public static Block mangrove_root;
+ public static Block dead_branch;
+ public static Block bramble;
+
+ public static Block toadstool;
+ public static Block glowshroom;
+
+ public static Block potted_origin_sapling;
+ public static Block potted_flowering_oak_sapling;
+ public static Block potted_rainbow_birch_sapling;
+ public static Block potted_yellow_autumn_sapling;
+ public static Block potted_orange_autumn_sapling;
+ public static Block potted_maple_sapling;
+ public static Block potted_fir_sapling;
+ public static Block potted_redwood_sapling;
+ public static Block potted_white_cherry_sapling;
+ public static Block potted_pink_cherry_sapling;
+ public static Block potted_mahogany_sapling;
+ public static Block potted_jacaranda_sapling;
+ public static Block potted_palm_sapling;
+ public static Block potted_willow_sapling;
+ public static Block potted_dead_sapling;
+ public static Block potted_magic_sapling;
+ public static Block potted_umbran_sapling;
+ public static Block potted_hellbark_sapling;
+ public static Block potted_rose;
+ public static Block potted_violet;
+ public static Block potted_lavender;
+ public static Block potted_wildflower;
+ public static Block potted_orange_cosmos;
+ public static Block potted_pink_daffodil;
+ public static Block potted_pink_hibiscus;
+ public static Block potted_glowflower;
+ public static Block potted_wilted_lily;
+ public static Block potted_burning_blossom;
+ public static Block potted_sprout;
+ public static Block potted_clover;
+ public static Block potted_toadstool;
+ public static Block potted_glowshroom;
+}
diff --git a/src/main/java/biomesoplenty/api/entity/BOPEntities.java b/src/main/java/biomesoplenty/api/entity/BOPEntities.java
new file mode 100644
index 0000000000..b3ea10f31a
--- /dev/null
+++ b/src/main/java/biomesoplenty/api/entity/BOPEntities.java
@@ -0,0 +1,16 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.api.entity;
+
+import net.minecraft.entity.EntityType;
+import net.minecraft.entity.item.BoatEntity;
+
+public class BOPEntities
+{
+ public static EntityType extends BoatEntity> boat_bop;
+}
diff --git a/src/main/java/biomesoplenty/api/enums/BOPClimates.java b/src/main/java/biomesoplenty/api/enums/BOPClimates.java
new file mode 100644
index 0000000000..f18966812b
--- /dev/null
+++ b/src/main/java/biomesoplenty/api/enums/BOPClimates.java
@@ -0,0 +1,211 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.api.enums;
+
+import biomesoplenty.api.biome.BOPBiomes;
+import biomesoplenty.common.util.biome.BiomeUtil;
+import biomesoplenty.init.ModBiomes;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+import net.minecraft.util.RegistryKey;
+import net.minecraft.world.biome.Biome;
+import net.minecraft.world.biome.Biomes;
+import net.minecraft.world.gen.INoiseRandom;
+import net.minecraftforge.common.BiomeManager;
+import net.minecraftforge.common.BiomeManager.BiomeType;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+public enum BOPClimates
+{
+ ICE_CAP (BiomeType.ICY),
+ TUNDRA (BiomeType.ICY),
+ WET_BOREAL (BiomeType.COOL),
+ DRY_BOREAL (BiomeType.COOL),
+ WET_TEMPERATE (BiomeType.COOL),
+ DRY_TEMPERATE (BiomeType.WARM),
+ COOL_TEMPERATE (BiomeType.COOL),
+ WARM_TEMPERATE (BiomeType.WARM),
+ SUBTROPICAL (BiomeType.WARM),
+ TROPICAL (BiomeType.DESERT),
+ MEDITERRANEAN (BiomeType.WARM),
+ SAVANNA (BiomeType.DESERT),
+ HOT_DESERT (BiomeType.DESERT),
+ WASTELAND (null),
+ NETHER (null);
+
+ public final BiomeType biomeType;
+ private int totalBiomesWeight;
+ private int totalIslandBiomesWeight;
+
+ private ArrayList landBiomes = Lists.newArrayList();
+ private ArrayList islandBiomes = Lists.newArrayList();
+
+ BOPClimates(BiomeType biomeType)
+ {
+ this.biomeType = biomeType;
+ }
+
+ public BOPClimates addBiome(int weight, RegistryKey biome)
+ {
+ return this.addBiome(new WeightedBiomeEntry(weight, biome));
+ }
+
+ public BOPClimates addBiome(WeightedBiomeEntry biomeEntry)
+ {
+ this.totalBiomesWeight += biomeEntry.weight;
+ this.landBiomes.add(biomeEntry);
+ return this;
+ }
+
+ public BOPClimates addIslandBiome(int weight, RegistryKey biome)
+ {
+ return this.addIslandBiome(new WeightedBiomeEntry(weight, biome));
+ }
+
+ public BOPClimates addIslandBiome(WeightedBiomeEntry biomeEntry)
+ {
+ this.totalIslandBiomesWeight += biomeEntry.weight;
+ this.islandBiomes.add(biomeEntry);
+ return this;
+ }
+
+ public RegistryKey getRandomBiome(INoiseRandom context, RegistryKey fallback)
+ {
+ if (this.totalBiomesWeight == 0)
+ return fallback;
+
+ int weight = context.nextRandom(this.totalBiomesWeight);
+ Iterator iterator = this.landBiomes.iterator();
+ WeightedBiomeEntry item;
+ do
+ {
+ item = iterator.next();
+ weight -= item.weight;
+ }
+ while (weight >= 0);
+ return item.biome;
+ }
+
+ public RegistryKey getRandomIslandBiome(INoiseRandom context, RegistryKey fallback)
+ {
+ if (this.totalIslandBiomesWeight == 0)
+ return fallback;
+
+ int weight = context.nextRandom(this.totalIslandBiomesWeight);
+ Iterator iterator = this.islandBiomes.iterator();
+ WeightedBiomeEntry item;
+ do
+ {
+ item = iterator.next();
+ weight -= item.weight;
+ }
+ while (weight >= 0);
+ return item.biome;
+ }
+
+ public RegistryKey getRandomOceanBiome(INoiseRandom context, boolean deep)
+ {
+ return (deep ? Biomes.DEEP_OCEAN : Biomes.OCEAN);
+ }
+
+ public ImmutableList getLandBiomes()
+ {
+ return this.landBiomes.isEmpty() ? ImmutableList.of(this.getDefaultWeightedBiomeEntry()) : ImmutableList.copyOf(this.landBiomes);
+ }
+
+ public ImmutableList getIslandBiomes()
+ {
+ return this.islandBiomes.isEmpty() ? ImmutableList.of(this.getDefaultWeightedBiomeEntry()) : ImmutableList.copyOf(this.islandBiomes);
+ }
+
+ private WeightedBiomeEntry getDefaultWeightedBiomeEntry()
+ {
+ return new WeightedBiomeEntry(100, Biomes.OCEAN);
+ }
+
+ private static BOPClimates[] values = BOPClimates.values();
+
+ public static BOPClimates lookup(int i) {return values[i];}
+
+ // map temperature and rainfall to climates
+ // temperature values from 0 (cold) to 8 (hot) and rainfall values from 0 (wet) to 11 (dry), index is (temperatureValue * 12) + rainfallValue
+ // we will contrive to make any combination equally likely, so the overall rarity of each climate is in proportion to the number of times it appears in the array
+ private static final BOPClimates[] climateMapping = new BOPClimates[]
+ {
+ TUNDRA, TUNDRA, ICE_CAP, ICE_CAP, ICE_CAP, ICE_CAP, ICE_CAP, ICE_CAP, ICE_CAP, ICE_CAP, TUNDRA, TUNDRA,
+ WET_BOREAL, WET_BOREAL, TUNDRA, TUNDRA, TUNDRA, TUNDRA, TUNDRA, TUNDRA, TUNDRA, TUNDRA, DRY_BOREAL, DRY_BOREAL,
+ WET_BOREAL, WET_BOREAL, WET_BOREAL, WET_BOREAL, WET_BOREAL, WET_BOREAL, DRY_BOREAL, DRY_BOREAL, DRY_BOREAL, DRY_BOREAL, DRY_BOREAL, DRY_BOREAL,
+ WET_TEMPERATE, WET_TEMPERATE, WET_TEMPERATE, COOL_TEMPERATE, COOL_TEMPERATE, COOL_TEMPERATE, COOL_TEMPERATE, COOL_TEMPERATE, COOL_TEMPERATE, DRY_TEMPERATE, DRY_TEMPERATE, DRY_TEMPERATE,
+ WET_TEMPERATE, WET_TEMPERATE, WET_TEMPERATE, COOL_TEMPERATE, COOL_TEMPERATE, COOL_TEMPERATE, COOL_TEMPERATE, COOL_TEMPERATE, COOL_TEMPERATE, DRY_TEMPERATE, DRY_TEMPERATE, DRY_TEMPERATE,
+ SUBTROPICAL, SUBTROPICAL, WET_TEMPERATE, WARM_TEMPERATE, WARM_TEMPERATE, WARM_TEMPERATE, WARM_TEMPERATE, WARM_TEMPERATE, WARM_TEMPERATE, DRY_TEMPERATE, SAVANNA, SAVANNA,
+ SUBTROPICAL, SUBTROPICAL, SUBTROPICAL, WARM_TEMPERATE, WARM_TEMPERATE, WARM_TEMPERATE, WARM_TEMPERATE, WARM_TEMPERATE, WARM_TEMPERATE, SAVANNA, SAVANNA, SAVANNA,
+ TROPICAL, TROPICAL, SUBTROPICAL, SUBTROPICAL, MEDITERRANEAN, MEDITERRANEAN, MEDITERRANEAN, MEDITERRANEAN, SAVANNA, SAVANNA, HOT_DESERT, HOT_DESERT,
+ TROPICAL, TROPICAL, SUBTROPICAL, SUBTROPICAL, MEDITERRANEAN, MEDITERRANEAN, MEDITERRANEAN, MEDITERRANEAN, SAVANNA, SAVANNA, HOT_DESERT, HOT_DESERT
+ };
+
+ public static int[] getClimateMappingInts()
+ {
+ // 9 temperature values, 12 rainfall values, 12 * 9 = 108
+ int[] out = new int[108];
+ for (int i = 0; i < 108; i++)
+ {
+ out[i] = climateMapping[i].ordinal();
+ }
+ return out;
+ }
+
+ public static ImmutableSet> getOverworldBiomes()
+ {
+ Set> set = Sets.newHashSet();
+
+ for (BOPClimates climate : BOPClimates.values())
+ {
+ if (climate == BOPClimates.NETHER)
+ {
+ continue;
+ }
+
+ set.addAll(climate.getLandBiomes().stream().map(weightedBiomeEntry -> weightedBiomeEntry.biome).collect(Collectors.toSet()));
+ set.addAll(climate.getIslandBiomes().stream().map(weightedBiomeEntry -> weightedBiomeEntry.biome).collect(Collectors.toSet()));
+ }
+
+ ModBiomes.subBiomes.values().forEach(weightedSubBiome -> set.add(weightedSubBiome.biome));
+ return ImmutableSet.copyOf(set);
+ }
+
+ public static class WeightedBiomeEntry
+ {
+ public final int weight;
+ public final RegistryKey biome;
+
+ public WeightedBiomeEntry(int weight, RegistryKey biome)
+ {
+ this.weight = weight;
+ this.biome = biome;
+ }
+ }
+
+ // for debugging purposes
+ public static void printWeights()
+ {
+ for (BOPClimates climate : BOPClimates.values())
+ {
+ for (WeightedBiomeEntry entry : climate.landBiomes)
+ {
+ System.out.println(climate.name()+" "+entry.biome.location()+" "+entry.weight);
+ }
+ }
+ }
+
+}
diff --git a/src/main/java/biomesoplenty/api/item/BOPItems.java b/src/main/java/biomesoplenty/api/item/BOPItems.java
new file mode 100644
index 0000000000..5aa98461aa
--- /dev/null
+++ b/src/main/java/biomesoplenty/api/item/BOPItems.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.api.item;
+
+import net.minecraft.item.Item;
+
+public class BOPItems
+{
+ public static Item bop_icon;
+
+ public static Item mud_ball;
+ public static Item mud_brick;
+
+ public static Item fir_boat;
+ public static Item redwood_boat;
+ public static Item cherry_boat;
+ public static Item mahogany_boat;
+ public static Item jacaranda_boat;
+ public static Item palm_boat;
+ public static Item willow_boat;
+ public static Item dead_boat;
+ public static Item magic_boat;
+ public static Item umbran_boat;
+ public static Item hellbark_boat;
+
+ public static Item music_disc_wanderer;
+}
diff --git a/src/main/java/biomesoplenty/api/particle/BOPParticleTypes.java b/src/main/java/biomesoplenty/api/particle/BOPParticleTypes.java
new file mode 100644
index 0000000000..58801d73b9
--- /dev/null
+++ b/src/main/java/biomesoplenty/api/particle/BOPParticleTypes.java
@@ -0,0 +1,13 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.api.particle;
+
+public enum BOPParticleTypes
+{
+ MUD
+}
diff --git a/src/main/java/biomesoplenty/api/sound/BOPSounds.java b/src/main/java/biomesoplenty/api/sound/BOPSounds.java
new file mode 100644
index 0000000000..793e0a8116
--- /dev/null
+++ b/src/main/java/biomesoplenty/api/sound/BOPSounds.java
@@ -0,0 +1,15 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.api.sound;
+
+import net.minecraft.util.SoundEvent;
+
+public class BOPSounds
+{
+ public static SoundEvent music_disc_wanderer;
+}
diff --git a/src/main/java/biomesoplenty/client/BOPClassicPack.java b/src/main/java/biomesoplenty/client/BOPClassicPack.java
new file mode 100644
index 0000000000..5b12123378
--- /dev/null
+++ b/src/main/java/biomesoplenty/client/BOPClassicPack.java
@@ -0,0 +1,141 @@
+/**Copied from Twilight Forest and modified with permission**/
+
+package biomesoplenty.client;
+
+import biomesoplenty.core.BiomesOPlenty;
+import com.google.common.base.Joiner;
+import net.minecraft.resources.ResourcePack;
+import net.minecraft.resources.ResourcePackFileNotFoundException;
+import net.minecraft.resources.ResourcePackType;
+import net.minecraft.resources.data.IMetadataSectionSerializer;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.api.distmarker.Dist;
+import net.minecraftforge.api.distmarker.OnlyIn;
+import net.minecraftforge.fml.loading.moddiscovery.ModFile;
+
+import javax.annotation.Nullable;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.StandardOpenOption;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Set;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+
+@OnlyIn(Dist.CLIENT)
+public class BOPClassicPack extends ResourcePack
+{
+ private final ModFile modFile;
+ private static final String subDir = "classic/";
+
+ public BOPClassicPack(ModFile modFile)
+ {
+ super(modFile.getFilePath().toFile());
+ this.modFile = modFile;
+ }
+
+ @Override
+ public Set getNamespaces(ResourcePackType type)
+ {
+ try
+ {
+ Path root = modFile.getLocator().findPath(modFile, subDir + type.getDirectory()).toAbsolutePath();
+ return Files.walk(root,1).map(path -> root.relativize(path.toAbsolutePath())).filter(path -> path.getNameCount() > 0).map(p->p.toString().replaceAll("/$","")).filter(s -> !s.isEmpty()).collect(Collectors.toSet());
+ }
+ catch (Throwable t)
+ {
+ BiomesOPlenty.logger.error("BOPClassicPack failed to collect resource namespaces!", t);
+ return Collections.emptySet();
+ }
+ }
+
+ @Override
+ protected InputStream getResource(String location) throws IOException
+ {
+ final Path path = modFile.getLocator().findPath(modFile, subDir + location);
+
+ if (!Files.exists(path))
+ {
+ BiomesOPlenty.logger.error("File does not exist!");
+ throw new ResourcePackFileNotFoundException(path.toFile(), location);
+ }
+
+ return Files.newInputStream(path, StandardOpenOption.READ);
+ }
+
+ @Override
+ protected boolean hasResource(String resourcePath)
+ {
+ return Files.exists(modFile.getLocator().findPath(modFile, subDir + resourcePath));
+ }
+
+ @Override
+ public Collection getResources(ResourcePackType type, String namespaceIn, String pathIn, int maxDepthIn, Predicate filterIn)
+ {
+ try
+ {
+ Path root = modFile.getLocator().findPath(modFile, subDir + type.getDirectory()).toAbsolutePath();
+ Path inputPath = root.getFileSystem().getPath(pathIn);
+
+ return Files.walk(root).map(path -> root.relativize(path.toAbsolutePath())).filter(path -> path.getNameCount() > 1 && path.getNameCount() - 1 <= maxDepthIn).filter(path -> !path.toString().endsWith(".mcmeta")).filter(path -> path.subpath(1, path.getNameCount()).startsWith(inputPath)).filter(path -> filterIn.test(path.getFileName().toString())).map(path -> new ResourceLocation(path.getName(0).toString(), Joiner.on('/').join(path.subpath(1, Math.min(maxDepthIn, path.getNameCount()))))).collect(Collectors.toList());
+ }
+ catch (IOException e)
+ {
+ return Collections.emptyList();
+ }
+ }
+
+ @Override
+ public void close() { }
+
+ @Override
+ public String getName()
+ {
+ return "BOP Programmer Art";
+ }
+
+ @Nullable
+ @Override
+ public T getMetadataSection(IMetadataSectionSerializer serializer) throws IOException
+ {
+ InputStream inputStream = getResource("pack.mcmeta");
+ Throwable throwable = null;
+ T resourceMetaData;
+
+ try
+ {
+ resourceMetaData = getMetadataFromStream(serializer, inputStream);
+ }
+ catch (Throwable t)
+ {
+ throwable = t;
+ throw t;
+ }
+ finally
+ {
+ if (inputStream != null)
+ {
+ if (throwable != null)
+ {
+ try
+ {
+ inputStream.close();
+ }
+ catch (Throwable t)
+ {
+ throwable.addSuppressed(t);
+ }
+ }
+ else
+ {
+ inputStream.close();
+ }
+ }
+ }
+
+ return resourceMetaData;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/biomesoplenty/client/handler/GuiEventHandler.java b/src/main/java/biomesoplenty/client/handler/GuiEventHandler.java
new file mode 100644
index 0000000000..0121d34250
--- /dev/null
+++ b/src/main/java/biomesoplenty/client/handler/GuiEventHandler.java
@@ -0,0 +1,50 @@
+package biomesoplenty.client.handler;
+
+import biomesoplenty.init.ModBiomes;
+import biomesoplenty.init.ModConfig;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.screen.*;
+import net.minecraft.util.text.TranslationTextComponent;
+import net.minecraftforge.api.distmarker.Dist;
+import net.minecraftforge.api.distmarker.OnlyIn;
+import net.minecraftforge.client.event.GuiOpenEvent;
+import net.minecraftforge.eventbus.api.SubscribeEvent;
+import net.minecraftforge.fml.common.Mod;
+
+import java.util.Optional;
+
+@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.FORGE)
+public class GuiEventHandler
+{
+ @OnlyIn(Dist.CLIENT)
+ @SubscribeEvent
+ public static void onGuiOpened(GuiOpenEvent event)
+ {
+ Screen gui = event.getGui();
+ Minecraft mc = Minecraft.getInstance();
+ Screen prevScreen = mc.screen;
+
+ // Default to the bop worldtype
+ if (ModConfig.ClientConfig.useWorldType.get() && gui instanceof CreateWorldScreen && prevScreen instanceof WorldSelectionScreen)
+ {
+ WorldOptionsScreen optionsScreen = ((CreateWorldScreen)gui).worldGenSettingsComponent;
+ optionsScreen.preset = Optional.of(findBopBiomeGeneratorTypeScreen());
+ optionsScreen.settings = optionsScreen.preset.get().create(optionsScreen.registryHolder, optionsScreen.settings.seed(), optionsScreen.settings.generateFeatures(), optionsScreen.settings.generateBonusChest());
+ }
+ }
+
+ private static BiomeGeneratorTypeScreens findBopBiomeGeneratorTypeScreen()
+ {
+ for (BiomeGeneratorTypeScreens screen : BiomeGeneratorTypeScreens.PRESETS)
+ {
+ TranslationTextComponent desc = (TranslationTextComponent)screen.description;
+
+ if (desc.getKey().equals("generator.minecraft.biomesoplenty"))
+ {
+ return screen;
+ }
+ }
+
+ throw new RuntimeException("Failed to locate biomesoplenty biome generator type screen!");
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/biomesoplenty/client/renderer/BoatRendererBOP.java b/src/main/java/biomesoplenty/client/renderer/BoatRendererBOP.java
new file mode 100644
index 0000000000..ecfc4d11ad
--- /dev/null
+++ b/src/main/java/biomesoplenty/client/renderer/BoatRendererBOP.java
@@ -0,0 +1,78 @@
+package biomesoplenty.client.renderer;
+
+import biomesoplenty.common.entity.item.BoatEntityBOP;
+import com.mojang.blaze3d.matrix.MatrixStack;
+import com.mojang.blaze3d.vertex.IVertexBuilder;
+import net.minecraft.client.renderer.IRenderTypeBuffer;
+import net.minecraft.client.renderer.RenderType;
+import net.minecraft.client.renderer.entity.EntityRenderer;
+import net.minecraft.client.renderer.entity.EntityRendererManager;
+import net.minecraft.client.renderer.entity.model.BoatModel;
+import net.minecraft.client.renderer.texture.OverlayTexture;
+import net.minecraft.util.ResourceLocation;
+import net.minecraft.util.math.MathHelper;
+import net.minecraft.util.math.vector.Quaternion;
+import net.minecraft.util.math.vector.Vector3f;
+import net.minecraftforge.api.distmarker.Dist;
+import net.minecraftforge.api.distmarker.OnlyIn;
+
+import static biomesoplenty.core.BiomesOPlenty.MOD_ID;
+
+@OnlyIn(Dist.CLIENT)
+public class BoatRendererBOP extends EntityRenderer {
+ protected final BoatModel model = new BoatModel();
+
+ public BoatRendererBOP(EntityRendererManager renderer) {
+ super(renderer);
+ this.shadowRadius = 0.8f;
+ }
+
+ @Override
+ public void render(BoatEntityBOP entity, float entityYaw, float partialTicks, MatrixStack matrixStack, IRenderTypeBuffer renderTypeBuffer, int light) {
+ matrixStack.pushPose();
+ matrixStack.translate(0d, 0.375d, 0d);
+ matrixStack.mulPose(Vector3f.YP.rotationDegrees(180f - entityYaw));
+ float f = (float) entity.getHurtTime() - partialTicks;
+ float f1 = entity.getDamage() - partialTicks;
+ if (f1 < 0f) {
+ f1 = 0f;
+ }
+ if (f > 0f) {
+ matrixStack.mulPose(Vector3f.XP.rotationDegrees(MathHelper.sin(f) * f * f1 / 10f * (float) entity.getHurtDir()));
+ }
+ float f2 = entity.getBubbleAngle(partialTicks);
+ if (!MathHelper.equal(f2, 0f)) {
+ matrixStack.mulPose(new Quaternion(new Vector3f(1f, 0f, 1f), entity.getBubbleAngle(partialTicks), true));
+ }
+ matrixStack.scale(-1f, -1f, 1f);
+ matrixStack.mulPose(Vector3f.YP.rotationDegrees(90.0F));
+ this.model.setupAnim(entity, partialTicks, 0f, -0.1f, 0f, 0f);
+ IVertexBuilder ivertexbuilder = renderTypeBuffer.getBuffer(this.model.renderType(this.getTextureLocation(entity)));
+ this.model.renderToBuffer(matrixStack, ivertexbuilder, light, OverlayTexture.NO_OVERLAY, 1f, 1f, 1f, 1f);
+ if (!entity.isUnderWater()) {
+ IVertexBuilder ivertexbuilder1 = renderTypeBuffer.getBuffer(RenderType.waterMask());
+ this.model.waterPatch().render(matrixStack, ivertexbuilder1, light, OverlayTexture.NO_OVERLAY);
+ }
+ matrixStack.popPose();
+ super.render(entity, entityYaw, partialTicks, matrixStack, renderTypeBuffer, light);
+ }
+
+ @Override
+ public ResourceLocation getTextureLocation(BoatEntityBOP entity) {
+ return BOAT_TEXTURE_LOCATIONS[entity.getModel().ordinal()];
+ }
+
+ private static final ResourceLocation[] BOAT_TEXTURE_LOCATIONS = new ResourceLocation[] {
+ new ResourceLocation(MOD_ID, "textures/entity/boat/fir.png"),
+ new ResourceLocation(MOD_ID, "textures/entity/boat/redwood.png"),
+ new ResourceLocation(MOD_ID, "textures/entity/boat/cherry.png"),
+ new ResourceLocation(MOD_ID, "textures/entity/boat/mahogany.png"),
+ new ResourceLocation(MOD_ID, "textures/entity/boat/jacaranda.png"),
+ new ResourceLocation(MOD_ID, "textures/entity/boat/palm.png"),
+ new ResourceLocation(MOD_ID, "textures/entity/boat/willow.png"),
+ new ResourceLocation(MOD_ID, "textures/entity/boat/dead.png"),
+ new ResourceLocation(MOD_ID, "textures/entity/boat/magic.png"),
+ new ResourceLocation(MOD_ID, "textures/entity/boat/umbran.png"),
+ new ResourceLocation(MOD_ID, "textures/entity/boat/hellbark.png")
+ };
+}
diff --git a/src/main/java/biomesoplenty/common/biome/BiomeConfigData.java b/src/main/java/biomesoplenty/common/biome/BiomeConfigData.java
new file mode 100644
index 0000000000..9c31b62b24
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/BiomeConfigData.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome;
+
+import com.google.common.collect.Maps;
+import com.google.gson.annotations.SerializedName;
+
+import java.util.Map;
+import java.util.TreeMap;
+
+public class BiomeConfigData
+{
+ @SerializedName("standard_weights")
+ public TreeMap standardBiomeWeights = Maps.newTreeMap();
+
+ @SerializedName("technical_biome_toggles")
+ public TreeMap technicalBiomeEntries = Maps.newTreeMap();
+
+ @SerializedName("sub_biome_weights")
+ public TreeMap subBiomeEntries = Maps.newTreeMap();
+
+ @SerializedName("island_biome_toggles")
+ public TreeMap islandBiomeEntries = Maps.newTreeMap();
+
+ @SerializedName("vanilla_biome_weights")
+ public TreeMap vanillaBiomeEntries = Maps.newTreeMap();
+
+ public static class WeightedBiomeEntry
+ {
+ public int weight;
+
+ public WeightedBiomeEntry(int weight)
+ {
+ this.weight = weight;
+ }
+ }
+
+ public static class ToggleableBiomeEntry
+ {
+ public boolean enabled;
+
+ public ToggleableBiomeEntry(boolean enabled)
+ {
+ this.enabled = enabled;
+ }
+ }
+
+ public static class SubBiomeEntry
+ {
+ public int weight;
+ public float rarity;
+
+ public SubBiomeEntry(int weight, float rarity)
+ {
+ this.weight = weight;
+ this.rarity = rarity;
+ }
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/BiomeMetadata.java b/src/main/java/biomesoplenty/common/biome/BiomeMetadata.java
new file mode 100644
index 0000000000..b391f13451
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/BiomeMetadata.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright 2020, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.util.biome.BiomeUtil;
+import com.google.common.collect.ImmutableMap;
+import net.minecraft.util.RegistryKey;
+import net.minecraft.world.biome.Biome;
+import net.minecraft.world.biome.Biomes;
+
+import javax.annotation.Nullable;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.function.BiFunction;
+
+public class BiomeMetadata
+{
+ private final ImmutableMap weightMap;
+
+ @Nullable
+ private final RegistryKey beachBiome;
+
+ @Nullable
+ private final RegistryKey riverBiome;
+
+ @Nullable
+ private final BiFunction foliageColorFunction;
+
+ @Nullable
+ private final BiFunction grassColorFunction;
+
+ @Nullable
+ private final BiFunction waterColorFunction;
+
+ protected BiomeMetadata(Map weights, @Nullable RegistryKey beachBiome, @Nullable RegistryKey riverBiome, BiFunction foliageColorFunction, BiFunction grassColorFunction, BiFunction waterColorFunction)
+ {
+ this.weightMap = ImmutableMap.copyOf(weights);
+ this.beachBiome = beachBiome;
+ this.riverBiome = riverBiome;
+ this.foliageColorFunction = foliageColorFunction;
+ this.grassColorFunction = grassColorFunction;
+ this.waterColorFunction = waterColorFunction;
+ }
+
+ public Map getWeightMap()
+ {
+ return this.weightMap;
+ }
+
+ @Nullable
+ public RegistryKey getBeachBiome()
+ {
+ return this.beachBiome;
+ }
+
+ @Nullable
+ public RegistryKey getRiverBiome()
+ {
+ return this.riverBiome;
+ }
+
+ @Nullable
+ public BiFunction getFoliageColorFunction()
+ {
+ return this.foliageColorFunction;
+ }
+
+ @Nullable
+ public BiFunction getGrassColorFunction()
+ {
+ return this.grassColorFunction;
+ }
+
+ @Nullable
+ public BiFunction getWaterColorFunction()
+ {
+ return this.waterColorFunction;
+ }
+
+ public boolean hasWeights()
+ {
+ return !this.weightMap.isEmpty() && !this.weightMap.entrySet().stream().allMatch((entry) -> entry.getValue().equals(0));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/BiomeRegistry.java b/src/main/java/biomesoplenty/common/biome/BiomeRegistry.java
new file mode 100644
index 0000000000..deb78d562a
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/BiomeRegistry.java
@@ -0,0 +1,680 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome;
+
+import biomesoplenty.api.biome.BOPBiomes;
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.util.biome.BiomeUtil;
+import biomesoplenty.common.util.config.JsonUtil;
+import biomesoplenty.core.BiomesOPlenty;
+import biomesoplenty.init.ModBiomes;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+import com.google.gson.reflect.TypeToken;
+import net.minecraft.util.RegistryKey;
+import net.minecraft.util.ResourceLocation;
+import net.minecraft.world.biome.Biome;
+import net.minecraftforge.fml.loading.FMLPaths;
+import net.minecraftforge.registries.ForgeRegistries;
+import org.apache.commons.lang3.tuple.Pair;
+
+import javax.annotation.Nullable;
+import java.io.File;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.*;
+import java.util.function.Consumer;
+
+public class BiomeRegistry
+{
+ private static final String CONFIG_FILE_NAME = "biomes.json";
+
+ private static Map> deferrances = Maps.newHashMap();
+
+ public static void deferStandardRegistration(BiomeTemplate biome, String name)
+ {
+ defer(RegistrationType.STANDARD_BIOME, new StandardBiomeRegistrationData(biome, name));
+ }
+
+ public static void deferTechnicalBiomeRegistration(BiomeTemplate biome, String name)
+ {
+ defer(RegistrationType.TECHNICAL_BIOME, new ToggleableStandardBiomeRegistrationData(biome, name, true));
+ }
+
+ public static void deferSubBiomeRegistration(RegistryKey parent, RegistryKey child, int weight, float rarity)
+ {
+ // Don't register sub biome if the parent or child don't exist
+ if (!BiomeUtil.exists(parent) || !BiomeUtil.exists(child)) {
+ return;
+ }
+
+ defer(RegistrationType.SUB_BIOME, new SubBiomeRegistrationData(parent, child, weight, rarity));
+ }
+
+ public static void deferIslandBiomeRegistration(RegistryKey key, BOPClimates climate, int weight)
+ {
+ if (!BiomeUtil.exists(key))
+ return;
+
+ defer(RegistrationType.ISLAND_BIOME, new SingleClimateRegistrationData(key, climate, weight));
+ }
+
+ public static void deferVanillaBiomeRegistration(RegistryKey key, BOPClimates climate, int weight)
+ {
+ if (!BiomeUtil.exists(key))
+ return;
+
+ defer(RegistrationType.VANILLA_BIOME, new SingleClimateRegistrationData(key, climate, weight));
+ }
+
+ public static void configureStandardBiomes()
+ {
+ List standardRegistrations = deferrances.get(RegistrationType.STANDARD_BIOME);
+ TreeMap defaultEntries = Maps.newTreeMap();
+ Map regDataMap = Maps.newHashMap();
+
+ for (DeferredRegistration registration : standardRegistrations)
+ {
+ StandardBiomeRegistrationData regData = registration.regData;
+
+ // Ignore biomes which don't have any weights set by default
+ if (regData.getMetadata().hasWeights())
+ {
+ String biomeName = new ResourceLocation(BiomesOPlenty.MOD_ID, regData.getName()).toString();
+ Pair primaryWeight = regData.getPrimaryWeight();
+ defaultEntries.put(biomeName, new BiomeConfigData.WeightedBiomeEntry(primaryWeight.getValue()));
+ regDataMap.put(biomeName, registration.regData);
+ }
+ }
+
+ BiomeConfigData defaultConfigData = new BiomeConfigData();
+ defaultConfigData.standardBiomeWeights = defaultEntries;
+ BiomeConfigData configData = getConfigData(defaultConfigData);
+
+ TreeMap revisedStandardBiomeWeights = Maps.newTreeMap(defaultEntries);
+
+ // Merge the config file with the default values
+ for (Map.Entry biomeEntry : configData.standardBiomeWeights.entrySet())
+ {
+ if (revisedStandardBiomeWeights.containsKey(biomeEntry.getKey()))
+ {
+ revisedStandardBiomeWeights.put(biomeEntry.getKey(), biomeEntry.getValue());
+ }
+ }
+
+ // Write back to the config file
+ configData.standardBiomeWeights = revisedStandardBiomeWeights;
+ JsonUtil.writeFile(getConfigFile(), configData);
+
+ for (Map.Entry biomeEntry : configData.standardBiomeWeights.entrySet())
+ {
+ String name = biomeEntry.getKey();
+ BiomeConfigData.WeightedBiomeEntry weight = biomeEntry.getValue();
+
+ // Replace the default weight map for this biome with those from the config file
+ if (regDataMap.containsKey(name))
+ {
+ StandardBiomeRegistrationData registrationData = regDataMap.get(name);
+ registrationData.setPrimaryWeight(weight.weight);
+ }
+ }
+ }
+
+ public static void configureTechnicalBiomes()
+ {
+ List biomeRegistrations = deferrances.get(RegistrationType.TECHNICAL_BIOME);
+ TreeMap defaultBiomeEntries = Maps.newTreeMap();
+
+ for (DeferredRegistration registration : biomeRegistrations)
+ {
+ ToggleableStandardBiomeRegistrationData regData = registration.regData;
+ String biomeName = new ResourceLocation(BiomesOPlenty.MOD_ID, regData.getName()).toString();
+ defaultBiomeEntries.put(biomeName, new BiomeConfigData.ToggleableBiomeEntry(true));
+ }
+
+ BiomeConfigData defaultConfigData = new BiomeConfigData();
+ defaultConfigData.technicalBiomeEntries = defaultBiomeEntries;
+ BiomeConfigData configData = getConfigData(defaultConfigData);
+
+ TreeMap revisedBiomeEntries = Maps.newTreeMap(defaultBiomeEntries);
+
+ // Merge the config file with the default values
+ for (Map.Entry biomeEntry : configData.technicalBiomeEntries.entrySet())
+ {
+ if (revisedBiomeEntries.containsKey(biomeEntry.getKey()))
+ {
+ revisedBiomeEntries.put(biomeEntry.getKey(), biomeEntry.getValue());
+ }
+ }
+
+ // Write back to the config file
+ configData.technicalBiomeEntries = revisedBiomeEntries;
+ JsonUtil.writeFile(getConfigFile(), configData);
+
+ for (DeferredRegistration registration : biomeRegistrations)
+ {
+ ToggleableStandardBiomeRegistrationData regData = registration.regData;
+ String biomeName = new ResourceLocation(BiomesOPlenty.MOD_ID, regData.getName()).toString();
+
+ if (revisedBiomeEntries.containsKey(biomeName))
+ {
+ BiomeConfigData.ToggleableBiomeEntry entry = revisedBiomeEntries.get(biomeName);
+
+ if (!entry.enabled)
+ {
+ registration.regData.setEnabled(false);
+ }
+ }
+ }
+ }
+
+ public static void configureSubBiomes()
+ {
+ List subBiomeRegistrations = deferrances.get(RegistrationType.SUB_BIOME);
+ TreeMap defaultSubBiomeEntries = Maps.newTreeMap();
+ Map regDataMap = Maps.newHashMap();
+
+ for (DeferredRegistration registration : subBiomeRegistrations)
+ {
+ SubBiomeRegistrationData regData = registration.regData;
+ String biomeName = registration.regData.getChild().location().toString();
+ defaultSubBiomeEntries.put(biomeName, new BiomeConfigData.SubBiomeEntry(regData.getWeight(), regData.getRarity()));
+ regDataMap.put(biomeName, registration.regData);
+ }
+
+ BiomeConfigData defaultConfigData = new BiomeConfigData();
+ defaultConfigData.subBiomeEntries = defaultSubBiomeEntries;
+ BiomeConfigData configData = getConfigData(defaultConfigData);
+
+ TreeMap revisedSubBiomeEntries = Maps.newTreeMap(defaultSubBiomeEntries);
+
+ // Merge the config file with the default values
+ for (Map.Entry biomeEntry : configData.subBiomeEntries.entrySet())
+ {
+ if (revisedSubBiomeEntries.containsKey(biomeEntry.getKey()))
+ {
+ revisedSubBiomeEntries.put(biomeEntry.getKey(), biomeEntry.getValue());
+ }
+ }
+
+ // Write back to the config file
+ configData.subBiomeEntries = revisedSubBiomeEntries;
+ JsonUtil.writeFile(getConfigFile(), configData);
+
+ for (Map.Entry biomeEntry : configData.subBiomeEntries.entrySet())
+ {
+ String name = biomeEntry.getKey();
+ BiomeConfigData.SubBiomeEntry subBiomeEntry = biomeEntry.getValue();
+
+ // Replace the default values for this biome with those from the config file
+ if (regDataMap.containsKey(name))
+ {
+ SubBiomeRegistrationData registrationData = regDataMap.get(name);
+ registrationData.setWeight(subBiomeEntry.weight);
+ registrationData.setRarity(subBiomeEntry.rarity);
+ }
+ }
+ }
+
+ public static void configureIslandBiomes()
+ {
+ List biomeRegistrations = deferrances.get(RegistrationType.ISLAND_BIOME);
+ TreeMap defaultBiomeEntries = Maps.newTreeMap();
+
+ for (DeferredRegistration registration : biomeRegistrations)
+ {
+ SingleClimateRegistrationData regData = registration.regData;
+ String biomeName = regData.getBiome().location().toString();
+ defaultBiomeEntries.put(biomeName, new BiomeConfigData.ToggleableBiomeEntry(true));
+ }
+
+ BiomeConfigData defaultConfigData = new BiomeConfigData();
+ defaultConfigData.islandBiomeEntries = defaultBiomeEntries;
+ BiomeConfigData configData = getConfigData(defaultConfigData);
+
+ TreeMap revisedBiomeEntries = Maps.newTreeMap(defaultBiomeEntries);
+
+ // Merge the config file with the default values
+ for (Map.Entry biomeEntry : configData.islandBiomeEntries.entrySet())
+ {
+ if (revisedBiomeEntries.containsKey(biomeEntry.getKey()))
+ {
+ revisedBiomeEntries.put(biomeEntry.getKey(), biomeEntry.getValue());
+ }
+ }
+
+ // Write back to the config file
+ configData.islandBiomeEntries = revisedBiomeEntries;
+ JsonUtil.writeFile(getConfigFile(), configData);
+
+ for (DeferredRegistration registration : biomeRegistrations)
+ {
+ SingleClimateRegistrationData regData = registration.regData;
+ String biomeName = regData.getBiome().location().toString();
+
+ if (revisedBiomeEntries.containsKey(biomeName))
+ {
+ BiomeConfigData.ToggleableBiomeEntry entry = revisedBiomeEntries.get(biomeName);
+
+ if (!entry.enabled)
+ {
+ registration.regData.setWeight(0);
+ }
+ }
+ }
+ }
+
+ public static void configureVanillaBiomes()
+ {
+ List biomeRegistrations = deferrances.get(RegistrationType.VANILLA_BIOME);
+ TreeMap defaultBiomeEntries = Maps.newTreeMap();
+ Map regDataMap = Maps.newHashMap();
+
+ for (DeferredRegistration registration : biomeRegistrations)
+ {
+ SingleClimateRegistrationData regData = registration.regData;
+ String biomeName = registration.regData.getBiome().location().toString();
+ defaultBiomeEntries.put(biomeName, new BiomeConfigData.WeightedBiomeEntry(regData.getWeight()));
+ regDataMap.put(biomeName, registration.regData);
+ }
+
+ BiomeConfigData defaultConfigData = new BiomeConfigData();
+ defaultConfigData.vanillaBiomeEntries = defaultBiomeEntries;
+ BiomeConfigData configData = getConfigData(defaultConfigData);
+
+ TreeMap revisedBiomeEntries = Maps.newTreeMap(defaultBiomeEntries);
+
+ // Merge the config file with the default values
+ for (Map.Entry biomeEntry : configData.vanillaBiomeEntries.entrySet())
+ {
+ if (revisedBiomeEntries.containsKey(biomeEntry.getKey()))
+ {
+ revisedBiomeEntries.put(biomeEntry.getKey(), biomeEntry.getValue());
+ }
+ }
+
+ // Write back to the config file
+ configData.vanillaBiomeEntries = revisedBiomeEntries;
+ JsonUtil.writeFile(getConfigFile(), configData);
+
+ for (Map.Entry biomeEntry : configData.vanillaBiomeEntries.entrySet())
+ {
+ String name = biomeEntry.getKey();
+ BiomeConfigData.WeightedBiomeEntry islandBiomeEntry = biomeEntry.getValue();
+
+ // Replace the default values for this biome with those from the config file
+ if (regDataMap.containsKey(name))
+ {
+ SingleClimateRegistrationData registrationData = regDataMap.get(name);
+ registrationData.setWeight(islandBiomeEntry.weight);
+ }
+ }
+ }
+
+ private static File getConfigDirFile()
+ {
+ Path configPath = FMLPaths.CONFIGDIR.get();
+ Path bopConfigPath = Paths.get(configPath.toAbsolutePath().toString(), "biomesoplenty");
+ return bopConfigPath.toFile();
+ }
+
+ private static File getConfigFile()
+ {
+ return new File(getConfigDirFile(), CONFIG_FILE_NAME);
+ }
+
+ private static BiomeConfigData getConfigData(BiomeConfigData defaultConfigData)
+ {
+ BiomeConfigData configData = JsonUtil.getOrCreateConfigFile(getConfigDirFile(), CONFIG_FILE_NAME, defaultConfigData, new TypeToken(){}.getType());
+ return configData;
+ }
+
+ private static void defer(RegistrationType type, T data)
+ {
+ if (!deferrances.containsKey(type))
+ deferrances.put(type, Lists.newArrayList());
+
+ List list = deferrances.get(type);
+ list.add(new DeferredRegistration(type.regFunc, data));
+ }
+
+ public static void finalizeRegistrations(RegistrationType type)
+ {
+ if (!deferrances.containsKey(type))
+ return;
+
+ if (type == RegistrationType.SUB_BIOME)
+ {
+ Set> children = Sets.newHashSet();
+ deferrances.get(RegistrationType.SUB_BIOME).forEach((reg) -> {
+ RegistryKey biome = ((SubBiomeRegistrationData)reg.regData).getChild();
+ if (children.contains(biome))
+ {
+ throw new RuntimeException(String.format("Sub biome %s cannot be added to multiple parents", biome.location().toString()));
+ }
+ children.add(biome);
+ });
+
+ }
+
+ for (DeferredRegistration reg : deferrances.get(type))
+ {
+ reg.register();
+ }
+ }
+
+ public enum RegistrationType
+ {
+ STANDARD_BIOME((StandardBiomeRegistrationData data) -> {
+ Biome biome = data.getBiome();
+ BiomeMetadata metadata = data.getMetadata();
+ String name = data.getName();
+
+ // Don't register biomes with their weight set to 0, that normally have weights that are non-zero
+ if (!metadata.getWeightMap().isEmpty() && (data.weightMap.isEmpty() || data.weightMap.entrySet().stream().allMatch((entry) -> entry.getValue().equals(0))))
+ {
+ BiomesOPlenty.logger.debug("Weights absent for " + data.getName() + ", disabling...");
+ return;
+ }
+
+ biome.setRegistryName(new ResourceLocation(BiomesOPlenty.MOD_ID, name));
+ ForgeRegistries.BIOMES.register(biome);
+
+ for (Map.Entry entry : data.getWeights().entrySet())
+ {
+ if (entry != null && entry.getValue() > 0)
+ {
+ BOPClimates climate = entry.getKey();
+ int weight = entry.getValue();
+ BiomesOPlenty.logger.debug(String.format("%s weight set to %d for climate %s", name, weight, climate.name()));
+ climate.addBiome(weight, BiomeUtil.createKey(data.getBiome()));
+ }
+ }
+
+ if (data.getMetadata() != null)
+ {
+ ModBiomes.biomeMetadata.put(BiomeUtil.createKey(data.getBiome()), data.getMetadata());
+ }
+ }),
+ TECHNICAL_BIOME((ToggleableStandardBiomeRegistrationData data) -> {
+ Biome biome = data.getBiome();
+ String name = data.getName();
+
+ if (!data.getEnabled())
+ {
+ BiomesOPlenty.logger.debug("Technical biome " + data.getName() + " is disabled.");
+ return;
+ }
+
+ biome.setRegistryName(new ResourceLocation(BiomesOPlenty.MOD_ID, name));
+ ForgeRegistries.BIOMES.register(biome);
+
+ if (data.getMetadata() != null)
+ {
+ ModBiomes.biomeMetadata.put(BiomeUtil.createKey(data.getBiome()), data.getMetadata());
+ }
+ }),
+ SUB_BIOME((SubBiomeRegistrationData data) -> {
+ if (data.getWeight() == 0)
+ {
+ BiomesOPlenty.logger.debug("Weights absent for sub biome" + data.getChild().location().toString() + ", disabling...");
+ return;
+ }
+
+ String childName = data.getChild().location().toString();
+ BiomesOPlenty.logger.debug(String.format("Sub biome %s weight set to %d", childName, data.getWeight()));
+ ModBiomes.subBiomes.put(BiomeUtil.getBiomeId(data.getParent()), new ModBiomes.WeightedSubBiome(data.getChild(), data.getRarity(), data.getWeight()));
+ }),
+ ISLAND_BIOME((SingleClimateRegistrationData data) -> {
+ if (data.getWeight() == 0)
+ {
+ BiomesOPlenty.logger.debug("Weights absent for island biome" + data.getBiome().location().toString() + ", disabling...");
+ return;
+ }
+
+ String biomeName = data.getBiome().location().toString();
+ BiomesOPlenty.logger.debug(String.format("Island biome %s weight set to %d for climate %s", biomeName, data.getWeight(), data.getClimate().name()));
+ ModBiomes.islandBiomeIds.add(BiomeUtil.getBiomeId(data.getBiome()));
+ data.getClimate().addIslandBiome(data.getWeight(), data.getBiome());
+ }),
+ VANILLA_BIOME((SingleClimateRegistrationData data) -> {
+ if (data.getWeight() == 0)
+ {
+ BiomesOPlenty.logger.debug("Weights absent for vanilla biome" + data.getBiome().location().toString() + ", disabling...");
+ return;
+ }
+
+ data.getClimate().addBiome(data.getWeight(), data.getBiome());
+ });
+
+ public final Consumer extends IRegistrationData> regFunc;
+
+ RegistrationType(Consumer extends IRegistrationData> regFunc)
+ {
+ this.regFunc = regFunc;
+ }
+ }
+
+ private interface IRegistrationData
+ {
+
+ }
+
+ private static abstract class TemplateRegistrationData implements IRegistrationData
+ {
+ private final Biome biome;
+ private final BiomeMetadata metadata;
+
+ public TemplateRegistrationData(BiomeTemplate template)
+ {
+ this.biome = template.build();
+ this.metadata = template.buildMetadata();
+ }
+
+ public TemplateRegistrationData(Biome biome)
+ {
+ this.biome = biome;
+ this.metadata = null;
+ }
+
+ public Biome getBiome()
+ {
+ return this.biome;
+ }
+
+ @Nullable
+ public BiomeMetadata getMetadata()
+ {
+ return this.metadata;
+ }
+ }
+
+ private static class StandardBiomeRegistrationData extends TemplateRegistrationData
+ {
+ private final String name;
+ private Map weightMap;
+
+ public StandardBiomeRegistrationData(BiomeTemplate biome, String name)
+ {
+ super(biome);
+ this.name = name;
+ this.weightMap = Maps.newHashMap(this.getMetadata().getWeightMap());
+ this.ensureSingleWeight();
+ }
+
+ public String getName()
+ {
+ return this.name;
+ }
+
+ public ImmutableMap getWeights()
+ {
+ return ImmutableMap.copyOf(this.weightMap);
+ }
+
+ public int getWeight(BOPClimates climate)
+ {
+ return this.weightMap.get(climate);
+ }
+
+ public void setWeight(BOPClimates climate, int weight)
+ {
+ this.weightMap.put(climate, weight);
+ this.ensureSingleWeight();
+ }
+
+ public Pair getPrimaryWeight()
+ {
+ List> pairs = Lists.newArrayList();
+ this.weightMap.entrySet().forEach((entry) -> pairs.add(Pair.of(entry.getKey(), entry.getValue())));
+ return pairs.get(0);
+ }
+
+ public void setPrimaryWeight(int value)
+ {
+ BOPClimates climate = this.getPrimaryWeight().getKey();
+ this.setWeight(climate, value);
+ }
+
+ // This limitation is enforced for config file simplicity, and because we don't need it at this time
+ private void ensureSingleWeight()
+ {
+ if (this.weightMap.size() > 1)
+ {
+ throw new RuntimeException(String.format("%s cannot be assigned to multiple climates!\n%s", new ResourceLocation(BiomesOPlenty.MOD_ID, name).toString(), this.weightMap));
+ }
+ }
+ }
+
+ private static class SubBiomeRegistrationData implements IRegistrationData
+ {
+ private final RegistryKey parent;
+ private final RegistryKey child;
+ private int weight;
+ private float rarity;
+
+ public SubBiomeRegistrationData(RegistryKey parent, RegistryKey child, int weight, float rarity)
+ {
+ this.parent = parent;
+ this.child = child;
+ this.weight = weight;
+ this.rarity = rarity;
+ }
+
+ public RegistryKey getParent()
+ {
+ return this.parent;
+ }
+
+ public RegistryKey getChild()
+ {
+ return this.child;
+ }
+
+ public int getWeight()
+ {
+ return this.weight;
+ }
+
+ public void setWeight(int weight)
+ {
+ this.weight = weight;
+ }
+
+ public float getRarity()
+ {
+ return this.rarity;
+ }
+
+ public void setRarity(float rarity)
+ {
+ this.rarity = rarity;
+ }
+ }
+
+ private static class SingleClimateRegistrationData implements IRegistrationData
+ {
+ private final BOPClimates climate;
+ private final RegistryKey biome;
+ private int weight;
+
+ public SingleClimateRegistrationData(RegistryKey biome, BOPClimates climate, int weight)
+ {
+ this.biome = biome;
+ this.climate = climate;
+ this.weight = weight;
+ }
+
+ public RegistryKey getBiome()
+ {
+ return this.biome;
+ }
+
+ public BOPClimates getClimate()
+ {
+ return this.climate;
+ }
+
+ public int getWeight()
+ {
+ return this.weight;
+ }
+
+ public void setWeight(int weight)
+ {
+ this.weight = weight;
+ }
+ }
+
+ private static class ToggleableStandardBiomeRegistrationData extends TemplateRegistrationData
+ {
+ private final String name;
+ private boolean enabled;
+
+ public ToggleableStandardBiomeRegistrationData(BiomeTemplate biome, String name, boolean enabled)
+ {
+ super(biome);
+ this.name = name;
+ this.enabled = enabled;
+ }
+
+ public String getName()
+ {
+ return this.name;
+ }
+
+ public boolean getEnabled()
+ {
+ return this.enabled;
+ }
+
+ public void setEnabled(boolean enabled)
+ {
+ this.enabled = enabled;
+ }
+ }
+
+ private static class DeferredRegistration
+ {
+ private final Consumer regFunc;
+ private final T regData;
+
+ public DeferredRegistration(Consumer regFunc, T regData)
+ {
+ this.regFunc = regFunc;
+ this.regData = regData;
+ }
+
+ public void register()
+ {
+ this.regFunc.accept(this.regData);
+ }
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/BiomeTemplate.java b/src/main/java/biomesoplenty/common/biome/BiomeTemplate.java
new file mode 100644
index 0000000000..3cc3e2c050
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/BiomeTemplate.java
@@ -0,0 +1,101 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome;
+
+import biomesoplenty.api.enums.BOPClimates;
+import net.minecraft.util.RegistryKey;
+import net.minecraft.util.math.MathHelper;
+import net.minecraft.world.biome.Biome;
+import net.minecraft.world.biome.BiomeGenerationSettings;
+import net.minecraft.world.biome.Biomes;
+import net.minecraft.world.biome.MobSpawnInfo;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.function.BiFunction;
+
+public class BiomeTemplate
+{
+ private Map weightMap = new HashMap();
+ private RegistryKey beachBiome = Biomes.BEACH;
+ private RegistryKey riverBiome = Biomes.RIVER;
+ private BiFunction foliageColorFunction;
+ private BiFunction grassColorFunction;
+ private BiFunction waterColorFunction;
+
+ protected void configureBiome(Biome.Builder builder) {}
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder) {}
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder) {}
+
+ protected void configureDefaultMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ builder.setPlayerCanSpawn();
+ }
+
+ public final Biome build()
+ {
+ Biome.Builder biomeBuilder = new Biome.Builder();
+
+ // Configure the biome generation
+ BiomeGenerationSettings.Builder biomeGenBuilder = new BiomeGenerationSettings.Builder();
+ this.configureGeneration(biomeGenBuilder);
+ biomeBuilder.generationSettings(biomeGenBuilder.build());
+
+ // Configure mob spawning
+ MobSpawnInfo.Builder mobSpawnBuilder = new MobSpawnInfo.Builder();
+ this.configureDefaultMobSpawns(mobSpawnBuilder);
+ this.configureMobSpawns(mobSpawnBuilder);
+ biomeBuilder.mobSpawnSettings(mobSpawnBuilder.build());
+
+ // Configure and build the biome
+ this.configureBiome(biomeBuilder);
+ return biomeBuilder.build();
+ }
+
+ public final BiomeMetadata buildMetadata()
+ {
+ return new BiomeMetadata(this.weightMap, this.beachBiome, this.riverBiome, this.foliageColorFunction, this.grassColorFunction, this.waterColorFunction);
+ }
+
+ public void addWeight(BOPClimates climate, int weight)
+ {
+ this.weightMap.put(climate, weight);
+ }
+
+ public void setBeachBiome(RegistryKey biome)
+ {
+ this.beachBiome = biome;
+ }
+
+ public void setRiverBiome(RegistryKey biome)
+ {
+ this.riverBiome = biome;
+ }
+
+ public void setFoliageColorFunction(BiFunction func)
+ {
+ this.foliageColorFunction = func;
+ }
+
+ public void setGrassColorFunction(BiFunction func)
+ {
+ this.grassColorFunction = func;
+ }
+
+ public void setWaterColorFunction(BiFunction func)
+ {
+ this.waterColorFunction = func;
+ }
+
+ public static int calculateSkyColor(float temperature)
+ {
+ float lvt_1_1_ = temperature / 3.0F;
+ lvt_1_1_ = MathHelper.clamp(lvt_1_1_, -1.0F, 1.0F);
+ return MathHelper.hsvToRgb(0.62222224F - lvt_1_1_ * 0.05F, 0.5F + lvt_1_1_ * 0.1F, 1.0F);
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/NetherBiomeTemplate.java b/src/main/java/biomesoplenty/common/biome/NetherBiomeTemplate.java
new file mode 100644
index 0000000000..af21387628
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/NetherBiomeTemplate.java
@@ -0,0 +1,18 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome;
+
+import net.minecraft.world.biome.MobSpawnInfo;
+
+public class NetherBiomeTemplate extends BiomeTemplate
+{
+ protected void configureDefaultMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Do nothing
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/nether/CrystallineChasmBiome.java b/src/main/java/biomesoplenty/common/biome/nether/CrystallineChasmBiome.java
new file mode 100644
index 0000000000..fe1df062b5
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/nether/CrystallineChasmBiome.java
@@ -0,0 +1,69 @@
+package biomesoplenty.common.biome.nether;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.NetherBiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import net.minecraft.client.audio.BackgroundMusicTracks;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.particles.ParticleTypes;
+import net.minecraft.util.SoundEvents;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.carver.ConfiguredCarvers;
+import net.minecraft.world.gen.feature.Features;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class CrystallineChasmBiome extends NetherBiomeTemplate
+{
+ public CrystallineChasmBiome()
+ {
+ this.addWeight(BOPClimates.NETHER, 5);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.NONE).biomeCategory(Biome.Category.NETHER).depth(0.1F).scale(0.2F).temperature(2.0F).downfall(0.0F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(0x59002C).skyColor(calculateSkyColor(2.0F)).ambientParticle(new ParticleEffectAmbience(ParticleTypes.INSTANT_EFFECT, 0.001785F)).ambientLoopSound(SoundEvents.AMBIENT_CRIMSON_FOREST_LOOP).ambientMoodSound(new MoodSoundAmbience(SoundEvents.AMBIENT_BASALT_DELTAS_MOOD, 6000, 8, 2.0D)).ambientAdditionsSound(new SoundAdditionsAmbience(SoundEvents.AMBIENT_BASALT_DELTAS_ADDITIONS, 0.0111D)).backgroundMusic(BackgroundMusicTracks.createGameMusic(SoundEvents.MUSIC_BIOME_NETHER_WASTES)).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.NETHER);
+
+ //Terrain
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_NETHER);
+ builder.addStructureStart(StructureFeatures.NETHER_BRIDGE);
+ builder.addStructureStart(StructureFeatures.BASTION_REMNANT);
+ builder.addCarver(GenerationStage.Carving.AIR, ConfiguredCarvers.NETHER_CAVE);
+
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_DECORATION, Features.SPRING_OPEN);
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_DECORATION, Features.PATCH_FIRE);
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_DECORATION, Features.PATCH_SOUL_FIRE);
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_DECORATION, Features.GLOWSTONE_EXTRA);
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_DECORATION, Features.GLOWSTONE);
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_DECORATION, Features.BROWN_MUSHROOM_NETHER);
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_DECORATION, Features.RED_MUSHROOM_NETHER);
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_DECORATION, Features.ORE_MAGMA);
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_DECORATION, Features.SPRING_CLOSED);
+
+ //Decoration
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_DECORATION, BOPConfiguredFeatures.LARGE_CRYSTAL);
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_DECORATION, BOPConfiguredFeatures.SMALL_CRYSTAL);
+
+ DefaultBiomeFeatures.addNetherDefaultOres(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ //Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.STRIDER, 60, 1, 2));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/nether/UndergrowthBiome.java b/src/main/java/biomesoplenty/common/biome/nether/UndergrowthBiome.java
new file mode 100644
index 0000000000..00563a584d
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/nether/UndergrowthBiome.java
@@ -0,0 +1,77 @@
+package biomesoplenty.common.biome.nether;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.NetherBiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import net.minecraft.client.audio.BackgroundMusicTracks;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.particles.ParticleTypes;
+import net.minecraft.util.SoundEvents;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.carver.ConfiguredCarvers;
+import net.minecraft.world.gen.feature.Features;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class UndergrowthBiome extends NetherBiomeTemplate
+{
+ public UndergrowthBiome()
+ {
+ this.addWeight(BOPClimates.NETHER, 10);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.NONE).biomeCategory(Biome.Category.NETHER).depth(0.1F).scale(0.2F).temperature(2.0F).downfall(0.0F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(0x1C2109).skyColor(calculateSkyColor(2.0F)).ambientParticle(new ParticleEffectAmbience(ParticleTypes.MYCELIUM, 0.00714F)).ambientLoopSound(SoundEvents.AMBIENT_WARPED_FOREST_LOOP).ambientMoodSound(new MoodSoundAmbience(SoundEvents.AMBIENT_CRIMSON_FOREST_MOOD, 6000, 8, 2.0D)).ambientAdditionsSound(new SoundAdditionsAmbience(SoundEvents.AMBIENT_NETHER_WASTES_ADDITIONS, 0.0111D)).backgroundMusic(BackgroundMusicTracks.createGameMusic(SoundEvents.MUSIC_BIOME_NETHER_WASTES)).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.NETHER);
+
+ //Terrain
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_NETHER);
+ builder.addStructureStart(StructureFeatures.NETHER_BRIDGE);
+ builder.addStructureStart(StructureFeatures.BASTION_REMNANT);
+ builder.addCarver(GenerationStage.Carving.AIR, ConfiguredCarvers.NETHER_CAVE);
+
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_DECORATION, Features.SPRING_OPEN);
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_DECORATION, Features.PATCH_FIRE);
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_DECORATION, Features.PATCH_SOUL_FIRE);
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_DECORATION, Features.GLOWSTONE_EXTRA);
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_DECORATION, Features.GLOWSTONE);
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_DECORATION, Features.BROWN_MUSHROOM_NETHER);
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_DECORATION, Features.RED_MUSHROOM_NETHER);
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_DECORATION, Features.ORE_MAGMA);
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_DECORATION, Features.SPRING_CLOSED);
+
+ //Vegetation
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_DECORATION, BOPConfiguredFeatures.UNDERGROWTH_TREES);
+
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_DECORATION, BOPConfiguredFeatures.NETHER_BRAMBLE);
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_DECORATION, BOPConfiguredFeatures.UNDERGROWTH_FLOWERS);
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_DECORATION, BOPConfiguredFeatures.SPROUTS_UNDERGROWTH);
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_DECORATION, BOPConfiguredFeatures.DEAD_GRASS_45);
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_DECORATION, BOPConfiguredFeatures.NETHER_VINES);
+
+ DefaultBiomeFeatures.addNetherDefaultOres(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ //Entities
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.GHAST, 50, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.MAGMA_CUBE, 2, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.HOGLIN, 9, 3, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.STRIDER, 60, 1, 2));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/nether/VisceralHeapBiome.java b/src/main/java/biomesoplenty/common/biome/nether/VisceralHeapBiome.java
new file mode 100644
index 0000000000..81fb6ff8bc
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/nether/VisceralHeapBiome.java
@@ -0,0 +1,65 @@
+package biomesoplenty.common.biome.nether;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.NetherBiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPConfiguredSurfaceBuilders;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPSurfaceBuilders;
+import net.minecraft.client.audio.BackgroundMusicTracks;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.particles.ParticleTypes;
+import net.minecraft.util.SoundEvents;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.carver.ConfiguredCarvers;
+import net.minecraft.world.gen.feature.Features;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class VisceralHeapBiome extends NetherBiomeTemplate
+{
+ public VisceralHeapBiome()
+ {
+ this.addWeight(BOPClimates.NETHER, 7);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.NONE).biomeCategory(Biome.Category.NETHER).depth(0.1F).scale(0.2F).temperature(2.0F).downfall(0.0F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(0x601F18).skyColor(calculateSkyColor(2.0F)).ambientParticle(new ParticleEffectAmbience(ParticleTypes.FALLING_LAVA, 0.001785F)).ambientLoopSound(SoundEvents.AMBIENT_NETHER_WASTES_LOOP).ambientMoodSound(new MoodSoundAmbience(SoundEvents.AMBIENT_SOUL_SAND_VALLEY_MOOD, 6000, 8, 2.0D)).ambientAdditionsSound(new SoundAdditionsAmbience(SoundEvents.AMBIENT_CRIMSON_FOREST_ADDITIONS, 0.0111D)).backgroundMusic(BackgroundMusicTracks.createGameMusic(SoundEvents.MUSIC_BIOME_CRIMSON_FOREST)).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(BOPConfiguredSurfaceBuilders.VISCERAL_HEAP);
+
+ //Terrain
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_NETHER);
+ builder.addStructureStart(StructureFeatures.NETHER_BRIDGE);
+ builder.addStructureStart(StructureFeatures.BASTION_REMNANT);
+ builder.addCarver(GenerationStage.Carving.AIR, ConfiguredCarvers.NETHER_CAVE);
+
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_DECORATION, Features.SPRING_OPEN);
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_DECORATION, Features.ORE_MAGMA);
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_DECORATION, Features.SPRING_CLOSED);
+
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_DECORATION, BOPConfiguredFeatures.FLESH_TENDON);
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_DECORATION, BOPConfiguredFeatures.BONE_SPINE);
+
+ DefaultBiomeFeatures.addNetherDefaultOres(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ //Entities
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.GHAST, 50, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIFIED_PIGLIN, 100, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.STRIDER, 60, 1, 2));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/nether/WitheredAbyssBiome.java b/src/main/java/biomesoplenty/common/biome/nether/WitheredAbyssBiome.java
new file mode 100644
index 0000000000..046196c8f7
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/nether/WitheredAbyssBiome.java
@@ -0,0 +1,57 @@
+package biomesoplenty.common.biome.nether;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.NetherBiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPConfiguredSurfaceBuilders;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPSurfaceBuilders;
+import net.minecraft.client.audio.BackgroundMusicTracks;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.particles.ParticleTypes;
+import net.minecraft.util.SoundEvents;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.carver.ConfiguredCarvers;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+
+public class WitheredAbyssBiome extends NetherBiomeTemplate
+{
+ public WitheredAbyssBiome()
+ {
+ this.addWeight(BOPClimates.NETHER, 3);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.NONE).biomeCategory(Biome.Category.NETHER).depth(0.1F).scale(0.2F).temperature(2.0F).downfall(0.0F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(0x09060F).skyColor(calculateSkyColor(2.0F)).ambientParticle(new ParticleEffectAmbience(ParticleTypes.SMOKE, 0.00357F)).ambientLoopSound(SoundEvents.AMBIENT_SOUL_SAND_VALLEY_LOOP).ambientMoodSound(new MoodSoundAmbience(SoundEvents.AMBIENT_SOUL_SAND_VALLEY_MOOD, 6000, 8, 2.0D)).backgroundMusic(BackgroundMusicTracks.createGameMusic(SoundEvents.MUSIC_BIOME_BASALT_DELTAS)).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(BOPConfiguredSurfaceBuilders.WITHERED_ABYSS);
+
+ //Terrain
+ builder.addStructureStart(StructureFeatures.NETHER_BRIDGE);
+ builder.addStructureStart(StructureFeatures.BASTION_REMNANT);
+ builder.addCarver(GenerationStage.Carving.AIR, ConfiguredCarvers.NETHER_CAVE);
+
+ //Decoration
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_DECORATION, BOPConfiguredFeatures.OBSIDIAN_SPLATTER);
+
+ DefaultBiomeFeatures.addNetherDefaultOres(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ //Entities
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 1, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITHER_SKELETON, 1, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/AlpsBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/AlpsBiome.java
new file mode 100644
index 0000000000..76d11d13bf
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/AlpsBiome.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPConfiguredSurfaceBuilders;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPSurfaceBuilders;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+
+public class AlpsBiome extends BiomeTemplate
+{
+ public AlpsBiome()
+ {
+ this.addWeight(BOPClimates.ICE_CAP, 5);
+ this.setBeachBiome(null);
+ this.setRiverBiome(null);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.SNOW).biomeCategory(Biome.Category.ICY).depth(7.5F).scale(0.2F).temperature(-0.25F).downfall(0.3F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(-0.25F)).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(BOPConfiguredSurfaceBuilders.DEEP_SNOW);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_MOUNTAIN);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+ DefaultBiomeFeatures.addDefaultSoftDisks(builder);
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addExtraEmeralds(builder);
+ DefaultBiomeFeatures.addInfestedStone(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.LLAMA, 5, 4, 6));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.STRAY, 80, 4, 4));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/AlpsFoothillsBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/AlpsFoothillsBiome.java
new file mode 100644
index 0000000000..388c888357
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/AlpsFoothillsBiome.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPConfiguredSurfaceBuilders;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class AlpsFoothillsBiome extends BiomeTemplate
+{
+ public AlpsFoothillsBiome()
+ {
+ this.setBeachBiome(null);
+ this.setRiverBiome(null);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.SNOW).biomeCategory(Biome.Category.ICY).depth(3.0F).scale(0.3F).temperature(-0.25F).downfall(0.3F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(-0.25F)).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(BOPConfiguredSurfaceBuilders.ALPS_FOOTHILLS);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_MOUNTAIN);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+ DefaultBiomeFeatures.addDefaultSoftDisks(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.ALPS_FOOTHILLS_TREES);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addExtraEmeralds(builder);
+ DefaultBiomeFeatures.addInfestedStone(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.LLAMA, 5, 4, 6));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.STRAY, 80, 4, 4));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/BambooBlossomGroveBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/BambooBlossomGroveBiome.java
new file mode 100644
index 0000000000..d4e7715df9
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/BambooBlossomGroveBiome.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.Features;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class BambooBlossomGroveBiome extends BiomeTemplate
+{
+ public BambooBlossomGroveBiome()
+ {
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.FOREST).depth(0.05F).scale(0.05F).temperature(0.6F).downfall(0.9F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(0.6F)).grassColorOverride(0x85CE71).foliageColorOverride(0x63BF66).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_STANDARD);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultLakes(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.BAMBOO_BLOSSOM_GROVE_TREES);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.CHERRY_BLOSSOM_GROVE_FLOWERS);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.CLOVER_3);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.LILAC_2);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.LILY_PAD_5);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.SHORT_BAMBOO_5);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_12);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.BROWN_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_SUGAR_CANE);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.RED_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.SEAGRASS_COLD);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.SHEEP, 12, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.PIG, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.CHICKEN, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.COW, 8, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.PANDA, 80, 1, 2));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/BayouBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/BayouBiome.java
new file mode 100644
index 0000000000..4d13d656d5
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/BayouBiome.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.biome.BOPBiomes;
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.*;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class BayouBiome extends BiomeTemplate
+{
+ public BayouBiome()
+ {
+ this.addWeight(BOPClimates.SUBTROPICAL, 10);
+ this.setBeachBiome(BOPBiomes.bayou_mangrove);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.SWAMP).depth(-0.3F).scale(0.0F).temperature(0.95F).downfall(0.9F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(0x62AF84).waterFogColor(0x0C211C).fogColor(12638463).skyColor(calculateSkyColor(0.95F)).grassColorOverride(0x6FAA50).foliageColorOverride(0x8BDB67).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_SWAMP);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultLakes(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+ DefaultBiomeFeatures.addSwampClayDisk(builder);
+
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES, BOPConfiguredFeatures.MUD_DISK);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.BAYOU_TREES);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.CATTAIL_6);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.FERN_GRASS_8);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.LARGE_FERN_7);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.LILY_PAD_10);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.TALL_GRASS_6);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.BROWN_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_SUGAR_CANE);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.RED_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.SEAGRASS_SWAMP);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 1, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/BayouMangroveBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/BayouMangroveBiome.java
new file mode 100644
index 0000000000..4c7ba3ad81
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/BayouMangroveBiome.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPConfiguredSurfaceBuilders;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.Features;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+
+public class BayouMangroveBiome extends BiomeTemplate
+{
+ public BayouMangroveBiome()
+ {
+ this.setBeachBiome(null);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.SWAMP).depth(-0.175F).scale(-0.075F).temperature(0.95F).downfall(0.9F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(0x62AF84).waterFogColor(0x0C211C).fogColor(12638463).skyColor(calculateSkyColor(0.95F)).grassColorOverride(0x6FAA50).foliageColorOverride(0x8BDB67).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(BOPConfiguredSurfaceBuilders.MANGROVE);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_SWAMP);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultLakes(builder);
+
+ builder.addFeature(GenerationStage.Decoration.LAKES, BOPConfiguredFeatures.WATER_LAKE_COMMON);
+
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.MANGROVE_ROOTS);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.SPROUTS_75);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_12);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.SEAGRASS_RIVER);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.WATER_AMBIENT, new MobSpawnInfo.Spawners(EntityType.COD, 10, 3, 6));
+ builder.addSpawn(EntityClassification.WATER_AMBIENT, new MobSpawnInfo.Spawners(EntityType.TROPICAL_FISH, 5, 8, 8));
+ builder.addSpawn(EntityClassification.WATER_CREATURE, new MobSpawnInfo.Spawners(EntityType.SQUID, 5, 4, 4));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/BurntForestBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/BurntForestBiome.java
new file mode 100644
index 0000000000..9524f01dad
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/BurntForestBiome.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.biome.BOPBiomes;
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPConfiguredSurfaceBuilders;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.particles.ParticleTypes;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.Features;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+
+public class BurntForestBiome extends BiomeTemplate
+{
+ public BurntForestBiome()
+ {
+ this.setBeachBiome(BOPBiomes.gravel_beach);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.TAIGA).depth(0.1F).scale(0.1F).temperature(0.3F).downfall(0.3F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(0.3F)).grassColorOverride(0x514F46).foliageColorOverride(0xB7B763).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_STANDARD);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+
+ builder.addFeature(GenerationStage.Decoration.LAKES, Features.LAKE_LAVA);
+
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.BURNT_FOREST_TREES);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.BLACK_SAND_SPLATTER);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.DEAD_GRASS_25);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_3);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/CherryBlossomGroveBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/CherryBlossomGroveBiome.java
new file mode 100644
index 0000000000..c82e74089a
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/CherryBlossomGroveBiome.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.*;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class CherryBlossomGroveBiome extends BiomeTemplate
+{
+ public CherryBlossomGroveBiome()
+ {
+ this.addWeight(BOPClimates.COOL_TEMPERATE, 1);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.FOREST).depth(-0.1F).scale(0.1F).temperature(0.6F).downfall(0.9F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(0.6F)).grassColorOverride(0x85CE71).foliageColorOverride(0x63BF66).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultLakes(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.CHERRY_BLOSSOM_GROVE_TREES);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.CHERRY_BLOSSOM_GROVE_FLOWERS);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.CLOVER_3);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.LILAC_4);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.PEONY_1);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_12);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.BROWN_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_SUGAR_CANE);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.RED_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.SEAGRASS_COLD);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.SHEEP, 12, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.PIG, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.CHICKEN, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.COW, 8, 4, 4));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/ColdDesertBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/ColdDesertBiome.java
new file mode 100644
index 0000000000..1d27e5d817
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/ColdDesertBiome.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPConfiguredSurfaceBuilders;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.Features;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+
+public class ColdDesertBiome extends BiomeTemplate
+{
+ public ColdDesertBiome()
+ {
+ this.addWeight(BOPClimates.ICE_CAP, 7);
+ this.setBeachBiome(null);
+ this.setRiverBiome(null);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.NONE).biomeCategory(Biome.Category.ICY).depth(0.0F).scale(-0.075F).temperature(0.25F).downfall(0.0F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(0.25F)).grassColorOverride(0xAD9364).foliageColorOverride(0xB5A76C).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(BOPConfiguredSurfaceBuilders.COLD_DESERT);
+
+ // Structures
+ builder.addStructureStart(StructureFeatures.VILLAGE_SNOWY);
+ builder.addStructureStart(StructureFeatures.PILLAGER_OUTPOST);
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_STANDARD);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+
+ builder.addFeature(GenerationStage.Decoration.LAKES, Features.LAKE_LAVA);
+
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+ DefaultBiomeFeatures.addDefaultSoftDisks(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.WASTELAND_GRASS_1);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.POLAR_BEAR, 1, 1, 2));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.STRAY, 80, 4, 4));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/ConiferousForestBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/ConiferousForestBiome.java
new file mode 100644
index 0000000000..3b4977cd30
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/ConiferousForestBiome.java
@@ -0,0 +1,101 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.biome.BOPBiomes;
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import biomesoplenty.init.ModEntities;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.*;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class ConiferousForestBiome extends BiomeTemplate
+{
+ public ConiferousForestBiome()
+ {
+ this.addWeight(BOPClimates.WET_BOREAL, 10);
+ this.setBeachBiome(BOPBiomes.gravel_beach);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.TAIGA).depth(0.2F).scale(0.1F).temperature(0.45F).downfall(0.5F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(0.45F)).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_STANDARD);
+
+ builder.addStructureStart(StructureFeatures.VILLAGE_TAIGA);
+ builder.addStructureStart(StructureFeatures.PILLAGER_OUTPOST);
+ builder.addStructureStart(StructureFeatures.WOODLAND_MANSION);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+
+ builder.addFeature(GenerationStage.Decoration.LAKES, Features.LAKE_WATER);
+
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+ DefaultBiomeFeatures.addDefaultSoftDisks(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.CONIFEROUS_FOREST_TREES);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.CONIFEROUS_FOREST_FLOWERS);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.FERN_GRASS_4);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.TOADSTOOL_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.BROWN_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_BERRY_SPARSE);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_PUMPKIN);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.RED_MUSHROOM_NORMAL);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.RABBIT, 4, 2, 3));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.WOLF, 5, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.FOX, 8, 2, 4));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/ConiferousLakesBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/ConiferousLakesBiome.java
new file mode 100644
index 0000000000..1d8ea002be
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/ConiferousLakesBiome.java
@@ -0,0 +1,102 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.biome.BOPBiomes;
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPConfiguredSurfaceBuilders;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPSurfaceBuilders;
+import biomesoplenty.init.ModEntities;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.Features;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class ConiferousLakesBiome extends BiomeTemplate
+{
+ public ConiferousLakesBiome()
+ {
+ this.setBeachBiome(BOPBiomes.gravel_beach);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.TAIGA).depth(-0.3F).scale(0.2F).temperature(0.45F).downfall(0.5F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(0.45F)).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(BOPConfiguredSurfaceBuilders.EXPOSED_STONE);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_STANDARD);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+
+ builder.addFeature(GenerationStage.Decoration.LAKES, Features.LAKE_WATER);
+
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES, BOPConfiguredFeatures.GRAVEL_DISK_EXTRA);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.CONIFEROUS_LAKES_TREES);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.CONIFEROUS_FOREST_FLOWERS);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.FERN_GRASS_4);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.REED_5);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.TOADSTOOL_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.WATERGRASS_5);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.BROWN_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_BERRY_SPARSE);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_PUMPKIN);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.RED_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.SEAGRASS_RIVER);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.RABBIT, 4, 2, 3));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.WOLF, 5, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.FOX, 8, 2, 4));
+ builder.addSpawn(EntityClassification.WATER_AMBIENT, new MobSpawnInfo.Spawners(EntityType.SALMON, 5, 1, 5));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/DeadForestBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/DeadForestBiome.java
new file mode 100644
index 0000000000..ae33534e6d
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/DeadForestBiome.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.biome.BOPBiomes;
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.*;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class DeadForestBiome extends BiomeTemplate
+{
+ public DeadForestBiome()
+ {
+ this.addWeight(BOPClimates.DRY_BOREAL, 3);
+ this.setBeachBiome(BOPBiomes.gravel_beach);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.TAIGA).depth(0.2F).scale(0.2F).temperature(0.3F).downfall(0.3F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(0.3F)).grassColorOverride(0xBAAD64).foliageColorOverride(0xB7B763).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ builder.addStructureStart(StructureFeatures.WOODLAND_MANSION);
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_STANDARD);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultLakes(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+ DefaultBiomeFeatures.addDefaultSoftDisks(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.DEAD_FOREST_TREES);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_3);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_PUMPKIN);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/DeepBayouBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/DeepBayouBiome.java
new file mode 100644
index 0000000000..ca54e1671f
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/DeepBayouBiome.java
@@ -0,0 +1,99 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.biome.BOPBiomes;
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.Features;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class DeepBayouBiome extends BiomeTemplate
+{
+ public DeepBayouBiome()
+ {
+ this.setBeachBiome(BOPBiomes.bayou_mangrove);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.SWAMP).depth(-0.315F).scale(-0.05F).temperature(0.95F).downfall(0.9F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(0x62AF84).waterFogColor(0x0C211C).fogColor(12638463).skyColor(calculateSkyColor(0.95F)).grassColorOverride(0x6FAA50).foliageColorOverride(0x8BDB67).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_SWAMP);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultLakes(builder);
+
+ builder.addFeature(GenerationStage.Decoration.LAKES, BOPConfiguredFeatures.WATER_LAKE_UNCOMMON);
+
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+ DefaultBiomeFeatures.addSwampClayDisk(builder);
+
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES, BOPConfiguredFeatures.MUD_DISK);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.DEEP_BAYOU_TREES);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.CATTAIL_24);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.DEEP_BAYOU_VINES);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.FERN_GRASS_16);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.LARGE_FERN_14);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.LILY_PAD_15);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.TALL_GRASS_12);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.BROWN_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_SUGAR_CANE);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.RED_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.SEAGRASS_SWAMP);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 1, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/DenseMarshBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/DenseMarshBiome.java
new file mode 100644
index 0000000000..3375ed4f04
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/DenseMarshBiome.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPConfiguredSurfaceBuilders;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.Features;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+
+public class DenseMarshBiome extends BiomeTemplate
+{
+ public DenseMarshBiome()
+ {
+ this.setBeachBiome(null);
+ this.setRiverBiome(null);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.SWAMP).depth(-0.15F).scale(-0.05F).temperature(0.65F).downfall(0.7F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(0.65F)).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(BOPConfiguredSurfaceBuilders.MARSH);
+
+ // Structures
+ builder.addStructureStart(StructureFeatures.SWAMP_HUT);
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_SWAMP);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+
+ builder.addFeature(GenerationStage.Decoration.LAKES, BOPConfiguredFeatures.WATER_LAKE_UNCOMMON);
+
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.SCRUB_EXTRA);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.REED_100);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_12);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.TALL_GRASS_250);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.WATERGRASS_250);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.SEAGRASS_SWAMP);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entity spawning
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/DenseWoodlandBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/DenseWoodlandBiome.java
new file mode 100644
index 0000000000..29f6d686e7
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/DenseWoodlandBiome.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.Features;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+
+public class DenseWoodlandBiome extends BiomeTemplate
+{
+ public DenseWoodlandBiome()
+ {
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.FOREST).depth(0.2F).scale(0.15F).temperature(0.8F).downfall(0.5F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(0.8F)).grassColorOverride(0xA7C047).foliageColorOverride(0x92AF1A).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_STANDARD);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultLakes(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+ DefaultBiomeFeatures.addDefaultSoftDisks(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.DENSE_WOODLAND_TREES);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.GROVE_FLOWERS);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.GOLDENROD_2);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.HUGE_TOADSTOOL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.ROSE_BUSH_2);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.SMALL_TOADSTOOL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_12);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.TALL_GRASS_12);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.TOADSTOOL_EXTRA);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.BROWN_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_PUMPKIN);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.RED_MUSHROOM_NORMAL);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.SHEEP, 12, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.PIG, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.CHICKEN, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.COW, 8, 4, 4));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/DryBoneyardBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/DryBoneyardBiome.java
new file mode 100644
index 0000000000..6c8e8237f8
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/DryBoneyardBiome.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPConfiguredSurfaceBuilders;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPSurfaceBuilders;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.Features;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class DryBoneyardBiome extends BiomeTemplate
+{
+ public DryBoneyardBiome()
+ {
+ this.setRiverBiome(null);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.NONE).biomeCategory(Biome.Category.SAVANNA).depth(0.1F).scale(0.1F).temperature(0.85F).downfall(0.05F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(0x9E9DFF).grassColorOverride(0xE5DFA9).foliageColorOverride(0xDAE0B3).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(BOPConfiguredSurfaceBuilders.DRYLAND);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_STANDARD);
+ builder.addStructureStart(StructureFeatures.NETHER_FOSSIL);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.DRY_BONEYARD_TREES);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.BONE_SPINE);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.BUSH_5);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.DEAD_GRASS_5);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_6);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/DrylandBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/DrylandBiome.java
new file mode 100644
index 0000000000..a090776a03
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/DrylandBiome.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.biome.BOPBiomes;
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPConfiguredSurfaceBuilders;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPSurfaceBuilders;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class DrylandBiome extends BiomeTemplate
+{
+ public DrylandBiome()
+ {
+ this.addWeight(BOPClimates.SAVANNA, 3);
+ this.setRiverBiome(null);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.NONE).biomeCategory(Biome.Category.SAVANNA).depth(0.1F).scale(0.1F).temperature(0.85F).downfall(0.05F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(0x9E9DFF).grassColorOverride(0xE5DFA9).foliageColorOverride(0xDAE0B3).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(BOPConfiguredSurfaceBuilders.DRYLAND);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_STANDARD);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.DRYLAND_TREES);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.BUSH_10);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_6);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/FirClearingBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/FirClearingBiome.java
new file mode 100644
index 0000000000..6463d345e7
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/FirClearingBiome.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.biome.BOPBiomes;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import biomesoplenty.init.ModEntities;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.*;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class FirClearingBiome extends BiomeTemplate
+{
+ public FirClearingBiome()
+ {
+ this.setBeachBiome(BOPBiomes.gravel_beach);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.TAIGA).depth(0.2F).scale(0.1F).temperature(0.45F).downfall(0.5F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(0.45F)).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_STANDARD);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+
+ builder.addFeature(GenerationStage.Decoration.LAKES, Features.LAKE_WATER);
+
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+ DefaultBiomeFeatures.addDefaultSoftDisks(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.FIR_CLEARING_TREES);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.CONIFEROUS_FOREST_FLOWERS);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.FERN_GRASS_8);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.TOADSTOOL_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.BROWN_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_BERRY_SPARSE);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_PUMPKIN);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.RED_MUSHROOM_NORMAL);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.RABBIT, 4, 2, 3));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.WOLF, 5, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.FOX, 8, 2, 4));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/FlowerMeadowBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/FlowerMeadowBiome.java
new file mode 100644
index 0000000000..aefaa95434
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/FlowerMeadowBiome.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.biome.BOPBiomes;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class FlowerMeadowBiome extends BiomeTemplate
+{
+ public FlowerMeadowBiome()
+ {
+ this.setBeachBiome(BOPBiomes.gravel_beach);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.TAIGA).depth(0.0F).scale(0.0F).temperature(0.4F).downfall(0.7F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(0.4F)).grassColorOverride(0x63B26D).foliageColorOverride(0x63B26D).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_STANDARD);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.FLOWER_MEADOW_TREES);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.FLOWER_MEADOW_FLOWERS);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.LILAC_2);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.ROSE_BUSH_2);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.SPROUTS_5);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_24);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.SUNFLOWER_1);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.FOX, 8, 2, 4));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/FungalFieldBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/FungalFieldBiome.java
new file mode 100644
index 0000000000..495705b5aa
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/FungalFieldBiome.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.Features;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+
+public class FungalFieldBiome extends BiomeTemplate
+{
+ public FungalFieldBiome()
+ {
+ this.setBeachBiome(null);
+ this.setGrassColorFunction(this::getGrassColor);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.JUNGLE).depth(0.1F).scale(0.0F).temperature(0.9F).downfall(0.9F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4445678).waterFogColor(270131).fogColor(12638463).skyColor(calculateSkyColor(0.9F)).grassColorOverride(0x4AA2F9).foliageColorOverride(0x4ADCF9).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.FERN_GRASS_16);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.GLOWSHROOM_UNCOMMON);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.LARGE_FERN_14);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.SMALL_GLOWSHROOM_UNCOMMON);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.TALL_GRASS_64);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.BROWN_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.RED_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.SEAGRASS_SWAMP);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.MOOSHROOM, 8, 4, 8));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+
+ public int getGrassColor(double x, double z)
+ {
+ double d0 = Biome.BIOME_INFO_NOISE.getValue(x * 0.0225D, z * 0.0225D, false);
+ return d0 < -0.1D ? 0x4AA2F9 : 0x4DD6CA;
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/FungalJungleBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/FungalJungleBiome.java
new file mode 100644
index 0000000000..4948e8c4e5
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/FungalJungleBiome.java
@@ -0,0 +1,99 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.*;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class FungalJungleBiome extends BiomeTemplate
+{
+ public FungalJungleBiome()
+ {
+ this.addWeight(BOPClimates.TROPICAL, 1);
+ this.setBeachBiome(null);
+ this.setGrassColorFunction(this::getGrassColor);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.JUNGLE).depth(0.15F).scale(0.1F).temperature(0.9F).downfall(0.9F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4445678).waterFogColor(270131).fogColor(12638463).skyColor(calculateSkyColor(0.9F)).grassColorOverride(0x4AA2F9).foliageColorOverride(0x4ADCF9).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.FUNGAL_JUNGLE_TREES);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.FERN_GRASS_16);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.GLOWSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.HUGE_GLOWSHROOM);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.LARGE_FERN_7);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.MYCELIUM_SPLATTER);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.SMALL_GLOWSHROOM);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.TALL_GRASS_12);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.BROWN_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.RED_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.SEAGRASS_SWAMP);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.MOOSHROOM, 8, 4, 8));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+
+ public int getGrassColor(double x, double z)
+ {
+ double d0 = Biome.BIOME_INFO_NOISE.getValue(x * 0.0225D, z * 0.0225D, false);
+ return d0 < -0.1D ? 0x4AA2F9 : 0x4DD6CA;
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/GoldenPrairieBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/GoldenPrairieBiome.java
new file mode 100644
index 0000000000..df77c1d3a0
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/GoldenPrairieBiome.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class GoldenPrairieBiome extends BiomeTemplate
+{
+ public GoldenPrairieBiome() {}
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.PLAINS).depth(0.0F).scale(-0.1F).temperature(0.8F).downfall(0.3F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(0.8F)).grassColorOverride(0xE4EA77).foliageColorOverride(0xC7E672).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.BARLEY);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_24);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.TALL_GRASS_64);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/GrasslandBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/GrasslandBiome.java
new file mode 100644
index 0000000000..c54d80beff
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/GrasslandBiome.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.biome.BOPBiomes;
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.Features;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+
+public class GrasslandBiome extends BiomeTemplate
+{
+ public GrasslandBiome()
+ {
+ this.addWeight(BOPClimates.COOL_TEMPERATE, 3);
+ this.setBeachBiome(BOPBiomes.gravel_beach);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.PLAINS).depth(0.1F).scale(0.2F).temperature(0.6F).downfall(0.7F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(0.6F)).grassColorOverride(0x88C57F).foliageColorOverride(0x6AB66F).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ builder.addStructureStart(StructureFeatures.VILLAGE_PLAINS);
+ builder.addStructureStart(StructureFeatures.PILLAGER_OUTPOST);
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_STANDARD);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultLakes(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.CLOVER_6);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_3);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_SUGAR_CANE_DESERT);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.SHEEP, 12, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.PIG, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.CHICKEN, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.COW, 8, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.HORSE, 5, 2, 6));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.DONKEY, 1, 1, 3));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/GrasslandCloverPatchBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/GrasslandCloverPatchBiome.java
new file mode 100644
index 0000000000..5a661ff407
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/GrasslandCloverPatchBiome.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.biome.BOPBiomes;
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.Features;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+
+public class GrasslandCloverPatchBiome extends BiomeTemplate
+{
+ public GrasslandCloverPatchBiome()
+ {
+ this.setBeachBiome(BOPBiomes.gravel_beach);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.PLAINS).depth(0.0F).scale(0.1F).temperature(0.6F).downfall(0.7F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(0.6F)).grassColorOverride(0x88C57F).foliageColorOverride(0x6AB66F).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_STANDARD);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.CLOVER_PATCH_FLOWERS);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.CLOVER_250);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.HUGE_CLOVER);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_3);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.SHEEP, 12, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.PIG, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.CHICKEN, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.COW, 8, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.HORSE, 5, 2, 6));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.DONKEY, 1, 1, 3));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/GravelBeachBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/GravelBeachBiome.java
new file mode 100644
index 0000000000..c973958bc6
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/GravelBeachBiome.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPConfiguredSurfaceBuilders;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class GravelBeachBiome extends BiomeTemplate
+{
+ public GravelBeachBiome()
+ {
+ this.setBeachBiome(null);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.BEACH).depth(0.0F).scale(0.025F).temperature(0.6F).downfall(0.5F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(0.6F)).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(BOPConfiguredSurfaceBuilders.GRAVEL_FULL);
+
+ // Structures
+ builder.addStructureStart(StructureFeatures.MINESHAFT);
+ builder.addStructureStart(StructureFeatures.BURIED_TREASURE);
+ builder.addStructureStart(StructureFeatures.SHIPWRECH_BEACHED);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_STANDARD);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultLakes(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+ DefaultBiomeFeatures.addDefaultSoftDisks(builder);
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/GroveBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/GroveBiome.java
new file mode 100644
index 0000000000..728b1b7ae8
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/GroveBiome.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPConfiguredSurfaceBuilders;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPSurfaceBuilders;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.*;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class GroveBiome extends BiomeTemplate
+{
+ public GroveBiome()
+ {
+ this.addWeight(BOPClimates.MEDITERRANEAN, 10);
+ this.setBeachBiome(null);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.FOREST).depth(0.5F).scale(0.3F).temperature(0.8F).downfall(0.275F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4566514).waterFogColor(267827).fogColor(12638463).skyColor(calculateSkyColor(0.8F)).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(BOPConfiguredSurfaceBuilders.PODZOL_MIXED);
+
+ // Structures
+ builder.addStructureStart(StructureFeatures.VILLAGE_PLAINS);
+ builder.addStructureStart(StructureFeatures.PILLAGER_OUTPOST);
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_STANDARD);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultLakes(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+ DefaultBiomeFeatures.addDefaultSoftDisks(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.GROVE_TREES);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.GROVE_FLOWERS);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.BUSH_15);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.PEONY_1);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_3);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_PUMPKIN);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.SHEEP, 12, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.PIG, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.CHICKEN, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.COW, 8, 4, 4));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/GroveClearingBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/GroveClearingBiome.java
new file mode 100644
index 0000000000..d2ccde85dd
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/GroveClearingBiome.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPSurfaceBuilders;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.Features;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class GroveClearingBiome extends BiomeTemplate
+{
+ public GroveClearingBiome()
+ {
+ this.setBeachBiome(null);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.FOREST).depth(0.2F).scale(0.1F).temperature(0.8F).downfall(0.275F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4566514).waterFogColor(267827).fogColor(12638463).skyColor(calculateSkyColor(0.8F)).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ builder.addStructureStart(StructureFeatures.VILLAGE_PLAINS);
+ builder.addStructureStart(StructureFeatures.PILLAGER_OUTPOST);
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_STANDARD);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultLakes(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+ DefaultBiomeFeatures.addDefaultSoftDisks(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.GROVE_CLEARING_TREES);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.GROVE_FLOWERS);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.BUSH_15);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.PEONY_1);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_6);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_PUMPKIN);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.SHEEP, 12, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.PIG, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.CHICKEN, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.COW, 8, 4, 4));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/GroveLakesBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/GroveLakesBiome.java
new file mode 100644
index 0000000000..c502b0019a
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/GroveLakesBiome.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPConfiguredSurfaceBuilders;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPSurfaceBuilders;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.Features;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class GroveLakesBiome extends BiomeTemplate
+{
+ public GroveLakesBiome()
+ {
+ this.setBeachBiome(null);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.FOREST).depth(-0.5F).scale(0.0F).temperature(0.8F).downfall(0.275F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4566514).waterFogColor(267827).fogColor(12638463).skyColor(calculateSkyColor(0.8F)).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(BOPConfiguredSurfaceBuilders.GROVE_LAKES);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_OCEAN);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultLakes(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES, Features.ORE_DIORITE);
+
+ DefaultBiomeFeatures.addDefaultOres(builder);
+
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES, BOPConfiguredFeatures.DIORITE_DISK);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.BUSH_15);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_3);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_PUMPKIN);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/HighlandBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/HighlandBiome.java
new file mode 100644
index 0000000000..e04a41c38c
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/HighlandBiome.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class HighlandBiome extends BiomeTemplate
+{
+ public HighlandBiome()
+ {
+ this.addWeight(BOPClimates.COOL_TEMPERATE, 5);
+ this.setBeachBiome(null);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.EXTREME_HILLS).depth(2.3F).scale(0.2F).temperature(0.6F).downfall(0.6F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(0.6F)).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_MOUNTAIN);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultLakes(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+ DefaultBiomeFeatures.addDefaultSoftDisks(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_12);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.TALL_GRASS_24);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addExtraEmeralds(builder);
+ DefaultBiomeFeatures.addInfestedStone(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.SHEEP, 12, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.PIG, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.CHICKEN, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.COW, 8, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.LLAMA, 5, 4, 6));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/HighlandCragBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/HighlandCragBiome.java
new file mode 100644
index 0000000000..b8ecc5bfad
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/HighlandCragBiome.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPConfiguredSurfaceBuilders;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPSurfaceBuilders;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class HighlandCragBiome extends BiomeTemplate
+{
+ public HighlandCragBiome()
+ {
+ this.setBeachBiome(null);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.EXTREME_HILLS).depth(3.0F).scale(0.7F).temperature(0.6F).downfall(0.6F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(0.6F)).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(BOPConfiguredSurfaceBuilders.HIGHLAND_CRAG);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_MOUNTAIN);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultLakes(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+ DefaultBiomeFeatures.addDefaultSoftDisks(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.CRAG_SPLATTER);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_12);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.TALL_GRASS_24);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addExtraEmeralds(builder);
+ DefaultBiomeFeatures.addInfestedStone(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.LLAMA, 5, 4, 6));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/HighlandMoorBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/HighlandMoorBiome.java
new file mode 100644
index 0000000000..8fc47668a9
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/HighlandMoorBiome.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.*;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class HighlandMoorBiome extends BiomeTemplate
+{
+ public HighlandMoorBiome()
+ {
+ this.setBeachBiome(null);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.PLAINS).depth(1.8F).scale(-0.05F).temperature(0.6F).downfall(0.6F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(0.6F)).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_MOUNTAIN);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+
+ builder.addFeature(GenerationStage.Decoration.LAKES, BOPConfiguredFeatures.WATER_LAKE_COMMON);
+
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+ DefaultBiomeFeatures.addSwampClayDisk(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.MOOR_FLOWERS);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.MOOR_FLOWERS_2);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.SCRUB_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_12);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.TALL_GRASS_6);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.BROWN_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.RED_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.SEAGRASS_RIVER);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addExtraEmeralds(builder);
+ DefaultBiomeFeatures.addInfestedStone(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.SHEEP, 12, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.PIG, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.CHICKEN, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.COW, 8, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.LLAMA, 5, 4, 6));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/JadeCliffsBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/JadeCliffsBiome.java
new file mode 100644
index 0000000000..fcc108d268
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/JadeCliffsBiome.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPConfiguredSurfaceBuilders;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPSurfaceBuilders;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.Features;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class JadeCliffsBiome extends BiomeTemplate
+{
+ public JadeCliffsBiome()
+ {
+ this.addWeight(BOPClimates.WARM_TEMPERATE, 1);
+ this.setBeachBiome(null);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.FOREST).depth(2.0F).scale(1.15F).temperature(0.8F).downfall(0.85F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(0xBBD1D5).skyColor(0xB7CCAD).grassColorOverride(0x7CA568).foliageColorOverride(0x8BB76E).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(BOPConfiguredSurfaceBuilders.DEEP_GRASS);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_MOUNTAIN);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+ DefaultBiomeFeatures.addDefaultSoftDisks(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.JADE_CLIFFS_TREES);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_6);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_SUGAR_CANE);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addExtraEmeralds(builder);
+ DefaultBiomeFeatures.addInfestedStone(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/LavenderFieldBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/LavenderFieldBiome.java
new file mode 100644
index 0000000000..4f39f33c35
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/LavenderFieldBiome.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.*;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class LavenderFieldBiome extends BiomeTemplate
+{
+ public LavenderFieldBiome()
+ {
+ this.addWeight(BOPClimates.MEDITERRANEAN, 3);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.PLAINS).depth(0.0F).scale(0.05F).temperature(0.8F).downfall(0.7F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(0.8F)).grassColorOverride(0xA1C36D).foliageColorOverride(0xA1C36D).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultLakes(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.LAVENDER_FIELD_TREES);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.LAVENDER_FLOWERS);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_12);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_SUGAR_CANE);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.SHEEP, 12, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.PIG, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.CHICKEN, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.COW, 8, 4, 4));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/LavenderForestBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/LavenderForestBiome.java
new file mode 100644
index 0000000000..314d85ec09
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/LavenderForestBiome.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.Features;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class LavenderForestBiome extends BiomeTemplate
+{
+ public LavenderForestBiome()
+ {
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.PLAINS).depth(0.1F).scale(0.1F).temperature(0.8F).downfall(0.7F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(0.8F)).grassColorOverride(0xA1C36D).foliageColorOverride(0xA1C36D).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultLakes(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.LAVENDER_FOREST_TREES);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.LAVENDER_FLOWERS);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_24);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_SUGAR_CANE);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.SHEEP, 12, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.PIG, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.CHICKEN, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.COW, 8, 4, 4));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/LushDesertBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/LushDesertBiome.java
new file mode 100644
index 0000000000..65a2bc3011
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/LushDesertBiome.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.biome.BOPBiomes;
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPConfiguredSurfaceBuilders;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPSurfaceBuilders;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.Features;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class LushDesertBiome extends BiomeTemplate
+{
+ public LushDesertBiome()
+ {
+ this.addWeight(BOPClimates.SAVANNA, 1);
+ this.setBeachBiome(null);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.DESERT).depth(0.6F).scale(0.6F).temperature(0.9F).downfall(0.5F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4566514).waterFogColor(267827).fogColor(12638463).skyColor(calculateSkyColor(0.9F)).grassColorOverride(0xEFE182).foliageColorOverride(0xD3D156).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(BOPConfiguredSurfaceBuilders.LUSH_DESERT);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_DESERT);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultLakes(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+ DefaultBiomeFeatures.addDefaultSoftDisks(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.LUSH_DESERT_TREES);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.LUSH_DESERT_FLOWERS);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.DEAD_GRASS_2);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.DESERT_GRASS_10);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.DUNE_GRASS_128);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.SPROUTS_5);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_DEAD_BUSH_2);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_SUGAR_CANE);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.WATER_SPRING_EXTRA);
+
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.RABBIT, 4, 2, 3));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.HUSK, 80, 4, 4));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/LushSavannaBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/LushSavannaBiome.java
new file mode 100644
index 0000000000..5dea12e2dd
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/LushSavannaBiome.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPConfiguredSurfaceBuilders;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPSurfaceBuilders;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.Features;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class LushSavannaBiome extends BiomeTemplate
+{
+ public LushSavannaBiome()
+ {
+ this.setBeachBiome(null);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.DESERT).depth(0.25F).scale(0.1F).temperature(0.9F).downfall(0.5F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4566514).waterFogColor(267827).fogColor(12638463).skyColor(calculateSkyColor(0.9F)).grassColorOverride(0xEFE182).foliageColorOverride(0xD3D156).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(BOPConfiguredSurfaceBuilders.LUSH_SAVANNA);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultLakes(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+ DefaultBiomeFeatures.addDefaultSoftDisks(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.POPPY_FLOWERS);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.ROSE_BUSH_15);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.SPROUTS_50);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_24);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.TALL_GRASS_24);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_SUGAR_CANE);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.WATER_SPRING_EXTRA);
+
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.RABBIT, 4, 2, 3));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.DONKEY, 1, 1, 3));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.HUSK, 80, 4, 4));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/MarshBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/MarshBiome.java
new file mode 100644
index 0000000000..c6ea3acd0f
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/MarshBiome.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPConfiguredSurfaceBuilders;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPSurfaceBuilders;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.*;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class MarshBiome extends BiomeTemplate
+{
+ public MarshBiome()
+ {
+ this.addWeight(BOPClimates.COOL_TEMPERATE, 7);
+ this.setBeachBiome(null);
+ this.setRiverBiome(null);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.SWAMP).depth(-0.15F).scale(-0.05F).temperature(0.65F).downfall(0.7F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(0.65F)).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(BOPConfiguredSurfaceBuilders.MARSH);
+
+ // Structures
+ builder.addStructureStart(StructureFeatures.SWAMP_HUT);
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_SWAMP);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+
+ builder.addFeature(GenerationStage.Decoration.LAKES, BOPConfiguredFeatures.WATER_LAKE_COMMON);
+
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.REED_10);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_12);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.TALL_GRASS_250);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.WATERGRASS_50);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.SEAGRASS_SWAMP);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entity spawning
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/MeadowBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/MeadowBiome.java
new file mode 100644
index 0000000000..3f421ab44d
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/MeadowBiome.java
@@ -0,0 +1,103 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.biome.BOPBiomes;
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.*;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class MeadowBiome extends BiomeTemplate
+{
+ public MeadowBiome()
+ {
+ this.addWeight(BOPClimates.WET_BOREAL, 7);
+ this.setBeachBiome(BOPBiomes.gravel_beach);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.TAIGA).depth(0.0F).scale(0.05F).temperature(0.4F).downfall(0.7F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(0.4F)).grassColorOverride(0x63B26D).foliageColorOverride(0x63B26D).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ builder.addStructureStart(StructureFeatures.VILLAGE_TAIGA);
+ builder.addStructureStart(StructureFeatures.PILLAGER_OUTPOST);
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_STANDARD);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultLakes(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+ DefaultBiomeFeatures.addDefaultSoftDisks(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.MEADOW_TREES);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.MEADOW_FLOWERS);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.MEADOW_FLOWERS_2);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.LILAC_1);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.ROSE_BUSH_1);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.SPROUTS_10);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_6);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.SUNFLOWER_1);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.BROWN_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_BERRY_SPARSE);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_PUMPKIN);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.RED_MUSHROOM_NORMAL);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.RABBIT, 4, 2, 3));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.SHEEP, 12, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.PIG, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.CHICKEN, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.COW, 8, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.FOX, 8, 2, 4));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/MeadowForestBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/MeadowForestBiome.java
new file mode 100644
index 0000000000..6f284d1ce1
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/MeadowForestBiome.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.biome.BOPBiomes;
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.Features;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class MeadowForestBiome extends BiomeTemplate
+{
+ public MeadowForestBiome()
+ {
+ this.setBeachBiome(BOPBiomes.gravel_beach);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.TAIGA).depth(0.0F).scale(0.05F).temperature(0.4F).downfall(0.7F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(0.4F)).grassColorOverride(0x63B26D).foliageColorOverride(0x63B26D).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ builder.addStructureStart(StructureFeatures.VILLAGE_TAIGA);
+ builder.addStructureStart(StructureFeatures.PILLAGER_OUTPOST);
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_STANDARD);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultLakes(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+ DefaultBiomeFeatures.addDefaultSoftDisks(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.MEADOW_FOREST_TREES);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.MEADOW_FLOWERS);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.LILAC_1);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.ROSE_BUSH_1);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.SPROUTS_15);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_6);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.BROWN_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_BERRY_SPARSE);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_PUMPKIN);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.RED_MUSHROOM_NORMAL);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.RABBIT, 4, 2, 3));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.SHEEP, 12, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.PIG, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.CHICKEN, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.COW, 8, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.FOX, 8, 2, 4));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/MuskegBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/MuskegBiome.java
new file mode 100644
index 0000000000..618c5d7524
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/MuskegBiome.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPSurfaceBuilders;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.*;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class MuskegBiome extends BiomeTemplate
+{
+ public MuskegBiome()
+ {
+ this.addWeight(BOPClimates.ICE_CAP, 1);
+ this.setBeachBiome(null);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.SNOW).biomeCategory(Biome.Category.ICY).depth(-0.175F).scale(-0.05F).temperature(-0.25F).downfall(0.6F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(-0.25F)).grassColorOverride(0x94966E).foliageColorOverride(0x8D9B6B).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ builder.addStructureStart(StructureFeatures.SWAMP_HUT);
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_SWAMP);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultLakes(builder);
+
+ builder.addFeature(GenerationStage.Decoration.LAKES, BOPConfiguredFeatures.WATER_LAKE_UNCOMMON);
+
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES, Features.DISK_CLAY);
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES, Features.DISK_GRAVEL);
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES, BOPConfiguredFeatures.MUD_DISK);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.MUSKEG_TREES);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_1);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 1, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/MysticGroveBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/MysticGroveBiome.java
new file mode 100644
index 0000000000..0d334c4313
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/MysticGroveBiome.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.particles.ParticleTypes;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.*;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class MysticGroveBiome extends BiomeTemplate
+{
+ public MysticGroveBiome()
+ {
+ this.addWeight(BOPClimates.WET_TEMPERATE, 1);
+ this.setBeachBiome(null);
+ this.setRiverBiome(null);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.FOREST).depth(0.1F).scale(0.1F).temperature(0.7F).downfall(0.8F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(0x9C3FE4).waterFogColor(0x2E0533).fogColor(0xFFC9DA).skyColor(0xAAEFFF).grassColorOverride(0x69CFDB).foliageColorOverride(0x70E0B5).ambientParticle(new ParticleEffectAmbience(ParticleTypes.END_ROD, 0.00011532552F)).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+
+ builder.addFeature(GenerationStage.Decoration.LAKES, Features.LAKE_WATER);
+
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES, Features.DISK_CLAY);
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES, BOPConfiguredFeatures.WHITE_SAND_DISK);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.MYSTIC_GROVE_TREES);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.MYSTIC_GROVE_FLOWERS);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.BLUE_HYDRANGEA_1);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.CLOVER_3);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.HUGE_RED_MUSHROOM_EXTRA);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.LILAC_1);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.SMALL_RED_MUSHROOM);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.SPROUTS_15);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_12);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.WATERGRASS_10);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.BROWN_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.RED_MUSHROOM_NORMAL);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.RABBIT, 4, 2, 3));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.FOX, 8, 2, 4));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 20, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/MysticPlainsBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/MysticPlainsBiome.java
new file mode 100644
index 0000000000..0bfa1f4a54
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/MysticPlainsBiome.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.particles.ParticleTypes;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.Features;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class MysticPlainsBiome extends BiomeTemplate
+{
+ public MysticPlainsBiome()
+ {
+ this.setBeachBiome(null);
+ this.setRiverBiome(null);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.FOREST).depth(0.0F).scale(-0.05F).temperature(0.7F).downfall(0.8F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(0x9C3FE4).waterFogColor(0x2E0533).fogColor(0xFFC9DA).skyColor(0xAAEFFF).grassColorOverride(0x69CFDB).foliageColorOverride(0x70E0B5).ambientParticle(new ParticleEffectAmbience(ParticleTypes.END_ROD, 0.00011532552F)).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+
+ builder.addFeature(GenerationStage.Decoration.LAKES, Features.LAKE_WATER);
+
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES, Features.DISK_CLAY);
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES, BOPConfiguredFeatures.WHITE_SAND_DISK);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.MYSTIC_PLAINS_TREES);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.MYSTIC_PLAINS_FLOWERS);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.BLUE_HYDRANGEA_4);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.CLOVER_6);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.LILAC_4);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.SPROUTS_25);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_24);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.TALL_GRASS_6);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.WATERGRASS_10);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.BROWN_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.RED_MUSHROOM_NORMAL);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.RABBIT, 4, 2, 3));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 20, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/OminousMireBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/OminousMireBiome.java
new file mode 100644
index 0000000000..c07eb0f6d1
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/OminousMireBiome.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPConfiguredSurfaceBuilders;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPSurfaceBuilders;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.particles.ParticleTypes;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.Features;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class OminousMireBiome extends BiomeTemplate
+{
+ public OminousMireBiome()
+ {
+ this.setBeachBiome(null);
+ this.setRiverBiome(null);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.TAIGA).depth(-0.215F).scale(-0.05F).temperature(0.6F).downfall(0.6F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(0x312346).waterFogColor(0x0A030C).fogColor(0x7881A5).skyColor(0x84A1CC).grassColorOverride(0x4C4A70).foliageColorOverride(0x6B487C).ambientParticle(new ParticleEffectAmbience(ParticleTypes.SMOKE, 0.00023065104F)).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(BOPConfiguredSurfaceBuilders.MARSH);
+
+ // Structures
+ builder.addStructureStart(StructureFeatures.SWAMP_HUT);
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_STANDARD);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+
+ builder.addFeature(GenerationStage.Decoration.LAKES, Features.LAKE_WATER);
+
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES, BOPConfiguredFeatures.BLACK_SAND_DISK);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.OMINOUS_MIRE_TREES);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.OMINOUS_WOODS_FLOWERS);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.BRAMBLE_EXTRA);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.DEAD_GRASS_5);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_6);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.WATERGRASS_5);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.BROWN_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_PUMPKIN);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.RED_MUSHROOM_NORMAL);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 50, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 25, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/OminousWoodsBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/OminousWoodsBiome.java
new file mode 100644
index 0000000000..fb5d3d4859
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/OminousWoodsBiome.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.particles.ParticleTypes;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.*;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class OminousWoodsBiome extends BiomeTemplate
+{
+ public OminousWoodsBiome()
+ {
+ this.addWeight(BOPClimates.WET_BOREAL, 1);
+ this.setBeachBiome(null);
+ this.setRiverBiome(null);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.TAIGA).depth(0.25F).scale(0.15F).temperature(0.6F).downfall(0.6F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(0x312346).waterFogColor(0x0A030C).fogColor(0x7881A5).skyColor(0x84A1CC).grassColorOverride(0x4C4A70).foliageColorOverride(0x6B487C).ambientParticle(new ParticleEffectAmbience(ParticleTypes.SMOKE, 0.00023065104F)).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ builder.addStructureStart(StructureFeatures.WOODLAND_MANSION);
+ builder.addStructureStart(StructureFeatures.SWAMP_HUT);
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_STANDARD);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+
+ builder.addFeature(GenerationStage.Decoration.LAKES, Features.LAKE_WATER);
+
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES, BOPConfiguredFeatures.BLACK_SAND_DISK);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.OMINOUS_WOODS_TREES);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.OMINOUS_WOODS_FLOWERS);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.BRAMBLE);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.DEAD_GRASS_2);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_6);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.BROWN_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_PUMPKIN);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.RED_MUSHROOM_NORMAL);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ILLUSIONER, 50, 2, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 50, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 25, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/OrchardBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/OrchardBiome.java
new file mode 100644
index 0000000000..9c49ce1a8c
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/OrchardBiome.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.*;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class OrchardBiome extends BiomeTemplate
+{
+ public OrchardBiome() { }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.FOREST).depth(0.0F).scale(0.0F).temperature(0.8F).downfall(0.4F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(0.8F)).grassColorOverride(0xA9DB69).foliageColorOverride(0xC9F75D).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_STANDARD);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultLakes(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+ DefaultBiomeFeatures.addDefaultSoftDisks(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.ORCHARD_TREES);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.ORCHARD_FLOWERS);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.ROSE_BUSH_1);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.SPROUTS_5);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_12);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_SUGAR_CANE);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entity spawning
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.SHEEP, 12, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.PIG, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.CHICKEN, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.COW, 8, 4, 4));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/OriginValleyBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/OriginValleyBiome.java
new file mode 100644
index 0000000000..919d334b7b
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/OriginValleyBiome.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.carver.BOPConfiguredCarvers;
+import biomesoplenty.common.world.gen.carver.BOPWorldCarvers;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import biomesoplenty.common.world.gen.feature.BOPFeatures;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPConfiguredSurfaceBuilders;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPSurfaceBuilders;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.*;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+
+public class OriginValleyBiome extends BiomeTemplate
+{
+ public OriginValleyBiome()
+ {
+ this.setBeachBiome(null);
+ this.setRiverBiome(null);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.NONE).depth(0.1F).scale(0.2F).temperature(0.6F).downfall(0.6F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(0x0E31FF).waterFogColor(0x070059).fogColor(0xB0CFFF).skyColor(0x8CBDFF).grassColorOverride(0x9AFF5F).foliageColorOverride(0x3AFF00).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(BOPConfiguredSurfaceBuilders.ORIGIN_VALLEY);
+
+ // Underground
+ builder.addCarver(GenerationStage.Carving.AIR, BOPConfiguredCarvers.ORIGIN_CAVE);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES, Features.DISK_CLAY);
+
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES, Features.ORE_DIRT);
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES, Features.ORE_GRAVEL);
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES, Features.ORE_COAL);
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES, Features.ORE_IRON);
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES, Features.ORE_GOLD);
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES, Features.ORE_REDSTONE);
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES, Features.ORE_DIAMOND);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.ORIGIN_VALLEY_TREES);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.ORIGIN_FLOWERS);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_SUGAR_CANE);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.SHEEP, 12, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.PIG, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.CHICKEN, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.COW, 8, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/PrairieBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/PrairieBiome.java
new file mode 100644
index 0000000000..8e20f3fde0
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/PrairieBiome.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class PrairieBiome extends BiomeTemplate
+{
+ public PrairieBiome()
+ {
+ this.addWeight(BOPClimates.MEDITERRANEAN, 7);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.PLAINS).depth(0.05F).scale(0.0F).temperature(0.8F).downfall(0.3F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(0.8F)).grassColorOverride(0xE4EA77).foliageColorOverride(0xC7E672).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ builder.addStructureStart(StructureFeatures.VILLAGE_PLAINS);
+ builder.addStructureStart(StructureFeatures.PILLAGER_OUTPOST);
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_STANDARD);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.PRAIRIE_TREES);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.CONIFEROUS_FOREST_FLOWERS);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.GOLDENROD_10);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_24);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.TALL_GRASS_24);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.SHEEP, 12, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.PIG, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.CHICKEN, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.COW, 8, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.HORSE, 5, 2, 6));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.DONKEY, 1, 1, 3));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/RainbowHillsBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/RainbowHillsBiome.java
new file mode 100644
index 0000000000..cecd8cb14f
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/RainbowHillsBiome.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import biomesoplenty.core.ClientProxy;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.*;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class RainbowHillsBiome extends BiomeTemplate
+{
+ public RainbowHillsBiome()
+ {
+ this.setBeachBiome(null);
+ this.setGrassColorFunction(this::getGrassColor);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.FOREST).depth(0.5F).scale(0.5F).temperature(0.55F).downfall(1.0F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4566514).waterFogColor(267827).fogColor(12638463).skyColor(calculateSkyColor(0.55F)).grassColorOverride(0x75CE8D).foliageColorOverride(getFoliageColor()).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultLakes(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+ DefaultBiomeFeatures.addDefaultSoftDisks(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.RAINBOW_HILLS_TREES);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.RAINBOW_HILLS_FLOWERS);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.BLUE_HYDRANGEA_4);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.CLOVER_6);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.GOLDENROD_2);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.LILAC_2);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.PEONY_1);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.ROSE_BUSH_4);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.SPROUTS_5);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_12);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.BROWN_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.RED_MUSHROOM_NORMAL);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.FOX, 8, 2, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.SHEEP, 12, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.PIG, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.CHICKEN, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.COW, 8, 4, 4));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ }
+
+ public int getGrassColor(double x, double z)
+ {
+ double d0 = Biome.BIOME_INFO_NOISE.getValue(x * 0.0225D, z * 0.0225D, false);
+ return d0 < -0.1D ? 0x77CE7F : 0x75CE8D;
+ }
+
+ public int getFoliageColor()
+ {
+ return 0x75CE8D;
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/RainforestBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/RainforestBiome.java
new file mode 100644
index 0000000000..3034594d6e
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/RainforestBiome.java
@@ -0,0 +1,101 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.biome.BOPBiomes;
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.*;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class RainforestBiome extends BiomeTemplate
+{
+ public RainforestBiome()
+ {
+ this.addWeight(BOPClimates.TROPICAL, 7);
+ this.setBeachBiome(null);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.JUNGLE).depth(0.15F).scale(0.35F).temperature(1.2F).downfall(2.0F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(0x3FDF99).waterFogColor(0x042F26).fogColor(12638463).skyColor(calculateSkyColor(1.2F)).grassColorOverride(0xA7E140).foliageColorOverride(0x88E140).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ builder.addStructureStart(StructureFeatures.JUNGLE_TEMPLE);
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_JUNGLE);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultLakes(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES, BOPConfiguredFeatures.ORANGE_SAND_DISK);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.RAINFOREST_TREES);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.RAINFOREST_FLOWERS);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.FERN_GRASS_16);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.LARGE_FERN_25);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.LILY_PAD_10);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.SPROUTS_5);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.TALL_GRASS_12);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.WATERGRASS_10);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.BROWN_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_MELON);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_SUGAR_CANE);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.RED_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.SEAGRASS_SWAMP);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.CHICKEN, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.PARROT, 40, 1, 2));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.OCELOT, 2, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/RainforestCliffsBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/RainforestCliffsBiome.java
new file mode 100644
index 0000000000..92e65a00df
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/RainforestCliffsBiome.java
@@ -0,0 +1,102 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPConfiguredSurfaceBuilders;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPSurfaceBuilders;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.*;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class RainforestCliffsBiome extends BiomeTemplate
+{
+ public RainforestCliffsBiome()
+ {
+ this.setBeachBiome(null);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.JUNGLE).depth(2.9F).scale(0.6F).temperature(1.2F).downfall(2.0F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(0x3FDF99).waterFogColor(0x042F26).fogColor(12638463).skyColor(calculateSkyColor(1.2F)).grassColorOverride(0xA7E140).foliageColorOverride(0x88E140).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(BOPConfiguredSurfaceBuilders.RAINFOREST_CLIFFS);
+
+ // Structures
+ builder.addStructureStart(StructureFeatures.JUNGLE_TEMPLE);
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_MOUNTAIN);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultLakes(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES, BOPConfiguredFeatures.ORANGE_SAND_DISK);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.RAINFOREST_CLIFFS_TREES);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.RAINFOREST_FLOWERS);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.FERN_GRASS_16);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.LARGE_FERN_7);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.RAINFOREST_CLIFFS_VINES);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.SPROUTS_25);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.TALL_GRASS_24);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.WATERGRASS_10);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.BROWN_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_SUGAR_CANE);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.RED_MUSHROOM_NORMAL);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.WATER_SPRING_EXTRA);
+
+ DefaultBiomeFeatures.addExtraEmeralds(builder);
+ DefaultBiomeFeatures.addInfestedStone(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.PARROT, 40, 1, 2));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.OCELOT, 2, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/RainforestFloodplainBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/RainforestFloodplainBiome.java
new file mode 100644
index 0000000000..e2a0a13c72
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/RainforestFloodplainBiome.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.*;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class RainforestFloodplainBiome extends BiomeTemplate
+{
+ public RainforestFloodplainBiome()
+ {
+ this.setBeachBiome(null);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.JUNGLE).depth(-0.125F).scale(-0.05F).temperature(1.2F).downfall(2.0F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(0x3FDF99).waterFogColor(0x042F26).fogColor(12638463).skyColor(calculateSkyColor(1.2F)).grassColorOverride(0xA7E140).foliageColorOverride(0x88E140).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.SWAMP);
+
+ // Structures
+ builder.addStructureStart(StructureFeatures.JUNGLE_TEMPLE);
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_SWAMP);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+
+ builder.addFeature(GenerationStage.Decoration.LAKES, BOPConfiguredFeatures.WATER_LAKE_COMMON);
+
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.RAINFOREST_FLOODPLAIN_TREES);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.RAINFOREST_FLOWERS);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.FERN_GRASS_16);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.LARGE_FERN_7);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.LILY_PAD_15);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.TALL_GRASS_24);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.WATERGRASS_250);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.SEAGRASS_SWAMP);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/RedwoodForestBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/RedwoodForestBiome.java
new file mode 100644
index 0000000000..c2563d6a83
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/RedwoodForestBiome.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPConfiguredSurfaceBuilders;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.*;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class RedwoodForestBiome extends BiomeTemplate
+{
+ public RedwoodForestBiome()
+ {
+ this.addWeight(BOPClimates.WARM_TEMPERATE, 5);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.FOREST).depth(0.25F).scale(0.05F).temperature(0.8F).downfall(0.6F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(0.8F)).grassColorOverride(0xB5D55C).foliageColorOverride(0x8EBF42).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(BOPConfiguredSurfaceBuilders.PODZOL_FULL);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_STANDARD);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+
+ builder.addFeature(GenerationStage.Decoration.LAKES, Features.LAKE_WATER);
+
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+ DefaultBiomeFeatures.addDefaultSoftDisks(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.REDWOOD_FOREST_TREES);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.FERN_24);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.LARGE_FERN_25);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.BROWN_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.RED_MUSHROOM_NORMAL);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.SHEEP, 12, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.PIG, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.CHICKEN, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.COW, 8, 4, 4));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/RedwoodForestEdgeBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/RedwoodForestEdgeBiome.java
new file mode 100644
index 0000000000..c6eda047e0
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/RedwoodForestEdgeBiome.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPConfiguredSurfaceBuilders;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPSurfaceBuilders;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.*;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class RedwoodForestEdgeBiome extends BiomeTemplate
+{
+ public RedwoodForestEdgeBiome() {}
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.FOREST).depth(0.25F).scale(0.05F).temperature(0.8F).downfall(0.6F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(0.8F)).grassColorOverride(0xB5D55C).foliageColorOverride(0x8EBF42).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(BOPConfiguredSurfaceBuilders.PODZOL_MIXED);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_STANDARD);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+
+ builder.addFeature(GenerationStage.Decoration.LAKES, Features.LAKE_WATER);
+
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+ DefaultBiomeFeatures.addDefaultSoftDisks(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.REDWOOD_FOREST_EDGE_TREES);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.FERN_GRASS_8);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.LARGE_FERN_7);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.BROWN_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.RED_MUSHROOM_NORMAL);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.SHEEP, 12, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.PIG, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.CHICKEN, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.COW, 8, 4, 4));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/RedwoodHillsBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/RedwoodHillsBiome.java
new file mode 100644
index 0000000000..0b9c25f8ab
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/RedwoodHillsBiome.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPConfiguredSurfaceBuilders;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.Features;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class RedwoodHillsBiome extends BiomeTemplate
+{
+ public RedwoodHillsBiome()
+ {
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.FOREST).depth(1.5F).scale(0.2F).temperature(0.8F).downfall(0.6F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(0.8F)).grassColorOverride(0xB5D55C).foliageColorOverride(0x8EBF42).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(BOPConfiguredSurfaceBuilders.PODZOL_FULL);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_STANDARD);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+
+ builder.addFeature(GenerationStage.Decoration.LAKES, Features.LAKE_WATER);
+
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+ DefaultBiomeFeatures.addDefaultSoftDisks(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.REDWOOD_HILLS_TREES);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.FLOWER_DEFAULT);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.FERN_24);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.LARGE_FERN_25);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.BROWN_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.RED_MUSHROOM_NORMAL);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/ScrublandBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/ScrublandBiome.java
new file mode 100644
index 0000000000..ea5dfaad04
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/ScrublandBiome.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class ScrublandBiome extends BiomeTemplate
+{
+ public ScrublandBiome()
+ {
+ this.addWeight(BOPClimates.SAVANNA, 7);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.NONE).biomeCategory(Biome.Category.SAVANNA).depth(0.0F).scale(0.0F).temperature(1.1F).downfall(0.15F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(1.1F)).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ builder.addStructureStart(StructureFeatures.VILLAGE_SAVANNA);
+ builder.addStructureStart(StructureFeatures.PILLAGER_OUTPOST);
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_STANDARD);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.SCRUBLAND_FLOWERS);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.DESERT_GRASS_10);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.SCRUB_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_6);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.SHEEP, 12, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.PIG, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.CHICKEN, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.COW, 8, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.HORSE, 5, 2, 6));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.DONKEY, 1, 1, 3));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/SeasonalForestBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/SeasonalForestBiome.java
new file mode 100644
index 0000000000..b57ac331f3
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/SeasonalForestBiome.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.biome.BOPBiomes;
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import biomesoplenty.init.ModEntities;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.*;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class SeasonalForestBiome extends BiomeTemplate
+{
+ public SeasonalForestBiome()
+ {
+ this.addWeight(BOPClimates.DRY_BOREAL, 7);
+ this.setBeachBiome(BOPBiomes.gravel_beach);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.FOREST).depth(0.2F).scale(0.2F).temperature(0.4F).downfall(0.8F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(0.4F)).grassColorOverride(0xDD9A4A).foliageColorOverride(0xD1B24A).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ builder.addStructureStart(StructureFeatures.WOODLAND_MANSION);
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_STANDARD);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultLakes(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+ DefaultBiomeFeatures.addDefaultSoftDisks(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.SEASONAL_FOREST_TREES);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.FLOWER_DEFAULT);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.REED_5);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_3);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.TOADSTOOL_EXTRA);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.BROWN_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_PUMPKIN);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.RED_MUSHROOM_NORMAL);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.WOLF, 5, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.FOX, 8, 2, 4));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/SeasonalOrchardBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/SeasonalOrchardBiome.java
new file mode 100644
index 0000000000..d21ed5ec14
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/SeasonalOrchardBiome.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.biome.BOPBiomes;
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.Features;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class SeasonalOrchardBiome extends BiomeTemplate
+{
+ public SeasonalOrchardBiome()
+ {
+ this.setBeachBiome(BOPBiomes.gravel_beach);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.FOREST).depth(0.0F).scale(0.0F).temperature(0.4F).downfall(0.8F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(0.4F)).grassColorOverride(0xDD9A4A).foliageColorOverride(0xD1B24A).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ builder.addStructureStart(StructureFeatures.WOODLAND_MANSION);
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_STANDARD);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultLakes(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+ DefaultBiomeFeatures.addDefaultSoftDisks(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.SEASONAL_ORCHARD_TREES);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.FLOWER_DEFAULT);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.REED_10);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_6);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.TOADSTOOL_EXTRA);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.BROWN_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_PUMPKIN);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.RED_MUSHROOM_NORMAL);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.WOLF, 5, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.FOX, 8, 2, 4));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/SeasonalPumpkinPatchBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/SeasonalPumpkinPatchBiome.java
new file mode 100644
index 0000000000..7e12132164
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/SeasonalPumpkinPatchBiome.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.biome.BOPBiomes;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.*;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class SeasonalPumpkinPatchBiome extends BiomeTemplate
+{
+ public SeasonalPumpkinPatchBiome()
+ {
+ this.setBeachBiome(BOPBiomes.gravel_beach);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.FOREST).depth(0.0F).scale(-0.025F).temperature(0.4F).downfall(0.8F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(0.4F)).grassColorOverride(0xDD9A4A).foliageColorOverride(0xD1B24A).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_STANDARD);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultLakes(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.SEASONAL_PUMPKIN_PATCH_TREES);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.BIG_PUMPKIN);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.PUMPKIN_PATCH);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.REED_5);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.SPROUTS_10);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_6);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.TOADSTOOL_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.BROWN_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.RED_MUSHROOM_NORMAL);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.SHEEP, 12, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.PIG, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.CHICKEN, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.COW, 8, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.WOLF, 5, 4, 4));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/ShroomyWetlandBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/ShroomyWetlandBiome.java
new file mode 100644
index 0000000000..0f55a536d1
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/ShroomyWetlandBiome.java
@@ -0,0 +1,99 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.Features;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+
+public class ShroomyWetlandBiome extends BiomeTemplate
+{
+ public ShroomyWetlandBiome()
+ {
+ this.setBeachBiome(null);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.SWAMP).depth(0.0F).scale(0.0F).temperature(0.6F).downfall(0.7F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(0x272179).waterFogColor(0x0C031B).fogColor(12638463).skyColor(calculateSkyColor(0.6F)).grassColorOverride(0x5A935F).foliageColorOverride(0x4F9657).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ builder.addStructureStart(StructureFeatures.SWAMP_HUT);
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_SWAMP);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+
+ builder.addFeature(GenerationStage.Decoration.LAKES, BOPConfiguredFeatures.WATER_LAKE_UNCOMMON);
+
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+ DefaultBiomeFeatures.addSwampClayDisk(builder);
+
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES, BOPConfiguredFeatures.MUD_DISK);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.SHROOMY_WETLAND_TREES);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.CATTAIL_12);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.FERN_GRASS_8);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.LILY_PAD_5);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.REED_5);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_3);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.TOADSTOOL_EXTRA);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.WATERGRASS_5);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.HUGE_BROWN_MUSHROOM_EXTRA);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.PODZOL_SPLATTER);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.SMALL_BROWN_MUSHROOM);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.BROWN_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.RED_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.SEAGRASS_SWAMP);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 1, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/ShrublandBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/ShrublandBiome.java
new file mode 100644
index 0000000000..e8a10101d5
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/ShrublandBiome.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.biome.BOPBiomes;
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class ShrublandBiome extends BiomeTemplate
+{
+ public ShrublandBiome()
+ {
+ this.addWeight(BOPClimates.DRY_TEMPERATE, 7);
+ this.setBeachBiome(BOPBiomes.gravel_beach);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.PLAINS).depth(0.05F).scale(0.05F).temperature(0.6F).downfall(0.05F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(0.6F)).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ builder.addStructureStart(StructureFeatures.VILLAGE_PLAINS);
+ builder.addStructureStart(StructureFeatures.PILLAGER_OUTPOST);
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_STANDARD);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultLakes(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+ DefaultBiomeFeatures.addDefaultSoftDisks(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.SHRUBLAND_TREES);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.SHRUBLAND_FLOWERS);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.BUSH_10);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.LILAC_1);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.REED_10);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_6);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.SHEEP, 12, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.PIG, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.CHICKEN, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.COW, 8, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.HORSE, 5, 2, 6));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.DONKEY, 1, 1, 3));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/ShrublandHillsBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/ShrublandHillsBiome.java
new file mode 100644
index 0000000000..834e58b0da
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/ShrublandHillsBiome.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.biome.BOPBiomes;
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPConfiguredSurfaceBuilders;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPSurfaceBuilders;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class ShrublandHillsBiome extends BiomeTemplate
+{
+ public ShrublandHillsBiome()
+ {
+ this.setBeachBiome(BOPBiomes.gravel_beach);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.PLAINS).depth(1.0F).scale(0.2F).temperature(0.6F).downfall(0.05F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(0.6F)).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(BOPConfiguredSurfaceBuilders.EXPOSED_STONE);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_MOUNTAIN);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultLakes(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+ DefaultBiomeFeatures.addDefaultSoftDisks(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.SHRUBLAND_HILLS_TREES);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.SHRUBLAND_FLOWERS);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.BUSH_10);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_6);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.SHEEP, 12, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.PIG, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.CHICKEN, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.COW, 8, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.HORSE, 5, 2, 6));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.DONKEY, 1, 1, 3));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/SnowyConiferousForestBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/SnowyConiferousForestBiome.java
new file mode 100644
index 0000000000..312818696b
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/SnowyConiferousForestBiome.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import biomesoplenty.init.ModEntities;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.*;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class SnowyConiferousForestBiome extends BiomeTemplate
+{
+ public SnowyConiferousForestBiome()
+ {
+ this.addWeight(BOPClimates.TUNDRA, 5);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.SNOW).biomeCategory(Biome.Category.ICY).depth(0.2F).scale(0.1F).temperature(-0.25F).downfall(0.5F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(-0.25F)).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ builder.addStructureStart(StructureFeatures.IGLOO);
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_STANDARD);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+
+ builder.addFeature(GenerationStage.Decoration.LAKES, Features.LAKE_WATER);
+
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+ DefaultBiomeFeatures.addDefaultSoftDisks(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.SNOWY_CONIFEROUS_FOREST_TREES);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.SNOWY_FLOWERS);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.FERN_GRASS_4);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.BROWN_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_BERRY_SPARSE);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_PUMPKIN);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.RED_MUSHROOM_NORMAL);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.RABBIT, 4, 2, 3));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.WOLF, 5, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.FOX, 8, 2, 4));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/SnowyFirClearingBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/SnowyFirClearingBiome.java
new file mode 100644
index 0000000000..9023faebf5
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/SnowyFirClearingBiome.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import biomesoplenty.init.ModEntities;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.*;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class SnowyFirClearingBiome extends BiomeTemplate
+{
+ public SnowyFirClearingBiome() {}
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.SNOW).biomeCategory(Biome.Category.ICY).depth(0.2F).scale(0.1F).temperature(-0.25F).downfall(0.5F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(-0.25F)).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ builder.addStructureStart(StructureFeatures.IGLOO);
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_STANDARD);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+
+ builder.addFeature(GenerationStage.Decoration.LAKES, Features.LAKE_WATER);
+
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+ DefaultBiomeFeatures.addDefaultSoftDisks(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.FIR_CLEARING_TREES);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.BROWN_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_BERRY_SPARSE);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_PUMPKIN);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.RED_MUSHROOM_NORMAL);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.RABBIT, 4, 2, 3));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.WOLF, 5, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.FOX, 8, 2, 4));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/SnowyMapleForestBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/SnowyMapleForestBiome.java
new file mode 100644
index 0000000000..1862569d6d
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/SnowyMapleForestBiome.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import biomesoplenty.init.ModEntities;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.Features;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class SnowyMapleForestBiome extends BiomeTemplate
+{
+ public SnowyMapleForestBiome()
+ {
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.SNOW).biomeCategory(Biome.Category.ICY).depth(0.2F).scale(0.2F).temperature(-0.25F).downfall(0.5F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(-0.25F)).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ builder.addStructureStart(StructureFeatures.IGLOO);
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_STANDARD);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+
+ builder.addFeature(GenerationStage.Decoration.LAKES, Features.LAKE_WATER);
+
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+ DefaultBiomeFeatures.addDefaultSoftDisks(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.SNOWY_MAPLE_FOREST_TREES);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.SNOWY_FLOWERS);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.FERN_GRASS_4);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.BROWN_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_BERRY_SPARSE);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_PUMPKIN);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.RED_MUSHROOM_NORMAL);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.RABBIT, 4, 2, 3));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.WOLF, 5, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.FOX, 8, 2, 4));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/TallDeadForestBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/TallDeadForestBiome.java
new file mode 100644
index 0000000000..828ff2c0a5
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/TallDeadForestBiome.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.biome.BOPBiomes;
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.Features;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+
+public class TallDeadForestBiome extends BiomeTemplate
+{
+ public TallDeadForestBiome()
+ {
+ this.setBeachBiome(BOPBiomes.gravel_beach);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.TAIGA).depth(0.5F).scale(0.1F).temperature(0.3F).downfall(0.3F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(0.3F)).grassColorOverride(0xBAAD64).foliageColorOverride(0xB7B763).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_STANDARD);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+
+ builder.addFeature(GenerationStage.Decoration.LAKES, Features.LAKE_WATER);
+
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+ DefaultBiomeFeatures.addDefaultSoftDisks(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.TALL_DEAD_FOREST_TREES);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_6);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_PUMPKIN);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/TropicBeachBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/TropicBeachBiome.java
new file mode 100644
index 0000000000..370cfefa4f
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/TropicBeachBiome.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPConfiguredSurfaceBuilders;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPSurfaceBuilders;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.Features;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+
+public class TropicBeachBiome extends BiomeTemplate
+{
+ public TropicBeachBiome()
+ {
+ this.setBeachBiome(null);
+ this.setRiverBiome(null);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.BEACH).depth(0.0F).scale(0.025F).temperature(0.95F).downfall(1.0F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4445678).waterFogColor(270131).fogColor(0xB2EDFF).skyColor(0x66BCFF).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(BOPConfiguredSurfaceBuilders.TROPIC_BEACH);
+
+
+ // Structures
+ builder.addStructureStart(StructureFeatures.BURIED_TREASURE);
+ builder.addStructureStart(StructureFeatures.SHIPWRECH_BEACHED);
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_JUNGLE);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultLakes(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.TROPIC_FLOWERS);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_12);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.SEA_PICKLE);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.WARM_OCEAN_VEGETATION);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.TURTLE, 5, 2, 5));
+ builder.addSpawn(EntityClassification.WATER_AMBIENT, new MobSpawnInfo.Spawners(EntityType.PUFFERFISH, 15, 1, 3));
+ builder.addSpawn(EntityClassification.WATER_AMBIENT, new MobSpawnInfo.Spawners(EntityType.TROPICAL_FISH, 25, 8, 8));
+ builder.addSpawn(EntityClassification.WATER_CREATURE, new MobSpawnInfo.Spawners(EntityType.SQUID, 10, 4, 4));
+ builder.addSpawn(EntityClassification.WATER_CREATURE, new MobSpawnInfo.Spawners(EntityType.DOLPHIN, 2, 1, 2));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/TropicsBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/TropicsBiome.java
new file mode 100644
index 0000000000..a2c50bed5a
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/TropicsBiome.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.biome.BOPBiomes;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPConfiguredSurfaceBuilders;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPSurfaceBuilders;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.*;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class TropicsBiome extends BiomeTemplate
+{
+ public TropicsBiome()
+ {
+ this.setBeachBiome(BOPBiomes.tropic_beach);
+ this.setRiverBiome(null);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.NONE).depth(0.25F).scale(0.4F).temperature(0.95F).downfall(1.0F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4445678).waterFogColor(270131).fogColor(0xB2EDFF).skyColor(0x66BCFF).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(BOPConfiguredSurfaceBuilders.TROPICS);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_JUNGLE);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultLakes(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES, BOPConfiguredFeatures.WHITE_SAND_DISK_EXTRA);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.TROPICS_TREES);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.TROPIC_FLOWERS);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.BLUE_HYDRANGEA_4);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.ROSE_BUSH_1);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.SHORT_BAMBOO_10);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_12);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_MELON);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_SUGAR_CANE);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.CHICKEN, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.PIG, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.PARROT, 40, 1, 2));
+ builder.addSpawn(EntityClassification.WATER_AMBIENT, new MobSpawnInfo.Spawners(EntityType.PUFFERFISH, 15, 1, 3));
+ builder.addSpawn(EntityClassification.WATER_AMBIENT, new MobSpawnInfo.Spawners(EntityType.TROPICAL_FISH, 25, 8, 8));
+ builder.addSpawn(EntityClassification.WATER_CREATURE, new MobSpawnInfo.Spawners(EntityType.SQUID, 10, 4, 4));
+ builder.addSpawn(EntityClassification.WATER_CREATURE, new MobSpawnInfo.Spawners(EntityType.DOLPHIN, 2, 1, 2));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/TundraBasinBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/TundraBasinBiome.java
new file mode 100644
index 0000000000..7e7157c729
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/TundraBasinBiome.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.biome.BOPBiomes;
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPConfiguredSurfaceBuilders;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPSurfaceBuilders;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.*;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class TundraBasinBiome extends BiomeTemplate
+{
+ public TundraBasinBiome()
+ {
+ this.setBeachBiome(BOPBiomes.gravel_beach);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.TAIGA).depth(0.0F).scale(0.0F).temperature(0.2F).downfall(0.5F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(0.2F)).grassColorOverride(0xC08359).foliageColorOverride(0xC5975C).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(BOPConfiguredSurfaceBuilders.STONE_BASIN);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_STANDARD);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES, Features.ORE_GRAVEL);
+
+ DefaultBiomeFeatures.addDefaultOres(builder);
+ DefaultBiomeFeatures.addDefaultSoftDisks(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.STRAY, 80, 4, 4));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/TundraBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/TundraBiome.java
new file mode 100644
index 0000000000..68fe8386d9
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/TundraBiome.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.biome.BOPBiomes;
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class TundraBiome extends BiomeTemplate
+{
+ public TundraBiome()
+ {
+ this.addWeight(BOPClimates.TUNDRA, 7);
+ this.setBeachBiome(BOPBiomes.gravel_beach);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.TAIGA).depth(0.15F).scale(0.15F).temperature(0.2F).downfall(0.5F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(0.2F)).grassColorOverride(0xC08359).foliageColorOverride(0xC5975C).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ builder.addStructureStart(StructureFeatures.VILLAGE_TAIGA);
+ builder.addStructureStart(StructureFeatures.PILLAGER_OUTPOST);
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_STANDARD);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultLakes(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES, BOPConfiguredFeatures.GRAVEL_DISK_EXTRA);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.TUNDRA_TREES);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.FERN_GRASS_4);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.REED_5);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.SCATTERED_ROCKS);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.WOLF, 5, 4, 4));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/TundraBogBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/TundraBogBiome.java
new file mode 100644
index 0000000000..7c77e2d4a7
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/TundraBogBiome.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.*;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class TundraBogBiome extends BiomeTemplate
+{
+ public TundraBogBiome()
+ {
+ this.setBeachBiome(null);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.TAIGA).depth(-0.15F).scale(-0.025F).temperature(0.2F).downfall(0.5F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(0.2F)).grassColorOverride(0xC08359).foliageColorOverride(0xC5975C).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_SWAMP);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+
+ builder.addFeature(GenerationStage.Decoration.LAKES, BOPConfiguredFeatures.WATER_LAKE_UNCOMMON);
+
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+ DefaultBiomeFeatures.addSwampClayDisk(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.TUNDRA_BOG_TREES);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.BUSH_50);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.FERN_GRASS_8);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.REED_10);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.BROWN_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_BERRY_DECORATED);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.RED_MUSHROOM_NORMAL);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 1, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/VolcanicPlainsBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/VolcanicPlainsBiome.java
new file mode 100644
index 0000000000..e59ec2f181
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/VolcanicPlainsBiome.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPConfiguredSurfaceBuilders;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPSurfaceBuilders;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.particles.ParticleTypes;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.*;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+
+public class VolcanicPlainsBiome extends BiomeTemplate
+{
+ public VolcanicPlainsBiome()
+ {
+ this.setBeachBiome(null);
+ this.setRiverBiome(null);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.NONE).depth(0.05F).scale(0.0F).temperature(0.95F).downfall(0.3F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4566514).waterFogColor(267827).fogColor(0xBFBFBF).skyColor(calculateSkyColor(0.95F)).grassColorOverride(0x4A703B).foliageColorOverride(0x547D42).ambientParticle(new ParticleEffectAmbience(ParticleTypes.WHITE_ASH, 0.01476166675F)).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(BOPConfiguredSurfaceBuilders.VOLCANIC_PLAINS);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_STANDARD);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+
+ builder.addFeature(GenerationStage.Decoration.LAKES, Features.LAKE_LAVA);
+
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.VOLCANIC_PLAINS_TREES);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.SPROUTS_200);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_12);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.VOLCANO_GRASS_SPLATTER);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.VOLCANO_SPRING);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/VolcanoBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/VolcanoBiome.java
new file mode 100644
index 0000000000..e8048df87f
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/VolcanoBiome.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.biome.BOPBiomes;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPConfiguredSurfaceBuilders;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPSurfaceBuilders;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.particles.ParticleTypes;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.*;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+
+public class VolcanoBiome extends BiomeTemplate
+{
+ public VolcanoBiome()
+ {
+ this.setRiverBiome(null);
+ this.setBeachBiome(BOPBiomes.volcanic_plains);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.NONE).depth(4.5F).scale(0.0F).temperature(0.95F).downfall(0.3F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4566514).waterFogColor(267827).fogColor(0x7F7F7F).skyColor(calculateSkyColor(0.95F)).grassColorOverride(0x4A703B).foliageColorOverride(0x547D42).ambientParticle(new ParticleEffectAmbience(ParticleTypes.WHITE_ASH, 0.059046667F)).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(BOPConfiguredSurfaceBuilders.VOLCANO);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_MOUNTAIN);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+
+ builder.addFeature(GenerationStage.Decoration.LAKES, BOPConfiguredFeatures.LAVA_LAKE_COMMON);
+
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES, Features.DISK_GRAVEL);
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.VOLCANO_SPRING);
+
+ DefaultBiomeFeatures.addExtraEmeralds(builder);
+ DefaultBiomeFeatures.addInfestedStone(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/WastelandBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/WastelandBiome.java
new file mode 100644
index 0000000000..35edef46fa
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/WastelandBiome.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPConfiguredSurfaceBuilders;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPSurfaceBuilders;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.particles.ParticleTypes;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class WastelandBiome extends BiomeTemplate
+{
+ public WastelandBiome()
+ {
+ this.addWeight(BOPClimates.HOT_DESERT, 1);
+ this.setBeachBiome(null);
+ this.setRiverBiome(null);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.NONE).biomeCategory(Biome.Category.DESERT).depth(0.0F).scale(-0.11F).temperature(2.0F).downfall(0.0F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(0x433721).waterFogColor(0x0C0C03).fogColor(0xDBDDC1).skyColor(0x70ADEF).grassColorOverride(0xAD9364).foliageColorOverride(0xB5A76C).ambientParticle(new ParticleEffectAmbience(ParticleTypes.MYCELIUM, 0.00357F)).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(BOPConfiguredSurfaceBuilders.WASTELAND);
+
+ // Structures
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_STANDARD);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.WASTELAND_TREES);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.WASTELAND_FLOWERS);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.WASTELAND_GRASS_2);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.HUSK, 80, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/WetlandBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/WetlandBiome.java
new file mode 100644
index 0000000000..74f1b5f5f4
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/WetlandBiome.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.*;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class WetlandBiome extends BiomeTemplate
+{
+ public WetlandBiome()
+ {
+ this.addWeight(BOPClimates.WET_TEMPERATE, 10);
+ this.setBeachBiome(null);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.SWAMP).depth(0.0F).scale(0.0F).temperature(0.6F).downfall(0.7F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(0x272179).waterFogColor(0x0C031B).fogColor(12638463).skyColor(calculateSkyColor(0.6F)).grassColorOverride(0x5A935F).foliageColorOverride(0x4F9657).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ builder.addStructureStart(StructureFeatures.SWAMP_HUT);
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_SWAMP);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+
+ builder.addFeature(GenerationStage.Decoration.LAKES, BOPConfiguredFeatures.WATER_LAKE_UNCOMMON);
+
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+ DefaultBiomeFeatures.addSwampClayDisk(builder);
+
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES, BOPConfiguredFeatures.MUD_DISK);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.WETLAND_TREES);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.WETLAND_FLOWERS);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.CATTAIL_24);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.FERN_GRASS_8);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.LILY_PAD_5);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.REED_5);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.TOADSTOOL_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.WATERGRASS_10);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.BROWN_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_SUGAR_CANE);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.RED_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.SEAGRASS_SWAMP);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.SHEEP, 12, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.PIG, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.CHICKEN, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.COW, 8, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.FOX, 8, 2, 4));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 1, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/WetlandForestBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/WetlandForestBiome.java
new file mode 100644
index 0000000000..06fffd2a5c
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/WetlandForestBiome.java
@@ -0,0 +1,103 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.Features;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+
+public class WetlandForestBiome extends BiomeTemplate
+{
+ public WetlandForestBiome()
+ {
+ this.setBeachBiome(null);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.SWAMP).depth(0.15F).scale(0.2F).temperature(0.6F).downfall(0.7F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(0x272179).waterFogColor(0x0C031B).fogColor(12638463).skyColor(calculateSkyColor(0.6F)).grassColorOverride(0x5A935F).foliageColorOverride(0x4F9657).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ builder.addStructureStart(StructureFeatures.SWAMP_HUT);
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_SWAMP);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+
+ builder.addFeature(GenerationStage.Decoration.LAKES, BOPConfiguredFeatures.WATER_LAKE_UNCOMMON);
+
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+ DefaultBiomeFeatures.addSwampClayDisk(builder);
+
+ builder.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES, BOPConfiguredFeatures.MUD_DISK);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.WETLAND_FOREST_TREES);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.WETLAND_FLOWERS);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.CATTAIL_24);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.FERN_GRASS_16);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.LILY_PAD_5);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.REED_5);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.TOADSTOOL_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.WATERGRASS_10);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.BROWN_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_PUMPKIN);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_SUGAR_CANE);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.RED_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.SEAGRASS_SWAMP);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.SHEEP, 12, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.PIG, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.CHICKEN, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.COW, 8, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.FOX, 8, 2, 4));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 1, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/WoodedScrublandBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/WoodedScrublandBiome.java
new file mode 100644
index 0000000000..bd8f545000
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/WoodedScrublandBiome.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.Features;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
+
+public class WoodedScrublandBiome extends BiomeTemplate
+{
+ public WoodedScrublandBiome()
+ {
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.NONE).biomeCategory(Biome.Category.SAVANNA).depth(0.1F).scale(0.2F).temperature(1.1F).downfall(0.15F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(1.1F)).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ builder.addStructureStart(StructureFeatures.VILLAGE_SAVANNA);
+ builder.addStructureStart(StructureFeatures.PILLAGER_OUTPOST);
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_STANDARD);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultLakes(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.WOODED_SCRUBLAND_TREES);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.SCRUBLAND_FLOWERS);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.DESERT_GRASS_10);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.SCRUB_EXTRA);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_12);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.TALL_GRASS_6);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.SHEEP, 12, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.PIG, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.CHICKEN, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.COW, 8, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.HORSE, 5, 2, 6));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.DONKEY, 1, 1, 3));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/biome/overworld/WoodlandBiome.java b/src/main/java/biomesoplenty/common/biome/overworld/WoodlandBiome.java
new file mode 100644
index 0000000000..9441a7bbdc
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/biome/overworld/WoodlandBiome.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.biome.overworld;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.biome.BiomeTemplate;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import biomesoplenty.common.world.gen.surfacebuilders.BOPConfiguredSurfaceBuilders;
+import net.minecraft.entity.EntityClassification;
+import net.minecraft.entity.EntityType;
+import net.minecraft.world.biome.*;
+import net.minecraft.world.gen.GenerationStage;
+import net.minecraft.world.gen.feature.Features;
+import net.minecraft.world.gen.feature.structure.StructureFeatures;
+import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilders;
+
+public class WoodlandBiome extends BiomeTemplate
+{
+ public WoodlandBiome()
+ {
+ this.addWeight(BOPClimates.WARM_TEMPERATE, 7);
+ }
+
+ @Override
+ protected void configureBiome(Biome.Builder builder)
+ {
+ builder.precipitation(Biome.RainType.RAIN).biomeCategory(Biome.Category.FOREST).depth(0.1F).scale(0.1F).temperature(0.8F).downfall(0.5F);
+
+ builder.specialEffects((new BiomeAmbience.Builder()).waterColor(4159204).waterFogColor(329011).fogColor(12638463).skyColor(calculateSkyColor(0.8F)).grassColorOverride(0xA7C047).foliageColorOverride(0x92AF1A).ambientMoodSound(MoodSoundAmbience.LEGACY_CAVE_SETTINGS).build());
+ }
+
+ @Override
+ protected void configureGeneration(BiomeGenerationSettings.Builder builder)
+ {
+ builder.surfaceBuilder(ConfiguredSurfaceBuilders.GRASS);
+
+ // Structures
+ builder.addStructureStart(StructureFeatures.VILLAGE_PLAINS);
+ builder.addStructureStart(StructureFeatures.PILLAGER_OUTPOST);
+ DefaultBiomeFeatures.addDefaultOverworldLandStructures(builder);
+ builder.addStructureStart(StructureFeatures.RUINED_PORTAL_STANDARD);
+
+ // Underground
+ DefaultBiomeFeatures.addDefaultCarvers(builder);
+ DefaultBiomeFeatures.addDefaultLakes(builder);
+ DefaultBiomeFeatures.addDefaultMonsterRoom(builder);
+ DefaultBiomeFeatures.addDefaultUndergroundVariety(builder);
+ DefaultBiomeFeatures.addDefaultOres(builder);
+ DefaultBiomeFeatures.addDefaultSoftDisks(builder);
+
+ ////////////////////////////////////////////////////////////
+
+ // Vegetation
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.WOODLAND_TREES);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.GROVE_FLOWERS);
+
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.GOLDENROD_2);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.ROSE_BUSH_2);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.STANDARD_GRASS_6);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.TALL_GRASS_6);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, BOPConfiguredFeatures.TOADSTOOL_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.BROWN_MUSHROOM_NORMAL);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.PATCH_PUMPKIN);
+ builder.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.RED_MUSHROOM_NORMAL);
+
+ ////////////////////////////////////////////////////////////
+
+ // Other Features
+ DefaultBiomeFeatures.addDefaultSprings(builder);
+ DefaultBiomeFeatures.addSurfaceFreezing(builder);
+ }
+
+ @Override
+ protected void configureMobSpawns(MobSpawnInfo.Builder builder)
+ {
+ // Entities
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.SHEEP, 12, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.PIG, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.CHICKEN, 10, 4, 4));
+ builder.addSpawn(EntityClassification.CREATURE, new MobSpawnInfo.Spawners(EntityType.COW, 8, 4, 4));
+ builder.addSpawn(EntityClassification.AMBIENT, new MobSpawnInfo.Spawners(EntityType.BAT, 10, 8, 8));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SPIDER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE, 95, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SKELETON, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CREEPER, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.SLIME, 100, 4, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
+ builder.addSpawn(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.WITCH, 5, 1, 1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/block/BrambleBlock.java b/src/main/java/biomesoplenty/common/block/BrambleBlock.java
new file mode 100644
index 0000000000..4ab2530fd2
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/block/BrambleBlock.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.block;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockState;
+import net.minecraft.block.SixWayBlock;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.PlayerEntity;
+import net.minecraft.item.BlockItemUseContext;
+import net.minecraft.pathfinding.PathType;
+import net.minecraft.state.StateContainer;
+import net.minecraft.util.DamageSource;
+import net.minecraft.util.Direction;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.IBlockReader;
+import net.minecraft.world.IWorld;
+import net.minecraft.world.World;
+
+public class BrambleBlock extends SixWayBlock
+{
+ public BrambleBlock(Block.Properties builder)
+ {
+ super(0.25F, builder);
+ this.registerDefaultState(this.stateDefinition.any().setValue(NORTH, Boolean.valueOf(false)).setValue(EAST, Boolean.valueOf(false)).setValue(SOUTH, Boolean.valueOf(false)).setValue(WEST, Boolean.valueOf(false)).setValue(UP, Boolean.valueOf(false)).setValue(DOWN, Boolean.valueOf(false)));
+ }
+
+ @Override
+ public BlockState getStateForPlacement(BlockItemUseContext context)
+ {
+ return this.makeConnections(context.getLevel(), context.getClickedPos());
+ }
+
+ public BlockState makeConnections(IBlockReader reader, BlockPos pos)
+ {
+ BlockState block = reader.getBlockState(pos.below());
+ BlockState block1 = reader.getBlockState(pos.above());
+ BlockState block2 = reader.getBlockState(pos.north());
+ BlockState block3 = reader.getBlockState(pos.east());
+ BlockState block4 = reader.getBlockState(pos.south());
+ BlockState block5 = reader.getBlockState(pos.west());
+ return this.defaultBlockState()
+ .setValue(DOWN, Boolean.valueOf(block.getBlock() == this || Block.isShapeFullBlock(block.getCollisionShape(reader, pos.below()))))
+ .setValue(UP, Boolean.valueOf(block1.getBlock() == this || Block.isShapeFullBlock(block1.getCollisionShape(reader, pos.above()))))
+ .setValue(NORTH, Boolean.valueOf(block2.getBlock() == this || Block.isShapeFullBlock(block2.getCollisionShape(reader, pos.north()))))
+ .setValue(EAST, Boolean.valueOf(block3.getBlock() == this || Block.isShapeFullBlock(block3.getCollisionShape(reader, pos.east()))))
+ .setValue(SOUTH, Boolean.valueOf(block4.getBlock() == this || Block.isShapeFullBlock(block4.getCollisionShape(reader, pos.south()))))
+ .setValue(WEST, Boolean.valueOf(block5.getBlock() == this || Block.isShapeFullBlock(block5.getCollisionShape(reader, pos.west()))));
+ }
+
+ @Override
+ public BlockState updateShape(BlockState stateIn, Direction facing, BlockState facingState, IWorld worldIn, BlockPos currentPos, BlockPos facingPos)
+ {
+ Block block = facingState.getBlock();
+ boolean flag = block == this || Block.isShapeFullBlock(facingState.getCollisionShape(worldIn, facingPos));
+ return stateIn.setValue(PROPERTY_BY_DIRECTION.get(facing), Boolean.valueOf(flag));
+ }
+
+ @Override
+ public void entityInside(BlockState state, World worldIn, BlockPos pos, Entity entityIn)
+ {
+ if (entityIn instanceof PlayerEntity)
+ {
+ PlayerEntity playerEntity = (PlayerEntity) entityIn;
+ playerEntity.hurt(DamageSource.CACTUS, 1.0F);
+ }
+ }
+
+ @Override
+ protected void createBlockStateDefinition(StateContainer.Builder builder)
+ {
+ builder.add(NORTH, EAST, SOUTH, WEST, UP, DOWN);
+ }
+
+ @Override
+ public boolean isPathfindable(BlockState state, IBlockReader worldIn, BlockPos pos, PathType type)
+ {
+ return false;
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/block/DeadBranchBlock.java b/src/main/java/biomesoplenty/common/block/DeadBranchBlock.java
new file mode 100644
index 0000000000..9c2ef698b6
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/block/DeadBranchBlock.java
@@ -0,0 +1,99 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.block;
+
+import biomesoplenty.api.block.BOPBlocks;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Maps;
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockState;
+import net.minecraft.block.Blocks;
+import net.minecraft.block.HorizontalBlock;
+import net.minecraft.entity.Entity;
+import net.minecraft.fluid.Fluids;
+import net.minecraft.item.BlockItemUseContext;
+import net.minecraft.state.DirectionProperty;
+import net.minecraft.state.StateContainer;
+import net.minecraft.util.Direction;
+import net.minecraft.util.Mirror;
+import net.minecraft.util.Rotation;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.util.math.shapes.ISelectionContext;
+import net.minecraft.util.math.shapes.VoxelShape;
+import net.minecraft.world.IBlockReader;
+import net.minecraft.world.IWorld;
+import net.minecraft.world.IWorldReader;
+import net.minecraft.world.World;
+
+import javax.annotation.Nullable;
+import java.util.Map;
+
+public class DeadBranchBlock extends Block
+{
+ public static final DirectionProperty FACING = HorizontalBlock.FACING;
+ private static final Map SHAPES = Maps.newEnumMap(ImmutableMap.of(Direction.NORTH, Block.box(4.0D, 0.0D, 4.0D, 12.0D, 16.0D, 16.0D), Direction.SOUTH, Block.box(4.0D, 0.0D, 0.0D, 12.0D, 16.0D, 12.0D), Direction.WEST, Block.box(4.0D, 0.0D, 4.0D, 16.0D, 16.0D, 12.0D), Direction.EAST, Block.box(0.0D, 0.0D, 4.0D, 12.0D, 16.0D, 12.0D)));
+
+ public DeadBranchBlock(Properties properties)
+ {
+ super(properties);
+ this.registerDefaultState(this.stateDefinition.any().setValue(FACING, Direction.NORTH));
+ }
+
+ public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
+ return SHAPES.get(state.getValue(FACING));
+ }
+
+ public BlockState rotate(BlockState state, Rotation rot) {
+ return state.setValue(FACING, rot.rotate(state.getValue(FACING)));
+ }
+
+ public BlockState mirror(BlockState state, Mirror mirrorIn) {
+ return state.rotate(mirrorIn.getRotation(state.getValue(FACING)));
+ }
+
+ protected void createBlockStateDefinition(StateContainer.Builder builder) {
+ builder.add(FACING);
+ }
+
+ /**
+ * Update the provided state given the provided neighbor facing and neighbor state, returning a new state.
+ * For example, fences make their connections to the passed in state if possible, and wet concrete powder immediately
+ * returns its solidified counterpart.
+ * Note that this method should ideally consider only the specific face passed in.
+ */
+ public BlockState updateShape(BlockState stateIn, Direction facing, BlockState facingState, IWorld worldIn, BlockPos currentPos, BlockPos facingPos)
+ {
+ return facing.getOpposite() == stateIn.getValue(FACING) && !stateIn.canSurvive(worldIn, currentPos) ? Blocks.AIR.defaultBlockState() : stateIn;
+ }
+
+ public boolean canSurvive(BlockState state, IWorldReader worldIn, BlockPos pos) {
+ Direction direction = state.getValue(FACING);
+ BlockPos blockpos = pos.relative(direction.getOpposite());
+ BlockState blockstate = worldIn.getBlockState(blockpos);
+ return blockstate.getBlock() == BOPBlocks.dead_log || blockstate.getBlock() == BOPBlocks.dead_wood;
+ }
+
+ @Nullable
+ public BlockState getStateForPlacement(BlockItemUseContext context) {
+ BlockState blockstate = super.getStateForPlacement(context);
+ IWorldReader iworldreader = context.getLevel();
+ BlockPos blockpos = context.getClickedPos();
+ Direction[] adirection = context.getNearestLookingDirections();
+
+ for(Direction direction : adirection) {
+ if (direction.getAxis().isHorizontal()) {
+ blockstate = blockstate.setValue(FACING, direction.getOpposite());
+ if (blockstate.canSurvive(iworldreader, blockpos)) {
+ return blockstate;
+ }
+ }
+ }
+
+ return null;
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/block/DoublePlantBlockBOP.java b/src/main/java/biomesoplenty/common/block/DoublePlantBlockBOP.java
new file mode 100644
index 0000000000..b8fa30a381
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/block/DoublePlantBlockBOP.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.block;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.DoublePlantBlock;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.IBlockReader;
+import net.minecraftforge.common.PlantType;
+
+public class DoublePlantBlockBOP extends DoublePlantBlock
+{
+ public DoublePlantBlockBOP(Block.Properties properties)
+ {
+ super(properties);
+ }
+
+ @Override
+ public PlantType getPlantType(IBlockReader world, BlockPos pos)
+ {
+ return PlantType.PLAINS;
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/block/DoubleWaterPlantBlock.java b/src/main/java/biomesoplenty/common/block/DoubleWaterPlantBlock.java
new file mode 100644
index 0000000000..ba4ab32803
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/block/DoubleWaterPlantBlock.java
@@ -0,0 +1,109 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.block;
+
+import biomesoplenty.core.BiomesOPlenty;
+import net.minecraft.block.*;
+import net.minecraft.block.material.Material;
+import net.minecraft.entity.LivingEntity;
+import net.minecraft.fluid.FluidState;
+import net.minecraft.fluid.Fluids;
+import net.minecraft.item.BlockItemUseContext;
+import net.minecraft.item.ItemStack;
+import net.minecraft.state.BooleanProperty;
+import net.minecraft.state.StateContainer;
+import net.minecraft.state.properties.BlockStateProperties;
+import net.minecraft.state.properties.DoubleBlockHalf;
+import net.minecraft.tags.FluidTags;
+import net.minecraft.util.Direction;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.IBlockReader;
+import net.minecraft.world.IWorld;
+import net.minecraft.world.IWorldReader;
+import net.minecraft.world.World;
+import net.minecraftforge.common.PlantType;
+
+import javax.annotation.Nullable;
+
+public class DoubleWaterPlantBlock extends DoublePlantBlock implements IWaterLoggable
+{
+ public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED;
+
+ public DoubleWaterPlantBlock(Properties properties)
+ {
+ super(properties);
+ this.registerDefaultState(this.stateDefinition.any().setValue(HALF, DoubleBlockHalf.LOWER).setValue(WATERLOGGED, Boolean.valueOf(true)));
+ }
+
+ @Nullable
+ public BlockState getStateForPlacement(BlockItemUseContext context) {
+ FluidState ifluidstate = context.getLevel().getFluidState(context.getClickedPos());
+ BlockPos blockpos = context.getClickedPos();
+ return blockpos.getY() < 255 && context.getLevel().getBlockState(blockpos.above()).canBeReplaced(context) ? this.defaultBlockState().setValue(WATERLOGGED, Boolean.valueOf(ifluidstate.is(FluidTags.WATER) && ifluidstate.getAmount() == 8)) : null;
+ }
+
+ @Override
+ public BlockState updateShape(BlockState stateIn, Direction facing, BlockState facingState, IWorld worldIn, BlockPos currentPos, BlockPos facingPos) {
+ if (stateIn.getValue(WATERLOGGED)) {
+ worldIn.getLiquidTicks().scheduleTick(currentPos, Fluids.WATER, Fluids.WATER.getTickDelay(worldIn));
+ }
+
+ return facing == Direction.DOWN && !this.canSurvive(stateIn, worldIn, currentPos) ? Blocks.AIR.defaultBlockState() : super.updateShape(stateIn, facing, facingState, worldIn, currentPos, facingPos);
+ }
+
+ @Override
+ public void setPlacedBy(World worldIn, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack) {
+ worldIn.setBlock(pos.above(), this.defaultBlockState().setValue(HALF, DoubleBlockHalf.UPPER).setValue(WATERLOGGED, false), 3);
+ }
+
+ @Override
+ public boolean canSurvive(BlockState state, IWorldReader worldIn, BlockPos pos)
+ {
+ if (state.getValue(HALF) != DoubleBlockHalf.UPPER)
+ {
+ BlockPos posBelow = pos.below();
+ BlockState existingState = worldIn.getBlockState(pos);
+ Block existingBlock = existingState.getBlock();
+ return (existingBlock == this || existingState.getMaterial() == Material.WATER) && this.isExposed(worldIn, pos.above()) && worldIn.getBlockState(posBelow).isFaceSturdy(worldIn, posBelow, Direction.UP);
+ }
+ else
+ {
+ BlockState blockstate = worldIn.getBlockState(pos.below());
+ if (state.getBlock() != this) return worldIn.isEmptyBlock(pos); // This function is called during world gen and placement, before this block is set, so if we are not 'here' then assume it's the pre-check.
+ return this.isExposed(worldIn, pos) && blockstate.getBlock() == this && blockstate.getValue(HALF) == DoubleBlockHalf.LOWER && blockstate.getValue(WATERLOGGED);
+ }
+ }
+
+ @Override
+ public void placeAt(IWorld worldIn, BlockPos pos, int flags) {
+ worldIn.setBlock(pos, this.defaultBlockState().setValue(HALF, DoubleBlockHalf.LOWER).setValue(WATERLOGGED, true), flags);
+ worldIn.setBlock(pos.above(), this.defaultBlockState().setValue(HALF, DoubleBlockHalf.UPPER).setValue(WATERLOGGED, false), flags);
+ }
+
+ @Override
+ public PlantType getPlantType(IBlockReader world, BlockPos pos)
+ {
+ return PlantType.PLAINS;
+ }
+
+ @Override
+ protected void createBlockStateDefinition(StateContainer.Builder builder) {
+ builder.add(WATERLOGGED, HALF);
+ }
+
+ @Override
+ public FluidState getFluidState(BlockState state) {
+ return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state);
+ }
+
+ protected boolean isExposed(IWorldReader world, BlockPos pos)
+ {
+ BlockState state = world.getBlockState(pos);
+ return state.getBlock() == this ? !state.getValue(WATERLOGGED) : world.isEmptyBlock(pos);
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/block/DoubleWatersidePlantBlock.java b/src/main/java/biomesoplenty/common/block/DoubleWatersidePlantBlock.java
new file mode 100644
index 0000000000..b6d434ee45
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/block/DoubleWatersidePlantBlock.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.block;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockState;
+import net.minecraft.block.Blocks;
+import net.minecraft.fluid.FluidState;
+import net.minecraft.state.properties.DoubleBlockHalf;
+import net.minecraft.tags.FluidTags;
+import net.minecraft.util.Direction;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.IBlockReader;
+import net.minecraft.world.IWorldReader;
+import net.minecraftforge.common.PlantType;
+
+import java.util.Iterator;
+
+public class DoubleWatersidePlantBlock extends DoublePlantBlockBOP
+{
+ public DoubleWatersidePlantBlock(Block.Properties properties)
+ {
+ super(properties);
+ }
+
+ @Override
+ public PlantType getPlantType(IBlockReader world, BlockPos pos)
+ {
+ return PlantType.BEACH;
+ }
+
+ @Override
+ public boolean canSurvive(BlockState state, IWorldReader worldReader, BlockPos pos)
+ {
+ if (state.getBlock() != this) return super.canSurvive(state, worldReader, pos);
+ if (state.getValue(HALF) != DoubleBlockHalf.UPPER)
+ {
+ BlockState soil = worldReader.getBlockState(pos.below());
+ if (soil.canSustainPlant(worldReader, pos.below(), Direction.UP, this))
+ {
+ BlockPos blockpos = pos.below();
+ Iterator var7 = Direction.Plane.HORIZONTAL.iterator();
+
+ BlockState BlockState;
+ FluidState ifluidstate;
+ do {
+ if (!var7.hasNext()) {
+ return false;
+ }
+
+ Direction dir = (Direction)var7.next();
+ BlockState = worldReader.getBlockState(blockpos.relative(dir));
+ ifluidstate = worldReader.getFluidState(blockpos.relative(dir));
+ } while(!ifluidstate.is(FluidTags.WATER) && BlockState.getBlock() != Blocks.FROSTED_ICE);
+
+ return true;
+ }
+ }
+ else
+ {
+ BlockState below = worldReader.getBlockState(pos.below());
+ return below.getBlock() == this && below.getValue(HALF) == DoubleBlockHalf.LOWER;
+ }
+
+ return false;
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/block/DriedSaltBlock.java b/src/main/java/biomesoplenty/common/block/DriedSaltBlock.java
new file mode 100644
index 0000000000..fda936cd21
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/block/DriedSaltBlock.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.block;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockState;
+import net.minecraft.util.Direction;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.IBlockReader;
+import net.minecraftforge.common.PlantType;
+
+public class DriedSaltBlock extends Block
+{
+ public DriedSaltBlock(Block.Properties properties)
+ {
+ super(properties);
+ }
+
+ @Override
+ public boolean canSustainPlant(BlockState state, IBlockReader world, BlockPos pos, Direction facing, net.minecraftforge.common.IPlantable plantable) {
+ PlantType type = plantable.getPlantType(world, pos.relative(facing));
+
+ if (type == PlantType.DESERT) return true;
+ else if (type == PlantType.NETHER) return true;
+ else if (type == PlantType.CAVE) return true;
+ else if (type == PlantType.PLAINS) return true;
+ return false;
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/block/FleshBlock.java b/src/main/java/biomesoplenty/common/block/FleshBlock.java
new file mode 100644
index 0000000000..8b8d6ac46b
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/block/FleshBlock.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.block;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.Entity;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.World;
+
+public class FleshBlock extends Block
+{
+ public FleshBlock(Block.Properties properties)
+ {
+ super(properties);
+ }
+
+ @Override
+ public void stepOn(World worldIn, BlockPos pos, Entity entityIn)
+ {
+ entityIn.setDeltaMovement(entityIn.getDeltaMovement().multiply(0.95D, 1.0D, 0.95D));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/block/FlowerBlockBOP.java b/src/main/java/biomesoplenty/common/block/FlowerBlockBOP.java
new file mode 100644
index 0000000000..8884f8e6bc
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/block/FlowerBlockBOP.java
@@ -0,0 +1,122 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.block;
+
+import biomesoplenty.api.block.BOPBlocks;
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockState;
+import net.minecraft.block.Blocks;
+import net.minecraft.block.FlowerBlock;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.LivingEntity;
+import net.minecraft.particles.ParticleTypes;
+import net.minecraft.potion.Effect;
+import net.minecraft.potion.Effects;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.util.math.shapes.ISelectionContext;
+import net.minecraft.util.math.shapes.VoxelShape;
+import net.minecraft.world.IBlockReader;
+import net.minecraft.world.IWorldReader;
+import net.minecraft.world.World;
+import net.minecraftforge.api.distmarker.Dist;
+import net.minecraftforge.api.distmarker.OnlyIn;
+
+import java.util.Random;
+
+public class FlowerBlockBOP extends FlowerBlock
+{
+ protected static final VoxelShape NORMAL = Block.box(5.0D, 0.0D, 5.0D, 11.0D, 10.0D, 11.0D);
+ protected static final VoxelShape LARGE = Block.box(1.0D, 0.0D, 1.0D, 15.0D, 14.0D, 15.0D);
+ private final Effect stewEffect;
+ private final int stewEffectDuration;
+
+ public FlowerBlockBOP(Effect p_i49984_1_, int effectDuration, Block.Properties properties)
+ {
+ super(p_i49984_1_, 0, properties);
+ this.stewEffect = p_i49984_1_;
+ if (p_i49984_1_.isInstantenous()) {
+ this.stewEffectDuration = effectDuration;
+ } else {
+ this.stewEffectDuration = effectDuration * 20;
+ }
+ }
+
+ @Override
+ public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext selectionContext)
+ {
+ Block block = state.getBlock();
+
+ if (block == BOPBlocks.lavender || block == BOPBlocks.pink_hibiscus)
+ {
+ return LARGE;
+ }
+
+ return NORMAL;
+ }
+
+ @Override
+ public boolean canSurvive(BlockState state, IWorldReader worldIn, BlockPos pos)
+ {
+ Block ground = worldIn.getBlockState(pos.below()).getBlock();
+
+ if (this == BOPBlocks.wildflower)
+ {
+ return ground == Blocks.SAND || ground == Blocks.RED_SAND || ground == BOPBlocks.white_sand || ground == BOPBlocks.orange_sand || ground == BOPBlocks.black_sand || super.canSurvive(state, worldIn, pos);
+ }
+ if (this == BOPBlocks.burning_blossom)
+ {
+ return ground == Blocks.NETHERRACK || ground == Blocks.SOUL_SAND || ground == Blocks.SOUL_SOIL || ground == Blocks.CRIMSON_NYLIUM || ground == Blocks.WARPED_NYLIUM || super.canSurvive(state, worldIn, pos);
+ }
+
+ return super.canSurvive(state, worldIn, pos);
+ }
+
+ @Override
+ public void entityInside(BlockState stateIn, World worldIn, BlockPos pos, Entity entityIn)
+ {
+ Block block = stateIn.getBlock();
+
+ if (entityIn instanceof LivingEntity)
+ {
+ if (block == BOPBlocks.burning_blossom)
+ {
+ (entityIn).setSecondsOnFire(1);
+ }
+ }
+ }
+
+ @Override
+ @OnlyIn(Dist.CLIENT)
+ public void animateTick(BlockState stateIn, World worldIn, BlockPos pos, Random rand)
+ {
+ super.animateTick(stateIn, worldIn, pos, rand);
+ Block block = stateIn.getBlock();
+
+ if (block == BOPBlocks.burning_blossom)
+ {
+ if (rand.nextInt(8) == 0)
+ {
+ worldIn.addParticle(ParticleTypes.FLAME, (double)(pos.getX() + 0.5D + ((rand.nextDouble() - rand.nextDouble()) / 4.0D)), (double)(pos.getY() + 0.75D), (double)(pos.getZ() + 0.5D + ((rand.nextDouble() - rand.nextDouble()) / 4.0D)), 0.0D, 0.0D, 0.0D);
+ }
+ if (rand.nextInt(4) == 0)
+ {
+ worldIn.addParticle(ParticleTypes.SMOKE, (double)(pos.getX() + 0.5D + ((rand.nextDouble() - rand.nextDouble()) / 4.0D)), (double)(pos.getY() + 0.75D), (double)(pos.getZ() + 0.5D + ((rand.nextDouble() - rand.nextDouble()) / 4.0D)), 0.0D, 0.0D, 0.0D);
+ }
+ }
+ }
+
+ @Override
+ public Effect getSuspiciousStewEffect() {
+ return this.stewEffect;
+ }
+
+ @Override
+ public int getEffectDuration() {
+ return this.stewEffectDuration;
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/block/FoliageBlockBOP.java b/src/main/java/biomesoplenty/common/block/FoliageBlockBOP.java
new file mode 100644
index 0000000000..bb83959a79
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/block/FoliageBlockBOP.java
@@ -0,0 +1,160 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.block;
+
+import biomesoplenty.api.block.BOPBlocks;
+import biomesoplenty.common.world.gen.feature.BOPConfiguredFeatures;
+import biomesoplenty.common.world.gen.feature.BOPFeatures;
+import net.minecraft.block.*;
+import net.minecraft.entity.player.PlayerEntity;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.Items;
+import net.minecraft.stats.Stats;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.Direction;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.util.math.shapes.ISelectionContext;
+import net.minecraft.util.math.shapes.VoxelShape;
+import net.minecraft.world.IBlockReader;
+import net.minecraft.world.IWorldReader;
+import net.minecraft.world.World;
+import net.minecraft.world.gen.feature.ConfiguredFeature;
+import net.minecraft.world.gen.feature.IFeatureConfig;
+import net.minecraft.world.gen.feature.NoFeatureConfig;
+import net.minecraft.world.server.ServerWorld;
+import net.minecraftforge.common.IPlantable;
+import net.minecraftforge.common.PlantType;
+
+import javax.annotation.Nullable;
+import java.util.Random;
+
+public class FoliageBlockBOP extends BushBlock implements IPlantable, IGrowable
+{
+ protected static final VoxelShape NORMAL = Block.box(2.0D, 0.0D, 2.0D, 14.0D, 13.0D, 14.0D);
+ protected static final VoxelShape SHORT = Block.box(1.0D, 0.0D, 1.0D, 15.0D, 7.0D, 15.0D);
+
+ public FoliageBlockBOP(Block.Properties properties)
+ {
+ super(properties);
+ }
+
+ @Override
+ public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext selectionContext)
+ {
+ Block block = state.getBlock();
+
+ if (block == BOPBlocks.desert_grass || block == BOPBlocks.clover)
+ {
+ return SHORT;
+ }
+
+ return NORMAL;
+ }
+
+ @Override
+ public void playerDestroy(World worldIn, PlayerEntity player, BlockPos pos, BlockState state, @Nullable TileEntity te, ItemStack stack)
+ {
+ if (!worldIn.isClientSide && stack.getItem() == Items.SHEARS)
+ {
+ player.awardStat(Stats.BLOCK_MINED.get(this));
+ player.causeFoodExhaustion(0.005F);
+ this.popResource(worldIn, pos, new ItemStack(this));
+ }
+ else
+ {
+ super.playerDestroy(worldIn, player, pos, state, te, stack);
+ }
+ }
+
+ public java.util.List onSheared(ItemStack item, net.minecraft.world.IWorld world, BlockPos pos, int fortune)
+ {
+ world.setBlock(pos, Blocks.AIR.defaultBlockState(), 11);
+ return java.util.Arrays.asList(new ItemStack(this));
+ }
+
+ @Override
+ public boolean canSurvive(BlockState state, IWorldReader worldIn, BlockPos pos)
+ {
+ BlockState groundState = worldIn.getBlockState(pos.below());
+ Block ground = groundState.getBlock();
+
+ if (this == BOPBlocks.sprout)
+ {
+ return groundState.isFaceSturdy(worldIn, pos.below(), Direction.UP) || super.canSurvive(state, worldIn, pos);
+ }
+ if (this == BOPBlocks.dune_grass)
+ {
+ return ground == Blocks.SAND || ground == Blocks.RED_SAND || ground == BOPBlocks.white_sand || ground == BOPBlocks.orange_sand || ground == BOPBlocks.black_sand;
+ }
+ if (this == BOPBlocks.desert_grass || this == BOPBlocks.dead_grass)
+ {
+ return ground == BOPBlocks.dried_salt || ground == Blocks.GRAVEL || ground == Blocks.SAND || ground == Blocks.RED_SAND || ground == BOPBlocks.white_sand || ground == BOPBlocks.orange_sand || ground == BOPBlocks.black_sand || ground == Blocks.NETHERRACK || super.canSurvive(state, worldIn, pos);
+ }
+
+ return super.canSurvive(state, worldIn, pos);
+ }
+
+ @Override
+ public Block.OffsetType getOffsetType()
+ {
+ return Block.OffsetType.XYZ;
+ }
+
+ @Override
+ public PlantType getPlantType(IBlockReader world, BlockPos pos)
+ {
+ return PlantType.PLAINS;
+ }
+
+ @Override
+ public boolean isValidBonemealTarget(IBlockReader worldIn, BlockPos pos, BlockState state, boolean isClient)
+ {
+ Block block = state.getBlock();
+
+ if (block == BOPBlocks.clover)
+ {
+ return true;
+ }
+
+ return false;
+ }
+
+ @Override
+ public boolean isBonemealSuccess(World worldIn, Random rand, BlockPos pos, BlockState state)
+ {
+ Block block = state.getBlock();
+
+ if (block == BOPBlocks.clover) { return (double)rand.nextFloat() < 0.4D; }
+
+ return false;
+ }
+
+ @Override
+ public void performBonemeal(ServerWorld world, Random rand, BlockPos pos, BlockState state)
+ {
+ Block block = state.getBlock();
+
+ if (block == BOPBlocks.clover) { this.growHugeClover(world, rand, pos, state); }
+ }
+
+ public boolean growHugeClover(ServerWorld world, Random rand, BlockPos pos, BlockState state)
+ {
+ world.removeBlock(pos, false);
+ ConfiguredFeature configuredfeature = BOPFeatures.HUGE_CLOVER.configured(IFeatureConfig.NONE);
+
+ if (configuredfeature.place(world, world.getChunkSource().getGenerator(), rand, pos))
+ {
+ return true;
+ }
+ else
+ {
+ world.setBlock(pos, state, 3);
+ return false;
+ }
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/block/HugeCloverPetalBlock.java b/src/main/java/biomesoplenty/common/block/HugeCloverPetalBlock.java
new file mode 100644
index 0000000000..60975a594f
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/block/HugeCloverPetalBlock.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.block;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockState;
+import net.minecraft.block.Blocks;
+import net.minecraft.block.HorizontalBlock;
+import net.minecraft.item.BlockItemUseContext;
+import net.minecraft.state.DirectionProperty;
+import net.minecraft.state.StateContainer;
+import net.minecraft.util.Direction;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.util.math.shapes.ISelectionContext;
+import net.minecraft.util.math.shapes.VoxelShape;
+import net.minecraft.world.IBlockReader;
+import net.minecraft.world.IWorld;
+import net.minecraft.world.IWorldReader;
+import net.minecraftforge.common.IPlantable;
+import net.minecraftforge.common.PlantType;
+
+public class HugeCloverPetalBlock extends HorizontalBlock implements IPlantable
+{
+ public static final DirectionProperty FACING = HorizontalBlock.FACING;
+ public static final VoxelShape SHAPE = Block.box(0.0D, 13.0D, 0.0D, 16.0D, 15.0D, 16.0D);
+
+ public HugeCloverPetalBlock(Properties properties)
+ {
+ super(properties);
+ this.registerDefaultState(this.stateDefinition.any().setValue(FACING, Direction.NORTH));
+ }
+
+ public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
+ return SHAPE;
+ }
+
+ protected void createBlockStateDefinition(StateContainer.Builder builder) {
+ builder.add(FACING);
+ }
+
+ public BlockState updateShape(BlockState p_196271_1_, Direction p_196271_2_, BlockState p_196271_3_, IWorld p_196271_4_, BlockPos p_196271_5_, BlockPos p_196271_6_) {
+ return !p_196271_1_.canSurvive(p_196271_4_, p_196271_5_) ? Blocks.AIR.defaultBlockState() : super.updateShape(p_196271_1_, p_196271_2_, p_196271_3_, p_196271_4_, p_196271_5_, p_196271_6_);
+ }
+
+ protected boolean mayPlaceOn(BlockState p_200014_1_, IBlockReader p_200014_2_, BlockPos p_200014_3_) {
+ return p_200014_1_.is(Blocks.GRASS_BLOCK) || p_200014_1_.is(Blocks.DIRT) || p_200014_1_.is(Blocks.COARSE_DIRT) || p_200014_1_.is(Blocks.PODZOL) || p_200014_1_.is(Blocks.FARMLAND);
+ }
+
+ @Override
+ public boolean canSurvive(BlockState p_196260_1_, IWorldReader p_196260_2_, BlockPos p_196260_3_) {
+ BlockPos blockpos = p_196260_3_.below();
+ if (p_196260_1_.getBlock() == this) //Forge: This function is called during world gen and placement, before this block is set, so if we are not 'here' then assume it's the pre-check.
+ return p_196260_2_.getBlockState(blockpos).canSustainPlant(p_196260_2_, blockpos, Direction.UP, this);
+ return this.mayPlaceOn(p_196260_2_.getBlockState(blockpos), p_196260_2_, blockpos);
+ }
+
+ @Override
+ public PlantType getPlantType(IBlockReader world, BlockPos pos)
+ {
+ return PlantType.PLAINS;
+ }
+
+ @Override
+ public BlockState getPlant(IBlockReader world, BlockPos pos) {
+ BlockState state = world.getBlockState(pos);
+ if (state.getBlock() != this) return defaultBlockState();
+ return state;
+ }
+
+ public BlockState getStateForPlacement(BlockItemUseContext p_196258_1_) {
+ return this.defaultBlockState().setValue(FACING, p_196258_1_.getHorizontalDirection());
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/block/MudBlock.java b/src/main/java/biomesoplenty/common/block/MudBlock.java
new file mode 100644
index 0000000000..43f2f0ac38
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/block/MudBlock.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.block;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockState;
+import net.minecraft.block.Blocks;
+import net.minecraft.block.material.Material;
+import net.minecraft.entity.Entity;
+import net.minecraft.fluid.FluidState;
+import net.minecraft.tags.FluidTags;
+import net.minecraft.util.Direction;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.IBlockReader;
+import net.minecraft.world.World;
+import net.minecraftforge.common.PlantType;
+
+public class MudBlock extends Block
+{
+ public MudBlock(Block.Properties properties)
+ {
+ super(properties);
+ }
+
+ @Override
+ public void stepOn(World worldIn, BlockPos pos, Entity entityIn)
+ {
+ entityIn.setDeltaMovement(entityIn.getDeltaMovement().multiply(0.5D, 1.0D, 0.5D));
+ }
+
+ @Override
+ public boolean canSustainPlant(BlockState state, IBlockReader world, BlockPos pos, Direction facing, net.minecraftforge.common.IPlantable plantable)
+ {
+ PlantType type = plantable.getPlantType(world, pos.relative(facing));
+
+ if (type == PlantType.BEACH)
+ {
+ for(Direction direction : Direction.Plane.HORIZONTAL) {
+ BlockState blockstate1 = world.getBlockState(pos.relative(direction));
+ FluidState fluidstate = world.getFluidState(pos.relative(direction));
+ if (fluidstate.is(FluidTags.WATER) || blockstate1.is(Blocks.FROSTED_ICE)) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/block/MushroomBlockBOP.java b/src/main/java/biomesoplenty/common/block/MushroomBlockBOP.java
new file mode 100644
index 0000000000..8a46c1f512
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/block/MushroomBlockBOP.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.block;
+
+import biomesoplenty.api.block.BOPBlocks;
+import biomesoplenty.common.world.gen.feature.BOPFeatures;
+import net.minecraft.block.*;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.IBlockReader;
+import net.minecraft.world.IWorldReader;
+import net.minecraft.world.World;
+import net.minecraft.world.gen.feature.*;
+import net.minecraft.world.server.ServerWorld;
+
+import java.util.Random;
+
+public class MushroomBlockBOP extends MushroomBlock implements IGrowable
+{
+ public MushroomBlockBOP(Block.Properties properties)
+ {
+ super(properties);
+ }
+
+ @Override
+ public void tick(BlockState state, ServerWorld world, BlockPos pos, Random random)
+ {
+ }
+
+ @Override
+ public boolean canSurvive(BlockState state, IWorldReader worldIn, BlockPos pos)
+ {
+ Block ground = worldIn.getBlockState(pos.below()).getBlock();
+ BlockState BlockState = worldIn.getBlockState(pos.below());
+
+ return BlockState.canSustainPlant(worldIn, pos.below(), net.minecraft.util.Direction.UP, this);
+ }
+
+ @Override
+ public boolean growMushroom(ServerWorld world, BlockPos p_226940_2_, BlockState p_226940_3_, Random p_226940_4_)
+ {
+ world.removeBlock(p_226940_2_, false);
+ ConfiguredFeature configuredfeature;
+ if (this == BOPBlocks.glowshroom)
+ {
+ configuredfeature = BOPFeatures.HUGE_GLOWSHROOM.configured(IFeatureConfig.NONE);
+ }
+ else
+ {
+ if (this != BOPBlocks.toadstool)
+ {
+ world.setBlock(p_226940_2_, p_226940_3_, 3);
+ return false;
+ }
+
+ configuredfeature = BOPFeatures.HUGE_TOADSTOOL.configured(IFeatureConfig.NONE);
+ }
+
+ if (configuredfeature.place(world, world.getChunkSource().getGenerator(), p_226940_4_, p_226940_2_))
+ {
+ return true;
+ }
+ else
+ {
+ world.setBlock(p_226940_2_, p_226940_3_, 3);
+ return false;
+ }
+ }
+
+ public boolean isValidBonemealTarget(IBlockReader worldIn, BlockPos pos, BlockState state, boolean isClient) {
+ return true;
+ }
+
+ public boolean isBonemealSuccess(World worldIn, Random rand, BlockPos pos, BlockState state) {
+ return (double)rand.nextFloat() < 0.4D;
+ }
+
+ public void performBonemeal(ServerWorld p_225535_1_, Random p_225535_2_, BlockPos p_225535_3_, BlockState p_225535_4_) {
+ this.growMushroom(p_225535_1_, p_225535_3_, p_225535_4_, p_225535_2_);
+ }
+
+ public boolean hasPostProcess(BlockState state, IBlockReader worldIn, BlockPos pos) {
+ return true;
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/block/NetherCrystalBlock.java b/src/main/java/biomesoplenty/common/block/NetherCrystalBlock.java
new file mode 100644
index 0000000000..63bb913d24
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/block/NetherCrystalBlock.java
@@ -0,0 +1,101 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.block;
+
+import biomesoplenty.api.block.BOPBlocks;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Maps;
+import net.minecraft.block.*;
+import net.minecraft.item.BlockItemUseContext;
+import net.minecraft.pathfinding.PathType;
+import net.minecraft.state.DirectionProperty;
+import net.minecraft.state.StateContainer;
+import net.minecraft.state.properties.AttachFace;
+import net.minecraft.util.Direction;
+import net.minecraft.util.Mirror;
+import net.minecraft.util.Rotation;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.util.math.shapes.ISelectionContext;
+import net.minecraft.util.math.shapes.VoxelShape;
+import net.minecraft.world.IBlockReader;
+import net.minecraft.world.IWorld;
+import net.minecraft.world.IWorldReader;
+
+import javax.annotation.Nullable;
+import java.util.Map;
+
+public class NetherCrystalBlock extends HorizontalFaceBlock
+{
+ protected static final VoxelShape FLOOR_AABB = Block.box(2.0D, 0.0D, 2.0D, 14.0D, 13.0D, 14.0D);
+ protected static final VoxelShape CEILING_AABB = Block.box(2.0D, 3.0D, 2.0D, 14.0D, 16.0D, 14.0D);
+ protected static final VoxelShape NORTH_AABB = Block.box(2.0D, 2.0D, 3.0D, 14.0D, 14.0D, 16.0D);
+ protected static final VoxelShape SOUTH_AABB = Block.box(2.0D, 2.0D, 0.0D, 14.0D, 14.0D, 13.0D);
+ protected static final VoxelShape EAST_AABB = Block.box(0.0D, 2.0D, 2.0D, 13.0D, 14.0D, 14.0D);
+ protected static final VoxelShape WEST_AABB = Block.box(3.0D, 2.0D, 2.0D, 16.0D, 14.0D, 14.0D);
+
+ public NetherCrystalBlock(Block.Properties properties)
+ {
+ super(properties);
+ this.registerDefaultState(this.stateDefinition.any().setValue(FACE, AttachFace.FLOOR).setValue(FACING, Direction.NORTH));
+ }
+
+ protected static boolean mayPlaceOn(BlockState state, IBlockReader worldIn, BlockPos pos) {
+ Block block = state.getBlock();
+ return block == Blocks.NETHERRACK || block == Blocks.NETHER_QUARTZ_ORE || block == Blocks.BLACKSTONE || block == BOPBlocks.nether_crystal_block;
+ }
+
+ @Override
+ public boolean canSurvive(BlockState state, IWorldReader worldIn, BlockPos pos) {
+ return canAttach(worldIn, pos, getConnectedDirection(state).getOpposite());
+ }
+
+ public static boolean canAttach(IWorldReader p_220185_0_, BlockPos p_220185_1_, Direction p_220185_2_) {
+ BlockPos blockpos = p_220185_1_.relative(p_220185_2_);
+ return mayPlaceOn(p_220185_0_.getBlockState(blockpos), p_220185_0_, blockpos);
+ }
+
+ public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
+ Direction direction = state.getValue(FACING);
+ switch(state.getValue(FACE))
+ {
+ case FLOOR:
+ return FLOOR_AABB;
+ case WALL:
+ switch(direction)
+ {
+ case EAST:
+ return EAST_AABB;
+ case WEST:
+ return WEST_AABB;
+ case SOUTH:
+ return SOUTH_AABB;
+ case NORTH:
+ default:
+ return NORTH_AABB;
+ }
+ case CEILING:
+ default:
+ return CEILING_AABB;
+ }
+ }
+
+ @Override
+ public boolean propagatesSkylightDown(BlockState state, IBlockReader reader, BlockPos pos) {
+ return state.getFluidState().isEmpty();
+ }
+
+ @Override
+ public boolean isPathfindable(BlockState state, IBlockReader worldIn, BlockPos pos, PathType type) {
+ return type == PathType.AIR && !this.hasCollision ? true : super.isPathfindable(state, worldIn, pos, type);
+ }
+
+ @Override
+ protected void createBlockStateDefinition(StateContainer.Builder builderIn) {
+ builderIn.add(FACING, FACE);
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/block/PlantBlockBOP.java b/src/main/java/biomesoplenty/common/block/PlantBlockBOP.java
new file mode 100644
index 0000000000..1dde1c46d7
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/block/PlantBlockBOP.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.block;
+
+import biomesoplenty.api.block.BOPBlocks;
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockState;
+import net.minecraft.block.Blocks;
+import net.minecraft.block.BushBlock;
+import net.minecraft.util.Direction;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.util.math.shapes.ISelectionContext;
+import net.minecraft.util.math.shapes.VoxelShape;
+import net.minecraft.world.IBlockReader;
+import net.minecraft.world.IWorldReader;
+import net.minecraftforge.common.IPlantable;
+import net.minecraftforge.common.PlantType;
+
+public class PlantBlockBOP extends BushBlock implements IPlantable
+{
+ protected static final VoxelShape NORMAL = Block.box(2.0D, 0.0D, 2.0D, 14.0D, 13.0D, 14.0D);
+
+ public PlantBlockBOP(Block.Properties properties)
+ {
+ super(properties);
+ }
+
+ @Override
+ public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext selectionContext)
+ {
+ Block block = state.getBlock();
+
+ return NORMAL;
+ }
+
+ @Override
+ public Block.OffsetType getOffsetType()
+ {
+ return Block.OffsetType.XZ;
+ }
+
+ @Override
+ public boolean canSurvive(BlockState state, IWorldReader worldIn, BlockPos pos)
+ {
+ return super.canSurvive(state, worldIn, pos);
+ }
+
+ @Override
+ public PlantType getPlantType(IBlockReader world, BlockPos pos)
+ {
+ return PlantType.PLAINS;
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/block/SandBlockBOP.java b/src/main/java/biomesoplenty/common/block/SandBlockBOP.java
new file mode 100644
index 0000000000..66ef97b0ff
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/block/SandBlockBOP.java
@@ -0,0 +1,42 @@
+package biomesoplenty.common.block;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockState;
+import net.minecraft.block.Blocks;
+import net.minecraft.block.SandBlock;
+import net.minecraft.block.material.Material;
+import net.minecraft.fluid.FluidState;
+import net.minecraft.tags.FluidTags;
+import net.minecraft.util.Direction;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.IBlockReader;
+import net.minecraftforge.common.PlantType;
+
+public class SandBlockBOP extends SandBlock
+{
+ public SandBlockBOP(int p_i48338_1_, Block.Properties properties)
+ {
+ super(p_i48338_1_, properties);
+ }
+
+ @Override
+ public boolean canSustainPlant(BlockState state, IBlockReader world, BlockPos pos, Direction facing, net.minecraftforge.common.IPlantable plantable)
+ {
+ PlantType type = plantable.getPlantType(world, pos.relative(facing));
+
+ if (type == PlantType.DESERT) return true;
+ else if (type == PlantType.CAVE) return true;
+ else if (type == PlantType.BEACH)
+ {
+ for(Direction direction : Direction.Plane.HORIZONTAL) {
+ BlockState blockstate1 = world.getBlockState(pos.relative(direction));
+ FluidState fluidstate = world.getFluidState(pos.relative(direction));
+ if (fluidstate.is(FluidTags.WATER) || blockstate1.is(Blocks.FROSTED_ICE)) {
+ return true;
+ }
+ }
+ }
+
+ return super.canSustainPlant(state, world, pos, facing, plantable);
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/block/SaplingBlockBOP.java b/src/main/java/biomesoplenty/common/block/SaplingBlockBOP.java
new file mode 100644
index 0000000000..c7c6b011d2
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/block/SaplingBlockBOP.java
@@ -0,0 +1,115 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.block;
+
+import biomesoplenty.api.block.BOPBlocks;
+import net.minecraft.block.*;
+import net.minecraft.block.trees.Tree;
+import net.minecraft.state.IntegerProperty;
+import net.minecraft.state.StateContainer;
+import net.minecraft.state.properties.BlockStateProperties;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.util.math.shapes.ISelectionContext;
+import net.minecraft.util.math.shapes.VoxelShape;
+import net.minecraft.world.IBlockReader;
+import net.minecraft.world.IWorld;
+import net.minecraft.world.IWorldReader;
+import net.minecraft.world.World;
+import net.minecraft.world.server.ServerWorld;
+
+import java.util.Random;
+
+public class SaplingBlockBOP extends SaplingBlock implements IGrowable
+{
+ public static final IntegerProperty STAGE = BlockStateProperties.STAGE;
+ public static final VoxelShape SHAPE = Block.box(2.0D, 0.0D, 2.0D, 14.0D, 12.0D, 14.0D);
+ private final Tree tree;
+
+ public SaplingBlockBOP(Tree tree, Block.Properties properties)
+ {
+ super(tree, properties);
+ this.tree = tree;
+ this.registerDefaultState(this.stateDefinition.any().setValue(STAGE, Integer.valueOf(0)));
+ }
+
+ @Override
+ public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext selectionContext)
+ {
+ return SHAPE;
+ }
+
+ @Override
+ public void tick(BlockState state, ServerWorld world, BlockPos pos, Random random)
+ {
+ super.tick(state, world, pos, random);
+ if (!world.isAreaLoaded(pos, 1)) return; // Forge: prevent loading unloaded chunks when checking neighbor's light
+ if (world.getMaxLocalRawBrightness(pos.above()) >= 9 && random.nextInt(7) == 0) {
+ this.performBonemeal(world, random, pos, state);
+ }
+
+ }
+
+ @Override
+ public void performBonemeal(ServerWorld world, Random rand, BlockPos pos, BlockState state)
+ {
+ if (state.getValue(STAGE) == 0)
+ {
+ world.setBlock(pos, state.cycle(STAGE), 4);
+ }
+ else
+ {
+ if (!net.minecraftforge.event.ForgeEventFactory.saplingGrowTree(world, rand, pos)) return;
+ this.tree.growTree(world, world.getChunkSource().getGenerator(), pos, state, rand);
+ }
+
+ }
+
+ /**
+ * Whether this IGrowable can grow
+ */
+ @Override
+ public boolean isValidBonemealTarget(IBlockReader worldIn, BlockPos pos, BlockState state, boolean isClient)
+ {
+ return true;
+ }
+
+ @Override
+ public boolean isBonemealSuccess(World worldIn, Random rand, BlockPos pos, BlockState state)
+ {
+ return (double)worldIn.random.nextFloat() < 0.45D;
+ }
+
+ @Override
+ public void advanceTree(ServerWorld world, BlockPos pos, BlockState state, Random rand)
+ {
+ this.performBonemeal(world, rand, pos, state);
+ }
+
+ @Override
+ public boolean canSurvive(BlockState state, IWorldReader worldIn, BlockPos pos)
+ {
+ Block ground = worldIn.getBlockState(pos.below()).getBlock();
+
+ if (this == BOPBlocks.palm_sapling)
+ {
+ return ground == BOPBlocks.white_sand || ground == BOPBlocks.orange_sand || ground == BOPBlocks.black_sand || ground == Blocks.RED_SAND || ground == Blocks.SAND || super.canSurvive(state, worldIn, pos);
+ }
+ if (this == BOPBlocks.hellbark_sapling)
+ {
+ return ground == Blocks.NETHERRACK || super.canSurvive(state, worldIn, pos);
+ }
+
+ return super.canSurvive(state, worldIn, pos);
+ }
+
+ @Override
+ public void createBlockStateDefinition(StateContainer.Builder builder)
+ {
+ builder.add(STAGE);
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/block/SpanishMossBlock.java b/src/main/java/biomesoplenty/common/block/SpanishMossBlock.java
new file mode 100644
index 0000000000..b0558ac980
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/block/SpanishMossBlock.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.block;
+
+import biomesoplenty.api.block.BOPBlocks;
+import net.minecraft.block.*;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.PlayerEntity;
+import net.minecraft.item.BlockItemUseContext;
+import net.minecraft.pathfinding.PathType;
+import net.minecraft.state.StateContainer;
+import net.minecraft.tags.BlockTags;
+import net.minecraft.util.DamageSource;
+import net.minecraft.util.Direction;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.util.math.shapes.VoxelShape;
+import net.minecraft.world.IBlockReader;
+import net.minecraft.world.IWorld;
+import net.minecraft.world.IWorldReader;
+import net.minecraft.world.World;
+
+public class SpanishMossBlock extends AbstractBodyPlantBlock {
+ public static final VoxelShape SHAPE = Block.box(1.0D, 0.0D, 1.0D, 15.0D, 16.0D, 15.0D);
+
+ public SpanishMossBlock(AbstractBlock.Properties p_i241195_1_) {
+ super(p_i241195_1_, Direction.DOWN, SHAPE, false);
+ }
+
+ protected AbstractTopPlantBlock getHeadBlock() {
+ return (AbstractTopPlantBlock) BOPBlocks.spanish_moss;
+ }
+
+ @Override
+ public boolean canSurvive(BlockState p_196260_1_, IWorldReader p_196260_2_, BlockPos p_196260_3_) {
+ BlockPos blockpos = p_196260_3_.relative(this.growthDirection.getOpposite());
+ BlockState blockstate = p_196260_2_.getBlockState(blockpos);
+ Block block = blockstate.getBlock();
+ if (!this.canAttachToBlock(block)) {
+ return false;
+ } else {
+ return block == this.getHeadBlock() || block == this.getBodyBlock() || blockstate.getBlock().is(BlockTags.LEAVES) || blockstate.getBlock().is(BlockTags.LOGS);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/biomesoplenty/common/block/SpanishMossBottomBlock.java b/src/main/java/biomesoplenty/common/block/SpanishMossBottomBlock.java
new file mode 100644
index 0000000000..86a471e76d
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/block/SpanishMossBottomBlock.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.block;
+
+import biomesoplenty.api.block.BOPBlocks;
+import net.minecraft.block.*;
+import net.minecraft.tags.BlockTags;
+import net.minecraft.util.Direction;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.util.math.shapes.VoxelShape;
+import net.minecraft.world.IWorldReader;
+
+import java.util.Random;
+
+public class SpanishMossBottomBlock extends AbstractTopPlantBlock {
+ protected static final VoxelShape SHAPE = Block.box(1.0D, 0.0D, 1.0D, 15.0D, 16.0D, 15.0D);
+
+ public SpanishMossBottomBlock(AbstractBlock.Properties p_i241194_1_) {
+ super(p_i241194_1_, Direction.DOWN, SHAPE, false, 0.01D);
+ }
+
+ protected int getBlocksToGrowWhenBonemealed(Random p_230332_1_) {
+ return PlantBlockHelper.getBlocksToGrowWhenBonemealed(p_230332_1_);
+ }
+
+ protected Block getBodyBlock() {
+ return BOPBlocks.spanish_moss_plant;
+ }
+
+ protected boolean canGrowInto(BlockState p_230334_1_) {
+ return PlantBlockHelper.isValidGrowthState(p_230334_1_);
+ }
+
+ @Override
+ public boolean canSurvive(BlockState p_196260_1_, IWorldReader p_196260_2_, BlockPos p_196260_3_) {
+ BlockPos blockpos = p_196260_3_.relative(this.growthDirection.getOpposite());
+ BlockState blockstate = p_196260_2_.getBlockState(blockpos);
+ Block block = blockstate.getBlock();
+ if (!this.canAttachToBlock(block)) {
+ return false;
+ } else {
+ return block == this.getHeadBlock() || block == this.getBodyBlock() || blockstate.getBlock().is(BlockTags.LEAVES) || blockstate.getBlock().is(BlockTags.LOGS);
+ }
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/block/TallFlowerBlockBOP.java b/src/main/java/biomesoplenty/common/block/TallFlowerBlockBOP.java
new file mode 100644
index 0000000000..1f38bd969a
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/block/TallFlowerBlockBOP.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.block;
+
+import net.minecraft.block.TallFlowerBlock;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.IBlockReader;
+import net.minecraftforge.common.PlantType;
+
+public class TallFlowerBlockBOP extends TallFlowerBlock
+{
+ public TallFlowerBlockBOP(Properties properties)
+ {
+ super(properties);
+ }
+
+ @Override
+ public PlantType getPlantType(IBlockReader world, BlockPos pos)
+ {
+ return PlantType.PLAINS;
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/block/WatersidePlantBlock.java b/src/main/java/biomesoplenty/common/block/WatersidePlantBlock.java
new file mode 100644
index 0000000000..54c94b3710
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/block/WatersidePlantBlock.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.block;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockState;
+import net.minecraft.block.Blocks;
+import net.minecraft.fluid.FluidState;
+import net.minecraft.tags.FluidTags;
+import net.minecraft.util.Direction;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.IBlockReader;
+import net.minecraft.world.IWorldReader;
+import net.minecraftforge.common.PlantType;
+
+import java.util.Iterator;
+
+public class WatersidePlantBlock extends PlantBlockBOP
+{
+ public WatersidePlantBlock(Block.Properties properties)
+ {
+ super(properties);
+ }
+
+ @Override
+ public PlantType getPlantType(IBlockReader world, BlockPos pos)
+ {
+ Block block = world.getBlockState(pos).getBlock();
+
+ return PlantType.BEACH;
+ }
+
+ @Override
+ public boolean canSurvive(BlockState state, IWorldReader worldReader, BlockPos pos)
+ {
+ BlockState soil = worldReader.getBlockState(pos.below());
+ if (soil.canSustainPlant(worldReader, pos.below(), Direction.UP, this))
+ {
+ BlockPos blockpos = pos.below();
+ Iterator var7 = Direction.Plane.HORIZONTAL.iterator();
+
+ BlockState BlockState;
+ FluidState ifluidstate;
+ do {
+ if (!var7.hasNext()) {
+ return false;
+ }
+
+ Direction Direction = (Direction)var7.next();
+ BlockState = worldReader.getBlockState(blockpos.relative(Direction));
+ ifluidstate = worldReader.getFluidState(blockpos.relative(Direction));
+ } while(!ifluidstate.is(FluidTags.WATER) && BlockState.getBlock() != Blocks.FROSTED_ICE);
+
+ return true;
+ }
+ else
+ return false;
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/block/trees/BigTreeDefaultConfig.java b/src/main/java/biomesoplenty/common/block/trees/BigTreeDefaultConfig.java
new file mode 100644
index 0000000000..86a2dfe6a8
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/block/trees/BigTreeDefaultConfig.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.block.trees;
+
+import net.minecraft.block.BlockState;
+import net.minecraft.block.Blocks;
+import net.minecraft.block.trees.BigTree;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.IWorld;
+import net.minecraft.world.biome.DefaultBiomeFeatures;
+import net.minecraft.world.gen.ChunkGenerator;
+import net.minecraft.world.gen.feature.*;
+import net.minecraft.world.server.ServerWorld;
+
+import javax.annotation.Nullable;
+import java.util.Random;
+
+public abstract class BigTreeDefaultConfig extends BigTree
+{
+ @Override
+ @Nullable
+ protected ConfiguredFeature getConfiguredFeature(Random random, boolean hasFlowers)
+ {
+ return null;
+ }
+
+ @Override
+ @Nullable
+ protected ConfiguredFeature getConfiguredMegaFeature(Random random)
+ {
+ return null;
+ }
+
+ protected abstract Feature extends BaseTreeFeatureConfig> getFeature(Random random);
+ protected abstract Feature extends BaseTreeFeatureConfig> getBigFeature(Random random);
+
+ @Override
+ public boolean growTree(ServerWorld world, ChunkGenerator generator, BlockPos pos, BlockState state, Random random)
+ {
+ for (int i = 0; i >= -1; --i)
+ {
+ for (int j = 0; j >= -1; --j)
+ {
+ if (isTwoByTwoSapling(state, world, pos, i, j))
+ {
+ return this.placeMega(world, generator, pos, state, random, i, j);
+ }
+ }
+ }
+
+ Feature feature = (Feature)this.getFeature(random);
+
+ if (feature == null)
+ {
+ return false;
+ }
+ else
+ {
+ world.setBlock(pos, Blocks.AIR.defaultBlockState(), 4);
+ if (feature.place(world, generator, random, pos, Features.OAK.config()))
+ {
+ return true;
+ }
+ else
+ {
+ world.setBlock(pos, state, 4);
+ return false;
+ }
+ }
+ }
+
+ @Override
+ public boolean placeMega(ServerWorld world, ChunkGenerator generator, BlockPos pos, BlockState state, Random random, int x, int z)
+ {
+ Feature feature = (Feature)this.getBigFeature(random);
+ if (feature == null)
+ {
+ return false;
+ }
+ else
+ {
+ BlockState blockstate = Blocks.AIR.defaultBlockState();
+ world.setBlock(pos.offset(x, 0, z), blockstate, 4);
+ world.setBlock(pos.offset(x + 1, 0, z), blockstate, 4);
+ world.setBlock(pos.offset(x, 0, z + 1), blockstate, 4);
+ world.setBlock(pos.offset(x + 1, 0, z + 1), blockstate, 4);
+ if (feature.place(world, generator, random, pos.offset(x, 0, z), Features.OAK.config()))
+ {
+ return true;
+ }
+ else
+ {
+ world.setBlock(pos.offset(x, 0, z), state, 4);
+ world.setBlock(pos.offset(x + 1, 0, z), state, 4);
+ world.setBlock(pos.offset(x, 0, z + 1), state, 4);
+ world.setBlock(pos.offset(x + 1, 0, z + 1), state, 4);
+ return false;
+ }
+ }
+ }
+
+}
diff --git a/src/main/java/biomesoplenty/common/block/trees/DeadTree.java b/src/main/java/biomesoplenty/common/block/trees/DeadTree.java
new file mode 100644
index 0000000000..3237478e04
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/block/trees/DeadTree.java
@@ -0,0 +1,15 @@
+package biomesoplenty.common.block.trees;
+
+import biomesoplenty.common.world.gen.feature.BOPFeatures;
+import net.minecraft.world.gen.feature.*;
+
+import java.util.Random;
+
+public class DeadTree extends TreeDefaultConfig
+{
+ @Override
+ protected Feature extends BaseTreeFeatureConfig> getFeature(Random random)
+ {
+ return random.nextInt(10) == 0 ? BOPFeatures.DYING_TREE : BOPFeatures.SMALL_DEAD_TREE;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/biomesoplenty/common/block/trees/FirTree.java b/src/main/java/biomesoplenty/common/block/trees/FirTree.java
new file mode 100644
index 0000000000..85c4ec184e
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/block/trees/FirTree.java
@@ -0,0 +1,21 @@
+package biomesoplenty.common.block.trees;
+
+import biomesoplenty.common.world.gen.feature.BOPFeatures;
+import net.minecraft.world.gen.feature.*;
+
+import java.util.Random;
+
+public class FirTree extends BigTreeDefaultConfig
+{
+ @Override
+ protected Feature extends BaseTreeFeatureConfig> getFeature(Random random)
+ {
+ return BOPFeatures.FIR_TREE;
+ }
+
+ @Override
+ protected Feature extends BaseTreeFeatureConfig> getBigFeature(Random random)
+ {
+ return BOPFeatures.FIR_TREE_LARGE;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/biomesoplenty/common/block/trees/FloweringOakTree.java b/src/main/java/biomesoplenty/common/block/trees/FloweringOakTree.java
new file mode 100644
index 0000000000..8695ffbdf8
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/block/trees/FloweringOakTree.java
@@ -0,0 +1,15 @@
+package biomesoplenty.common.block.trees;
+
+import biomesoplenty.common.world.gen.feature.BOPFeatures;
+import net.minecraft.world.gen.feature.*;
+
+import java.util.Random;
+
+public class FloweringOakTree extends TreeDefaultConfig
+{
+ @Override
+ protected Feature extends BaseTreeFeatureConfig> getFeature(Random random)
+ {
+ return (random.nextInt(10) == 0 ? BOPFeatures.BIG_FLOWERING_OAK_TREE : BOPFeatures.FLOWERING_OAK_TREE);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/biomesoplenty/common/block/trees/HellbarkTree.java b/src/main/java/biomesoplenty/common/block/trees/HellbarkTree.java
new file mode 100644
index 0000000000..e3287be4f4
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/block/trees/HellbarkTree.java
@@ -0,0 +1,15 @@
+package biomesoplenty.common.block.trees;
+
+import biomesoplenty.common.world.gen.feature.BOPFeatures;
+import net.minecraft.world.gen.feature.*;
+
+import java.util.Random;
+
+public class HellbarkTree extends TreeDefaultConfig
+{
+ @Override
+ protected Feature extends BaseTreeFeatureConfig> getFeature(Random random)
+ {
+ return (random.nextInt(10) == 0 ? BOPFeatures.BIG_HELLBARK_TREE : BOPFeatures.HELLBARK_TREE);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/biomesoplenty/common/block/trees/JacarandaTree.java b/src/main/java/biomesoplenty/common/block/trees/JacarandaTree.java
new file mode 100644
index 0000000000..35265570c4
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/block/trees/JacarandaTree.java
@@ -0,0 +1,15 @@
+package biomesoplenty.common.block.trees;
+
+import biomesoplenty.common.world.gen.feature.BOPFeatures;
+import net.minecraft.world.gen.feature.*;
+
+import java.util.Random;
+
+public class JacarandaTree extends TreeDefaultConfig
+{
+ @Override
+ protected Feature extends BaseTreeFeatureConfig> getFeature(Random random)
+ {
+ return (random.nextInt(10) == 0 ? BOPFeatures.BIG_JACARANDA_TREE : BOPFeatures.JACARANDA_TREE);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/biomesoplenty/common/block/trees/MagicTree.java b/src/main/java/biomesoplenty/common/block/trees/MagicTree.java
new file mode 100644
index 0000000000..3ea2dcc716
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/block/trees/MagicTree.java
@@ -0,0 +1,15 @@
+package biomesoplenty.common.block.trees;
+
+import biomesoplenty.common.world.gen.feature.BOPFeatures;
+import net.minecraft.world.gen.feature.*;
+
+import java.util.Random;
+
+public class MagicTree extends TreeDefaultConfig
+{
+ @Override
+ protected Feature extends BaseTreeFeatureConfig> getFeature(Random random)
+ {
+ return (random.nextInt(10) == 0 ? BOPFeatures.BIG_MAGIC_TREE : BOPFeatures.MAGIC_TREE);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/biomesoplenty/common/block/trees/MahoganyTree.java b/src/main/java/biomesoplenty/common/block/trees/MahoganyTree.java
new file mode 100644
index 0000000000..c71992df02
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/block/trees/MahoganyTree.java
@@ -0,0 +1,15 @@
+package biomesoplenty.common.block.trees;
+
+import biomesoplenty.common.world.gen.feature.BOPFeatures;
+import net.minecraft.world.gen.feature.*;
+
+import java.util.Random;
+
+public class MahoganyTree extends TreeDefaultConfig
+{
+ @Override
+ protected Feature extends BaseTreeFeatureConfig> getFeature(Random random)
+ {
+ return BOPFeatures.MAHOGANY_TREE;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/biomesoplenty/common/block/trees/MapleTree.java b/src/main/java/biomesoplenty/common/block/trees/MapleTree.java
new file mode 100644
index 0000000000..baf493f356
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/block/trees/MapleTree.java
@@ -0,0 +1,15 @@
+package biomesoplenty.common.block.trees;
+
+import biomesoplenty.common.world.gen.feature.BOPFeatures;
+import net.minecraft.world.gen.feature.*;
+
+import java.util.Random;
+
+public class MapleTree extends TreeDefaultConfig
+{
+ @Override
+ protected Feature extends BaseTreeFeatureConfig> getFeature(Random random)
+ {
+ return (random.nextInt(10) == 0 ? BOPFeatures.BIG_MAPLE_TREE : BOPFeatures.MAPLE_TREE);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/biomesoplenty/common/block/trees/OrangeAutumnTree.java b/src/main/java/biomesoplenty/common/block/trees/OrangeAutumnTree.java
new file mode 100644
index 0000000000..7f462d76f6
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/block/trees/OrangeAutumnTree.java
@@ -0,0 +1,15 @@
+package biomesoplenty.common.block.trees;
+
+import biomesoplenty.common.world.gen.feature.BOPFeatures;
+import net.minecraft.world.gen.feature.*;
+
+import java.util.Random;
+
+public class OrangeAutumnTree extends TreeDefaultConfig
+{
+ @Override
+ protected Feature extends BaseTreeFeatureConfig> getFeature(Random random)
+ {
+ return (random.nextInt(10) == 0 ? BOPFeatures.BIG_ORANGE_AUTUMN_TREE : BOPFeatures.ORANGE_AUTUMN_TREE);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/biomesoplenty/common/block/trees/OriginTree.java b/src/main/java/biomesoplenty/common/block/trees/OriginTree.java
new file mode 100644
index 0000000000..04f19d3e6e
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/block/trees/OriginTree.java
@@ -0,0 +1,15 @@
+package biomesoplenty.common.block.trees;
+
+import biomesoplenty.common.world.gen.feature.BOPFeatures;
+import net.minecraft.world.gen.feature.*;
+
+import java.util.Random;
+
+public class OriginTree extends TreeDefaultConfig
+{
+ @Override
+ protected Feature extends BaseTreeFeatureConfig> getFeature(Random random)
+ {
+ return (random.nextInt(10) == 0 ? BOPFeatures.BIG_ORIGIN_TREE : BOPFeatures.ORIGIN_TREE);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/biomesoplenty/common/block/trees/PalmTree.java b/src/main/java/biomesoplenty/common/block/trees/PalmTree.java
new file mode 100644
index 0000000000..16ffe792bf
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/block/trees/PalmTree.java
@@ -0,0 +1,15 @@
+package biomesoplenty.common.block.trees;
+
+import biomesoplenty.common.world.gen.feature.BOPFeatures;
+import net.minecraft.world.gen.feature.*;
+
+import java.util.Random;
+
+public class PalmTree extends TreeDefaultConfig
+{
+ @Override
+ protected Feature extends BaseTreeFeatureConfig> getFeature(Random random)
+ {
+ return BOPFeatures.PALM_TREE;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/biomesoplenty/common/block/trees/PinkCherryTree.java b/src/main/java/biomesoplenty/common/block/trees/PinkCherryTree.java
new file mode 100644
index 0000000000..228290a6af
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/block/trees/PinkCherryTree.java
@@ -0,0 +1,15 @@
+package biomesoplenty.common.block.trees;
+
+import biomesoplenty.common.world.gen.feature.BOPFeatures;
+import net.minecraft.world.gen.feature.*;
+
+import java.util.Random;
+
+public class PinkCherryTree extends TreeDefaultConfig
+{
+ @Override
+ protected Feature extends BaseTreeFeatureConfig> getFeature(Random random)
+ {
+ return (random.nextInt(10) == 0 ? BOPFeatures.BIG_PINK_CHERRY_TREE : BOPFeatures.PINK_CHERRY_TREE);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/biomesoplenty/common/block/trees/RainbowBirchTree.java b/src/main/java/biomesoplenty/common/block/trees/RainbowBirchTree.java
new file mode 100644
index 0000000000..e7cad3105c
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/block/trees/RainbowBirchTree.java
@@ -0,0 +1,16 @@
+package biomesoplenty.common.block.trees;
+
+import biomesoplenty.common.world.gen.feature.BOPFeatures;
+import net.minecraft.world.gen.feature.BaseTreeFeatureConfig;
+import net.minecraft.world.gen.feature.Feature;
+
+import java.util.Random;
+
+public class RainbowBirchTree extends TreeDefaultConfig
+{
+ @Override
+ protected Feature extends BaseTreeFeatureConfig> getFeature(Random random)
+ {
+ return (random.nextInt(10) == 0 ? BOPFeatures.BIG_RAINBOW_BIRCH_TREE : BOPFeatures.RAINBOW_BIRCH_TREE);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/biomesoplenty/common/block/trees/RedwoodTree.java b/src/main/java/biomesoplenty/common/block/trees/RedwoodTree.java
new file mode 100644
index 0000000000..b6e5887302
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/block/trees/RedwoodTree.java
@@ -0,0 +1,21 @@
+package biomesoplenty.common.block.trees;
+
+import biomesoplenty.common.world.gen.feature.BOPFeatures;
+import net.minecraft.world.gen.feature.*;
+
+import java.util.Random;
+
+public class RedwoodTree extends BigTreeDefaultConfig
+{
+ @Override
+ protected Feature extends BaseTreeFeatureConfig> getFeature(Random random)
+ {
+ return BOPFeatures.REDWOOD_TREE;
+ }
+
+ @Override
+ protected Feature extends BaseTreeFeatureConfig> getBigFeature(Random random)
+ {
+ return BOPFeatures.REDWOOD_TREE_MEDIUM;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/biomesoplenty/common/block/trees/TreeDefaultConfig.java b/src/main/java/biomesoplenty/common/block/trees/TreeDefaultConfig.java
new file mode 100644
index 0000000000..5308d2bfec
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/block/trees/TreeDefaultConfig.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.block.trees;
+
+import net.minecraft.block.BlockState;
+import net.minecraft.block.Blocks;
+import net.minecraft.block.trees.Tree;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.IWorld;
+import net.minecraft.world.biome.DefaultBiomeFeatures;
+import net.minecraft.world.gen.ChunkGenerator;
+import net.minecraft.world.gen.feature.*;
+import net.minecraft.world.server.ServerWorld;
+
+import javax.annotation.Nullable;
+import java.util.Random;
+
+public abstract class TreeDefaultConfig extends Tree
+{
+ @Override
+ @Nullable
+ protected ConfiguredFeature getConfiguredFeature(Random random, boolean hasFlowers)
+ {
+ return null;
+ }
+
+ protected abstract Feature extends BaseTreeFeatureConfig> getFeature(Random random);
+
+ @Override
+ public boolean growTree(ServerWorld world, ChunkGenerator generator, BlockPos pos, BlockState state, Random random)
+ {
+ Feature feature = (Feature)this.getFeature(random);
+ if (feature == null)
+ {
+ return false;
+ }
+ else
+ {
+ world.setBlock(pos, Blocks.AIR.defaultBlockState(), 4);
+ if (feature.place(world, generator, random, pos, Features.OAK.config()))
+ {
+ return true;
+ }
+ else
+ {
+ world.setBlock(pos, state, 4);
+ return false;
+ }
+ }
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/block/trees/UmbranTree.java b/src/main/java/biomesoplenty/common/block/trees/UmbranTree.java
new file mode 100644
index 0000000000..e522d3878e
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/block/trees/UmbranTree.java
@@ -0,0 +1,21 @@
+package biomesoplenty.common.block.trees;
+
+import biomesoplenty.common.world.gen.feature.BOPFeatures;
+import net.minecraft.world.gen.feature.*;
+
+import java.util.Random;
+
+public class UmbranTree extends BigTreeDefaultConfig
+{
+ @Override
+ protected Feature extends BaseTreeFeatureConfig> getFeature(Random random)
+ {
+ return BOPFeatures.UMBRAN_TREE;
+ }
+
+ @Override
+ protected Feature extends BaseTreeFeatureConfig> getBigFeature(Random random)
+ {
+ return BOPFeatures.TALL_UMBRAN_TREE;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/biomesoplenty/common/block/trees/WhiteCherryTree.java b/src/main/java/biomesoplenty/common/block/trees/WhiteCherryTree.java
new file mode 100644
index 0000000000..abdda4d947
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/block/trees/WhiteCherryTree.java
@@ -0,0 +1,15 @@
+package biomesoplenty.common.block.trees;
+
+import biomesoplenty.common.world.gen.feature.BOPFeatures;
+import net.minecraft.world.gen.feature.*;
+
+import java.util.Random;
+
+public class WhiteCherryTree extends TreeDefaultConfig
+{
+ @Override
+ protected Feature extends BaseTreeFeatureConfig> getFeature(Random random)
+ {
+ return (random.nextInt(10) == 0 ? BOPFeatures.BIG_WHITE_CHERRY_TREE : BOPFeatures.WHITE_CHERRY_TREE);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/biomesoplenty/common/block/trees/WillowTree.java b/src/main/java/biomesoplenty/common/block/trees/WillowTree.java
new file mode 100644
index 0000000000..085780e676
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/block/trees/WillowTree.java
@@ -0,0 +1,15 @@
+package biomesoplenty.common.block.trees;
+
+import biomesoplenty.common.world.gen.feature.BOPFeatures;
+import net.minecraft.world.gen.feature.*;
+
+import java.util.Random;
+
+public class WillowTree extends TreeDefaultConfig
+{
+ @Override
+ protected Feature extends BaseTreeFeatureConfig> getFeature(Random random)
+ {
+ return BOPFeatures.WILLOW_TREE;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/biomesoplenty/common/block/trees/YellowAutumnTree.java b/src/main/java/biomesoplenty/common/block/trees/YellowAutumnTree.java
new file mode 100644
index 0000000000..69583be436
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/block/trees/YellowAutumnTree.java
@@ -0,0 +1,15 @@
+package biomesoplenty.common.block.trees;
+
+import biomesoplenty.common.world.gen.feature.BOPFeatures;
+import net.minecraft.world.gen.feature.*;
+
+import java.util.Random;
+
+public class YellowAutumnTree extends TreeDefaultConfig
+{
+ @Override
+ protected Feature extends BaseTreeFeatureConfig> getFeature(Random random)
+ {
+ return (random.nextInt(10) == 0 ? BOPFeatures.BIG_YELLOW_AUTUMN_TREE : BOPFeatures.YELLOW_AUTUMN_TREE);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/biomesoplenty/common/entity/item/BoatEntityBOP.java b/src/main/java/biomesoplenty/common/entity/item/BoatEntityBOP.java
new file mode 100644
index 0000000000..213c71337d
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/entity/item/BoatEntityBOP.java
@@ -0,0 +1,183 @@
+package biomesoplenty.common.entity.item;
+
+import biomesoplenty.api.block.BOPBlocks;
+import biomesoplenty.api.item.BOPItems;
+import biomesoplenty.init.ModEntities;
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockState;
+import net.minecraft.entity.EntityType;
+import net.minecraft.entity.item.BoatEntity;
+import net.minecraft.item.Item;
+import net.minecraft.item.Items;
+import net.minecraft.nbt.CompoundNBT;
+import net.minecraft.network.IPacket;
+import net.minecraft.tags.FluidTags;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.util.math.vector.Vector3d;
+import net.minecraft.world.GameRules;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.Constants;
+import net.minecraftforge.fml.network.FMLPlayMessages;
+import net.minecraftforge.fml.network.NetworkHooks;
+
+import java.util.Arrays;
+import java.util.function.Supplier;
+
+public class BoatEntityBOP extends BoatEntity {
+ public BoatEntityBOP(EntityType extends BoatEntityBOP> type, World world) {
+ super(type, world);
+ }
+
+ public BoatEntityBOP(World world, double x, double y, double z) {
+ super(ModEntities.boat, world);
+ setPos(x, y, z);
+ setDeltaMovement(Vector3d.ZERO);
+ this.xo = x;
+ this.yo = y;
+ this.zo = z;
+ }
+
+ public BoatEntityBOP(FMLPlayMessages.SpawnEntity spawnEntity, World world) {
+ this(world, spawnEntity.getPosX(), spawnEntity.getPosY(), spawnEntity.getPosZ());
+ }
+
+ @Override
+ public IPacket> getAddEntityPacket() {
+ return NetworkHooks.getEntitySpawningPacket(this);
+ }
+
+ @Override
+ protected void addAdditionalSaveData(CompoundNBT nbt) {
+ nbt.putString("model", getModel().getName());
+ }
+
+ @Override
+ protected void readAdditionalSaveData(CompoundNBT nbt) {
+ if (nbt.contains("model", Constants.NBT.TAG_STRING)) {
+ this.entityData.set(DATA_ID_TYPE, BoatModel.byName(nbt.getString("model")).ordinal());
+ }
+ }
+
+ @Override
+ protected void checkFallDamage(double y, boolean onGround, BlockState state, BlockPos pos) {
+ this.lastYd = getDeltaMovement().y;
+ if (!isPassenger()) {
+ if (onGround) {
+ if (this.fallDistance > 3f) {
+ if (this.status != Status.ON_LAND) {
+ this.fallDistance = 0f;
+ return;
+ }
+ causeFallDamage(this.fallDistance, 1f);
+ if (!this.level.isClientSide && !this.removed) {
+ this.remove();
+ if (this.level.getGameRules().getBoolean(GameRules.RULE_DOENTITYDROPS)) {
+ for (int i = 0; i < 3; ++i) {
+ spawnAtLocation(getModel().getPlanks());
+ }
+ for (int j = 0; j < 2; ++j) {
+ spawnAtLocation(Items.STICK);
+ }
+ }
+ }
+ }
+ this.fallDistance = 0f;
+ } else if (!this.level.getFluidState(this.blockPosition().below()).is(FluidTags.WATER) && y < 0d) {
+ this.fallDistance = (float) ((double) this.fallDistance - y);
+ }
+ }
+ }
+
+ @Override
+ public Item getDropItem() {
+ switch (BoatModel.byId(this.entityData.get(DATA_ID_TYPE))) {
+ case FIR:
+ return BOPItems.fir_boat;
+ case REDWOOD:
+ return BOPItems.redwood_boat;
+ case CHERRY:
+ return BOPItems.cherry_boat;
+ case MAHOGANY:
+ return BOPItems.mahogany_boat;
+ case JACARANDA:
+ return BOPItems.jacaranda_boat;
+ case PALM:
+ return BOPItems.palm_boat;
+ case WILLOW:
+ return BOPItems.willow_boat;
+ case DEAD:
+ return BOPItems.dead_boat;
+ case MAGIC:
+ return BOPItems.magic_boat;
+ case UMBRAN:
+ return BOPItems.umbran_boat;
+ case HELLBARK:
+ return BOPItems.hellbark_boat;
+ }
+ return Items.OAK_BOAT;
+ }
+
+ public BoatEntityBOP withModel(BoatModel type) {
+ this.entityData.set(DATA_ID_TYPE, type.ordinal());
+ return this;
+ }
+
+ public BoatModel getModel() {
+ return BoatModel.byId(this.entityData.get(DATA_ID_TYPE));
+ }
+
+ @Deprecated
+ @Override
+ public void setType(Type vanillaType) {
+ }
+
+ @Deprecated
+ @Override
+ public Type getBoatType() {
+ return Type.OAK;
+ }
+
+ public enum BoatModel {
+ FIR("fir", () -> BOPBlocks.fir_planks),
+ REDWOOD("redwood", () -> BOPBlocks.redwood_planks),
+ CHERRY("cherry", () -> BOPBlocks.cherry_planks),
+ MAHOGANY("mahogany", () -> BOPBlocks.mahogany_planks),
+ JACARANDA("jacaranda", () -> BOPBlocks.jacaranda_planks),
+ PALM("palm", () -> BOPBlocks.palm_planks),
+ WILLOW("willow", () -> BOPBlocks.willow_planks),
+ DEAD("dead", () -> BOPBlocks.dead_planks),
+ MAGIC("magic", () -> BOPBlocks.magic_planks),
+ UMBRAN("umbran", () -> BOPBlocks.umbran_planks),
+ HELLBARK("hellbark", () -> BOPBlocks.hellbark_planks);
+
+ private final String name;
+ private final Supplier supplierPlanks;
+
+ BoatModel(String name, Supplier supplierPlanks) {
+ this.name = name;
+ this.supplierPlanks = supplierPlanks;
+ }
+
+ public String getName() {
+ return this.name;
+ }
+
+ public Block getPlanks() {
+ return this.supplierPlanks.get();
+ }
+
+ public String toString() {
+ return this.name;
+ }
+
+ public static BoatModel byId(int id) {
+ BoatModel[] type = values();
+ return type[id < 0 || id >= type.length ? 0 : id];
+ }
+
+ public static BoatModel byName(String aName) {
+ BoatModel[] type = values();
+ return Arrays.stream(type).filter(t -> t.getName().equals(aName)).findFirst().orElse(type[0]);
+ }
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/item/BoatItemBOP.java b/src/main/java/biomesoplenty/common/item/BoatItemBOP.java
new file mode 100644
index 0000000000..c4ddd81374
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/item/BoatItemBOP.java
@@ -0,0 +1,72 @@
+package biomesoplenty.common.item;
+
+import biomesoplenty.common.entity.item.BoatEntityBOP;
+import biomesoplenty.common.entity.item.BoatEntityBOP.BoatModel;
+import biomesoplenty.common.util.inventory.ItemGroupBOP;
+import net.minecraft.block.DispenserBlock;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.PlayerEntity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.stats.Stats;
+import net.minecraft.util.ActionResult;
+import net.minecraft.util.EntityPredicates;
+import net.minecraft.util.Hand;
+import net.minecraft.util.math.AxisAlignedBB;
+import net.minecraft.util.math.RayTraceContext;
+import net.minecraft.util.math.RayTraceResult;
+import net.minecraft.util.math.vector.Vector3d;
+import net.minecraft.world.World;
+
+import java.util.List;
+import java.util.function.Predicate;
+
+public class BoatItemBOP extends Item {
+ private static final Predicate ENTITY_PREDICATE = EntityPredicates.NO_SPECTATORS.and(Entity::isPickable);
+ private final BoatModel model;
+
+ public BoatItemBOP(BoatModel model) {
+ super(new Item.Properties().stacksTo(1).tab(ItemGroupBOP.instance));
+ this.model = model;
+ DispenserBlock.registerBehavior(this, new DispenserBoatBehaviorBOP(model));
+ }
+
+ @Override
+ public ActionResult use(World world, PlayerEntity player, Hand hand) {
+ ItemStack heldItem = player.getItemInHand(hand);
+ RayTraceResult result = getPlayerPOVHitResult(world, player, RayTraceContext.FluidMode.ANY);
+ if (result.getType() == RayTraceResult.Type.MISS) {
+ return ActionResult.pass(heldItem);
+ } else {
+ Vector3d vector3d = player.getViewVector(1f);
+ List entities = world.getEntities(player, player.getBoundingBox().expandTowards(vector3d.scale(5d)).inflate(1d), ENTITY_PREDICATE);
+ if (!entities.isEmpty()) {
+ Vector3d vector3d1 = player.getEyePosition(1f);
+ for (Entity entity : entities) {
+ AxisAlignedBB bounds = entity.getBoundingBox().inflate((double) entity.getPickRadius());
+ if (bounds.contains(vector3d1)) {
+ return ActionResult.pass(heldItem);
+ }
+ }
+ }
+ if (result.getType() == RayTraceResult.Type.BLOCK) {
+ BoatEntityBOP boat = new BoatEntityBOP(world, result.getLocation().x, result.getLocation().y, result.getLocation().z).withModel(this.model);
+ boat.yRot = player.yRot;
+ if (!world.noCollision(boat, boat.getBoundingBox().inflate(-0.1d))) {
+ return ActionResult.fail(heldItem);
+ } else {
+ if (!world.isClientSide()) {
+ world.addFreshEntity(boat);
+ if (!player.abilities.instabuild) {
+ heldItem.shrink(1);
+ }
+ }
+ player.awardStat(Stats.ITEM_USED.get(this));
+ return ActionResult.sidedSuccess(heldItem, world.isClientSide());
+ }
+ } else {
+ return ActionResult.pass(heldItem);
+ }
+ }
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/item/DispenserBoatBehaviorBOP.java b/src/main/java/biomesoplenty/common/item/DispenserBoatBehaviorBOP.java
new file mode 100644
index 0000000000..0a1d583c24
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/item/DispenserBoatBehaviorBOP.java
@@ -0,0 +1,45 @@
+package biomesoplenty.common.item;
+
+import biomesoplenty.common.entity.item.BoatEntityBOP;
+import biomesoplenty.common.entity.item.BoatEntityBOP.BoatModel;
+import net.minecraft.block.DispenserBlock;
+import net.minecraft.dispenser.DefaultDispenseItemBehavior;
+import net.minecraft.dispenser.IBlockSource;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tags.FluidTags;
+import net.minecraft.util.Direction;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.World;
+
+public class DispenserBoatBehaviorBOP extends DefaultDispenseItemBehavior {
+ private final DefaultDispenseItemBehavior defaultDispenseItemBehavior = new DefaultDispenseItemBehavior();
+ private final BoatModel model;
+
+ public DispenserBoatBehaviorBOP(BoatModel model) {
+ this.model = model;
+ }
+
+ @Override
+ public ItemStack execute(IBlockSource source, ItemStack stack) {
+ Direction direction = source.getBlockState().getValue(DispenserBlock.FACING);
+ World world = source.getLevel();
+ double d0 = source.x() + (double) ((float) direction.getStepX() * 1.125f);
+ double d1 = source.y() + (double) ((float) direction.getStepY() * 1.125f);
+ double d2 = source.z() + (double) ((float) direction.getStepZ() * 1.125f);
+ BlockPos blockpos = source.getPos().relative(direction);
+ double d3;
+ if (world.getFluidState(blockpos).is(FluidTags.WATER)) {
+ d3 = 1d;
+ } else {
+ if (!world.getBlockState(blockpos).isAir() || !world.getFluidState(blockpos.below()).is(FluidTags.WATER)) {
+ return this.defaultDispenseItemBehavior.dispense(source, stack);
+ }
+ d3 = 0d;
+ }
+ BoatEntityBOP boat = new BoatEntityBOP(world, d0, d1 + d3, d2).withModel(this.model);
+ boat.yRot = direction.toYRot();
+ world.addFreshEntity(boat);
+ stack.shrink(1);
+ return stack;
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/item/MusicDiscItemBOP.java b/src/main/java/biomesoplenty/common/item/MusicDiscItemBOP.java
new file mode 100644
index 0000000000..fc53994595
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/item/MusicDiscItemBOP.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.item;
+
+import biomesoplenty.common.util.inventory.ItemGroupBOP;
+import biomesoplenty.core.BiomesOPlenty;
+import net.minecraft.item.Item;
+import net.minecraft.item.MusicDiscItem;
+import net.minecraft.item.Rarity;
+import net.minecraft.util.ResourceLocation;
+import net.minecraft.util.SoundEvent;
+import net.minecraftforge.fml.RegistryObject;
+import net.minecraftforge.registries.ForgeRegistries;
+
+public class MusicDiscItemBOP extends MusicDiscItem
+{
+ //Provide a resource location and the correct registry to retrieve a SoundEvent supplier
+ public static RegistryObject soundProvider(String soundName) {
+ return RegistryObject.of(
+ new ResourceLocation(BiomesOPlenty.MOD_ID, soundName),
+ ForgeRegistries.SOUND_EVENTS
+ );
+ };
+
+ public MusicDiscItemBOP(String record)
+ {
+ super(0, soundProvider(record), new Item.Properties().tab(ItemGroupBOP.instance).rarity(Rarity.RARE).stacksTo(1));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/util/biome/BiomeUtil.java b/src/main/java/biomesoplenty/common/util/biome/BiomeUtil.java
new file mode 100644
index 0000000000..300af93a18
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/util/biome/BiomeUtil.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.util.biome;
+
+import biomesoplenty.common.biome.BiomeMetadata;
+import biomesoplenty.core.BiomesOPlenty;
+import biomesoplenty.init.ModBiomes;
+import net.minecraft.client.Minecraft;
+import net.minecraft.util.RegistryKey;
+import net.minecraft.util.registry.DynamicRegistries;
+import net.minecraft.util.registry.Registry;
+import net.minecraft.world.biome.Biome;
+import net.minecraftforge.registries.ForgeRegistries;
+import net.minecraftforge.registries.ForgeRegistry;
+
+import javax.annotation.Nullable;
+
+public class BiomeUtil
+{
+ public static RegistryKey createKey(Biome biome)
+ {
+ return biome == null ? null : RegistryKey.create(Registry.BIOME_REGISTRY, biome.delegate.name());
+ }
+
+ public static RegistryKey createKey(int id)
+ {
+ return createKey(getBiome(id));
+ }
+
+ public static Biome getBiome(RegistryKey key)
+ {
+ Biome biome = ForgeRegistries.BIOMES.getValue(key.location());
+ if (biome == null) throw new RuntimeException("Attempted to get unregistered biome " + key);
+ return biome;
+ }
+
+ public static Biome getBiome(int id)
+ {
+ if (id == -1) throw new RuntimeException("Attempted to get biome with id -1");
+ return getBiome(((ForgeRegistry)ForgeRegistries.BIOMES).getKey(id));
+ }
+
+ public static int getBiomeId(Biome biome)
+ {
+ if (biome == null) throw new RuntimeException("Attempted to get id of null biome");
+ int id = ((ForgeRegistry)ForgeRegistries.BIOMES).getID(biome);
+ if (id == -1) throw new RuntimeException("Biome id is -1 for biome " + biome.delegate.name());
+ return id;
+ }
+
+ public static int getBiomeId(RegistryKey key)
+ {
+ return getBiomeId(getBiome(key));
+ }
+
+ public static boolean hasMetadata(RegistryKey key)
+ {
+ return ModBiomes.biomeMetadata.containsKey(key);
+ }
+
+ public static boolean hasMetadata(Biome biome)
+ {
+ return hasMetadata(createKey(biome));
+ }
+
+ public static BiomeMetadata getMetadata(RegistryKey key)
+ {
+ return ModBiomes.biomeMetadata.get(key);
+ }
+
+ public static BiomeMetadata getMetadata(Biome biome)
+ {
+ return getMetadata(createKey(biome));
+ }
+
+ public static boolean exists(RegistryKey key)
+ {
+ return ForgeRegistries.BIOMES.containsKey(key.location());
+ }
+
+ public static boolean exists(int id)
+ {
+ return getBiome(id) != null;
+ }
+
+ @Nullable
+ public static RegistryKey getClientKey(Biome biome)
+ {
+ return Minecraft.getInstance().level.registryAccess().registryOrThrow(Registry.BIOME_REGISTRY).getResourceKey(biome).orElse(null);
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/util/biome/FeatureUtil.java b/src/main/java/biomesoplenty/common/util/biome/FeatureUtil.java
new file mode 100644
index 0000000000..8c235aec3f
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/util/biome/FeatureUtil.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.util.biome;
+
+import biomesoplenty.common.world.gen.feature.DenseFeatureSpreadConfig;
+import biomesoplenty.common.world.gen.placement.BOPPlacements;
+import net.minecraft.world.gen.feature.FeatureSpreadConfig;
+import net.minecraft.world.gen.placement.ConfiguredPlacement;
+import net.minecraft.world.gen.placement.Placement;
+
+public class FeatureUtil
+{
+ public static ConfiguredPlacement> denseCount(int count)
+ {
+ return BOPPlacements.COUNT.configured(new DenseFeatureSpreadConfig(count));
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/util/biome/GeneratorUtil.java b/src/main/java/biomesoplenty/common/util/biome/GeneratorUtil.java
new file mode 100644
index 0000000000..07d1f96e52
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/util/biome/GeneratorUtil.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.util.biome;
+
+import java.util.Random;
+
+public class GeneratorUtil
+{
+ // get a random number between 2 values (inclusive of end points)
+ public static int nextIntBetween(Random rand, int a, int b)
+ {
+ if (a == b) {return a;}
+ int min = a < b ? a : b;
+ int max = a > b ? a : b;
+ return min + rand.nextInt(1 + max - min);
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/util/block/BlockUtil.java b/src/main/java/biomesoplenty/common/util/block/BlockUtil.java
new file mode 100644
index 0000000000..3d6402b681
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/util/block/BlockUtil.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.util.block;
+
+import net.minecraft.block.BlockState;
+import net.minecraft.state.Property;
+import net.minecraft.util.Direction;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.IWorld;
+import net.minecraft.world.chunk.ChunkStatus;
+import net.minecraft.world.chunk.IChunk;
+import net.minecraft.world.gen.Heightmap;
+
+import java.util.Collection;
+
+public class BlockUtil
+{
+ // Given a blockstate for some block which has an axis orientation (such as logs), try to determine the axis property
+ public static Property getAxisProperty(BlockState log)
+ {
+ for (Property property : log.getProperties())
+ {
+ Collection allowedValues = property.getPossibleValues();
+ if (allowedValues.contains(Direction.Axis.X) && allowedValues.contains(Direction.Axis.Y) && allowedValues.contains(Direction.Axis.Z))
+ {
+ return property;
+ }
+ }
+ return null;
+ }
+
+ public static BlockPos getTopSolidOrLiquidBlock(IWorld world, int x, int z)
+ {
+ IChunk chunk = world.getChunk(x >> 4, z >> 4, ChunkStatus.FULL);
+ return new BlockPos(x, chunk.getHeight(Heightmap.Type.MOTION_BLOCKING, x & 15, z & 15), z);
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/util/block/IBlockPosQuery.java b/src/main/java/biomesoplenty/common/util/block/IBlockPosQuery.java
new file mode 100644
index 0000000000..44dfb7749a
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/util/block/IBlockPosQuery.java
@@ -0,0 +1,16 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.util.block;
+
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.IWorld;
+
+public interface IBlockPosQuery
+{
+ boolean matches(IWorld world, BlockPos pos);
+}
diff --git a/src/main/java/biomesoplenty/common/util/config/JsonUtil.java b/src/main/java/biomesoplenty/common/util/config/JsonUtil.java
new file mode 100644
index 0000000000..112e7bbec0
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/util/config/JsonUtil.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright 2014-2020, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.util.config;
+
+import biomesoplenty.core.BiomesOPlenty;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import org.apache.commons.io.FileUtils;
+
+import java.io.File;
+import java.lang.reflect.Type;
+
+public class JsonUtil
+{
+ public static final Gson SERIALIZER = new GsonBuilder().setPrettyPrinting().create();
+
+ public static T getOrCreateConfigFile(File configDir, String configName, T defaults, Type type)
+ {
+ File configFile = new File(configDir, configName);
+
+ //No config file, so create default config:
+ if (!configFile.exists())
+ {
+ writeFile(configFile, defaults);
+ }
+
+ try
+ {
+ return (T)SERIALIZER.fromJson(FileUtils.readFileToString(configFile), type);
+ }
+ catch (Exception e)
+ {
+ BiomesOPlenty.logger.error("Error parsing config from json: " + configFile.toString(), e);
+ }
+
+ return null;
+ }
+
+ public static boolean writeFile(File outputFile, Object obj)
+ {
+ try
+ {
+ FileUtils.write(outputFile, SERIALIZER.toJson(obj));
+ return true;
+ }
+ catch (Exception e)
+ {
+ BiomesOPlenty.logger.error("Error writing config file " + outputFile.getAbsolutePath() + ": " + e.getMessage());
+ return false;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/biomesoplenty/common/util/inventory/ItemGroupBOP.java b/src/main/java/biomesoplenty/common/util/inventory/ItemGroupBOP.java
new file mode 100644
index 0000000000..0e6a81eb8c
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/util/inventory/ItemGroupBOP.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.util.inventory;
+
+import biomesoplenty.api.item.BOPItems;
+import net.minecraft.item.ItemGroup;
+import net.minecraft.item.ItemStack;
+
+public class ItemGroupBOP extends ItemGroup
+{
+ public static final ItemGroupBOP instance = new ItemGroupBOP(ItemGroup.TABS.length, "biomesoplenty");
+
+ private ItemGroupBOP(int index, String label)
+ {
+ super(index, label);
+ }
+
+ @Override
+ public ItemStack makeIcon()
+ {
+ return new ItemStack(BOPItems.bop_icon);
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/world/AlphaOctavePerlinNoise.java b/src/main/java/biomesoplenty/common/world/AlphaOctavePerlinNoise.java
new file mode 100644
index 0000000000..9e5aa85ad0
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/world/AlphaOctavePerlinNoise.java
@@ -0,0 +1,48 @@
+package biomesoplenty.common.world;
+
+import java.util.Arrays;
+import java.util.Random;
+
+public class AlphaOctavePerlinNoise
+{
+ private AlphaPerlinNoise samplers[];
+ private int octaves;
+
+ public AlphaOctavePerlinNoise(Random random, int octaves)
+ {
+ this.octaves = octaves;
+ samplers = new AlphaPerlinNoise[octaves];
+ for(int i = 0; i < octaves; i++)
+ {
+ samplers[i] = new AlphaPerlinNoise(random);
+ }
+
+ }
+
+ public double sample(double x, double z)
+ {
+ double sum = 0.0;
+ double amplitude = 1.0;
+ for(int i = 0; i < this.octaves; i++)
+ {
+ sum += this.samplers[i].sample(x * amplitude, z * amplitude) / amplitude;
+ amplitude /= 2.0;
+ }
+
+ return sum;
+ }
+
+ public double sample(double x, double y, double z, double xFreq, double yFreq, double zFreq)
+ {
+ double sum = 0.0;
+
+ double amplitude = 1.0D;
+ for(int i = 0; i < octaves; i++)
+ {
+ sum += samplers[i].sample(x, y, z, xFreq * amplitude, yFreq * amplitude, zFreq * amplitude, amplitude);
+ amplitude /= 2D;
+ }
+
+ return sum;
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/world/AlphaPerlinNoise.java b/src/main/java/biomesoplenty/common/world/AlphaPerlinNoise.java
new file mode 100644
index 0000000000..5c08e05957
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/world/AlphaPerlinNoise.java
@@ -0,0 +1,154 @@
+package biomesoplenty.common.world;
+
+import java.util.Random;
+
+public class AlphaPerlinNoise
+{
+ private final int[] permutations;
+ public final double offsetX;
+ public final double offsetY;
+ public final double offsetZ;
+
+ public AlphaPerlinNoise(Random random)
+ {
+ permutations = new int[512];
+ offsetX = random.nextDouble() * 256D;
+ offsetY = random.nextDouble() * 256D;
+ offsetZ = random.nextDouble() * 256D;
+ for(int i = 0; i < 256; i++)
+ {
+ permutations[i] = i;
+ }
+
+ for(int j = 0; j < 256; j++)
+ {
+ int k = random.nextInt(256 - j) + j;
+ int l = permutations[j];
+ permutations[j] = permutations[k];
+ permutations[k] = l;
+ permutations[j + 256] = permutations[j];
+ }
+
+ }
+
+ public double sample(double x, double y, double z)
+ {
+ double localX = x + offsetX;
+ double localY = y + offsetY;
+ double localZ = z + offsetZ;
+ int floorX = (int) localX;
+ int floorY = (int) localY;
+ int floorZ = (int) localZ;
+ if(localX < (double) floorX)
+ {
+ floorX--;
+ }
+ if(localY < (double) floorY)
+ {
+ floorY--;
+ }
+ if(localZ < (double) floorZ)
+ {
+ floorZ--;
+ }
+ int maskedX = floorX & 0xff;
+ int maskedY = floorY & 0xff;
+ int maskedZ = floorZ & 0xff;
+ localX -= floorX;
+ localY -= floorY;
+ localZ -= floorZ;
+ // Apply smoothstep on all axes
+ double smoothedX = localX * localX * localX * (localX * (localX * 6 - 15) + 10);
+ double smoothedY = localY * localY * localY * (localY * (localY * 6 - 15) + 10);
+ double smoothedZ = localZ * localZ * localZ * (localZ * (localZ * 6 - 15) + 10);
+ int perm1 = permutations[maskedX] + maskedY;
+ int perm2 = permutations[perm1] + maskedZ;
+ int perm3 = permutations[perm1 + 1] + maskedZ;
+ int perm4 = permutations[maskedX + 1] + maskedY;
+ int perm5 = permutations[perm4] + maskedZ;
+ int perm6 = permutations[perm4 + 1] + maskedZ;
+ // Apply trilinear interpolation on the noise to get the final result
+ return lerp(smoothedZ,
+ lerp(smoothedY,
+ lerp(smoothedX,
+ grad(permutations[perm2], localX, localY, localZ),
+ grad(permutations[perm5], localX - 1.0D, localY, localZ)),
+ lerp(smoothedX,
+ grad(permutations[perm3], localX, localY - 1.0D, localZ),
+ grad(permutations[perm6], localX - 1.0D, localY - 1.0D, localZ))),
+ lerp(smoothedY,
+ lerp(smoothedX,
+ grad(permutations[perm2 + 1], localX, localY, localZ - 1.0D),
+ grad(permutations[perm5 + 1], localX - 1.0D, localY, localZ - 1.0D)),
+ lerp(smoothedX,
+ grad(permutations[perm3 + 1], localX, localY - 1.0D, localZ - 1.0D),
+ grad(permutations[perm6 + 1], localX - 1.0D, localY - 1.0D, localZ - 1.0D))));
+ }
+
+ public double lerp(double delta, double start, double end)
+ {
+ return start + delta * (end - start);
+ }
+
+ public double grad(int i, double d, double d1, double d2)
+ {
+ int j = i & 0xf;
+ double d3 = j >= 8 ? d1 : d;
+ double d4 = j >= 4 ? j != 12 && j != 14 ? d2 : d : d1;
+ return ((j & 1) != 0 ? -d3 : d3) + ((j & 2) != 0 ? -d4 : d4);
+ }
+
+ // Note: Passing in the z value as the y coordinate is intended behavior here.
+ public double sample(double x, double z)
+ {
+ return sample(x, z, 0.0);
+ }
+
+ // Alternate sample method that provides frequency and amplitude modification functionality
+ public double sample(double x, double y, double z, double freqX, double freqY, double freqZ, double amplitude)
+ {
+ double noiseAmplitude = 1.0 / amplitude;
+ double localX = (x + (double) 0) * freqX + offsetX;
+ int floorX = (int) localX;
+ if(localX < (double) floorX)
+ {
+ floorX--;
+ }
+ int maskX = floorX & 0xff;
+ localX -= floorX;
+ double smoothedX = localX * localX * localX * (localX * (localX * 6D - 15D) + 10D);
+ double localZ = (z + (double) 0) * freqZ + offsetZ;
+ int floorZ = (int) localZ;
+ if(localZ < (double) floorZ)
+ {
+ floorZ--;
+ }
+ int maskZ = floorZ & 0xff;
+ localZ -= floorZ;
+ double smoothZ = localZ * localZ * localZ * (localZ * (localZ * 6D - 15D) + 10D);
+ double localY = (y + (double) 0) * freqY + offsetY;
+ int floorY = (int) localY;
+ if(localY < (double) floorY)
+ {
+ floorY--;
+ }
+ int maskY = floorY & 0xff;
+ localY -= floorY;
+ double smoothY = localY * localY * localY * (localY * (localY * 6D - 15D) + 10D);
+ int perm1 = permutations[maskX] + maskY;
+ int perm2 = permutations[perm1] + maskZ;
+ int perm3 = permutations[perm1 + 1] + maskZ;
+ int perm4 = permutations[maskX + 1] + maskY;
+ int perm5 = permutations[perm4] + maskZ;
+ int perm6 = permutations[perm4 + 1] + maskZ;
+ double lerp1 = lerp(smoothedX, grad(permutations[perm2], localX, localY, localZ), grad(permutations[perm5], localX - 1.0D, localY, localZ));
+ double lerp2 = lerp(smoothedX, grad(permutations[perm3], localX, localY - 1.0D, localZ), grad(permutations[perm6], localX - 1.0D, localY - 1.0D, localZ));
+ double lerp3 = lerp(smoothedX, grad(permutations[perm2 + 1], localX, localY, localZ - 1.0D), grad(permutations[perm5 + 1], localX - 1.0D, localY, localZ - 1.0D));
+ double lerp4 = lerp(smoothedX, grad(permutations[perm3 + 1], localX, localY - 1.0D, localZ - 1.0D), grad(permutations[perm6 + 1], localX - 1.0D, localY - 1.0D, localZ - 1.0D));
+ double biLerp1 = lerp(smoothY, lerp1, lerp2);
+ double biLerp2 = lerp(smoothY, lerp3, lerp4);
+ double finalNoise = lerp(smoothZ, biLerp1, biLerp2);
+
+ return finalNoise * noiseAmplitude;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/biomesoplenty/common/world/BOPBiomeProvider.java b/src/main/java/biomesoplenty/common/world/BOPBiomeProvider.java
new file mode 100644
index 0000000000..99e218ac0d
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/world/BOPBiomeProvider.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.world;
+
+import biomesoplenty.api.enums.BOPClimates;
+import biomesoplenty.common.util.biome.BiomeUtil;
+import com.google.common.collect.ImmutableList;
+import com.mojang.serialization.Codec;
+import com.mojang.serialization.codecs.RecordCodecBuilder;
+import net.minecraft.util.RegistryKey;
+import net.minecraft.util.registry.DynamicRegistries;
+import net.minecraft.util.registry.Registry;
+import net.minecraft.util.registry.RegistryLookupCodec;
+import net.minecraft.util.registry.WorldGenRegistries;
+import net.minecraft.world.biome.Biome;
+import net.minecraft.world.biome.Biomes;
+import net.minecraft.world.biome.provider.BiomeProvider;
+import net.minecraft.world.gen.layer.Layer;
+import net.minecraft.world.gen.layer.LayerUtil;
+import net.minecraftforge.registries.ForgeRegistries;
+
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public class BOPBiomeProvider extends BiomeProvider
+{
+ public static final Codec CODEC = RecordCodecBuilder.create((builder) ->
+ {
+ return builder.group(
+ Codec.LONG.fieldOf("seed").stable().forGetter((biomeProvider) -> biomeProvider.seed),
+ RegistryLookupCodec.create(Registry.BIOME_REGISTRY).forGetter((biomeProvider) -> biomeProvider.biomes)
+ ).apply(builder, builder.stable(BOPBiomeProvider::new));
+ });
+
+ private static final List> VANILLA_POSSIBLE_BIOMES = ImmutableList.of(Biomes.OCEAN, Biomes.PLAINS, Biomes.DESERT, Biomes.MOUNTAINS, Biomes.FOREST, Biomes.TAIGA, Biomes.SWAMP, Biomes.RIVER, Biomes.FROZEN_OCEAN, Biomes.FROZEN_RIVER, Biomes.SNOWY_TUNDRA, Biomes.SNOWY_MOUNTAINS, Biomes.MUSHROOM_FIELDS, Biomes.MUSHROOM_FIELD_SHORE, Biomes.BEACH, Biomes.DESERT_HILLS, Biomes.WOODED_HILLS, Biomes.TAIGA_HILLS, Biomes.MOUNTAIN_EDGE, Biomes.JUNGLE, Biomes.JUNGLE_HILLS, Biomes.JUNGLE_EDGE, Biomes.DEEP_OCEAN, Biomes.STONE_SHORE, Biomes.SNOWY_BEACH, Biomes.BIRCH_FOREST, Biomes.BIRCH_FOREST_HILLS, Biomes.DARK_FOREST, Biomes.SNOWY_TAIGA, Biomes.SNOWY_TAIGA_HILLS, Biomes.GIANT_TREE_TAIGA, Biomes.GIANT_TREE_TAIGA_HILLS, Biomes.WOODED_MOUNTAINS, Biomes.SAVANNA, Biomes.SAVANNA_PLATEAU, Biomes.BADLANDS, Biomes.WOODED_BADLANDS_PLATEAU, Biomes.BADLANDS_PLATEAU, Biomes.WARM_OCEAN, Biomes.LUKEWARM_OCEAN, Biomes.COLD_OCEAN, Biomes.DEEP_WARM_OCEAN, Biomes.DEEP_LUKEWARM_OCEAN, Biomes.DEEP_COLD_OCEAN, Biomes.DEEP_FROZEN_OCEAN, Biomes.SUNFLOWER_PLAINS, Biomes.DESERT_LAKES, Biomes.GRAVELLY_MOUNTAINS, Biomes.FLOWER_FOREST, Biomes.TAIGA_MOUNTAINS, Biomes.SWAMP_HILLS, Biomes.ICE_SPIKES, Biomes.MODIFIED_JUNGLE, Biomes.MODIFIED_JUNGLE_EDGE, Biomes.TALL_BIRCH_FOREST, Biomes.TALL_BIRCH_HILLS, Biomes.DARK_FOREST_HILLS, Biomes.SNOWY_TAIGA_MOUNTAINS, Biomes.GIANT_SPRUCE_TAIGA, Biomes.GIANT_SPRUCE_TAIGA_HILLS, Biomes.MODIFIED_GRAVELLY_MOUNTAINS, Biomes.SHATTERED_SAVANNA, Biomes.SHATTERED_SAVANNA_PLATEAU, Biomes.ERODED_BADLANDS, Biomes.MODIFIED_WOODED_BADLANDS_PLATEAU, Biomes.MODIFIED_BADLANDS_PLATEAU);
+
+ private final long seed;
+ private final Layer noiseBiomeLayer;
+ private final Registry biomes;
+
+ public BOPBiomeProvider(long seed, Registry biomes)
+ {
+ super(Stream.concat(VANILLA_POSSIBLE_BIOMES.stream(), BOPClimates.getOverworldBiomes().stream()).map(biomes::get).collect(Collectors.toList()));
+ this.seed = seed;
+ this.noiseBiomeLayer = BOPLayerUtil.createGenLayers(seed, new BOPOverworldGenSettings());
+ this.biomes = biomes;
+ }
+
+ @Override
+ protected Codec extends BiomeProvider> codec()
+ {
+ return CODEC;
+ }
+
+ @Override
+ public BiomeProvider withSeed(long seed)
+ {
+ return new BOPBiomeProvider(seed, this.biomes);
+ }
+
+ @Override
+ public Biome getNoiseBiome(int x, int y, int z)
+ {
+ return this.noiseBiomeLayer.get(this.biomes, x, z);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/biomesoplenty/common/world/BOPDimensionType.java b/src/main/java/biomesoplenty/common/world/BOPDimensionType.java
new file mode 100644
index 0000000000..e837123e78
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/world/BOPDimensionType.java
@@ -0,0 +1,50 @@
+package biomesoplenty.common.world;
+
+import biomesoplenty.init.ModConfig;
+import com.google.common.collect.ImmutableList;
+import com.mojang.datafixers.util.Pair;
+import com.mojang.serialization.Lifecycle;
+import net.minecraft.util.RegistryKey;
+import net.minecraft.util.ResourceLocation;
+import net.minecraft.util.registry.MutableRegistry;
+import net.minecraft.util.registry.Registry;
+import net.minecraft.util.registry.SimpleRegistry;
+import net.minecraft.world.Dimension;
+import net.minecraft.world.DimensionType;
+import net.minecraft.world.biome.Biome;
+import net.minecraft.world.biome.Biomes;
+import net.minecraft.world.biome.FuzzedBiomeMagnifier;
+import net.minecraft.world.biome.provider.BiomeProvider;
+import net.minecraft.world.biome.provider.EndBiomeProvider;
+import net.minecraft.world.biome.provider.NetherBiomeProvider;
+import net.minecraft.world.gen.ChunkGenerator;
+import net.minecraft.world.gen.DimensionSettings;
+import net.minecraft.world.gen.NoiseChunkGenerator;
+
+import java.util.Optional;
+import java.util.OptionalLong;
+
+/***
+ * This class mainly exists as a means of putting static methods in the same place Vanilla has them and access to protected methods.
+ * We don't need to create our own BOPDimensionType instances.
+ */
+public class BOPDimensionType extends DimensionType
+{
+ protected BOPDimensionType(OptionalLong p_i241972_1_, boolean p_i241972_2_, boolean p_i241972_3_, boolean p_i241972_4_, boolean p_i241972_5_, double p_i241972_6_, boolean p_i241972_8_, boolean p_i241972_9_, boolean p_i241972_10_, boolean p_i241972_11_, int p_i241972_12_, ResourceLocation p_i241972_13_, ResourceLocation p_i241972_14_, float p_i241972_15_)
+ {
+ super(p_i241972_1_, p_i241972_2_, p_i241972_3_, p_i241972_4_, p_i241972_5_, p_i241972_6_, p_i241972_8_, p_i241972_9_, p_i241972_10_, p_i241972_11_, p_i241972_12_, p_i241972_13_, p_i241972_14_, p_i241972_15_);
+ }
+
+ private static ChunkGenerator bopNetherGenerator(Registry biomeRegistry, Registry dimensionSettingsRegistry, long seed)
+ {
+ return new NoiseChunkGenerator(new BOPNetherBiomeProvider(seed, biomeRegistry), seed, () -> dimensionSettingsRegistry.getOrThrow(DimensionSettings.NETHER));
+ }
+
+ public static SimpleRegistry bopDimensions(Registry biomeRegistry, Registry dimensionSettingsRegistry, long seed)
+ {
+ SimpleRegistry registry = new SimpleRegistry<>(Registry.LEVEL_STEM_REGISTRY, Lifecycle.experimental());
+ registry.register(Dimension.NETHER, new Dimension(() -> DEFAULT_NETHER, ModConfig.GenerationConfig.useBopNether.get() ? bopNetherGenerator(biomeRegistry, dimensionSettingsRegistry, seed) : DimensionType.defaultNetherGenerator(biomeRegistry, dimensionSettingsRegistry, seed)), Lifecycle.stable());
+ registry.register(Dimension.END, new Dimension(() -> DEFAULT_END, DimensionType.defaultEndGenerator(biomeRegistry, dimensionSettingsRegistry, seed)), Lifecycle.stable());
+ return registry;
+ }
+}
diff --git a/src/main/java/biomesoplenty/common/world/BOPLayerUtil.java b/src/main/java/biomesoplenty/common/world/BOPLayerUtil.java
new file mode 100644
index 0000000000..69e55c73bc
--- /dev/null
+++ b/src/main/java/biomesoplenty/common/world/BOPLayerUtil.java
@@ -0,0 +1,189 @@
+/*******************************************************************************
+ * Copyright 2014-2019, the Biomes O' Plenty Team
+ *
+ * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
+ *
+ * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
+ ******************************************************************************/
+package biomesoplenty.common.world;
+
+import biomesoplenty.common.util.biome.BiomeUtil;
+import biomesoplenty.common.world.layer.*;
+import biomesoplenty.common.world.layer.traits.LazyAreaLayerContextBOP;
+import net.minecraft.util.registry.Registry;
+import net.minecraft.world.biome.Biomes;
+import net.minecraft.world.gen.IExtendedNoiseRandom;
+import net.minecraft.world.gen.area.IArea;
+import net.minecraft.world.gen.area.IAreaFactory;
+import net.minecraft.world.gen.area.LazyArea;
+import net.minecraft.world.gen.layer.*;
+
+import java.util.function.LongFunction;
+
+public class BOPLayerUtil
+{
+ public static final int WARM_OCEAN = BiomeUtil.getBiomeId(Biomes.WARM_OCEAN);
+ public static final int LUKEWARM_OCEAN = BiomeUtil.getBiomeId(Biomes.LUKEWARM_OCEAN);
+ public static final int OCEAN = BiomeUtil.getBiomeId(Biomes.OCEAN);
+ public static final int COLD_OCEAN = BiomeUtil.getBiomeId(Biomes.COLD_OCEAN);
+ public static final int FROZEN_OCEAN = BiomeUtil.getBiomeId(Biomes.FROZEN_OCEAN);
+ public static final int DEEP_WARM_OCEAN = BiomeUtil.getBiomeId(Biomes.DEEP_WARM_OCEAN);
+ public static final int DEEP_LUKEWARM_OCEAN = BiomeUtil.getBiomeId(Biomes.DEEP_LUKEWARM_OCEAN);
+ public static final int DEEP_OCEAN = BiomeUtil.getBiomeId(Biomes.DEEP_OCEAN);
+ public static final int DEEP_COLD_OCEAN = BiomeUtil.getBiomeId(Biomes.DEEP_COLD_OCEAN);
+ public static final int DEEP_FROZEN_OCEAN = BiomeUtil.getBiomeId(Biomes.DEEP_FROZEN_OCEAN);
+
+ public static > IAreaFactory createInitialLandAndSeaFactory(LongFunction contextFactory)
+ {
+ // NOTE: Normally AddSnow, CoolWarm, HeatIce and Special GenLayers occur here, but we handle those ourselves
+ IAreaFactory factory = IslandLayer.INSTANCE.run(contextFactory.apply(1L));
+ factory = ZoomLayer.FUZZY.run(contextFactory.apply(2000L), factory);
+ factory = AddIslandLayer.INSTANCE.run(contextFactory.apply(1L), factory);
+ factory = ZoomLayer.NORMAL.run(contextFactory.apply(2001L), factory);
+ factory = AddIslandLayer.INSTANCE.run(contextFactory.apply(2L), factory);
+ factory = AddIslandLayer.INSTANCE.run(contextFactory.apply(50L), factory);
+ factory = AddIslandLayer.INSTANCE.run(contextFactory.apply(70L), factory);
+ factory = RemoveTooMuchOceanLayer.INSTANCE.run(contextFactory.apply(2L), factory);
+ //factory = GenLayerAddSnow.INSTANCE.apply((IContextExtended)contextFactory.apply(2L), factory);
+ factory = AddIslandLayer.INSTANCE.run(contextFactory.apply(3L), factory);
+ //factory = GenLayerEdge.CoolWarm.INSTANCE.run(contextFactory.apply(2L), factory);
+ //factory = GenLayerEdge.HeatIce.INSTANCE.run(contextFactory.apply(2L), factory);
+ //factory = GenLayerEdge.Special.INSTANCE.run(contextFactory.apply(3L), factory);
+ factory = ZoomLayer.NORMAL.run(contextFactory.apply(2002L), factory);
+ factory = ZoomLayer.NORMAL.run(contextFactory.apply(2003L), factory);
+ factory = AddIslandLayer.INSTANCE.run(contextFactory.apply(4L), factory);
+ return factory;
+ }
+
+ // superimpose hot and cold regions an a land and sea layer
+ public static > IAreaFactory createClimateFactory(LongFunction