Compare commits

..

10 Commits

Author SHA1 Message Date
Adubbz 3711ae5821 Removed old access transformer 2016-01-09 21:02:25 +11:00
Adubbz 5385daa4b9 Moved access transformer 2016-01-09 21:02:08 +11:00
Adubbz 616174acb0 Update build.properties 2016-01-09 13:04:02 +11:00
Adubbz b17bdcf438 Update build.gradle 2016-01-09 13:03:29 +11:00
Adubbz 52dad1328a Added null check for getWeightedTerrainSettings 2016-01-09 13:00:02 +11:00
Adubbz 34ca387bba Merge pull request #583 from gxy17886/patch-3
update zh_CN.lang
2016-01-05 09:57:15 +11:00
gxy17886 04ff2179cc update zh_CN.lang
update zh_CN.lang
2016-01-05 00:34:51 +08:00
Adubbz 866d75be0d Updated to the latest Forge Gradle 2015-12-17 02:13:46 +11:00
Adubbz d21577b1b8 Dummy commit 2015-12-17 00:15:09 +11:00
Adubbz 91de3df26c Updated the build script out of curiosity 2015-12-17 00:12:06 +11:00
4329 changed files with 46833 additions and 60449 deletions

View File

@ -1,27 +0,0 @@
---
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. ]</br>
### What's the issue you encountered?
[ Describe the issue in detail and what you were doing beforehand. ]</br>
### How can the issue be reproduced?
[ Include a detailed step by step process for recreating your issue with only Biomes O' Plenty installed. ]</br>
### Logs
[ Please include any relevant logs here. This can be done by dragging and dropping your log files into the issue. ]</br>
### Mod Version
[ Please put the version of the mod you were using here. ]</br>

View File

@ -1,23 +0,0 @@
---
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. ]</br>
### How can the crash be reproduced?
[ Include a detailed step by step process for recreating your crash with only Biomes O' Plenty installed. ]</br>
### 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. ]</br>
### Mod Version
[ Please put the version of the mod you were using here. ]</br>

View File

@ -1,20 +0,0 @@
---
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. ]</br>
### What feature are you suggesting?
[ Provide an overview of the feature being suggested. ]</br>
### Why should it be added?
[ Describe the benefits of implementing this feature. ]</br>

View File

@ -1,5 +0,0 @@
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.

17
.gitignore vendored
View File

@ -1,28 +1,11 @@
/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

60
Jenkinsfile vendored
View File

@ -1,60 +0,0 @@
@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}'
}
}
}
}
}

View File

@ -1,17 +0,0 @@
<p align="center"><img src="https://i.imgur.com/HQ2opH6.png"></p>
<p align="center"><img src="https://i.imgur.com/CYxKg5M.png"></p>
<p align="center">https://discord.gg/GyyzU6T</p>
**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**
-----------------
[<img src="http://i.creativecommons.org/l/by-nc-nd/3.0/88x31.png">](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).

View File

@ -1,71 +1,90 @@
buildscript {
repositories {
mavenLocal()
maven { url = 'https://files.minecraftforge.net/maven' }
jcenter()
mavenCentral()
maven {
name = "forge"
url = "http://files.minecraftforge.net/maven"
}
}
dependencies {
classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '3.+', changing: true
classpath 'net.minecraftforge.gradle:ForgeGradle:2.1-SNAPSHOT'
}
}
plugins {
id "com.matthewprenger.cursegradle" version "1.4.0"
id "com.matthewprenger.cursegradle" version "1.0.5"
}
apply plugin: 'net.minecraftforge.gradle'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'net.minecraftforge.gradle.forge'
apply plugin: 'maven'
repositories { mavenLocal() }
// define the properties file
ext.configFile = file "build.properties"
configFile.withReader {
// read config. it shall from now on be referenced as simply config or as project.config
def prop = new Properties()
prop.load(it)
project.ext.config = new ConfigSlurper().parse prop
}
group = "com.github.glitchfiend.biomesoplenty"
version = config.mod_version
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
}
}
version = config.minecraft_version + "-" + config.forge_version // grab latest forge
useDepAts = true
mappings = project.config.mappings_version
}
processResources {
from (sourceSets.main.resources.srcDirs) {
include 'META-INF/mods.toml'
expand 'version': project.version
}
// add some stuff to the version
version = "${config.minecraft_version}-${config.mod_version}.${System.getenv().BUILD_NUMBER}"
def commonManifest = {
attributes 'FMLAT': 'biomesoplenty_at.cfg'
}
jar {
manifest commonManifest
classifier = 'universal'
}
dependencies {
minecraft 'net.minecraftforge:forge:' + minecraft_version + '-' + forge_version
processResources {
from(sourceSets.main.resources.srcDirs) {
include '**/*.info'
include '**/*.properties'
// replaces
expand ([
'modid': project.archivesBaseName,
'mod_version': project.config.mod_version,
'minecraft_version': project.config.minecraft_version,
'build_number': project.config.build_number
])
}
from(sourceSets.main.resources.srcDirs) {
exclude '**/*.info'
exclude '**/*.properties'
}
}
import net.minecraftforge.gradle.tasks.JenkinsChangelog
import net.minecraftforge.gradle.common.Constants
task changelog(type: JenkinsChangelog) {
def buildNumber = "${System.getenv().BUILD_NUMBER}"
serverRoot = 'http://ci.jenkins.minecraftforge.net/'
jobName = 'BiomesOPlenty'
authName = 'console_script';
authPassword = 'dc6d48ca20a474beeac280a9a16a926e';
targetBuild = buildNumber.toString();
output = 'build/libs/' + project.getName() + '-' + project.version + '-changelog.txt';
}
tasks.build.dependsOn('changelog')
task sourcesJar(type: Jar) {
from sourceSets.main.allJava
@ -78,64 +97,63 @@ task sourcesJar(type: Jar) {
task deobfJar(type: Jar) {
from sourceSets.main.output
manifest commonManifest
classifier = 'deobf'
}
task apiJar(type: Jar) {
from(sourceSets.main.allJava) {
include 'biomesoplenty/api/**'
}
from (sourceSets.main.output) {
include 'LICENSE.txt'
include 'biomesoplenty/api/**'
}
task listOutputs << {
//This is needed by the Groovy Postbuild to append labels for each build used in the changelog.
println "Output files:"
println "--------------------"
def list = []
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
def dir = new File("build/libs/")
if (dir.exists()) {
dir.eachFileRecurse (FileType.FILES) { file ->
//Add each file to the list
list << file
}
//Print the names of all of the output files
list.each {
println it.getName()
}
}
println "--------------------"
}
tasks.build.finalizedBy('listOutputs')
artifacts {
if (changelog_file.exists()) {
archives changelog_file
}
archives jar
archives changelog.output
archives sourcesJar
archives deobfJar
archives apiJar
}
curseforge {
apiKey = "$System.env.curse_api_key"
project {
id = '220318'
changelog = file('build/libs/' + project.getName() + '-' + project.version + '-changelog.txt');
releaseType = 'beta'
}
}
import groovy.io.FileType
uploadArchives {
repositories {
mavenDeployer {
if (project.hasProperty('forgeMavenPassword')) {
repository(url: "https://files.minecraftforge.net/maven/manage/upload") {
if (project.hasProperty('forgeMavenPassword'))
{
repository(url: "http://files.minecraftforge.net/maven/manage/upload") {
authentication(userName: project.getProperty('forgeMavenUsername'), password: project.getProperty('forgeMavenPassword'))
}
}
else {
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())
}
@ -175,11 +193,21 @@ uploadArchives {
name 'Adubbz'
roles { role 'developer' }
}
developer {
id 'Amnet'
name 'Amnet'
roles { role 'developer' }
}
developer {
id 'Forstride'
name 'Forstride'
roles { role 'developer' }
}
developer {
id 'ted80'
name 'ted80'
roles { role 'developer' }
}
}
}
}

6
build.properties Normal file
View File

@ -0,0 +1,6 @@
minecraft_version=1.8
forge_version=11.14.4.1577
mod_version=3.0.0
curse_project_id=220318
curse_release_type=alpha
mappings_version=snapshot_nodoc_20150214

View File

@ -1,12 +0,0 @@
# 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

Binary file not shown.

View File

@ -1,5 +1,6 @@
#Tue Dec 15 20:33:12 AEDT 2015
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
distributionUrl=https\://services.gradle.org/distributions/gradle-2.9-bin.zip

108
gradlew vendored
View File

@ -6,6 +6,47 @@
##
##############################################################################
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# 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
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
esac
# For Cygwin, ensure paths are in UNIX format before anything is touched.
if $cygwin ; then
[ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
fi
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
@ -20,49 +61,9 @@ while [ -h "$PRG" ] ; do
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
cd "`dirname \"$PRG\"`/" >&-
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
cd "$SAVED" >&-
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
@ -89,7 +90,7 @@ location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
@ -113,7 +114,6 @@ fi
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`
@ -154,19 +154,11 @@ if $cygwin ; then
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
function splitJvmOpts() {
JVM_OPTS=("$@")
}
APP_ARGS=$(save "$@")
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
# 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" "$@"
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"

180
gradlew.bat vendored
View File

@ -1,90 +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
@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

View File

@ -0,0 +1,345 @@
/*******************************************************************************
* Copyright 2015, 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 java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Map.Entry;
import net.minecraft.block.BlockSand;
import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityList;
import net.minecraft.entity.EnumCreatureType;
import net.minecraft.init.Blocks;
import net.minecraft.world.World;
import net.minecraft.world.biome.BiomeGenBase;
import net.minecraft.world.chunk.ChunkPrimer;
import biomesoplenty.api.biome.generation.GenerationManager;
import biomesoplenty.api.biome.generation.GeneratorStage;
import biomesoplenty.api.biome.generation.IGenerator;
import biomesoplenty.common.enums.BOPClimates;
import biomesoplenty.common.util.config.BOPConfig.IConfigObj;
import biomesoplenty.common.world.BOPWorldSettings;
import biomesoplenty.common.world.TerrainSettings;
public class BOPBiome extends BiomeGenBase implements IExtendedBiome
{
private GenerationManager generationManager = new GenerationManager();
private Map<BOPClimates, Integer> weightMap = new HashMap<BOPClimates, Integer>();
// defaults
public int skyColor = -1; // -1 indicates the default skyColor by temperature will be used
public boolean hasBiomeEssence = true;
public IBlockState seaFloorBlock = Blocks.dirt.getDefaultState();
public TerrainSettings terrainSettings = new TerrainSettings();
public boolean noNeighborTerrainInfuence = false;
public int avgDirtDepth = 3;
public BOPBiome()
{
super(-1, false);
this.terrainSettings.setDefaults();
this.theBiomeDecorator.treesPerChunk = -999;
this.theBiomeDecorator.flowersPerChunk = -999;
this.theBiomeDecorator.grassPerChunk = -999;
this.theBiomeDecorator.sandPerChunk = -999;
this.theBiomeDecorator.sandPerChunk2 = -999;
this.theBiomeDecorator.clayPerChunk = -999;
this.theBiomeDecorator.generateLakes = false;
}
public void applySettings(BOPWorldSettings settings)
{
}
public void configure(IConfigObj conf)
{
// Allow name to be overridden
this.biomeName = conf.getString("biomeName",this.biomeName);
// Allow basic properties to be overridden
this.topBlock = conf.getBlockState("topBlock", this.topBlock);
this.fillerBlock = conf.getBlockState("fillerBlock", this.fillerBlock);
this.seaFloorBlock = conf.getBlockState("seaFloorBlock", this.seaFloorBlock);
this.minHeight = conf.getFloat("rootHeight", this.minHeight);
this.maxHeight = conf.getFloat("variation", this.maxHeight);
this.temperature = conf.getFloat("temperature", this.temperature);
this.rainfall = conf.getFloat("rainfall", this.rainfall);
this.color = conf.getInt("color",this.color);
this.waterColorMultiplier = conf.getInt("waterColorMultiplier", this.waterColorMultiplier);
this.enableRain = conf.getBool("enableRain", this.enableRain);
this.enableSnow = conf.getBool("enableSnow", this.enableSnow);
this.skyColor = conf.getInt("skyColor", this.skyColor);
this.hasBiomeEssence = conf.getBool("hasBiomeEssence", this.hasBiomeEssence);
// Allow weights to be overridden
IConfigObj confWeights = conf.getObject("weights");
if (confWeights != null)
{
for (BOPClimates climate : BOPClimates.values())
{
Integer weight = confWeights.getInt(climate.name().toLowerCase(), null);
if (weight == null) {continue;}
if (weight.intValue() < 1)
{
this.weightMap.remove(climate);
}
else
{
this.weightMap.put(climate, weight);
}
}
}
// Allow generators to be configured
IConfigObj confGenerators = conf.getObject("generators");
if (confGenerators != null)
{
for (String name : confGenerators.getKeys())
{
this.generationManager.configureWith(name, confGenerators.getObject(name));
}
}
// Allow spawnable entites to be configured
ArrayList<IConfigObj> confEntities = conf.getObjectArray("entities");
if (confEntities != null)
{
for (IConfigObj confEntity : confEntities)
{
String entityName = confEntity.getString("name");
EnumCreatureType creatureType = confEntity.getEnum("creatureType", EnumCreatureType.class);
if (entityName == null || creatureType == null) {continue;}
// Look for an entity class matching this name
// case insensitive, dot used as mod delimiter, no spaces or underscores
// eg 'villager', 'Zombie', 'SQUID', 'enderdragon', 'biomesoplenty.wasp' all ok
Class <? extends Entity > entityClazz = null;
for (Object entry : EntityList.stringToClassMapping.entrySet())
{
String entryEntityName = (String)((Entry)entry).getKey();
if (entryEntityName.equalsIgnoreCase(entityName))
{
entityClazz = (Class <? extends Entity >)((Entry)entry).getValue();
}
}
if (entityClazz == null)
{
confEntity.addMessage("No entity registered called " + entityName);
continue;
}
if (!creatureType.getCreatureClass().isAssignableFrom(entityClazz))
{
confEntity.addMessage("Entity " + entityName + " is not of type " + creatureType);
continue;
}
List<SpawnListEntry> spawns = this.getSpawnableList(creatureType);
Integer weight = confEntity.getInt("weight");
if (weight != null && weight < 1)
{
// weight was set to zero (or negative) so find and remove this spawn
Iterator<SpawnListEntry> spawnIterator = spawns.iterator();
while (spawnIterator.hasNext())
{
SpawnListEntry entry = spawnIterator.next();
if (entry.entityClass == entityClazz)
{
spawnIterator.remove();
}
}
}
else
{
// weight was positive, or omitted, so update an existing spawn or add a new spawn
boolean foundIt = false;
for (SpawnListEntry entry : spawns)
{
if (entry.entityClass == entityClazz)
{
// the entry already exists - adjust the params
entry.itemWeight = confEntity.getInt("weight", entry.itemWeight);
entry.minGroupCount = confEntity.getInt("minGroupCount", entry.minGroupCount);
entry.maxGroupCount = confEntity.getInt("maxGroupCount", entry.maxGroupCount);
foundIt = true;
}
}
if (!foundIt)
{
// the entry does not exist - add it
SpawnListEntry entry = new SpawnListEntry(entityClazz, confEntity.getInt("weight", 10), confEntity.getInt("minGroupCount", 4), confEntity.getInt("maxGroupCount", 4));
spawns.add(entry);
}
}
}
}
}
@Override
public BiomeOwner getBiomeOwner()
{
return BiomeOwner.BIOMESOPLENTY;
}
@Override
public void addGenerator(String name, GeneratorStage stage, IGenerator generator)
{
this.generationManager.addGenerator(name, stage, generator);
}
public void removeGenerator(String name)
{
this.generationManager.removeGenerator(name);
}
@Override
public GenerationManager getGenerationManager()
{
return this.generationManager;
}
@Override
public Map<BOPClimates, Integer> getWeightMap()
{
return this.weightMap;
}
@Override
public void addWeight(BOPClimates climate, int weight)
{
this.weightMap.put(climate, weight);
}
@Override
public void clearWeights()
{
this.weightMap.clear();
}
// whether or not a biome essence item corresponding to this biome should be able to drop from biome blocks
public boolean hasBiomeEssence()
{
return this.hasBiomeEssence;
}
@Override
public int getSkyColorByTemp(float temperature)
{
return (this.skyColor == -1) ? super.getSkyColorByTemp(temperature) : this.skyColor;
}
@Override
public BiomeGenBase setTemperatureRainfall(float temp, float rain)
{
this.temperature = temp;
this.rainfall = rain;
return this;
}
@Override
public void genTerrainBlocks(World world, Random rand, ChunkPrimer primer, int x, int z, double stoneNoiseVal)
{
IBlockState topBlock = this.topBlock;
IBlockState fillerBlock = this.fillerBlock;
IBlockState seaFloorBlock = this.seaFloorBlock;
boolean hitFloorYet = false;
int topBlocksToFill = 0;
int dirtBlocksToFill = 0;
int seaFloorBlocksToFill = 0;
int dirtDepth = Math.max(0, (int)(stoneNoiseVal / 3.0D + this.avgDirtDepth + rand.nextDouble() * 0.25D));
int seaFloorDepth = 1 + rand.nextInt(2);
int localX = x & 15;
int localZ = z & 15;
// start at the top and move downwards
for (int y = 255; y >= 0; --y)
{
IBlockState state = primer.getBlockState(localZ, y, localX);
// bedrock at the bottom
if (y <= rand.nextInt(5))
{
primer.setBlockState(localZ, y, localX, Blocks.bedrock.getDefaultState());
continue;
}
if (state.getBlock().getMaterial() == Material.air)
{
// topBlocks and dirtBlocks can occur after any pocket of air
topBlocksToFill = (topBlock == null ? 0 : 1);
dirtBlocksToFill = dirtDepth;
continue;
}
else if (!hitFloorYet && state.getBlock().getMaterial() == Material.water)
{
// seaFloorBlocks can occur after surface water
seaFloorBlocksToFill = seaFloorDepth;
}
if (state.getBlock() == Blocks.stone)
{
hitFloorYet = true;
if (topBlocksToFill > 0)
{
if (y >= 62)
{
primer.setBlockState(localZ, y, localX, topBlock);
}
else if (y >= 56 - dirtDepth)
{
primer.setBlockState(localZ, y, localX, fillerBlock);
}
else
{
primer.setBlockState(localZ, y, localX, Blocks.gravel.getDefaultState());
dirtBlocksToFill = 0;
}
topBlocksToFill--;
}
else if (seaFloorBlocksToFill > 0)
{
primer.setBlockState(localZ, y, localX, seaFloorBlock);
--seaFloorBlocksToFill;
}
else if (dirtBlocksToFill > 0)
{
primer.setBlockState(localZ, y, localX, fillerBlock);
--dirtBlocksToFill;
// add sandstone after a patch of sand
if (dirtBlocksToFill == 0 && fillerBlock.getBlock() == Blocks.sand)
{
dirtBlocksToFill = rand.nextInt(4) + Math.max(0, y - 63);
fillerBlock = fillerBlock.getValue(BlockSand.VARIANT) == BlockSand.EnumType.RED_SAND ? Blocks.red_sandstone.getDefaultState() : Blocks.sandstone.getDefaultState();
}
}
}
}
}
}

View File

@ -1,104 +1,65 @@
/*******************************************************************************
* Copyright 2014-2019, the Biomes O' Plenty Team
*
* Copyright 2015, 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;
import com.google.common.base.Optional;
import net.minecraft.world.biome.BiomeGenBase;
public class BOPBiomes
{
public static RegistryKey<Biome> alps = register("alps");
public static RegistryKey<Biome> alps_foothills = register("alps_foothills");
public static RegistryKey<Biome> bamboo_blossom_grove = register("bamboo_blossom_grove");
public static RegistryKey<Biome> bayou = register("bayou");
public static RegistryKey<Biome> bayou_mangrove = register("bayou_mangrove");
public static RegistryKey<Biome> burnt_forest = register("burnt_forest");
public static RegistryKey<Biome> cherry_blossom_grove = register("cherry_blossom_grove");
public static RegistryKey<Biome> cold_desert = register("cold_desert");
public static RegistryKey<Biome> coniferous_forest = register("coniferous_forest");
public static RegistryKey<Biome> coniferous_lakes = register("coniferous_lakes");
public static RegistryKey<Biome> dead_forest = register("dead_forest");
public static RegistryKey<Biome> deep_bayou = register("deep_bayou");
public static RegistryKey<Biome> dense_marsh = register("dense_marsh");
public static RegistryKey<Biome> dense_woodland = register("dense_woodland");
public static RegistryKey<Biome> dryland = register("dryland");
public static RegistryKey<Biome> dry_boneyard = register("dry_boneyard");
public static RegistryKey<Biome> fir_clearing = register("fir_clearing");
public static RegistryKey<Biome> flower_meadow = register("flower_meadow");
public static RegistryKey<Biome> fungal_field = register("fungal_field");
public static RegistryKey<Biome> fungal_jungle = register("fungal_jungle");
public static RegistryKey<Biome> golden_prairie = register("golden_prairie");
public static RegistryKey<Biome> grassland = register("grassland");
public static RegistryKey<Biome> grassland_clover_patch = register("grassland_clover_patch");
public static RegistryKey<Biome> gravel_beach = register("gravel_beach");
public static RegistryKey<Biome> grove = register("grove");
public static RegistryKey<Biome> grove_clearing = register("grove_clearing");
public static RegistryKey<Biome> grove_lakes = register("grove_lakes");
public static RegistryKey<Biome> highland = register("highland");
public static RegistryKey<Biome> highland_crag = register("highland_crag");
public static RegistryKey<Biome> highland_moor = register("highland_moor");
public static RegistryKey<Biome> jade_cliffs = register("jade_cliffs");
public static RegistryKey<Biome> lavender_field = register("lavender_field");
public static RegistryKey<Biome> lavender_forest = register("lavender_forest");
public static RegistryKey<Biome> lush_desert = register("lush_desert");
public static RegistryKey<Biome> lush_savanna = register("lush_savanna");
public static RegistryKey<Biome> marsh = register("marsh");
public static RegistryKey<Biome> meadow = register("meadow");
public static RegistryKey<Biome> meadow_forest = register("meadow_forest");
public static RegistryKey<Biome> muskeg = register("muskeg");
public static RegistryKey<Biome> mystic_grove = register("mystic_grove");
public static RegistryKey<Biome> mystic_plains = register("mystic_plains");
public static RegistryKey<Biome> ominous_woods = register("ominous_woods");
public static RegistryKey<Biome> ominous_mire = register("ominous_mire");
public static RegistryKey<Biome> orchard = register("orchard");
public static RegistryKey<Biome> origin_valley = register("origin_valley");
public static RegistryKey<Biome> prairie = register("prairie");
public static RegistryKey<Biome> rainbow_hills = register("rainbow_hills");
public static RegistryKey<Biome> rainforest = register("rainforest");
public static RegistryKey<Biome> rainforest_cliffs = register("rainforest_cliffs");
public static RegistryKey<Biome> rainforest_floodplain = register("rainforest_floodplain");
public static RegistryKey<Biome> redwood_forest = register("redwood_forest");
public static RegistryKey<Biome> redwood_forest_edge = register("redwood_forest_edge");
public static RegistryKey<Biome> redwood_hills = register("redwood_hills");
public static RegistryKey<Biome> scrubland = register("scrubland");
public static RegistryKey<Biome> seasonal_forest = register("seasonal_forest");
public static RegistryKey<Biome> seasonal_orchard = register("seasonal_orchard");
public static RegistryKey<Biome> seasonal_pumpkin_patch = register("seasonal_pumpkin_patch");
public static RegistryKey<Biome> shroomy_wetland = register("shroomy_wetland");
public static RegistryKey<Biome> shrubland = register("shrubland");
public static RegistryKey<Biome> shrubland_hills = register("shrubland_hills");
public static RegistryKey<Biome> snowy_coniferous_forest = register("snowy_coniferous_forest");
public static RegistryKey<Biome> snowy_fir_clearing = register("snowy_fir_clearing");
public static RegistryKey<Biome> snowy_maple_forest = register("snowy_maple_forest");
public static RegistryKey<Biome> tall_dead_forest = register("tall_dead_forest");
public static RegistryKey<Biome> tropic_beach = register("tropic_beach");
public static RegistryKey<Biome> tropics = register("tropics");
public static RegistryKey<Biome> tundra = register("tundra");
public static RegistryKey<Biome> tundra_basin = register("tundra_basin");
public static RegistryKey<Biome> tundra_bog = register("tundra_bog");
public static RegistryKey<Biome> volcanic_plains = register("volcanic_plains");
public static RegistryKey<Biome> volcano = register("volcano");
public static RegistryKey<Biome> wasteland = register("wasteland");
public static RegistryKey<Biome> wetland = register("wetland");
public static RegistryKey<Biome> wetland_forest = register("wetland_forest");
public static RegistryKey<Biome> wooded_scrubland = register("wooded_scrubland");
public static RegistryKey<Biome> woodland = register("woodland");
// normal biomes which have weights
public static Optional<BiomeGenBase> alps = Optional.absent();
public static Optional<BiomeGenBase> arctic = Optional.absent();
public static Optional<BiomeGenBase> bamboo_forest = Optional.absent();
public static Optional<BiomeGenBase> bayou = Optional.absent();
public static Optional<BiomeGenBase> bog = Optional.absent();
public static Optional<BiomeGenBase> boreal_forest = Optional.absent();
public static Optional<BiomeGenBase> brushland = Optional.absent();
public static Optional<BiomeGenBase> canyon = Optional.absent();
public static Optional<BiomeGenBase> chaparral = Optional.absent();
public static Optional<BiomeGenBase> cherry_blossom_grove = Optional.absent();
public static Optional<BiomeGenBase> cold_desert = Optional.absent();
public static Optional<BiomeGenBase> coniferous_forest = Optional.absent();
public static Optional<BiomeGenBase> crag = Optional.absent();
public static Optional<BiomeGenBase> dead_forest = Optional.absent();
public static Optional<BiomeGenBase> dead_swamp = Optional.absent();
public static Optional<BiomeGenBase> deciduous_forest = Optional.absent();
public static Optional<BiomeGenBase> eucalyptus_forest = Optional.absent();
public static Optional<BiomeGenBase> fen = Optional.absent();
public static Optional<BiomeGenBase> dense_forest = Optional.absent();
public static Optional<BiomeGenBase> flower_field = Optional.absent();
public static Optional<BiomeGenBase> frost_forest = Optional.absent();
public static Optional<BiomeGenBase> frozen_desert = Optional.absent();
public static Optional<BiomeGenBase> fungi_forest = Optional.absent();
public static Optional<BiomeGenBase> garden = Optional.absent();
public static Optional<BiomeGenBase> grassland = Optional.absent();
public static Optional<BiomeGenBase> grove = Optional.absent();
public static Optional<BiomeGenBase> heathland = Optional.absent();
public static Optional<BiomeGenBase> highland = Optional.absent();
public static Optional<BiomeGenBase> jade_cliffs = Optional.absent();
public static Optional<BiomeGenBase> lavender_fields = Optional.absent();
public static Optional<BiomeGenBase> marsh = Optional.absent();
public static Optional<BiomeGenBase> moor = Optional.absent();
public static Optional<BiomeGenBase> mountain = Optional.absent();
public static Optional<BiomeGenBase> origin_valley = Optional.absent();
public static Optional<BiomeGenBase> outback = Optional.absent();
public static Optional<BiomeGenBase> shrubland = Optional.absent();
public static Optional<BiomeGenBase> steppe = Optional.absent();
public static Optional<BiomeGenBase> thicket = Optional.absent();
public static Optional<BiomeGenBase> tundra = Optional.absent();
public static Optional<BiomeGenBase> woodland = Optional.absent();
public static Optional<BiomeGenBase> xeric_shrubland = Optional.absent();
// edge-biomes, sub-biomes and mutated-biomes
public static Optional<BiomeGenBase> glacier = Optional.absent();
public static Optional<BiomeGenBase> mountain_foothills = Optional.absent();
public static Optional<BiomeGenBase> canyon_ravine = Optional.absent();
public static RegistryKey<Biome> crystalline_chasm = register("crystalline_chasm");
public static RegistryKey<Biome> undergrowth = register("undergrowth");
public static RegistryKey<Biome> visceral_heap = register("visceral_heap");
public static RegistryKey<Biome> withered_abyss = register("withered_abyss");
private static RegistryKey<Biome> register(String name)
{
return RegistryKey.create(Registry.BIOME_REGISTRY, new ResourceLocation(BiomesOPlenty.MOD_ID, name));
}
}

View File

@ -0,0 +1,14 @@
/*******************************************************************************
* Copyright 2014-2015, 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;
public enum BiomeOwner
{
BIOMESOPLENTY, OTHER;
}

View File

@ -0,0 +1,26 @@
/*******************************************************************************
* Copyright 2014-2015, 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 java.util.Map;
import biomesoplenty.api.biome.generation.GenerationManager;
import biomesoplenty.api.biome.generation.GeneratorStage;
import biomesoplenty.api.biome.generation.IGenerator;
import biomesoplenty.common.enums.BOPClimates;
public interface IExtendedBiome
{
public BiomeOwner getBiomeOwner();
public void addGenerator(String name, GeneratorStage stage, IGenerator generator);
public GenerationManager getGenerationManager();
public Map<BOPClimates, Integer> getWeightMap();
public void clearWeights();
public void addWeight(BOPClimates climate, int weight);
}

View File

@ -0,0 +1,100 @@
/*******************************************************************************
* Copyright 2015, 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.generation;
import java.util.Random;
import net.minecraft.util.BlockPos;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;
import net.minecraft.world.gen.feature.WorldGenerator;
public abstract class BOPGeneratorBase extends WorldGenerator implements IGenerator
{
private final String identifier;
private String name;
private GeneratorStage stage;
protected float amountPerChunk;
protected BOPGeneratorBase(float amountPerChunk)
{
this.identifier = GeneratorRegistry.getIdentifier((Class<? extends IGenerator>)this.getClass());
if (this.identifier == null)
{
throw new RuntimeException("The identifier for " + this.getClass().getCanonicalName() + " cannot be null!");
}
this.amountPerChunk = amountPerChunk;
}
protected static abstract class InnerBuilder<T extends InnerBuilder<T, G>, G extends BOPGeneratorBase>
{
protected T self() {return (T)this;}
protected float amountPerChunk;
public T amountPerChunk(float amountPerChunk) {this.amountPerChunk = amountPerChunk; return this.self();}
public abstract G create();
}
@Override
public void setName(String name)
{
this.name = name;
}
@Override
public void setStage(GeneratorStage stage)
{
this.stage = stage;
}
@Override
public String getName()
{
return this.name;
}
@Override
public GeneratorStage getStage()
{
return this.stage;
}
@Override
public final String getIdentifier()
{
return this.identifier;
}
public abstract BlockPos getScatterY(World world, Random random, int x, int z);
public int getAmountToScatter(Random random)
{
int amount = MathHelper.floor_float(this.amountPerChunk);
float remainder = this.amountPerChunk - amount;
if (random.nextFloat() < remainder) {amount++;}
return amount;
}
@Override
public void scatter(World world, Random random, BlockPos pos)
{
int amount = this.getAmountToScatter(random);
for (int i = 0; i < amount; i++)
{
int x = pos.getX() + random.nextInt(16) + 8;
int z = pos.getZ() + random.nextInt(16) + 8;
generate(world, random, this.getScatterY(world, random, x, z));
}
}
}

View File

@ -0,0 +1,84 @@
/*******************************************************************************
* Copyright 2015, 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.generation;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import biomesoplenty.common.util.config.BOPConfig.IConfigObj;
import com.google.common.collect.ImmutableCollection;
import com.google.common.collect.ImmutableList;
public class GenerationManager
{
private Map<String, IGenerator> generators = new HashMap<String, IGenerator>();
public void addGenerator(String name, GeneratorStage stage, IGenerator generator)
{
if (this.generators.containsKey(name))
{
throw new RuntimeException("A generator with name " + name + " already exists!");
}
generator.setName(name);
generator.setStage(stage);
this.generators.put(name, generator);
}
public ImmutableCollection<IGenerator> getGeneratorsForStage(GeneratorStage stage)
{
ArrayList<IGenerator> out = new ArrayList<IGenerator>();
for (IGenerator generator : this.generators.values())
{
if (generator.getStage() == stage)
{
out.add(generator);
}
}
return ImmutableList.<IGenerator>copyOf(out);
}
public void removeGenerator(String name)
{
this.generators.remove(name);
}
public IGenerator getGenerator(String name)
{
return this.generators.get(name);
}
public void configureWith(String name, IConfigObj conf)
{
if (this.generators.containsKey(name))
{
if (conf.getBool("enable", true))
{
// configure the existing generator
this.generators.get(name).configure(conf);
}
else
{
// remove this generator
this.generators.remove(name);
}
}
else
{
// there was previously no generator of this name - attempt to add it
IGenerator generator = GeneratorRegistry.createGenerator(conf);
if (generator != null)
{
this.generators.put(name, generator);
}
}
}
}

View File

@ -0,0 +1,67 @@
/*******************************************************************************
* Copyright 2015, 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.generation;
import java.util.HashMap;
import java.util.Map;
import biomesoplenty.common.util.config.BOPConfig.IConfigObj;
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
public class GeneratorRegistry
{
private static BiMap<String, Class<? extends IGenerator>> generatorClasses = HashBiMap.create();
private static Map<String, IGenerator.IGeneratorBuilder> generatorBuilders = new HashMap<String, IGenerator.IGeneratorBuilder>();
public static <T extends IGenerator> void registerGenerator(String identifier, Class<T> generatorClass, IGenerator.IGeneratorBuilder<T> builder)
{
generatorClasses.put(identifier, generatorClass);
generatorBuilders.put(identifier, builder);
}
public static String getIdentifier(Class<? extends IGenerator> generatorClass)
{
return generatorClasses.inverse().get(generatorClass);
}
public static Class<? extends IGenerator> getGeneratorClass(String identifier)
{
return generatorClasses.get(identifier);
}
public static IGenerator.IGeneratorBuilder getGeneratorBuilder(String identifier)
{
return generatorBuilders.get(identifier);
}
public static boolean generatorExists(String identifier)
{
return generatorClasses.containsValue(identifier);
}
public static IGenerator createGenerator(IConfigObj conf)
{
GeneratorStage stage = conf.getEnum("stage", GeneratorStage.class);
String identifier = conf.getString("type");
if (stage == null || identifier == null) {return null;}
IGenerator.IGeneratorBuilder builder = getGeneratorBuilder(identifier);
if (builder == null)
{
conf.addMessage("No generator is registered with type name " + identifier);
return null;
}
IGenerator generator = builder.create();
generator.setStage(stage);
generator.configure(conf);
return generator;
}
}

View File

@ -0,0 +1,71 @@
/*******************************************************************************
* Copyright 2015, 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.generation;
import net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate;
import com.google.gson.annotations.SerializedName;
public enum GeneratorStage
{
@SerializedName("pre")
PRE(null),
@SerializedName("big_shroom")
BIG_SHROOM(Decorate.EventType.BIG_SHROOM),
@SerializedName("cactus")
CACTUS(Decorate.EventType.CACTUS),
@SerializedName("clay")
CLAY(Decorate.EventType.CLAY),
@SerializedName("dead_bush")
DEAD_BUSH(Decorate.EventType.DEAD_BUSH),
@SerializedName("lilypad")
LILYPAD(Decorate.EventType.LILYPAD),
@SerializedName("flowers")
FLOWERS(Decorate.EventType.FLOWERS),
@SerializedName("grass")
GRASS(Decorate.EventType.GRASS),
@SerializedName("lake_water")
LAKE_WATER(Decorate.EventType.LAKE_WATER),
@SerializedName("lake_lava")
LAKE_LAVA(Decorate.EventType.LAKE_LAVA),
@SerializedName("pumpkin")
PUMPKIN(Decorate.EventType.PUMPKIN),
@SerializedName("reed")
REED(Decorate.EventType.REED),
@SerializedName("sand")
SAND(Decorate.EventType.SAND),
@SerializedName("sand_pass_2")
SAND_PASS2(Decorate.EventType.SAND_PASS2),
@SerializedName("shroom")
SHROOM(Decorate.EventType.SHROOM),
@SerializedName("tree")
TREE(Decorate.EventType.TREE),
@SerializedName("post")
POST(null),
@SerializedName("parent")
PARENT(null);
private Decorate.EventType decorateType;
private GeneratorStage(Decorate.EventType decorateType)
{
this.decorateType = decorateType;
}
public Decorate.EventType getDecorateType()
{
return this.decorateType;
}
public static GeneratorStage mapDecorateType(Decorate.EventType decorateType)
{
//Somewhat of a hack, requires the ordering of our enum to be the s
return decorateType != Decorate.EventType.CUSTOM ? GeneratorStage.values()[decorateType.ordinal() + 1] : null;
}
}

View File

@ -0,0 +1,163 @@
/*******************************************************************************
* Copyright 2015, 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.generation;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Random;
import net.minecraft.util.BlockPos;
import net.minecraft.world.World;
import biomesoplenty.common.util.config.BOPConfig.IConfigObj;
public class GeneratorWeighted extends BOPGeneratorBase
{
public static class Builder implements IGeneratorBuilder<GeneratorWeighted>
{
protected float amountPerChunk = 1.0F;
public Builder amountPerChunk(float a) {this.amountPerChunk = a; return this;}
@Override
public GeneratorWeighted create()
{
return new GeneratorWeighted(this.amountPerChunk);
}
}
private HashMap<String, IGenerator> generators = new HashMap<String, IGenerator>();
private HashMap<IGenerator, Integer> weights = new HashMap<IGenerator, Integer>();
public GeneratorWeighted()
{
// default
this(1);
}
public GeneratorWeighted(float amountPerChunk)
{
super(amountPerChunk);
}
public void add(String name, int weight, IGenerator entry)
{
if (this.generators.containsKey(name))
{
throw new RuntimeException("A generator with name " + name + " already exists!");
}
if (weight < 1)
{
throw new IllegalArgumentException("Generator weight must be positive");
}
entry.setStage(GeneratorStage.PARENT);
this.generators.put(name, entry);
this.weights.put(entry, weight);
}
public void clear()
{
this.generators.clear();
this.weights.clear();
}
public IGenerator getGenerator(String name)
{
return this.generators.get(name);
}
public void removeGenerator(String name)
{
IGenerator generator = this.generators.get(name);
if (generator != null)
{
this.generators.remove(name);
this.weights.remove(generator);
}
}
public IGenerator getRandomGenerator(Random random)
{
if (this.weights.isEmpty())
{
throw new RuntimeException("GeneratorWeighted has no child generators");
}
int totalWeight = 0;
for (int weight : this.weights.values()) {totalWeight += weight;}
int j = random.nextInt(totalWeight);
for (Entry<IGenerator, Integer> entry : this.weights.entrySet())
{
j -= entry.getValue();
if (j < 0) {return entry.getKey();}
}
throw new RuntimeException("Shouldn't ever get here");
}
// never used - the scatter method is overriden
@Override
public BlockPos getScatterY(World world, Random random, int x, int z) {return null;}
@Override
public void scatter(World world, Random random, BlockPos pos)
{
int amount = this.getAmountToScatter(random);
for (int i = 0; i < amount; i++)
{
this.getRandomGenerator(random).scatter(world, random, pos);
}
}
@Override
public boolean generate(World world, Random random, BlockPos pos)
{
return this.getRandomGenerator(random).generate(world, random, pos);
}
@Override
public void configure(IConfigObj conf)
{
this.amountPerChunk = conf.getFloat("amountPerChunk", this.amountPerChunk);
IConfigObj confGenerators = conf.getObject("generators");
if (confGenerators != null)
{
for (String name : confGenerators.getKeys())
{
if (this.generators.containsKey(name))
{
IGenerator generator = this.getGenerator(name);
Integer weight = conf.getInt("weight", this.weights.get(generator));
if (weight.intValue() < 1)
{
// remove this generator if the weight is zero (or negative)
this.removeGenerator(name);
}
else
{
// adjust weight
this.weights.put(generator, weight);
// configure the existing generator
generator.configure(conf);
}
}
else
{
// there was previously no generator of this name - attempt to add it
Integer weight = conf.getInt("weight", null);
IGenerator generator = GeneratorRegistry.createGenerator(conf);
if (weight != null && generator != null)
{
this.add(name, weight, generator);
}
}
}
}
}
}

View File

@ -0,0 +1,39 @@
/*******************************************************************************
* Copyright 2014-2015, 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.generation;
import java.util.Random;
import biomesoplenty.common.util.config.BOPConfig.IConfigObj;
import net.minecraft.util.BlockPos;
import net.minecraft.world.World;
public interface IGenerator
{
public void scatter(World world, Random random, BlockPos pos);
public boolean generate(World world, Random random, BlockPos pos);
public void setStage(GeneratorStage stage);
public void setName(String name);
/**A unique name use to classify the purpose of a generator. For example, emeralds and ruby use the
* same generator (and thus, have the same identifier) but have differing names.
*/
public String getName();
/**The identifier for this generator should be consistent across all instances of the same type*/
public String getIdentifier();
public GeneratorStage getStage();
public static interface IGeneratorBuilder<T extends IGenerator>
{
public T create();
}
public void configure(IConfigObj conf);
}

View File

@ -1,346 +1,148 @@
/*******************************************************************************
* Copyright 2014-2019, the Biomes O' Plenty Team
*
* Copyright 2014, 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;
import net.minecraftforge.fluids.Fluid;
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 bamboo_thatching;
public static Block ash_block;
public static Block bamboo;
public static Block bone_segment;
public static Block coral;
public static Block seaweed;
public static Block gem_block;
public static Block gem_ore;
public static Block hive;
public static Block mushroom;
public static Block stone;
public static Block biome_block;
public static Block flower_0;
public static Block flower_1;
public static Block log_0;
public static Block log_1;
public static Block log_2;
public static Block log_3;
public static Block leaves_0;
public static Block leaves_1;
public static Block leaves_2;
public static Block leaves_3;
public static Block leaves_4;
public static Block leaves_5;
public static Block sapling_0;
public static Block sapling_1;
public static Block sapling_2;
// TODO fruit tree leaves and saplings
public static Block planks_0;
public static Block wood_slab_0;
public static Block wood_slab_1;
public static Block double_wood_slab_0;
public static Block double_wood_slab_1;
public static Block sacred_oak_stairs;
public static Block cherry_stairs;
public static Block dark_stairs;
public static Block fir_stairs;
public static Block ethereal_stairs;
public static Block magic_stairs;
public static Block mangrove_stairs;
public static Block palm_stairs;
public static Block redwood_stairs;
public static Block willow_stairs;
public static Block pine_stairs;
public static Block hellbark_stairs;
public static Block jacaranda_stairs;
public static Block mahogany_stairs;
public static Block sacred_oak_fence;
public static Block cherry_fence;
public static Block dark_fence;
public static Block fir_fence;
public static Block ethereal_fence;
public static Block magic_fence;
public static Block mangrove_fence;
public static Block palm_fence;
public static Block redwood_fence;
public static Block willow_fence;
public static Block pine_fence;
public static Block hellbark_fence;
public static Block jacaranda_fence;
public static Block mahogany_fence;
public static Block sacred_oak_fence_gate;
public static Block cherry_fence_gate;
public static Block dark_fence_gate;
public static Block fir_fence_gate;
public static Block ethereal_fence_gate;
public static Block magic_fence_gate;
public static Block mangrove_fence_gate;
public static Block palm_fence_gate;
public static Block redwood_fence_gate;
public static Block willow_fence_gate;
public static Block pine_fence_gate;
public static Block hellbark_fence_gate;
public static Block jacaranda_fence_gate;
public static Block mahogany_fence_gate;
public static Block sacred_oak_door;
public static Block cherry_door;
public static Block dark_door;
public static Block fir_door;
public static Block ethereal_door;
public static Block magic_door;
public static Block mangrove_door;
public static Block palm_door;
public static Block redwood_door;
public static Block willow_door;
public static Block pine_door;
public static Block hellbark_door;
public static Block jacaranda_door;
public static Block mahogany_door;
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 sand;
public static Block turnip_block;
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 grass;
public static Block waterlily;
public static Block dirt;
public static Block stone_formations;
public static Block fruit_block;
public static Block ash_stone;
public static Block hard_sand;
public static Block hard_dirt;
public static Block hard_ice;
public static Block dried_dirt;
public static Block crag_rock;
public static Block mud_brick_block;
public static Block crystal;
public static Block other_slab;
public static Block double_other_slab;
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 mud_brick_stairs;
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 flower_vine;
public static Block ivy;
public static Block moss;
public static Block tree_moss;
public static Block wisteria;
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 plant_0;
public static Block plant_1;
public static Block double_plant;
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 honey_block;
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;
public static Block honey;
public static Fluid honey_fluid;
public static Block blood;
public static Fluid blood_fluid;
public static Block poison;
public static Fluid poison_fluid;
}

View File

@ -0,0 +1,43 @@
/*******************************************************************************
* Copyright 2014, 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 biomesoplenty.common.util.block.BlockQuery.IBlockPosQuery;
public class BlockQueries
{
public static IBlockPosQuery anything;
public static IBlockPosQuery nothing;
public static IBlockPosQuery hasWater;
public static IBlockPosQuery airAbove;
public static IBlockPosQuery breakable;
public static IBlockPosQuery airOrLeaves;
public static IBlockPosQuery surfaceBlocks;
public static IBlockPosQuery groundBlocks;
public static IBlockPosQuery fertile;
public static IBlockPosQuery fertileOrNetherrack;
public static IBlockPosQuery sustainsCave;
public static IBlockPosQuery sustainsNether;
public static IBlockPosQuery endish;
public static IBlockPosQuery hellish;
public static IBlockPosQuery litFertile;
public static IBlockPosQuery litBeach;
public static IBlockPosQuery litFertileWaterside;
public static IBlockPosQuery litSand;
public static IBlockPosQuery litDry;
public static IBlockPosQuery litFertileOrDry;
public static IBlockPosQuery spectralMoss;
public static IBlockPosQuery fertileSeaBed;
public static IBlockPosQuery underwater;
public static IBlockPosQuery suitableForReed;
public static IBlockPosQuery rootsCanDigThrough;
}

View File

@ -0,0 +1,23 @@
/*******************************************************************************
* Copyright 2014, 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.properties.IProperty;
import net.minecraft.block.state.IBlockState;
import net.minecraft.item.ItemBlock;
public interface IBOPBlock {
public Class<? extends ItemBlock> getItemClass();
public int getItemRenderColor(IBlockState state, int tintIndex);
public IProperty[] getPresetProperties();
public IProperty[] getNonRenderingProperties();
public String getStateName(IBlockState state);
}

View File

@ -0,0 +1,18 @@
/*******************************************************************************
* Copyright 2014, 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.util.BlockPos;
import net.minecraft.world.IBlockAccess;
import net.minecraftforge.common.EnumPlantType;
public interface ISustainsPlantType
{
public boolean canSustainPlantType(IBlockAccess world, BlockPos pos, EnumPlantType plantType);
}

View File

@ -1,16 +0,0 @@
/*******************************************************************************
* 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;
}

View File

@ -1,211 +0,0 @@
/*******************************************************************************
* 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<WeightedBiomeEntry> landBiomes = Lists.newArrayList();
private ArrayList<WeightedBiomeEntry> islandBiomes = Lists.newArrayList();
BOPClimates(BiomeType biomeType)
{
this.biomeType = biomeType;
}
public BOPClimates addBiome(int weight, RegistryKey<Biome> 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> 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<Biome> getRandomBiome(INoiseRandom context, RegistryKey<Biome> fallback)
{
if (this.totalBiomesWeight == 0)
return fallback;
int weight = context.nextRandom(this.totalBiomesWeight);
Iterator<WeightedBiomeEntry> iterator = this.landBiomes.iterator();
WeightedBiomeEntry item;
do
{
item = iterator.next();
weight -= item.weight;
}
while (weight >= 0);
return item.biome;
}
public RegistryKey<Biome> getRandomIslandBiome(INoiseRandom context, RegistryKey<Biome> fallback)
{
if (this.totalIslandBiomesWeight == 0)
return fallback;
int weight = context.nextRandom(this.totalIslandBiomesWeight);
Iterator<WeightedBiomeEntry> iterator = this.islandBiomes.iterator();
WeightedBiomeEntry item;
do
{
item = iterator.next();
weight -= item.weight;
}
while (weight >= 0);
return item.biome;
}
public RegistryKey<Biome> getRandomOceanBiome(INoiseRandom context, boolean deep)
{
return (deep ? Biomes.DEEP_OCEAN : Biomes.OCEAN);
}
public ImmutableList<WeightedBiomeEntry> getLandBiomes()
{
return this.landBiomes.isEmpty() ? ImmutableList.of(this.getDefaultWeightedBiomeEntry()) : ImmutableList.copyOf(this.landBiomes);
}
public ImmutableList<WeightedBiomeEntry> 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<RegistryKey<Biome>> getOverworldBiomes()
{
Set<RegistryKey<Biome>> 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> biome;
public WeightedBiomeEntry(int weight, RegistryKey<Biome> 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);
}
}
}
}

View File

@ -0,0 +1,27 @@
/*******************************************************************************
* Copyright 2014, 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.ToolMaterial;
import net.minecraft.item.ItemArmor.ArmorMaterial;
public class BOPItemHelper
{
public static ArmorMaterial wading_boots_material;
public static ArmorMaterial flippers_material;
public static ArmorMaterial plain_flower_band_material;
public static ArmorMaterial lush_flower_band_material;
public static ArmorMaterial exotic_flower_band_material;
public static ArmorMaterial dull_flower_band_material;
public static ArmorMaterial mud_armor_material;
public static ArmorMaterial amethyst_armor_material;
public static ToolMaterial mud_tool_material;
public static ToolMaterial amethyst_tool_material;
}

View File

@ -1,32 +1,124 @@
/*******************************************************************************
* Copyright 2014-2019, the Biomes O' Plenty Team
* Copyright 2014, 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 class BOPItems
{
public static Item bop_icon;
public static Item mud_ball;
public static Item berries;
public static Item shroompowder;
public static Item wildcarrots;
public static Item peach;
public static Item saladfruit;
public static Item saladveggie;
public static Item saladshroom;
public static Item earth;
public static Item persimmon;
public static Item filled_honeycomb;
public static Item ambrosia;
public static Item turnip;
public static Item pear;
public static Item ricebowl;
public static Item fleshchunk;
public static Item mudball;
public static Item turnip_seeds;
public static Item crystal_shard;
public static Item honeycomb;
public static Item gem;
public static Item ash;
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;
}
public static Item blue_dye;
public static Item brown_dye;
public static Item green_dye;
public static Item white_dye;
public static Item black_dye;
public static Item ghastly_soul;
public static Item pixie_dust;
public static Item ichor;
public static Item pinecone;
public static Item other_slab;
public static Item dart;
public static Item dart_blower;
public static Item sacred_oak_door;
public static Item cherry_door;
public static Item dark_door;
public static Item fir_door;
public static Item ethereal_door;
public static Item magic_door;
public static Item mangrove_door;
public static Item palm_door;
public static Item redwood_door;
public static Item willow_door;
public static Item pine_door;
public static Item hellbark_door;
public static Item jacaranda_door;
public static Item mahogany_door;
public static Item wood_slab_0;
public static Item wood_slab_1;
public static Item wading_boots;
public static Item flippers;
public static Item plain_flower_band;
public static Item lush_flower_band;
public static Item exotic_flower_band;
public static Item dull_flower_band;
public static Item mud_helmet;
public static Item mud_chestplate;
public static Item mud_leggings;
public static Item mud_boots;
public static Item amethyst_helmet;
public static Item amethyst_chestplate;
public static Item amethyst_leggings;
public static Item amethyst_boots;
public static Item mud_axe;
public static Item mud_hoe;
public static Item mud_pickaxe;
public static Item mud_shovel;
public static Item mud_sword;
public static Item amethyst_axe;
public static Item amethyst_hoe;
public static Item amethyst_pickaxe;
public static Item amethyst_shovel;
public static Item amethyst_sword;
public static Item mud_scythe;
public static Item wood_scythe;
public static Item stone_scythe;
public static Item iron_scythe;
public static Item gold_scythe;
public static Item diamond_scythe;
public static Item amethyst_scythe;
public static Item biome_finder;
public static Item biome_essence;
public static Item enderporter;
public static Item jar_empty;
public static Item jar_filled;
public static Item honey_bucket;
public static Item blood_bucket;
public static Item poison_bucket;
public static Item record_wanderer;
public static Item record_corruption;
public static Item spawn_egg;
// TODO: public static Item ancientStaff;
// TODO: public static Item bop_bucket;
}

View File

@ -1,13 +1,6 @@
/*******************************************************************************
* 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
}
PIXIETRAIL, DANDELION, MUD, PLAYER_TRAIL;
}

View File

@ -0,0 +1,19 @@
/*******************************************************************************
* Copyright 2014, 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.potion;
import net.minecraft.potion.Potion;
public class BOPPotions
{
public static Potion paralysis;
public static Potion possession;
}

View File

@ -1,15 +0,0 @@
/*******************************************************************************
* 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;
}

View File

@ -1,141 +0,0 @@
/**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<String> 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<ResourceLocation> getResources(ResourcePackType type, String namespaceIn, String pathIn, int maxDepthIn, Predicate<String> 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> T getMetadataSection(IMetadataSectionSerializer<T> 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;
}
}

View File

@ -0,0 +1,561 @@
package biomesoplenty.client.gui;
import java.io.IOException;
import net.minecraft.client.gui.Gui;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiCreateWorld;
import net.minecraft.client.gui.GuiListButton;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.GuiSlider;
import net.minecraft.client.gui.GuiTextField;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.WorldRenderer;
import net.minecraft.client.resources.I18n;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import biomesoplenty.common.world.BOPWorldSettings;
import biomesoplenty.common.world.BOPWorldSettings.BiomeSize;
import biomesoplenty.common.world.BOPWorldSettings.LandMassScheme;
import biomesoplenty.common.world.BOPWorldSettings.RainfallVariationScheme;
import biomesoplenty.common.world.BOPWorldSettings.TemperatureVariationScheme;
import com.google.common.base.Predicate;
import com.google.common.primitives.Floats;
@SideOnly(Side.CLIENT)
public class GuiBOPConfigureWorld extends GuiScreen implements GuiSlider.FormatHelper, GuiBOPPageList.GuiResponder
{
private GuiCreateWorld parentScreen;
protected String screenTitle = "Customize World Settings";
protected String pageInfo = "Page 1 of 3";
protected String page0Title = "Basic Settings";
protected String[] pageNames;
private GuiBOPPageManager pageManager;
//Navigation buttons, required on all pages
private GuiButton doneButton;
private GuiButton defaultsButton;
private GuiButton prevButton;
private GuiButton nextButton;
private GuiButton yesButton;
private GuiButton noButton;
private int modalAction = 0;
private boolean field_175340_C = false;
private Predicate validFloatPredicate = new Predicate()
{
public boolean tryParseValidFloat(String p_178956_1_)
{
Float f = Floats.tryParse(p_178956_1_);
return p_178956_1_.length() == 0 || f != null && Floats.isFinite(f.floatValue()) && f.floatValue() >= 0.0F;
}
@Override
public boolean apply(Object p_apply_1_)
{
return this.tryParseValidFloat((String)p_apply_1_);
}
};
private BOPWorldSettings settings;
public GuiBOPConfigureWorld(GuiScreen parentScreen, String settingsStringIn)
{
this.parentScreen = (GuiCreateWorld)parentScreen;
if (settingsStringIn.isEmpty())
{
this.settings = new BOPWorldSettings();
} else {
this.settings = new BOPWorldSettings(settingsStringIn);
}
}
private static enum Actions
{
PREVIOUS (301),
NEXT (302),
DEFAULTS (303),
DONE (304),
YES (305),
NO (306);
private int id;
private Actions(int id)
{
this.id = id;
}
public int getId()
{
return this.id;
}
public static Actions fromId(int id)
{
for (Actions action : Actions.values())
{
if (action.id == id)
{
return action;
}
}
return null;
}
}
@Override
public void initGui()
{
this.screenTitle = I18n.format("options.customizeTitle", new Object[0]);
this.buttonList.clear();
this.buttonList.add(this.prevButton = new GuiButton(Actions.PREVIOUS.getId(), 20, 5, 80, 20, I18n.format("createWorld.customize.custom.prev", new Object[0])));
this.buttonList.add(this.nextButton = new GuiButton(Actions.NEXT.getId(), this.width - 100, 5, 80, 20, I18n.format("createWorld.customize.custom.next", new Object[0])));
this.buttonList.add(this.defaultsButton = new GuiButton(Actions.DEFAULTS.getId(), this.width / 2 - 187, this.height - 27, 90, 20, I18n.format("createWorld.customize.custom.defaults", new Object[0])));
this.buttonList.add(this.doneButton = new GuiButton(Actions.DONE.getId(), this.width / 2 + 98, this.height - 27, 90, 20, I18n.format("gui.done", new Object[0])));
this.yesButton = new GuiButton(Actions.YES.getId(), this.width / 2 - 55, 160, 50, 20, I18n.format("gui.yes", new Object[0]));
this.yesButton.visible = false;
this.buttonList.add(this.yesButton);
this.noButton = new GuiButton(Actions.NO.getId(), this.width / 2 + 5, 160, 50, 20, I18n.format("gui.no", new Object[0]));
this.noButton.visible = false;
this.buttonList.add(this.noButton);
this.setupPages();
}
@Override
public void handleMouseInput() throws IOException
{
super.handleMouseInput();
this.pageManager.getActivePage().handleMouseInput();
}
@Override
protected void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException
{
super.mouseClicked(mouseX, mouseY, mouseButton);
if (this.modalAction == 0 && !this.field_175340_C)
{
this.pageManager.getActivePage().mouseClicked(mouseX, mouseY, mouseButton);
}
}
@Override
protected void mouseReleased(int mouseX, int mouseY, int state)
{
super.mouseReleased(mouseX, mouseY, state);
if (this.field_175340_C)
{
this.field_175340_C = false;
}
else if (this.modalAction == 0)
{
this.pageManager.getActivePage().mouseReleased(mouseX, mouseY, state);
}
}
private static enum GuiEntries
{
TEMP_SCHEME (101),
GENERATE_BOP_GEMS (102),
AMPLITUDE (104),
BIOME_SIZE (105),
LAND_SCHEME (106),
RAIN_SCHEME (107);
private int id;
private GuiEntries(int id)
{
this.id = id;
}
public int getId()
{
return this.id;
}
public static GuiEntries fromId(int id)
{
for (GuiEntries entry : GuiEntries.values())
{
if (entry.id == id)
{
return entry;
}
}
return null;
}
}
private void setupPages()
{
this.pageNames = new String[3];
this.pageNames[0] = "World";
GuiBOPPageList.GuiFieldEntry[] page0Fields = new GuiBOPPageList.GuiFieldEntry[] {
new GuiBOPPageList.GuiEnumButtonEntry<BiomeSize>(GuiEntries.BIOME_SIZE.getId(), "Biome Size: %s", true, this.settings.biomeSize),
new GuiBOPPageList.GuiEnumButtonEntry<LandMassScheme>(GuiEntries.LAND_SCHEME.getId(), "Land Mass: %s", true, this.settings.landScheme),
new GuiBOPPageList.GuiEnumButtonEntry<TemperatureVariationScheme>(GuiEntries.TEMP_SCHEME.getId(), "Temperature: %s", true, this.settings.tempScheme),
new GuiBOPPageList.GuiEnumButtonEntry<RainfallVariationScheme>(GuiEntries.RAIN_SCHEME.getId(), "Rainfall: %s", true, this.settings.rainScheme),
new GuiBOPPageList.GuiSlideEntry(GuiEntries.AMPLITUDE.getId(), "Amplitude", true, this, 0.2F, 3.0F, this.settings.amplitude)
};
this.pageNames[1] = "Biomes";
GuiBOPPageList.GuiFieldEntry[] page1Fields = new GuiBOPPageList.GuiFieldEntry[] {
};
this.pageNames[2] = "Features";
GuiBOPPageList.GuiFieldEntry[] page2Fields = new GuiBOPPageList.GuiFieldEntry[] {
new GuiBOPPageList.GuiButtonEntry(GuiEntries.GENERATE_BOP_GEMS.getId(), "Generate BOP gems", true, this.settings.generateBopGems)
};
this.pageManager = new GuiBOPPageManager(createTableForFields(page0Fields, page1Fields, page2Fields));
this.pageManager.setup();
this.showNewPage();
}
private GuiBOPPageTable[] createTableForFields(GuiBOPPageList.GuiFieldEntry[]... fieldGroup)
{
GuiBOPPageTable[] output = new GuiBOPPageTable[fieldGroup.length];
for (int i = 0; i < fieldGroup.length; i++)
{
GuiBOPPageList.GuiFieldEntry[] fields = fieldGroup[i];
output[i] = new GuiBOPPageTable(this.width, this.height, 32, this.height - 32, 25, i, this, fields);
}
return output;
}
public String serialize()
{
return this.settings.toString().replace("\n", "");
}
@Override
public String func_175318_a(int p_175318_1_, String p_175318_2_, float p_175318_3_)
{
return p_175318_2_ + ": " + this.stringFormatFloat(p_175318_1_, p_175318_3_);
}
private String stringFormatFloat(int fieldId, float value)
{
GuiEntries entry = GuiEntries.fromId(fieldId);
if (entry == null) {return "";}
switch (entry)
{
case AMPLITUDE:
return String.format("%5.3f", new Object[] {Float.valueOf(value)});
default:
return "";
}
}
@Override
public void handleEnumSelection(int fieldId, int ordinal)
{
GuiEntries entry = GuiEntries.fromId(fieldId);
if (entry == null) {return;}
switch (entry)
{
case LAND_SCHEME:
LandMassScheme[] land_values = LandMassScheme.values();
this.settings.landScheme = land_values[ordinal % land_values.length];
break;
case TEMP_SCHEME:
TemperatureVariationScheme[] temp_values = TemperatureVariationScheme.values();
this.settings.tempScheme = temp_values[ordinal % temp_values.length];
break;
case RAIN_SCHEME:
RainfallVariationScheme[] rain_values = RainfallVariationScheme.values();
this.settings.rainScheme = rain_values[ordinal % rain_values.length];
break;
case BIOME_SIZE:
BiomeSize[] size_values = BiomeSize.values();
this.settings.biomeSize = size_values[ordinal % size_values.length];
break;
default:
break;
}
System.out.println("settings currently: "+this.settings.toJson());
}
@Override
public void handleBooleanSelection(int fieldId, boolean value)
{
GuiEntries entry = GuiEntries.fromId(fieldId);
if (entry == null) {return;}
switch (entry)
{
case GENERATE_BOP_GEMS:
this.settings.generateBopGems = value;
break;
default:
break;
}
System.out.println("settings currently: "+this.settings.toJson());
}
@Override
public void handleFloatSelection(int fieldId, float value)
{
GuiEntries entry = GuiEntries.fromId(fieldId);
if (entry == null) {return;}
switch (entry)
{
case AMPLITUDE:
this.settings.amplitude = value;
break;
default:
break;
}
System.out.println("settings currently: "+this.settings.toJson());
}
@Override
public void handleStringSelection(int fieldId, String value)
{
;
}
@Override
public void handleIntSelection(int fieldId, int value)
{
;
}
// These 3 are the original functions required by GuiPageButtonList.GuiResponder - just pass off to the better named functions
@Override
public void func_175319_a(int fieldId, String value) {this.handleStringSelection(fieldId, value);}
@Override
public void func_175320_a(int fieldId, float value) {this.handleFloatSelection(fieldId, value);}
@Override
public void func_175321_a(int fieldId, boolean value) {this.handleBooleanSelection(fieldId, value);}
@Override
protected void actionPerformed(GuiButton button) throws IOException
{
if (button.enabled)
{
Actions action = Actions.fromId(button.id);
if (action == null) {return;}
switch (action)
{
case DONE:
this.parentScreen.chunkProviderSettingsJson = this.settings.toJson();
System.out.println("settings sent to world screen "+this.parentScreen.chunkProviderSettingsJson);
this.mc.displayGuiScreen(this.parentScreen);
break;
case PREVIOUS:
this.pageManager.gotToPrevPage(); // prev page
this.showNewPage();
break;
case NEXT:
this.pageManager.goToNextPage(); // next page
this.showNewPage();
break;
case DEFAULTS:
this.confirmSetDefaults(button.id);
break;
case YES:
this.handleModalClose();
break;
case NO:
this.modalAction = 0;
this.handleModalClose();
}
}
}
private void doSetDefaults()
{
this.settings.setDefault();
this.setupPages();
}
private void confirmSetDefaults(int actionId)
{
this.modalAction = actionId;
this.showModal(true);
}
private void handleModalClose() throws IOException
{
Actions action = Actions.fromId(this.modalAction);
if (action != null) {
switch (action)
{
case DONE:
this.actionPerformed((GuiListButton)this.pageManager.getActivePage().getGui(300));
break;
case DEFAULTS:
this.doSetDefaults();
break;
default:
break;
}
}
this.modalAction = 0;
this.field_175340_C = true;
this.showModal(false);
}
private void showModal(boolean flag)
{
this.yesButton.visible = flag;
this.noButton.visible = flag;
this.doneButton.enabled = !flag;
this.prevButton.enabled = !flag;
this.nextButton.enabled = !flag;
this.defaultsButton.enabled = !flag;
}
private void showNewPage()
{
this.prevButton.enabled = this.pageManager.getActivePage().pageNumber != 0;
this.nextButton.enabled = this.pageManager.getActivePage().pageNumber != this.pageManager.getNumPages() - 1;
this.pageInfo = I18n.format("book.pageIndicator", new Object[] {Integer.valueOf(this.pageManager.getActivePage().pageNumber + 1), Integer.valueOf(this.pageManager.getNumPages())});
this.page0Title = this.pageNames[this.pageManager.getActivePage().pageNumber];
}
@Override
protected void keyTyped(char typedChar, int keyCode) throws IOException
{
super.keyTyped(typedChar, keyCode);
if (this.modalAction == 0)
{
switch (keyCode)
{
case 200:
this.func_175327_a(1.0F);
break;
case 208:
this.func_175327_a(-1.0F);
break;
default:
this.pageManager.getActivePage().keyTyped(typedChar, keyCode);
}
}
}
private void func_175327_a(float p_175327_1_)
{
Gui gui = this.pageManager.getActivePage().getFocusedGuiElement();
if (gui instanceof GuiTextField)
{
float f1 = p_175327_1_;
if (GuiScreen.isShiftKeyDown())
{
f1 = p_175327_1_ * 0.1F;
if (GuiScreen.isCtrlKeyDown())
{
f1 *= 0.1F;
}
}
else if (GuiScreen.isCtrlKeyDown())
{
f1 = p_175327_1_ * 10.0F;
if (GuiScreen.isAltKeyDown())
{
f1 *= 10.0F;
}
}
GuiTextField guitextfield = (GuiTextField)gui;
Float f2 = Floats.tryParse(guitextfield.getText());
if (f2 != null)
{
f2 = Float.valueOf(f2.floatValue() + f1);
int i = guitextfield.getId();
String s = this.stringFormatFloat(guitextfield.getId(), f2.floatValue());
guitextfield.setText(s);
this.func_175319_a(i, s);
}
}
}
@Override
public void drawScreen(int mouseX, int mouseY, float partialTicks)
{
this.drawDefaultBackground();
this.pageManager.getActivePage().drawScreen(mouseX, mouseY, partialTicks);
this.drawCenteredString(this.fontRendererObj, this.screenTitle, this.width / 2, 2, 16777215);
this.drawCenteredString(this.fontRendererObj, this.pageInfo, this.width / 2, 12, 16777215);
this.drawCenteredString(this.fontRendererObj, this.page0Title, this.width / 2, 22, 16777215);
super.drawScreen(mouseX, mouseY, partialTicks);
if (this.modalAction != 0)
{
drawRect(0, 0, this.width, this.height, Integer.MIN_VALUE);
this.drawHorizontalLine(this.width / 2 - 91, this.width / 2 + 90, 99, -2039584);
this.drawHorizontalLine(this.width / 2 - 91, this.width / 2 + 90, 185, -6250336);
this.drawVerticalLine(this.width / 2 - 91, 99, 185, -2039584);
this.drawVerticalLine(this.width / 2 + 90, 99, 185, -6250336);
GlStateManager.disableLighting();
GlStateManager.disableFog();
Tessellator tessellator = Tessellator.getInstance();
WorldRenderer worldrenderer = tessellator.getWorldRenderer();
this.mc.getTextureManager().bindTexture(optionsBackground);
GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
worldrenderer.startDrawingQuads();
worldrenderer.setColorOpaque_I(4210752);
worldrenderer.addVertexWithUV((double)(this.width / 2 - 90), 185.0D, 0.0D, 0.0D, 2.65625D);
worldrenderer.addVertexWithUV((double)(this.width / 2 + 90), 185.0D, 0.0D, 5.625D, 2.65625D);
worldrenderer.addVertexWithUV((double)(this.width / 2 + 90), 100.0D, 0.0D, 5.625D, 0.0D);
worldrenderer.addVertexWithUV((double)(this.width / 2 - 90), 100.0D, 0.0D, 0.0D, 0.0D);
tessellator.draw();
this.drawCenteredString(this.fontRendererObj, I18n.format("createWorld.customize.custom.confirmTitle", new Object[0]), this.width / 2, 105, 16777215);
this.drawCenteredString(this.fontRendererObj, I18n.format("createWorld.customize.custom.confirm1", new Object[0]), this.width / 2, 125, 16777215);
this.drawCenteredString(this.fontRendererObj, I18n.format("createWorld.customize.custom.confirm2", new Object[0]), this.width / 2, 135, 16777215);
this.yesButton.drawButton(this.mc, mouseX, mouseY);
this.noButton.drawButton(this.mc, mouseX, mouseY);
}
}
}

View File

@ -0,0 +1,15 @@
/*******************************************************************************
* Copyright 2014-2015, 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.client.gui;
public class GuiBOPPageBiomes //extends GuiBOPPageDelegate
{
//Subclass implementing GuiListExtended.IGuiListEntry
//Icon, label
}

View File

@ -0,0 +1,36 @@
/*******************************************************************************
* Copyright 2014-2015, 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.client.gui;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Gui;
import net.minecraft.client.gui.GuiSlot;
public abstract class GuiBOPPageDelegate extends GuiSlot
{
public final int pageNumber;
public GuiBOPPageDelegate(int width, int height, int top, int bottom, int slotHeight, int pageNumber)
{
super(Minecraft.getMinecraft(), width, height, top, bottom, slotHeight);
this.pageNumber = pageNumber;
}
public abstract void setup();
public abstract void setVisible(boolean isVisible);
public void mouseClicked(int mouseX, int mouseY, int mouseEvent) {}
public void mouseReleased(int mouseX, int mouseY, int state) {}
public void keyTyped(char typedChar, int keyCode) {}
public Gui getFocusedGuiElement() { return null; }
public Gui getGui(int fieldId) { return null; }
}

View File

@ -0,0 +1,381 @@
/*******************************************************************************
* Copyright 2014-2015, 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.client.gui;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Gui;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiLabel;
import net.minecraft.client.gui.GuiListExtended;
import net.minecraft.client.gui.GuiPageButtonList;
import net.minecraft.client.gui.GuiSlider;
import net.minecraft.client.gui.GuiTextField;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import com.google.common.base.Objects;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
public abstract class GuiBOPPageList extends GuiBOPPageDelegate
{
public GuiBOPPageList(int width, int height, int top, int bottom, int slotHeight, int pageNumber)
{
super(width, height, top, bottom, slotHeight, pageNumber);
}
@Override
protected void elementClicked(int slotIndex, boolean isDoubleClick, int mouseX, int mouseY) {}
@Override
protected boolean isSelected(int slotIndex)
{
return false;
}
@Override
protected void drawBackground() {}
@Override
protected void drawSlot(int entryID, int p_180791_2_, int p_180791_3_, int p_180791_4_, int mouseXIn, int mouseYIn)
{
this.getListEntry(entryID).drawEntry(entryID, p_180791_2_, p_180791_3_, this.getListWidth(), p_180791_4_, mouseXIn, mouseYIn, this.getSlotIndexFromScreenCoords(mouseXIn, mouseYIn) == entryID);
}
@Override
protected void func_178040_a(int p_178040_1_, int p_178040_2_, int p_178040_3_)
{
this.getListEntry(p_178040_1_).setSelected(p_178040_1_, p_178040_2_, p_178040_3_);
}
@Override
public void mouseClicked(int mouseX, int mouseY, int mouseEvent)
{
if (this.isMouseYWithinSlotBounds(mouseY))
{
int l = this.getSlotIndexFromScreenCoords(mouseX, mouseY);
if (l >= 0)
{
int i1 = this.left + this.width / 2 - this.getListWidth() / 2 + 2;
int j1 = this.top + 4 - this.getAmountScrolled() + l * this.slotHeight + this.headerPadding;
int k1 = mouseX - i1;
int l1 = mouseY - j1;
if (this.getListEntry(l).mousePressed(l, mouseX, mouseY, mouseEvent, k1, l1))
{
this.setEnabled(false);
}
}
}
}
@Override
public void mouseReleased(int mouseX, int mouseY, int state)
{
for (int l = 0; l < this.getSize(); ++l)
{
int i1 = this.left + this.width / 2 - this.getListWidth() / 2 + 2;
int j1 = this.top + 4 - this.getAmountScrolled() + l * this.slotHeight + this.headerPadding;
int k1 = mouseX - i1;
int l1 = mouseY - j1;
this.getListEntry(l).mouseReleased(l, mouseX, mouseY, state, k1, l1);
}
this.setEnabled(true);
}
public abstract GuiListExtended.IGuiListEntry getListEntry(int rowNum);
@SideOnly(Side.CLIENT)
public static class GuiSlideEntry extends GuiBOPPageList.GuiFieldEntry
{
private final GuiSlider.FormatHelper formatHelper;
private final float min;
private final float max;
private final float value;
public GuiSlideEntry(int fieldId, String labelText, boolean isVisible, GuiSlider.FormatHelper formatHelper, float min, float max, float value)
{
super(fieldId, labelText, isVisible);
this.formatHelper = formatHelper;
this.min = min;
this.max = max;
this.value = value;
}
public GuiSlider.FormatHelper getFormatHelper()
{
return this.formatHelper;
}
public float getMin()
{
return this.min;
}
public float getMax()
{
return this.max;
}
public float getValue()
{
return this.value;
}
}
@SideOnly(Side.CLIENT)
public interface GuiResponder extends GuiPageButtonList.GuiResponder
{
void handleEnumSelection(int fieldId, int ordinal);
void handleBooleanSelection(int fieldId, boolean value);
void handleFloatSelection(int fieldId, float value);
void handleStringSelection(int fieldId, String value);
void handleIntSelection(int fieldId, int value);
}
@SideOnly(Side.CLIENT)
public static class GuiFieldEntry
{
private final int fieldID;
private final String labelText;
private final boolean isVisible;
public GuiFieldEntry(int fieldId, String labelText, boolean isVisible)
{
this.fieldID = fieldId;
this.labelText = labelText;
this.isVisible = isVisible;
}
public int getFieldId()
{
return this.fieldID;
}
public String getLabelText()
{
return this.labelText;
}
public boolean isVisible()
{
return this.isVisible;
}
}
@SideOnly(Side.CLIENT)
public static class GuiLabelEntry extends GuiFieldEntry
{
public GuiLabelEntry(int fieldId, String labelText, boolean isVisible)
{
super(fieldId, labelText, isVisible);
}
}
@SideOnly(Side.CLIENT)
public static class GuiRowEntry implements GuiListExtended.IGuiListEntry
{
private final Minecraft minecraft = Minecraft.getMinecraft();
private final Gui guiLeft;
private final Gui guiRight;
Gui focusedGui;
public GuiRowEntry(Gui guiLeft, Gui guiRight)
{
this.guiLeft = guiLeft;
this.guiRight = guiRight;
}
public Gui getGuiLeft()
{
return this.guiLeft;
}
public Gui getGuiRight()
{
return this.guiRight;
}
@Override
public void drawEntry(int slotIndex, int x, int y, int listWidth, int slotHeight, int mouseX, int mouseY, boolean isVisible)
{
this.drawGui(this.guiLeft, y, mouseX, mouseY, false);
this.drawGui(this.guiRight, y, mouseX, mouseY, false);
}
private void drawGui(Gui gui, int y, int mouseX, int mouseY, boolean isVisible)
{
if (gui != null)
{
if (gui instanceof GuiButton)
{
this.drawGuiButton((GuiButton)gui, y, mouseX, mouseY, isVisible);
}
else if (gui instanceof GuiTextField)
{
this.drawGuiTextField((GuiTextField)gui, y, isVisible);
}
else if (gui instanceof GuiLabel)
{
this.drawGuiLabel((GuiLabel)gui, y, mouseX, mouseY, isVisible);
}
}
}
private void drawGuiButton(GuiButton guiButton, int y, int mouseX, int mouseY, boolean isVisible)
{
guiButton.yPosition = y;
if (!isVisible)
{
guiButton.drawButton(this.minecraft, mouseX, mouseY);
}
}
private void drawGuiTextField(GuiTextField guiTextField, int y, boolean isVisible)
{
guiTextField.yPosition = y;
if (!isVisible)
{
guiTextField.drawTextBox();
}
}
private void drawGuiLabel(GuiLabel guiLabel, int y, int mouseX, int mouseY, boolean isVisible)
{
guiLabel.field_146174_h = y;
if (!isVisible)
{
guiLabel.drawLabel(this.minecraft, mouseX, mouseY);
}
}
@Override
public void setSelected(int p_178011_1_, int p_178011_2_, int p_178011_3_)
{
this.drawGui(this.guiLeft, p_178011_3_, 0, 0, true);
this.drawGui(this.guiRight, p_178011_3_, 0, 0, true);
}
@Override
public boolean mousePressed(int slotIndex, int x, int y, int mouseEvent, int relativeX, int relativeY)
{
return this.doMousePressed(this.guiLeft, x, y, mouseEvent) || this.doMousePressed(this.guiRight, x, y, mouseEvent);
}
private boolean doMousePressed(Gui gui, int x, int y, int mouseEvent)
{
if (gui == null)
{
return false;
}
else if (gui instanceof GuiButton)
{
if (((GuiButton)gui).mousePressed(this.minecraft, x, y))
{
this.focusedGui = gui;
return true;
}
else
{
return false;
}
}
else if (gui instanceof GuiTextField)
{
((GuiTextField)gui).mouseClicked(x, y, mouseEvent);
if (((GuiTextField)gui).isFocused())
{
this.focusedGui = gui;
}
return false;
}
return false;
}
@Override
public void mouseReleased(int slotIndex, int x, int y, int mouseEvent, int relativeX, int relativeY)
{
this.doMouseReleased(this.guiLeft, x, y);
this.doMouseReleased(this.guiRight, x, y);
}
public void doMouseReleased(Gui gui, int x, int y)
{
if (gui != null && (gui instanceof GuiButton))
{
((GuiButton)gui).mouseReleased(x, y);
}
}
}
@SideOnly(Side.CLIENT)
public static class GuiEnumButtonEntry<T extends Enum> extends GuiFieldEntry
{
private final T value;
public GuiEnumButtonEntry(int fieldId, String textLabel, boolean isVisible, T value)
{
super(fieldId, textLabel, isVisible);
this.value = value;
}
public T getValue()
{
return this.value;
}
}
@SideOnly(Side.CLIENT)
public static class GuiButtonEntry extends GuiFieldEntry
{
private final boolean value;
public GuiButtonEntry(int fieldId, String textLabel, boolean isVisible, boolean value)
{
super(fieldId, textLabel, isVisible);
this.value = value;
}
public boolean getValue()
{
return this.value;
}
}
@SideOnly(Side.CLIENT)
public static class EditBoxEntry extends GuiFieldEntry
{
private final Predicate validator;
public EditBoxEntry(int fieldId, String labelText, boolean isVisible, Predicate validator)
{
super(fieldId, labelText, isVisible);
this.validator = (Predicate)Objects.firstNonNull(validator, Predicates.alwaysTrue());
}
public Predicate getValidator()
{
return this.validator;
}
}
}

View File

@ -0,0 +1,61 @@
package biomesoplenty.client.gui;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
@SideOnly(Side.CLIENT)
public class GuiBOPPageManager
{
private GuiBOPPageDelegate[] pages;
private GuiBOPPageDelegate activePage;
public GuiBOPPageManager(GuiBOPPageDelegate ... pages)
{
this.pages = pages;
this.activePage = pages[0];
}
public void setup()
{
for (GuiBOPPageDelegate page : pages)
{
page.setup();
}
}
public GuiBOPPageDelegate getActivePage()
{
return this.activePage;
}
public int getNumPages()
{
return this.pages.length;
}
public void gotToPrevPage()
{
if (this.activePage.pageNumber > 0)
{
int newPageNumber = this.activePage.pageNumber - 1;
GuiBOPPageDelegate newPage = this.pages[newPageNumber];
this.activePage.setVisible(false);
newPage.setVisible(true);
this.activePage = newPage;
}
}
public void goToNextPage()
{
if (this.activePage.pageNumber < this.pages.length - 1)
{
int newPageNumber = this.activePage.pageNumber + 1;
GuiBOPPageDelegate newPage = this.pages[newPageNumber];
this.activePage.setVisible(false);
newPage.setVisible(true);
this.activePage = newPage;
}
}
}

View File

@ -0,0 +1,370 @@
/*******************************************************************************
* Copyright 2014-2015, 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.client.gui;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.lwjgl.input.Mouse;
import net.minecraft.client.gui.Gui;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiLabel;
import net.minecraft.client.gui.GuiListButton;
import net.minecraft.client.gui.GuiListExtended;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.GuiSlider;
import net.minecraft.client.gui.GuiTextField;
public class GuiBOPPageTable extends GuiBOPPageList
{
private final List<GuiBOPPageList.GuiRowEntry> allRows = new ArrayList<GuiBOPPageList.GuiRowEntry>();
private final Map<Integer, Gui> fieldIdToGuiMap = new HashMap<Integer, Gui>();
private final List<GuiTextField> allTextFieldGuis = new ArrayList<GuiTextField>();
private final GuiBOPPageList.GuiFieldEntry[] fields;
private GuiBOPPageList.GuiResponder responder;
private Gui focusedGui;
public GuiBOPPageTable(int width, int height, int top, int bottom, int slotHeight, int pageNumber, GuiBOPPageList.GuiResponder responder, GuiBOPPageList.GuiFieldEntry... fields)
{
super(width, height, top, bottom, slotHeight, pageNumber);
this.responder = responder;
this.fields = fields;
}
@Override
public void setVisible(boolean isVisible)
{
if (isVisible)
{
for (GuiBOPPageList.GuiFieldEntry field : this.fields)
{
if (field != null)
{
Gui gui = this.fieldIdToGuiMap.get(field.getFieldId());
this.setVisible(gui, true);
}
}
}
else
{
for (GuiBOPPageList.GuiFieldEntry field : this.fields)
{
if (field != null)
{
Gui gui = this.fieldIdToGuiMap.get(field.getFieldId());
this.setVisible(gui, false);
}
}
}
}
private void setVisible(Gui gui, boolean isVisible)
{
if (gui instanceof GuiButton)
{
((GuiButton)gui).visible = isVisible;
}
else if (gui instanceof GuiTextField)
{
((GuiTextField)gui).setVisible(isVisible);
}
else if (gui instanceof GuiLabel)
{
((GuiLabel)gui).visible = isVisible;
}
}
@Override
public void setup()
{
// go through the fields in twos (so they go in 2 columns)
for (int k = 0; k < fields.length; k += 2)
{
GuiBOPPageList.GuiFieldEntry fieldLeft = fields[k];
GuiBOPPageList.GuiFieldEntry fieldRight = k < fields.length - 1 ? fields[k + 1] : null;
Gui guiLeft = this.createGui(fieldLeft, 0, fieldRight == null);
Gui guiRight = this.createGui(fieldRight, 160, fieldLeft == null);
GuiBOPPageList.GuiRowEntry row = new GuiBOPPageList.GuiRowEntry(guiLeft, guiRight);
this.allRows.add(row);
if (fieldLeft != null && guiLeft != null)
{
this.fieldIdToGuiMap.put(fieldLeft.getFieldId(), guiLeft);
if (guiLeft instanceof GuiTextField)
{
this.allTextFieldGuis.add((GuiTextField)guiLeft);
}
}
if (fieldRight != null && guiRight != null)
{
this.fieldIdToGuiMap.put(fieldRight.getFieldId(), guiRight);
if (guiRight instanceof GuiTextField)
{
this.allTextFieldGuis.add((GuiTextField)guiRight);
}
}
}
this.resetRows();
}
private void resetRows()
{
this.allRows.clear();
for (int i = 0; i < this.fields.length; i += 2)
{
GuiBOPPageList.GuiFieldEntry guilistentryLeft = this.fields[i];
GuiBOPPageList.GuiFieldEntry guilistentryRight = i < this.fields.length - 1 ? this.fields[i + 1] : null;
Gui guiLeft = (Gui)this.fieldIdToGuiMap.get(guilistentryLeft.getFieldId());
Gui guiRight = guilistentryRight != null ? (Gui)this.fieldIdToGuiMap.get(guilistentryRight.getFieldId()) : null;
GuiBOPPageList.GuiRowEntry guientry = new GuiBOPPageList.GuiRowEntry(guiLeft, guiRight);
this.allRows.add(guientry);
}
}
@Override
public Gui getFocusedGuiElement()
{
return this.focusedGui;
}
@Override
public Gui getGui(int fieldId)
{
return (Gui)this.fieldIdToGuiMap.get(fieldId);
}
private Gui createGui(GuiBOPPageList.GuiFieldEntry field, int xOffset, boolean hasNoNeighbor)
{
if (field instanceof GuiBOPPageList.GuiSlideEntry)
{
return (Gui)this.createSlider(this.width / 2 - 155 + xOffset, 0, (GuiBOPPageList.GuiSlideEntry)field);
}
else if (field instanceof GuiBOPPageList.GuiButtonEntry)
{
return (Gui)this.createListButton(this.width / 2 - 155 + xOffset, 0, (GuiBOPPageList.GuiButtonEntry)field);
}
else if (field instanceof GuiBOPPageList.EditBoxEntry)
{
return (Gui)this.createTextField(this.width / 2 - 155 + xOffset, 0, (GuiBOPPageList.EditBoxEntry)field);
}
else if (field instanceof GuiBOPPageList.GuiLabelEntry)
{
return (Gui)this.createLabel(this.width / 2 - 155 + xOffset, 0, (GuiBOPPageList.GuiLabelEntry)field, hasNoNeighbor);
}
else if (field instanceof GuiBOPPageList.GuiEnumButtonEntry)
{
return (Gui)this.createEnumButton(this.width / 2 - 155 + xOffset, 0, (GuiBOPPageList.GuiEnumButtonEntry)field);
}
else
{
return null;
}
}
//Mouse clicked
private GuiSlider createSlider(int xPosition, int yPosition, GuiBOPPageList.GuiSlideEntry field)
{
GuiSlider guislider = new GuiSlider(this.responder, field.getFieldId(), xPosition, yPosition, field.getLabelText(), field.getMin(), field.getMax(), field.getValue(), field.getFormatHelper());
guislider.visible = field.isVisible();
return guislider;
}
private GuiListButton createListButton(int xPosition, int yPosition, GuiBOPPageList.GuiButtonEntry field)
{
GuiListButton guilistbutton = new GuiListButton(this.responder, field.getFieldId(), xPosition, yPosition, field.getLabelText(), field.getValue());
guilistbutton.visible = field.isVisible();
return guilistbutton;
}
private GuiEnumButton createEnumButton(int xPosition, int yPosition, GuiBOPPageList.GuiEnumButtonEntry field)
{
GuiEnumButton guienumbutton = new GuiEnumButton(this.responder, field.getFieldId(), xPosition, yPosition, field.getLabelText(), field.getValue());
guienumbutton.visible = field.isVisible();
return guienumbutton;
}
private GuiTextField createTextField(int xPosition, int yPosition, GuiBOPPageList.EditBoxEntry field)
{
GuiTextField guitextfield = new GuiTextField(field.getFieldId(), this.mc.fontRendererObj, xPosition, yPosition, 150, 20);
guitextfield.setText(field.getLabelText());
guitextfield.func_175207_a(this.responder); // setResponder
guitextfield.setVisible(field.isVisible());
guitextfield.func_175205_a(field.getValidator()); // setValidator
return guitextfield;
}
private GuiLabel createLabel(int xPosition, int yPosition, GuiBOPPageList.GuiLabelEntry field, boolean hasNoNeighbor)
{
GuiLabel guilabel;
if (hasNoNeighbor)
{
guilabel = new GuiLabel(this.mc.fontRendererObj, field.getFieldId(), xPosition, yPosition, this.width - xPosition * 2, 20, -1);
}
else
{
guilabel = new GuiLabel(this.mc.fontRendererObj, field.getFieldId(), xPosition, yPosition, 150, 20, -1);
}
guilabel.visible = field.isVisible();
guilabel.func_175202_a(field.getLabelText()); // setText
guilabel.setCentered();
return guilabel;
}
@Override
public void keyTyped(char typedChar, int keyCode)
{
if (this.focusedGui instanceof GuiTextField)
{
GuiTextField guitextfield = (GuiTextField)this.focusedGui;
int j;
//Check if aren't we are pasting text
if (!GuiScreen.isKeyComboCtrlV(keyCode))
{
if (keyCode == 15) //Tab is pressed
{
guitextfield.setFocused(false);
int focusedGuiIndex = this.allTextFieldGuis.indexOf(this.focusedGui);
if (GuiScreen.isShiftKeyDown())
{
if (focusedGuiIndex == 0) //Jump back to the end of the list when at the start
{
focusedGuiIndex = this.allTextFieldGuis.size() - 1;
}
else
{
--focusedGuiIndex; //Cycle backwards through the text fields
}
}
else if (focusedGuiIndex == this.allTextFieldGuis.size() - 1) //Jump back to the start of the list when at the end
{
focusedGuiIndex = 0;
}
else
{
++focusedGuiIndex; //Cycle forwards through the text fields
}
this.focusedGui = (Gui)this.allTextFieldGuis.get(focusedGuiIndex);
guitextfield = (GuiTextField)this.focusedGui;
guitextfield.setFocused(true);
int k1 = guitextfield.yPosition + this.slotHeight;
j = guitextfield.yPosition;
if (k1 > this.bottom)
{
this.amountScrolled += (float)(k1 - this.bottom);
}
else if (j < this.top)
{
this.amountScrolled = (float)j;
}
}
else
{
guitextfield.textboxKeyTyped(typedChar, keyCode);
}
}
else
{
String s = GuiScreen.getClipboardString();
String[] astring = s.split(";");
j = this.allTextFieldGuis.indexOf(this.focusedGui);
int k = j;
String[] astring1 = astring;
int l = astring.length;
for (int i1 = 0; i1 < l; ++i1)
{
String s1 = astring1[i1];
((GuiTextField)this.allTextFieldGuis.get(k)).setText(s1);
if (k == this.allTextFieldGuis.size() - 1)
{
k = 0;
}
else
{
++k;
}
if (k == j)
{
break;
}
}
}
}
}
public GuiBOPPageList.GuiRowEntry getRow(int rowNum)
{
return (GuiBOPPageList.GuiRowEntry)this.allRows.get(rowNum);
}
@Override
public int getSize()
{
return this.allRows.size();
}
@Override
public int getListWidth()
{
return 400;
}
@Override
protected int getScrollBarX()
{
return super.getScrollBarX() + 32;
}
@Override
public GuiListExtended.IGuiListEntry getListEntry(int rowNum)
{
return this.getRow(rowNum);
}
@Override
public void mouseClicked(int mouseX, int mouseY, int mouseButton)
{
super.mouseClicked(mouseX, mouseY, Mouse.getEventButton());
int l = this.getSlotIndexFromScreenCoords(mouseX, mouseY);
if (l >= 0)
{
GuiBOPPageTable.GuiRowEntry row = this.getRow(l);
if (this.focusedGui != row.focusedGui && this.focusedGui != null && this.focusedGui instanceof GuiTextField)
{
((GuiTextField)this.focusedGui).setFocused(false);
}
this.focusedGui = row.focusedGui;
}
}
}

View File

@ -0,0 +1,54 @@
package biomesoplenty.client.gui;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.resources.I18n;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
@SideOnly(Side.CLIENT)
public class GuiEnumButton<T extends Enum> extends GuiButton
{
private T value;
private String localizationStr;
private final GuiBOPPageList.GuiResponder guiResponder;
public GuiEnumButton(GuiBOPPageList.GuiResponder responder, int fieldId, int x, int y, String localizationStr, T initialValue)
{
super(fieldId, x, y, 150, 20, "");
this.localizationStr = localizationStr;
this.value = initialValue;
this.displayString = this.buildDisplayString();
this.guiResponder = responder;
}
private String buildDisplayString()
{
return I18n.format(this.localizationStr, new Object[] {this.value.toString()});
}
public void setValue(T value)
{
this.value = value;
this.displayString = this.buildDisplayString();
this.guiResponder.handleEnumSelection(this.id, value.ordinal());
}
@Override
public boolean mousePressed(Minecraft mc, int mouseX, int mouseY)
{
if (super.mousePressed(mc, mouseX, mouseY))
{
Object[] values = this.value.getClass().getEnumConstants();
int len = values.length;
this.value = (T)(values[(this.value.ordinal() + 1) % len]);
this.displayString = this.buildDisplayString();
this.guiResponder.handleEnumSelection(this.id, this.value.ordinal());
return true;
}
else
{
return false;
}
}
}

View File

@ -1,54 +0,0 @@
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)
{
// Skip screens that don't use a TranslationTextComponent because definitely they're not ours
if (!(screen.description instanceof TranslationTextComponent))
continue;
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!");
}
}

View File

@ -0,0 +1,54 @@
/*******************************************************************************
* Copyright 2014-2015, 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.client.handler;
import java.util.ArrayList;
import java.util.List;
import biomesoplenty.client.model.ModelBiomeFinder;
import biomesoplenty.client.texture.TextureAnimationFrame;
import biomesoplenty.client.util.TextureUtils;
import net.minecraft.client.renderer.texture.TextureMap;
import net.minecraft.client.resources.model.IBakedModel;
import net.minecraft.client.resources.model.ModelResourceLocation;
import net.minecraft.util.IRegistry;
import net.minecraftforge.client.event.ModelBakeEvent;
import net.minecraftforge.client.event.TextureStitchEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
public class ModelBakeHandler
{
public static final ModelResourceLocation BIOME_FINDER = new ModelResourceLocation("biomesoplenty:biome_finder", "inventory");
public static List<String> fluidsToTextureStitch = new ArrayList<String>();
private TextureAnimationFrame[] biomeFinderFrames;
@SubscribeEvent
public void onTextureStitch(TextureStitchEvent.Pre event)
{
TextureMap map = event.map;
biomeFinderFrames = TextureUtils.splitAnimatedTexture(map, "biomesoplenty:items/biome_finder", 12);
}
@SubscribeEvent
public void onTextureStitch(TextureStitchEvent.Post event)
{
TextureMap map = event.map;
}
@SubscribeEvent
public void onModelBake(ModelBakeEvent event)
{
IRegistry modelRegistry = event.modelRegistry;
IBakedModel biomeFinderModel = (IBakedModel)modelRegistry.getObject(BIOME_FINDER);
modelRegistry.putObject(BIOME_FINDER, new ModelBiomeFinder(biomeFinderModel, biomeFinderFrames));
}
}

View File

@ -0,0 +1,91 @@
/*******************************************************************************
* Copyright 2014-2015, 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.client.model;
import biomesoplenty.client.util.ModelUtils;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.EntityPlayerSP;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.client.resources.model.IBakedModel;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.client.model.IFlexibleBakedModel;
import net.minecraftforge.client.model.ISmartItemModel;
public class ModelBiomeFinder extends IFlexibleBakedModel.Wrapper implements ISmartItemModel
{
private IBakedModel[] frames;
private IBakedModel defaultModel;
public ModelBiomeFinder(IBakedModel defaultModel, TextureAtlasSprite[] frameTextures)
{
super(defaultModel, DefaultVertexFormats.ITEM);
this.defaultModel = defaultModel;
this.frames = ModelUtils.generateModelsForTextures(defaultModel, frameTextures);
}
@Override
public TextureAtlasSprite getTexture()
{
return null;
}
@Override
public IBakedModel handleItemState(ItemStack stack)
{
EntityPlayerSP player = Minecraft.getMinecraft().thePlayer;
if (player == null) {return this.defaultModel;}
NBTTagCompound nbt = stack.getTagCompound();
if (nbt != null && nbt.hasKey("biomeIDToFind"))
{
if (nbt.hasKey("searchStarted"))
{
// searching for biome, but not yet found indicate searching by flashing
return this.getFlashingFrame(player);
}
else if (nbt.getBoolean("found"))
{
// if the biome has been found, point at it
int posX = nbt.getInteger("posX");
int posZ = nbt.getInteger("posZ");
return getFrameForPositionRelativeToPlayer(player, posX, posZ);
}
else
{
// the search has not yet been started, show all sectors lit
return this.frames[9];
}
}
else
{
// if we've got here, the biome finder has not been bound to a biome yet - show no sectors lit
return this.frames[8];
}
}
public IBakedModel getFlashingFrame(EntityPlayerSP player)
{
return (player.getRNG().nextInt(2) == 0 ? this.frames[10] : this.frames[11]);
}
public IBakedModel getFrameForPositionRelativeToPlayer(EntityPlayer player, int biomePosX, int biomePosZ)
{
double xDiff = (double)biomePosX - player.posX;
double zDiff = (double)biomePosZ - player.posZ;
// angle (in degrees) of direction from player to biome (relative to player rotation)
double angleDiff = (Math.atan2(zDiff, xDiff) * 180.0D / Math.PI) + 270.0D - player.rotationYaw;
// there are 8 sectors on the biome finder, so 45 degrees each (offset by 22.5 to center the angle in the middle of the sector)
int sector = (int)Math.floor((angleDiff + 22.5D) / 45.0D);
return this.frames[((sector % 8) + 8) % 8];
}
}

View File

@ -0,0 +1,109 @@
/*******************************************************************************
* Copyright 2014, 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.client.particle;
import org.lwjgl.opengl.GL11;
import biomesoplenty.core.ClientProxy;
import net.minecraft.client.particle.EntityFX;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.WorldRenderer;
import net.minecraft.entity.Entity;
import net.minecraft.world.World;
import net.minecraftforge.fml.client.FMLClientHandler;
public class EntityDandelionFX extends EntityFX
{
public EntityDandelionFX(World world, double xCoordIn, double yCoordIn, double zCoordIn, float par14)
{
this(world, xCoordIn, yCoordIn, zCoordIn, 0.0D, 0.0D, 0.0D, par14);
}
public EntityDandelionFX(World world, double xCoordIn, double yCoordIn, double zCoordIn, double xSpeedIn, double ySpeedIn, double zSpeedIn, float par14)
{
super(world, xCoordIn, yCoordIn, zCoordIn, xSpeedIn, ySpeedIn, zSpeedIn);
// dandelion texture is at position 0,0
this.particleTextureIndexX = 0;
this.particleTextureIndexY = 0;
this.motionX *= 0.20000000149011612D;
this.motionY *= 0.10000000149011612D;
this.motionZ *= 0.20000000149011612D;
this.particleScale *= 0.25F;
this.particleScale *= par14;
this.particleMaxAge = (int)(8.0D / (Math.random() * 0.8D + 0.2D));
this.particleMaxAge = (int)((float)this.particleMaxAge * par14);
this.setAlphaF(1.0F);
this.noClip = false;
this.setSize(0.01F, 0.01F);
}
@Override
public int getFXLayer()
{
return 2;
}
@Override
public void renderParticle(WorldRenderer renderer, Entity entity, float partialTicks, float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY)
{
// EffectRenderer will by default bind the vanilla particles texture, override with our own
FMLClientHandler.instance().getClient().renderEngine.bindTexture(ClientProxy.particleTexturesLocation);
GlStateManager.depthMask(false);
// TODO what's this?
GL11.glEnable(3042);
GlStateManager.enableBlend();
GlStateManager.blendFunc(770, 1);
super.renderParticle(renderer, entity, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY);
GL11.glDisable(3042);
GlStateManager.disableBlend();
GlStateManager.depthMask(true);
}
@Override
public void onUpdate()
{
prevPosX = posX;
prevPosY = posY;
prevPosZ = posZ;
if (particleAge++ >= particleMaxAge)
{
this.setDead();
}
motionY += 0.004D;
this.moveEntity(motionX, motionY, motionZ);
if (posY == prevPosY)
{
motionX *= 1.1D;
motionZ *= 1.1D;
}
motionX *= 0.9599999785423279D;
motionY *= 0.9599999785423279D;
motionZ *= 0.9599999785423279D;
if (onGround)
{
motionX *= 0.699999988079071D;
motionZ *= 0.699999988079071D;
}
}
}

View File

@ -0,0 +1,112 @@
/*******************************************************************************
* Copyright 2014, 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.client.particle;
import biomesoplenty.core.ClientProxy;
import net.minecraft.client.particle.EntityFX;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.WorldRenderer;
import net.minecraft.entity.Entity;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;
import net.minecraftforge.fml.client.FMLClientHandler;
public class EntityPixieTrailFX extends EntityFX
{
public EntityPixieTrailFX(World world, double xCoordIn, double yCoordIn, double zCoordIn, double xSpeedIn, double ySpeedIn, double zSpeedIn)
{
this(world, xCoordIn, yCoordIn, zCoordIn, xSpeedIn, ySpeedIn, zSpeedIn, 1.0F);
}
public EntityPixieTrailFX(World world, double xCoordIn, double yCoordIn, double zCoordIn, double xSpeedIn, double ySpeedIn, double zSpeedIn, float par14)
{
super(world, xCoordIn, yCoordIn, zCoordIn, 0.0D, 0.0D, 0.0D);
// pixie trail texture is row from position 0,1 to position 8,1
this.particleTextureIndexX = 7;
this.particleTextureIndexY = 1;
this.motionX *= 0.10000000149011612D;
this.motionY *= 0.10000000149011612D;
this.motionZ *= 0.10000000149011612D;
this.motionX += xSpeedIn;
this.motionY += ySpeedIn;
this.motionZ += zSpeedIn;
this.particleScale *= 0.75F;
this.particleScale *= par14;
this.particleMaxAge = (int)((8.0D / (Math.random() * 0.8D + 0.2D)) * 8);
this.particleMaxAge = (int)((float)this.particleMaxAge * par14);
this.particleAge = (particleMaxAge / 2) + (int)((particleMaxAge / 2) * world.rand.nextInt(7));
this.particleAlpha = 1.0F;
this.noClip = false;
}
@Override
public int getFXLayer()
{
return 2;
}
@Override
public void renderParticle(WorldRenderer renderer, Entity entity, float partialTicks, float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY)
{
// EffectRenderer will by default bind the vanilla particles texture, override with our own
FMLClientHandler.instance().getClient().renderEngine.bindTexture(ClientProxy.particleTexturesLocation);
float scaleMultiplier = ((float)this.particleAge + partialTicks) / (float)this.particleMaxAge * 32.0F;
scaleMultiplier = MathHelper.clamp_float(scaleMultiplier, 0.0F, 1.0F);
this.particleScale = this.particleScale * scaleMultiplier;
GlStateManager.depthMask(false);
GlStateManager.enableBlend();
GlStateManager.blendFunc(770, 1);
super.renderParticle(renderer, entity, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY);
GlStateManager.disableBlend();
GlStateManager.depthMask(true);
}
@Override
public void onUpdate()
{
prevPosX = posX;
prevPosY = posY;
prevPosZ = posZ;
if (particleAge++ >= particleMaxAge)
{
this.setDead();
}
this.particleTextureIndexX = 7 - particleAge * 8 / particleMaxAge;
this.moveEntity(motionX, motionY, motionZ);
if (posY == prevPosY)
{
motionX *= 1.1D;
motionZ *= 1.1D;
}
motionX *= 0.9599999785423279D;
motionY *= 0.9599999785423279D;
motionZ *= 0.9599999785423279D;
if (onGround)
{
motionX *= 0.699999988079071D;
motionZ *= 0.699999988079071D;
}
}
}

View File

@ -0,0 +1,77 @@
/*******************************************************************************
* Copyright 2014, 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.client.particle;
import net.minecraft.client.particle.EntityFX;
import net.minecraft.client.renderer.WorldRenderer;
import net.minecraft.entity.Entity;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import net.minecraftforge.fml.client.FMLClientHandler;
public class EntityTrailFX extends EntityFX
{
private ResourceLocation trailResource;
/**The index of the flower to be spawned, values are 0-3*/
private int particleIndex;
private double startY;
public EntityTrailFX(World world, double x, double y, double z, String trailName)
{
super(world, x, y, z);
this.trailResource = new ResourceLocation("biomesoplenty:textures/particles/" + trailName + ".png");
this.motionX = this.motionY = this.motionZ = 0.0D; //Trail particles should not move
this.particleMaxAge = 550;
this.particleIndex = this.rand.nextInt(4); //Choose a random index on creation
this.startY = y; //Where y coordinate where this particle has started (before it moves downwards with time)
}
@Override
public void renderParticle(WorldRenderer renderer, Entity entity, float partialTicks, float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY)
{
// EffectRenderer will by default bind the vanilla particles texture, override with our own
FMLClientHandler.instance().getClient().renderEngine.bindTexture(this.trailResource);
//The overall maxU and maxV of the particle sheet is 1.0 (representing 16px)
float minU = (particleIndex % 2) * 0.5F; //Particles on the left side are 0, right are 0.5
float maxU = minU + 0.5F; //Each flower is 8px wide (half of the overall sheet)
float minV = (particleIndex / 2) * 0.5F; //Uses integer rounding errors (0 and 1 = 0, 2 and 3 = 1)
float maxV = minV + 0.5F; //Each flower is 8px high (half of the overall sheet)
//Vanilla particle rendering
float alpha = 1.0F - Math.min(1.0F, 2.0F * this.particleAge / this.particleMaxAge);
float width = 0.15F;
float x = (float)(prevPosX + (posX - prevPosX) - interpPosX);
float y = (float)(prevPosY + (posY - prevPosY) - interpPosY);
float z = (float)(prevPosZ + (posZ - prevPosZ) - interpPosZ);
renderer.setColorRGBA_F(this.particleRed, this.particleGreen, this.particleBlue, alpha);
renderer.addVertexWithUV(x - width, y, z + width, minU, maxV);
renderer.addVertexWithUV(x + width, y, z + width, minU, minV);
renderer.addVertexWithUV(x + width, y, z - width, maxU, minV);
renderer.addVertexWithUV(x - width, y, z - width, maxU, maxV);
}
@Override
public int getFXLayer()
{
return 2;
}
@Override
public void onUpdate()
{
super.onUpdate();
this.posY = this.startY - 0.01 * ((float)this.particleAge / (float)this.particleMaxAge);
this.prevPosY = this.posY;
}
}

View File

@ -1,78 +0,0 @@
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<BoatEntityBOP> {
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")
};
}

View File

@ -0,0 +1,88 @@
/*******************************************************************************
* Copyright 2014-2015, 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.client.texture;
import java.awt.image.BufferedImage;
import java.io.IOException;
import biomesoplenty.client.util.TextureUtils;
import biomesoplenty.core.BiomesOPlenty;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.renderer.texture.TextureUtil;
import net.minecraft.client.resources.IResource;
import net.minecraft.client.resources.IResourceManager;
import net.minecraft.client.resources.data.AnimationMetadataSection;
import net.minecraft.util.ResourceLocation;
public class TextureAnimationFrame extends TextureAtlasSprite
{
private String animationName;
private int frame;
public TextureAnimationFrame(String iconName, String animationName, int frame)
{
super(iconName);
this.animationName = animationName;
this.frame = frame;
}
//TODO: This still currently classifies as an animation, it should be turned into a proper static texture
@Override
public void updateAnimation() {}
@Override
public int[][] getFrameTextureData(int index)
{
return super.getFrameTextureData(this.frame);
}
@Override
public boolean hasCustomLoader(IResourceManager manager, net.minecraft.util.ResourceLocation location)
{
return true;
}
@Override
public boolean load(IResourceManager manager, ResourceLocation location)
{
location = new ResourceLocation(animationName);
ResourceLocation fullLocation = TextureUtils.completeResourceLocation(location, 0);
int mipmapLevels = Minecraft.getMinecraft().gameSettings.mipmapLevels;
try
{
IResource iresource = manager.getResource(fullLocation);
BufferedImage[] image = new BufferedImage[1 + mipmapLevels];
AnimationMetadataSection animation = (AnimationMetadataSection) iresource.getMetadata("animation");
if (animation != null)
{
image[0] = TextureUtil.readBufferedImage(iresource.getInputStream());
int cachedFrameCount = this.frameCounter;
this.loadSprite(image, animation);
this.frameCounter = cachedFrameCount;
}
else
{
BiomesOPlenty.logger.error("Resource " + location + " isn't animated");
return true;
}
}
catch (IOException e)
{
e.printStackTrace();
return true;
}
return false;
}
}

View File

@ -0,0 +1,50 @@
/*******************************************************************************
* Copyright 2014-2015, 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.client.util;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.resources.model.IBakedModel;
import net.minecraft.client.resources.model.SimpleBakedModel;
import net.minecraft.util.EnumFacing;
import com.google.common.collect.Lists;
public class ModelUtils
{
public static IBakedModel[] generateModelsForTextures(IBakedModel model, TextureAtlasSprite[] textures)
{
IBakedModel[] output = new IBakedModel[textures.length];
for (int i = 0; i < output.length; i++)
{
TextureAtlasSprite texture = textures[i];
SimpleBakedModel.Builder builder = new SimpleBakedModel.Builder(model, texture);
builder.setTexture(texture);
output[i] = builder.makeBakedModel();
}
return output;
}
public static List createFaceLists()
{
List list = new ArrayList(EnumFacing.values().length);
for (int i = 0; i < EnumFacing.values().length; i++)
{
list.add(i, Lists.newLinkedList());
}
return list;
}
}

View File

@ -0,0 +1,44 @@
/*******************************************************************************
* Copyright 2014-2015, 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.client.util;
import biomesoplenty.client.texture.TextureAnimationFrame;
import net.minecraft.client.renderer.texture.TextureMap;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
public class TextureUtils
{
public static final String TEXTURES_BASE_PATH = "textures";
//TODO: Remove frameCount argument
@SideOnly(Side.CLIENT)
public static TextureAnimationFrame[] splitAnimatedTexture(TextureMap textureMap, String iconName, int frameCount)
{
TextureAnimationFrame[] output = new TextureAnimationFrame[frameCount];
for (int i = 0; i < frameCount; i++)
{
String textureLocation = iconName + "_static_" + i;
TextureAnimationFrame frameTexture = new TextureAnimationFrame(textureLocation, iconName, i);
output[i] = frameTexture;
textureMap.setTextureEntry(textureLocation, frameTexture);
}
return output;
}
public static ResourceLocation completeResourceLocation(ResourceLocation location, int mode)
{
return mode == 0 ? new ResourceLocation(location.getResourceDomain(), String.format("%s/%s%s", new Object[] {TEXTURES_BASE_PATH, location.getResourcePath(), ".png"})) : new ResourceLocation(location.getResourceDomain(), String.format("%s/mipmaps/%s.%d%s", new Object[] {TEXTURES_BASE_PATH, location.getResourcePath(), Integer.valueOf(mode), ".png"}));
}
}

View File

@ -0,0 +1,49 @@
/*******************************************************************************
* Copyright 2014, 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.asm;
import java.util.Map;
import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin;
import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin.TransformerExclusions;
import biomesoplenty.common.asm.transformers.BOPAccessTransformer;
@TransformerExclusions("biomesoplenty.common.asm")
public class BOPLoadingPlugin implements IFMLLoadingPlugin
{
@Override
public String[] getASMTransformerClass()
{
return null;
}
@Override
public String getModContainerClass()
{
return null;
}
@Override
public String getSetupClass()
{
return null;
}
@Override
public void injectData(Map<String, Object> data)
{
}
@Override
public String getAccessTransformerClass()
{
return BOPAccessTransformer.class.getName();
}
}

View File

@ -0,0 +1,21 @@
/*******************************************************************************
* Copyright 2014, 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.asm.transformers;
import java.io.IOException;
import net.minecraftforge.fml.common.asm.transformers.AccessTransformer;
public class BOPAccessTransformer extends AccessTransformer
{
public BOPAccessTransformer() throws IOException
{
super("biomesoplenty_at.cfg");
}
}

View File

@ -1,64 +0,0 @@
/*******************************************************************************
* 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<String, WeightedBiomeEntry> standardBiomeWeights = Maps.newTreeMap();
@SerializedName("technical_biome_toggles")
public TreeMap<String, ToggleableBiomeEntry> technicalBiomeEntries = Maps.newTreeMap();
@SerializedName("sub_biome_weights")
public TreeMap<String, SubBiomeEntry> subBiomeEntries = Maps.newTreeMap();
@SerializedName("island_biome_toggles")
public TreeMap<String, ToggleableBiomeEntry> islandBiomeEntries = Maps.newTreeMap();
@SerializedName("vanilla_biome_weights")
public TreeMap<String, WeightedBiomeEntry> 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;
}
}
}

View File

@ -1,90 +0,0 @@
/*******************************************************************************
* 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<BOPClimates, Integer> weightMap;
@Nullable
private final RegistryKey<Biome> beachBiome;
@Nullable
private final RegistryKey<Biome> riverBiome;
@Nullable
private final BiFunction<Double, Double, Integer> foliageColorFunction;
@Nullable
private final BiFunction<Double, Double, Integer> grassColorFunction;
@Nullable
private final BiFunction<Double, Double, Integer> waterColorFunction;
protected BiomeMetadata(Map<BOPClimates, Integer> weights, @Nullable RegistryKey<Biome> beachBiome, @Nullable RegistryKey<Biome> riverBiome, BiFunction<Double, Double, Integer> foliageColorFunction, BiFunction<Double, Double, Integer> grassColorFunction, BiFunction<Double, Double, Integer> waterColorFunction)
{
this.weightMap = ImmutableMap.copyOf(weights);
this.beachBiome = beachBiome;
this.riverBiome = riverBiome;
this.foliageColorFunction = foliageColorFunction;
this.grassColorFunction = grassColorFunction;
this.waterColorFunction = waterColorFunction;
}
public Map<BOPClimates, Integer> getWeightMap()
{
return this.weightMap;
}
@Nullable
public RegistryKey<Biome> getBeachBiome()
{
return this.beachBiome;
}
@Nullable
public RegistryKey<Biome> getRiverBiome()
{
return this.riverBiome;
}
@Nullable
public BiFunction<Double, Double, Integer> getFoliageColorFunction()
{
return this.foliageColorFunction;
}
@Nullable
public BiFunction<Double, Double, Integer> getGrassColorFunction()
{
return this.grassColorFunction;
}
@Nullable
public BiFunction<Double, Double, Integer> getWaterColorFunction()
{
return this.waterColorFunction;
}
public boolean hasWeights()
{
return !this.weightMap.isEmpty() && !this.weightMap.entrySet().stream().allMatch((entry) -> entry.getValue().equals(0));
}
}

View File

@ -1,680 +0,0 @@
/*******************************************************************************
* 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<RegistrationType, List<DeferredRegistration>> 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<Biome> parent, RegistryKey<Biome> 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<Biome> key, BOPClimates climate, int weight)
{
if (!BiomeUtil.exists(key))
return;
defer(RegistrationType.ISLAND_BIOME, new SingleClimateRegistrationData(key, climate, weight));
}
public static void deferVanillaBiomeRegistration(RegistryKey<Biome> key, BOPClimates climate, int weight)
{
if (!BiomeUtil.exists(key))
return;
defer(RegistrationType.VANILLA_BIOME, new SingleClimateRegistrationData(key, climate, weight));
}
public static void configureStandardBiomes()
{
List<DeferredRegistration> standardRegistrations = deferrances.get(RegistrationType.STANDARD_BIOME);
TreeMap<String, BiomeConfigData.WeightedBiomeEntry> defaultEntries = Maps.newTreeMap();
Map<String, StandardBiomeRegistrationData> regDataMap = Maps.newHashMap();
for (DeferredRegistration<StandardBiomeRegistrationData> 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<BOPClimates, Integer> 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<String, BiomeConfigData.WeightedBiomeEntry> revisedStandardBiomeWeights = Maps.newTreeMap(defaultEntries);
// Merge the config file with the default values
for (Map.Entry<String, BiomeConfigData.WeightedBiomeEntry> 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<String, BiomeConfigData.WeightedBiomeEntry> 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<DeferredRegistration> biomeRegistrations = deferrances.get(RegistrationType.TECHNICAL_BIOME);
TreeMap<String, BiomeConfigData.ToggleableBiomeEntry> defaultBiomeEntries = Maps.newTreeMap();
for (DeferredRegistration<ToggleableStandardBiomeRegistrationData> 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<String, BiomeConfigData.ToggleableBiomeEntry> revisedBiomeEntries = Maps.newTreeMap(defaultBiomeEntries);
// Merge the config file with the default values
for (Map.Entry<String, BiomeConfigData.ToggleableBiomeEntry> 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<ToggleableStandardBiomeRegistrationData> 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<DeferredRegistration> subBiomeRegistrations = deferrances.get(RegistrationType.SUB_BIOME);
TreeMap<String, BiomeConfigData.SubBiomeEntry> defaultSubBiomeEntries = Maps.newTreeMap();
Map<String, SubBiomeRegistrationData> regDataMap = Maps.newHashMap();
for (DeferredRegistration<SubBiomeRegistrationData> 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<String, BiomeConfigData.SubBiomeEntry> revisedSubBiomeEntries = Maps.newTreeMap(defaultSubBiomeEntries);
// Merge the config file with the default values
for (Map.Entry<String, BiomeConfigData.SubBiomeEntry> 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<String, BiomeConfigData.SubBiomeEntry> 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<DeferredRegistration> biomeRegistrations = deferrances.get(RegistrationType.ISLAND_BIOME);
TreeMap<String, BiomeConfigData.ToggleableBiomeEntry> defaultBiomeEntries = Maps.newTreeMap();
for (DeferredRegistration<SingleClimateRegistrationData> 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<String, BiomeConfigData.ToggleableBiomeEntry> revisedBiomeEntries = Maps.newTreeMap(defaultBiomeEntries);
// Merge the config file with the default values
for (Map.Entry<String, BiomeConfigData.ToggleableBiomeEntry> 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<SingleClimateRegistrationData> 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<DeferredRegistration> biomeRegistrations = deferrances.get(RegistrationType.VANILLA_BIOME);
TreeMap<String, BiomeConfigData.WeightedBiomeEntry> defaultBiomeEntries = Maps.newTreeMap();
Map<String, SingleClimateRegistrationData> regDataMap = Maps.newHashMap();
for (DeferredRegistration<SingleClimateRegistrationData> 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<String, BiomeConfigData.WeightedBiomeEntry> revisedBiomeEntries = Maps.newTreeMap(defaultBiomeEntries);
// Merge the config file with the default values
for (Map.Entry<String, BiomeConfigData.WeightedBiomeEntry> 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<String, BiomeConfigData.WeightedBiomeEntry> 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<BiomeConfigData>(){}.getType());
return configData;
}
private static <T extends IRegistrationData> void defer(RegistrationType type, T data)
{
if (!deferrances.containsKey(type))
deferrances.put(type, Lists.newArrayList());
List<DeferredRegistration> 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<RegistryKey<Biome>> children = Sets.newHashSet();
deferrances.get(RegistrationType.SUB_BIOME).forEach((reg) -> {
RegistryKey<Biome> 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<BOPClimates, Integer> 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<BOPClimates, Integer> 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<BOPClimates, Integer> 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<BOPClimates, Integer> getPrimaryWeight()
{
List<Pair<BOPClimates, Integer>> 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<Biome> parent;
private final RegistryKey<Biome> child;
private int weight;
private float rarity;
public SubBiomeRegistrationData(RegistryKey<Biome> parent, RegistryKey<Biome> child, int weight, float rarity)
{
this.parent = parent;
this.child = child;
this.weight = weight;
this.rarity = rarity;
}
public RegistryKey<Biome> getParent()
{
return this.parent;
}
public RegistryKey<Biome> 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> biome;
private int weight;
public SingleClimateRegistrationData(RegistryKey<Biome> biome, BOPClimates climate, int weight)
{
this.biome = biome;
this.climate = climate;
this.weight = weight;
}
public RegistryKey<Biome> 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<T extends IRegistrationData>
{
private final Consumer<T> regFunc;
private final T regData;
public DeferredRegistration(Consumer<T> regFunc, T regData)
{
this.regFunc = regFunc;
this.regData = regData;
}
public void register()
{
this.regFunc.accept(this.regData);
}
}
}

View File

@ -1,101 +0,0 @@
/*******************************************************************************
* 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<BOPClimates, Integer> weightMap = new HashMap<BOPClimates, Integer>();
private RegistryKey<Biome> beachBiome = Biomes.BEACH;
private RegistryKey<Biome> riverBiome = Biomes.RIVER;
private BiFunction<Double, Double, Integer> foliageColorFunction;
private BiFunction<Double, Double, Integer> grassColorFunction;
private BiFunction<Double, Double, Integer> 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> biome)
{
this.beachBiome = biome;
}
public void setRiverBiome(RegistryKey<Biome> biome)
{
this.riverBiome = biome;
}
public void setFoliageColorFunction(BiFunction<Double, Double, Integer> func)
{
this.foliageColorFunction = func;
}
public void setGrassColorFunction(BiFunction<Double, Double, Integer> func)
{
this.grassColorFunction = func;
}
public void setWaterColorFunction(BiFunction<Double, Double, Integer> 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);
}
}

View File

@ -0,0 +1,97 @@
/*******************************************************************************
* Copyright 2015, 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 java.util.HashMap;
import java.util.Map;
import net.minecraft.world.biome.BiomeGenBase;
import biomesoplenty.api.biome.BiomeOwner;
import biomesoplenty.api.biome.IExtendedBiome;
import biomesoplenty.api.biome.generation.GenerationManager;
import biomesoplenty.api.biome.generation.GeneratorStage;
import biomesoplenty.api.biome.generation.IGenerator;
import biomesoplenty.common.enums.BOPClimates;
public class ExtendedBiomeRegistry
{
private static Map<BiomeGenBase, BiomeExtension> externalExtensions = new HashMap();
public static boolean isRegistered(BiomeGenBase biome)
{
return biome.biomeID != -1;
}
public static BiomeExtension createExtension(BiomeGenBase biome)
{
return externalExtensions.put(biome, new BiomeExtension(biome));
}
public static IExtendedBiome getExtension(BiomeGenBase biome)
{
if (biome instanceof IExtendedBiome)
{
return (IExtendedBiome)biome;
}
else if (externalExtensions.containsKey(biome))
{
return externalExtensions.get(biome);
}
return null;
}
public static class BiomeExtension implements IExtendedBiome
{
public final BiomeGenBase biome;
private GenerationManager generationManager = new GenerationManager();
private Map<BOPClimates, Integer> weightMap = new HashMap<BOPClimates, Integer>();
private BiomeExtension(BiomeGenBase biome)
{
this.biome = biome;
}
@Override
public BiomeOwner getBiomeOwner()
{
return BiomeOwner.OTHER;
}
@Override
public void addGenerator(String name, GeneratorStage stage, IGenerator generator)
{
this.generationManager.addGenerator(name, stage, generator);
}
@Override
public GenerationManager getGenerationManager()
{
return this.generationManager;
}
@Override
public Map<BOPClimates, Integer> getWeightMap()
{
return this.weightMap;
}
@Override
public void addWeight(BOPClimates climate, int weight)
{
this.weightMap.put(climate, weight);
}
@Override
public void clearWeights()
{
this.weightMap.clear();
}
}
}

View File

@ -1,18 +0,0 @@
/*******************************************************************************
* 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
}
}

View File

@ -1,69 +0,0 @@
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));
}
}

View File

@ -1,77 +0,0 @@
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));
}
}

View File

@ -1,65 +0,0 @@
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));
}
}

View File

@ -1,57 +0,0 @@
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));
}
}

View File

@ -1,71 +0,0 @@
/*******************************************************************************
* 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));
}
}

View File

@ -1,83 +0,0 @@
/*******************************************************************************
* 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));
}
}

View File

@ -1,95 +0,0 @@
/*******************************************************************************
* 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));
}
}

View File

@ -1,96 +0,0 @@
/*******************************************************************************
* 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));
}
}

View File

@ -1,86 +0,0 @@
/*******************************************************************************
* 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));
}
}

View File

@ -0,0 +1,48 @@
/*******************************************************************************
* Copyright 2015, 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 net.minecraft.init.Blocks;
import biomesoplenty.api.biome.BOPBiome;
import biomesoplenty.api.biome.generation.GeneratorStage;
import biomesoplenty.common.enums.BOPClimates;
import biomesoplenty.common.world.BOPWorldSettings;
import biomesoplenty.common.world.feature.GeneratorOreSingle;
public class BiomeGenAlps extends BOPBiome
{
private static final Height biomeHeight = new Height(8.0F, 0.025F);
public BiomeGenAlps()
{
// terrain
this.terrainSettings.avgHeight(198).heightVariation(12, 12).octaves(1, 1, 2, 2, 3, 3);
this.setHeight(biomeHeight);
this.setColor(13421772);
this.setEnableSnow();
this.setTemperatureRainfall(0.0F, 0.5F);
this.addWeight(BOPClimates.BOREAL, 5);
this.addWeight(BOPClimates.COLD_DESERT, 5);
this.topBlock = Blocks.snow.getDefaultState();
this.fillerBlock = Blocks.snow.getDefaultState();
// gem
this.addGenerator("emeralds", GeneratorStage.SAND, (new GeneratorOreSingle.Builder()).amountPerChunk(12).with(Blocks.emerald_ore.getDefaultState()).create());
}
@Override
public void applySettings(BOPWorldSettings settings)
{
if (!settings.generateBopGems) {this.removeGenerator("emeralds");}
}
}

View File

@ -0,0 +1,55 @@
/*******************************************************************************
* Copyright 2015, 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 net.minecraft.util.BlockPos;
import biomesoplenty.api.biome.BOPBiome;
import biomesoplenty.api.biome.generation.GeneratorStage;
import biomesoplenty.common.enums.BOPClimates;
import biomesoplenty.common.enums.BOPGems;
import biomesoplenty.common.world.BOPWorldSettings;
import biomesoplenty.common.world.feature.GeneratorOreSingle;
public class BiomeGenArctic extends BOPBiome
{
public BiomeGenArctic()
{
// terrain
this.terrainSettings.avgHeight(64).heightVariation(10, 6);
this.setColor(14540253);
this.setEnableSnow();
this.setTemperatureRainfall(0.05F, 0.5F);
this.addWeight(BOPClimates.ICE_CAP, 30);
this.spawnableCreatureList.clear();
// gem
this.addGenerator("tanzanite", GeneratorStage.SAND, (new GeneratorOreSingle.Builder()).amountPerChunk(12).with(BOPGems.TANZANITE).create());
}
@Override
public void applySettings(BOPWorldSettings settings)
{
if (!settings.generateBopGems) {this.removeGenerator("tanzanite");}
}
@Override
public int getGrassColorAtPos(BlockPos pos)
{
return 11176526;
}
@Override
public int getFoliageColorAtPos(BlockPos pos)
{
return 11903827;
}
}

View File

@ -0,0 +1,141 @@
/*******************************************************************************
* Copyright 2015, 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 java.util.Random;
import net.minecraft.block.BlockDirt;
import net.minecraft.block.BlockDoublePlant;
import net.minecraft.block.BlockTallGrass;
import net.minecraft.block.state.IBlockState;
import net.minecraft.init.Blocks;
import net.minecraft.util.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.chunk.ChunkPrimer;
import biomesoplenty.api.biome.BOPBiome;
import biomesoplenty.api.biome.generation.GeneratorStage;
import biomesoplenty.api.biome.generation.GeneratorWeighted;
import biomesoplenty.api.block.BOPBlocks;
import biomesoplenty.api.block.BlockQueries;
import biomesoplenty.common.block.BlockBOPPlant;
import biomesoplenty.common.block.BlockBOPCoral;
import biomesoplenty.common.enums.BOPClimates;
import biomesoplenty.common.enums.BOPGems;
import biomesoplenty.common.enums.BOPPlants;
import biomesoplenty.common.enums.BOPTrees;
import biomesoplenty.common.util.biome.GeneratorUtils.ScatterYMethod;
import biomesoplenty.common.util.config.BOPConfig.IConfigObj;
import biomesoplenty.common.world.BOPWorldSettings;
import biomesoplenty.common.world.feature.GeneratorColumns;
import biomesoplenty.common.world.feature.GeneratorDoubleFlora;
import biomesoplenty.common.world.feature.GeneratorFlora;
import biomesoplenty.common.world.feature.GeneratorGrass;
import biomesoplenty.common.world.feature.GeneratorOreSingle;
import biomesoplenty.common.world.feature.tree.GeneratorBulbTree;
import biomesoplenty.common.world.feature.tree.GeneratorBush;
import biomesoplenty.common.world.feature.tree.GeneratorTwigletTree;
public class BiomeGenBambooForest extends BOPBiome
{
public IBlockState usualTopBlock;
public IBlockState alternateTopBlock;
public BiomeGenBambooForest()
{
// terrain
this.terrainSettings.avgHeight(64).heightVariation(10, 30);
this.setColor(0xA3E053);
this.setTemperatureRainfall(1.2F, 0.9F);
this.waterColorMultiplier = 0x00ff66;
this.addWeight(BOPClimates.TROPICAL, 5);
this.topBlock = Blocks.dirt.getDefaultState().withProperty(BlockDirt.VARIANT, BlockDirt.DirtType.PODZOL);
this.usualTopBlock = this.topBlock;
this.alternateTopBlock = Blocks.grass.getDefaultState();
// trees & logs
GeneratorWeighted treeGenerator = new GeneratorWeighted(30);
this.addGenerator("trees", GeneratorStage.TREE, treeGenerator);
treeGenerator.add("bamboo", 2, (new GeneratorBulbTree.Builder()).minHeight(6).maxHeight(18).log(BOPBlocks.bamboo.getDefaultState()).leaves(BOPTrees.BAMBOO).create());
treeGenerator.add("bamboo_thin", 1, (new GeneratorTwigletTree.Builder()).minHeight(2).maxHeight(8).leafChance(0.3F).log(BOPBlocks.bamboo.getDefaultState()).leaves(BOPTrees.BAMBOO).create());
treeGenerator.add("oak_bush", 1, (new GeneratorBush.Builder()).create());
// grasses
GeneratorWeighted grassGenerator = new GeneratorWeighted(10);
this.addGenerator("grass", GeneratorStage.GRASS, grassGenerator);
grassGenerator.add("dampgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.DAMPGRASS).create());
grassGenerator.add("tallgrass", 1, (new GeneratorGrass.Builder()).with(BlockTallGrass.EnumType.GRASS).create());
grassGenerator.add("doublegrass", 2, (new GeneratorDoubleFlora.Builder()).with(BlockDoublePlant.EnumPlantType.GRASS).create());
// other plants
this.addGenerator("leaf_piles", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(3.0F).with(BOPPlants.LEAFPILE).create());
this.addGenerator("ferns", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(4.0F).with(BlockTallGrass.EnumType.FERN).create());
this.addGenerator("river_cane", GeneratorStage.FLOWERS,(new GeneratorColumns.Builder()).amountPerChunk(5.0F).generationAttempts(24).placeOn(BlockQueries.litFertileWaterside).with(BlockBOPPlant.paging.getVariantState(BOPPlants.RIVERCANE)).minHeight(1).maxHeight(3).create());
this.addGenerator("algae", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(4.0F).replace(Blocks.water).with(BOPBlocks.coral.getDefaultState().withProperty(BlockBOPCoral.VARIANT, BlockBOPCoral.CoralType.ALGAE)).scatterYMethod(ScatterYMethod.AT_GROUND).create());
this.addGenerator("bushes", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.5F).with(BOPPlants.BUSH).create());
// gem
this.addGenerator("topaz", GeneratorStage.SAND, (new GeneratorOreSingle.Builder()).amountPerChunk(12).with(BOPGems.TOPAZ).create());
}
@Override
public void configure(IConfigObj conf)
{
super.configure(conf);
this.usualTopBlock = this.topBlock;
this.alternateTopBlock = conf.getBlockState("alternateTopBlock", this.alternateTopBlock);
}
@Override
public void applySettings(BOPWorldSettings settings)
{
if (!settings.generateBopGems) {this.removeGenerator("topaz");}
}
@Override
public void genTerrainBlocks(World world, Random rand, ChunkPrimer primer, int x, int z, double noise)
{
this.topBlock = (noise + rand.nextDouble() * 3.0D > 1.8D) ? this.alternateTopBlock : this.usualTopBlock;
super.genTerrainBlocks(world, rand, primer, x, z, noise);
}
@Override
public int getGrassColorAtPos(BlockPos pos)
{
double noise = field_180281_af.func_151601_a((double)pos.getX() * 0.0225D, (double)pos.getZ() * 0.0225D);
return noise < -0.7D ? 0xD4DB55 : (noise < -0.3D ? 0xBBDD54 : 0xA3E053);
}
@Override
public int getFoliageColorAtPos(BlockPos pos)
{
double noise = field_180281_af.func_151601_a((double)pos.getX() * 0.0225D, (double)pos.getZ() * 0.0225D);
return noise < -0.7D ? 0xD4DB55 : (noise < -0.3D ? 0xBBDD54 : 0xA3E053);
}
// TODO: These 2 are copied from 1.7 - but are they used ever?
public int getFogColour(BlockPos pos)
{
return 0xCCE874;
}
public float getFogDensity(BlockPos pos)
{
return 0.99F;
}
}

View File

@ -0,0 +1,136 @@
/*******************************************************************************
* Copyright 2015, 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 net.minecraft.block.BlockDoublePlant;
import net.minecraft.block.BlockTallGrass;
import net.minecraft.entity.monster.EntitySlime;
import net.minecraft.init.Blocks;
import net.minecraft.util.BlockPos;
import biomesoplenty.api.biome.BOPBiome;
import biomesoplenty.api.biome.generation.GeneratorStage;
import biomesoplenty.api.biome.generation.GeneratorWeighted;
import biomesoplenty.api.block.BOPBlocks;
import biomesoplenty.api.block.BlockQueries;
import biomesoplenty.common.block.BlockBOPCoral;
import biomesoplenty.common.block.BlockBOPDoublePlant;
import biomesoplenty.common.block.BlockBOPLilypad;
import biomesoplenty.common.enums.BOPClimates;
import biomesoplenty.common.enums.BOPGems;
import biomesoplenty.common.enums.BOPPlants;
import biomesoplenty.common.enums.BOPTrees;
import biomesoplenty.common.enums.BOPWoods;
import biomesoplenty.common.util.biome.GeneratorUtils.ScatterYMethod;
import biomesoplenty.common.util.block.BlockQuery;
import biomesoplenty.common.util.block.BlockQuery.IBlockPosQuery;
import biomesoplenty.common.world.BOPWorldSettings;
import biomesoplenty.common.world.feature.GeneratorColumns;
import biomesoplenty.common.world.feature.GeneratorDoubleFlora;
import biomesoplenty.common.world.feature.GeneratorFlora;
import biomesoplenty.common.world.feature.GeneratorGrass;
import biomesoplenty.common.world.feature.GeneratorLogs;
import biomesoplenty.common.world.feature.GeneratorOreSingle;
import biomesoplenty.common.world.feature.GeneratorSplatter;
import biomesoplenty.common.world.feature.GeneratorWaterside;
import biomesoplenty.common.world.feature.tree.GeneratorBayouTree;
public class BiomeGenBayou extends BOPBiome
{
public BiomeGenBayou()
{
// terrain
this.terrainSettings.avgHeight(63).heightVariation(5, 10).octaves(1, 1, 1, 1, 0, 0).sidewaysNoise(0.0F);
this.setColor(0x8BAF6B);
this.setTemperatureRainfall(0.8F, 0.9F);
this.waterColorMultiplier = 0xFFD932;
this.skyColor = 0xACC4BC;
this.seaFloorBlock = BOPBlocks.mud.getDefaultState();
this.addWeight(BOPClimates.HOT_SWAMP, 10);
this.spawnableWaterCreatureList.clear();
this.spawnableMonsterList.add(new SpawnListEntry(EntitySlime.class, 10, 1, 3));
// mud
IBlockPosQuery emptyGrassOrDirt = BlockQuery.buildAnd().withAirAbove().states(this.topBlock, this.fillerBlock).create();
this.addGenerator("mud", GeneratorStage.SAND_PASS2, (new GeneratorWaterside.Builder()).amountPerChunk(8).maxRadius(7).with(BOPBlocks.mud.getDefaultState()).create());
this.addGenerator("mud_splatter", GeneratorStage.SAND, (new GeneratorSplatter.Builder()).amountPerChunk(4.0F).replace(emptyGrassOrDirt).with(BOPBlocks.mud.getDefaultState()).create());
// trees & logs
GeneratorWeighted treeGenerator = new GeneratorWeighted(8);
this.addGenerator("trees", GeneratorStage.TREE, treeGenerator);
treeGenerator.add("willow", 3, (new GeneratorBayouTree.Builder()).log(BOPWoods.WILLOW).leaves(BOPTrees.WILLOW).minHeight(6).maxHeight(12).minLeavesRadius(1).leavesGradient(2).create());
treeGenerator.add("willow_large", 1, (new GeneratorBayouTree.Builder()).log(BOPWoods.WILLOW).leaves(BOPTrees.WILLOW).minHeight(10).maxHeight(18).minLeavesRadius(2).leavesGradient(3).create());
this.addGenerator("dead_logs", GeneratorStage.TREE, (new GeneratorLogs.Builder()).amountPerChunk(1.5F).with(BOPWoods.DEAD).create());
// grasses
GeneratorWeighted grassGenerator = new GeneratorWeighted(10.0F);
this.addGenerator("grass", GeneratorStage.GRASS, grassGenerator);
grassGenerator.add("wheatgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.WHEATGRASS).create());
grassGenerator.add("dampgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.DAMPGRASS).create());
grassGenerator.add("tallgrass", 2, (new GeneratorGrass.Builder()).with(BlockTallGrass.EnumType.GRASS).create());
grassGenerator.add("doublegrass", 1, (new GeneratorDoubleFlora.Builder()).with(BlockDoublePlant.EnumPlantType.GRASS).create());
// other plants
this.addGenerator("koru", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.3F).with(BOPPlants.KORU).create());
this.addGenerator("cattail", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(3.0F).with(BOPPlants.CATTAIL).create());
this.addGenerator("double_cattail", GeneratorStage.FLOWERS, (new GeneratorDoubleFlora.Builder()).amountPerChunk(3.0F).with(BlockBOPDoublePlant.DoublePlantType.TALL_CATTAIL).create());
this.addGenerator("leaf_piles", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(3.0F).with(BOPPlants.LEAFPILE).create());
this.addGenerator("sugar_cane", GeneratorStage.FLOWERS,(new GeneratorColumns.Builder()).amountPerChunk(3.0F).generationAttempts(24).placeOn(BlockQueries.litFertileWaterside).with(Blocks.reeds.getDefaultState()).minHeight(1).maxHeight(3).create());
// water plants
this.addGenerator("duckweed", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(1.5F).with(BlockBOPLilypad.LilypadType.DUCKWEED).create());
this.addGenerator("lily", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(2.5F).with(Blocks.waterlily.getDefaultState()).create());
this.addGenerator("medium_lily", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(2.0F).with(BlockBOPLilypad.LilypadType.MEDIUM).create());
this.addGenerator("small_lily", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(1.5F).with(BlockBOPLilypad.LilypadType.SMALL).create());
this.addGenerator("tiny_lily", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(1.5F).with(BlockBOPLilypad.LilypadType.TINY).create());
this.addGenerator("algae", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(4.0F).replace(Blocks.water).with(BOPBlocks.coral.getDefaultState().withProperty(BlockBOPCoral.VARIANT, BlockBOPCoral.CoralType.ALGAE)).scatterYMethod(ScatterYMethod.AT_GROUND).create());
this.addGenerator("water_reeds", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(4.0F).with(BOPPlants.REED).generationAttempts(32).create());
// shrooms
this.addGenerator("red_mushrooms", GeneratorStage.SHROOM,(new GeneratorFlora.Builder()).amountPerChunk(0.3F).with(Blocks.red_mushroom.getDefaultState()).create());
this.addGenerator("brown_mushrooms", GeneratorStage.SHROOM,(new GeneratorFlora.Builder()).amountPerChunk(0.5F).with(Blocks.brown_mushroom.getDefaultState()).create());
// gem
this.addGenerator("malachite", GeneratorStage.SAND, (new GeneratorOreSingle.Builder()).amountPerChunk(12).with(BOPGems.MALACHITE).create());
}
@Override
public void applySettings(BOPWorldSettings settings)
{
if (!settings.generateBopGems) {this.removeGenerator("malachite");}
}
@Override
public int getGrassColorAtPos(BlockPos pos)
{
return 0x8BAF6B;
}
@Override
public int getFoliageColorAtPos(BlockPos pos)
{
return 0xB0E088;
}
// TODO: These 2 are copied from 1.7 - but are they used ever?
public int getFogColour(BlockPos pos)
{
return 0x90AF95;
}
public float getFogDensity(BlockPos pos)
{
return 0.99F;
}
}

View File

@ -0,0 +1,128 @@
/*******************************************************************************
* Copyright 2015, 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 net.minecraft.block.BlockPlanks;
import net.minecraft.block.BlockTallGrass;
import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.monster.EntitySlime;
import net.minecraft.init.Blocks;
import net.minecraft.util.BlockPos;
import biomesoplenty.api.biome.BOPBiome;
import biomesoplenty.api.biome.generation.GeneratorStage;
import biomesoplenty.api.biome.generation.GeneratorWeighted;
import biomesoplenty.api.block.BOPBlocks;
import biomesoplenty.api.block.BlockQueries;
import biomesoplenty.common.block.BlockBOPCoral;
import biomesoplenty.common.block.BlockBOPDirt;
import biomesoplenty.common.block.BlockBOPGrass;
import biomesoplenty.common.block.BlockBOPLilypad;
import biomesoplenty.common.block.BlockBOPMushroom;
import biomesoplenty.common.block.BlockBOPPlant;
import biomesoplenty.common.enums.BOPClimates;
import biomesoplenty.common.enums.BOPGems;
import biomesoplenty.common.enums.BOPPlants;
import biomesoplenty.common.util.biome.GeneratorUtils.ScatterYMethod;
import biomesoplenty.common.world.BOPWorldSettings;
import biomesoplenty.common.world.feature.GeneratorColumns;
import biomesoplenty.common.world.feature.GeneratorFlora;
import biomesoplenty.common.world.feature.GeneratorGrass;
import biomesoplenty.common.world.feature.GeneratorLakes;
import biomesoplenty.common.world.feature.GeneratorOreSingle;
import biomesoplenty.common.world.feature.GeneratorWaterside;
import biomesoplenty.common.world.feature.tree.GeneratorTwigletTree;
public class BiomeGenBog extends BOPBiome
{
public BiomeGenBog()
{
// terrain
this.terrainSettings.avgHeight(64).heightVariation(6, 20);
this.setColor(0xD8935F);
this.setTemperatureRainfall(0.5F, 0.9F);
this.topBlock = BOPBlocks.grass.getDefaultState().withProperty(BlockBOPGrass.VARIANT, BlockBOPGrass.BOPGrassType.LOAMY);
this.fillerBlock = BOPBlocks.dirt.getDefaultState().withProperty(BlockBOPDirt.VARIANT, BlockBOPDirt.BOPDirtType.LOAMY);
this.addWeight(BOPClimates.COLD_SWAMP, 7);
this.spawnableCreatureList.clear();
this.spawnableWaterCreatureList.clear();
this.spawnableMonsterList.add(new SpawnListEntry(EntitySlime.class, 10, 1, 3));
// lakes
this.addGenerator("lakes", GeneratorStage.SAND, (new GeneratorLakes.Builder()).amountPerChunk(2.5F).waterLakeForBiome(this).create());
this.addGenerator("poison_lakes", GeneratorStage.SAND, (new GeneratorLakes.Builder()).amountPerChunk(0.5F).waterLakeForBiome(this).liquid(BOPBlocks.poison).frozenLiquid((IBlockState)null).create());
// gravel
this.addGenerator("gravel", GeneratorStage.SAND_PASS2, (new GeneratorWaterside.Builder()).amountPerChunk(4).maxRadius(7).with(Blocks.gravel.getDefaultState()).create());
// mud
this.addGenerator("mud", GeneratorStage.SAND_PASS2, (new GeneratorWaterside.Builder()).amountPerChunk(3).maxRadius(7).with(BOPBlocks.mud.getDefaultState()).create());
// trees & logs
GeneratorWeighted treeGenerator = new GeneratorWeighted(12);
this.addGenerator("trees", GeneratorStage.TREE, treeGenerator);
treeGenerator.add("dark_oak_twiglet", 3, (new GeneratorTwigletTree.Builder()).log(BlockPlanks.EnumType.DARK_OAK).leaves(BlockPlanks.EnumType.DARK_OAK).minHeight(5).maxHeight(10).leafChance(0.3F, 0.9F).create());
treeGenerator.add("birch_twiglet", 1, (new GeneratorTwigletTree.Builder()).log(BlockPlanks.EnumType.BIRCH).leaves(BlockPlanks.EnumType.BIRCH).minHeight(5).maxHeight(10).leafChance(0.3F, 0.9F).create());
treeGenerator.add("bog_bush", 3, (new GeneratorFlora.Builder()).placeOn(this.topBlock).replace(Material.air).withNonDecayingLeaf(BlockPlanks.EnumType.OAK).generationAttempts(8).create());
// grasses
GeneratorWeighted grassGenerator = new GeneratorWeighted(9.0F);
this.addGenerator("grass", GeneratorStage.GRASS, grassGenerator);
grassGenerator.add("mediumgrass", 2, (new GeneratorGrass.Builder()).with(BOPPlants.MEDIUMGRASS).create());
grassGenerator.add("wheatgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.WHEATGRASS).create());
grassGenerator.add("dampgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.DAMPGRASS).create());
grassGenerator.add("tallgrass", 2, (new GeneratorGrass.Builder()).with(BlockTallGrass.EnumType.GRASS).create());
// other plants
this.addGenerator("koru", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.1F).with(BOPPlants.KORU).create());
this.addGenerator("river_cane", GeneratorStage.FLOWERS,(new GeneratorColumns.Builder()).amountPerChunk(1.0F).generationAttempts(24).placeOn(BlockQueries.litFertileWaterside).with(BlockBOPPlant.paging.getVariantState(BOPPlants.RIVERCANE)).minHeight(1).maxHeight(3).create());
this.addGenerator("bushes", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.6F).with(BOPPlants.BUSH).create());
this.addGenerator("shrubs", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(1.0F).with(BOPPlants.SHRUB).create());
this.addGenerator("leaf_piles", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(1.5F).with(BOPPlants.LEAFPILE).create());
this.addGenerator("dead_leaf_piles", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.8F).with(BOPPlants.DEADLEAFPILE).create());
// water plants
this.addGenerator("duckweed", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(1.5F).with(BlockBOPLilypad.LilypadType.DUCKWEED).generationAttempts(32).create());
this.addGenerator("algae", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(8.0F).replace(Blocks.water).with(BOPBlocks.coral.getDefaultState().withProperty(BlockBOPCoral.VARIANT, BlockBOPCoral.CoralType.ALGAE)).generationAttempts(32).scatterYMethod(ScatterYMethod.AT_GROUND).create());
this.addGenerator("water_reeds", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(3.0F).with(BOPPlants.REED).generationAttempts(32).create());
// shrooms
this.addGenerator("blue_milk_caps", GeneratorStage.SHROOM,(new GeneratorFlora.Builder()).amountPerChunk(0.2F).with(BlockBOPMushroom.MushroomType.BLUE_MILK_CAP).create());
this.addGenerator("brown_mushrooms", GeneratorStage.SHROOM,(new GeneratorFlora.Builder()).amountPerChunk(0.2F).with(Blocks.brown_mushroom.getDefaultState()).create());
this.addGenerator("red_mushrooms", GeneratorStage.SHROOM,(new GeneratorFlora.Builder()).amountPerChunk(0.1F).with(Blocks.red_mushroom.getDefaultState()).create());
// gem
this.addGenerator("malachite", GeneratorStage.SAND, (new GeneratorOreSingle.Builder()).amountPerChunk(12).with(BOPGems.MALACHITE).create());
}
@Override
public void applySettings(BOPWorldSettings settings)
{
if (!settings.generateBopGems) {this.removeGenerator("malachite");}
}
@Override
public int getGrassColorAtPos(BlockPos pos)
{
return 0xD8935F;
}
@Override
public int getFoliageColorAtPos(BlockPos pos)
{
return 0xDAE579;
}
}

View File

@ -0,0 +1,99 @@
package biomesoplenty.common.biome.overworld;
import net.minecraft.block.BlockDoublePlant;
import net.minecraft.block.BlockPlanks;
import net.minecraft.block.BlockTallGrass;
import net.minecraft.entity.passive.EntityWolf;
import net.minecraft.init.Blocks;
import net.minecraft.util.BlockPos;
import biomesoplenty.api.biome.BOPBiome;
import biomesoplenty.api.biome.generation.GeneratorStage;
import biomesoplenty.api.biome.generation.GeneratorWeighted;
import biomesoplenty.common.block.BlockBOPDoublePlant;
import biomesoplenty.common.block.BlockBOPLilypad;
import biomesoplenty.common.enums.BOPClimates;
import biomesoplenty.common.enums.BOPGems;
import biomesoplenty.common.enums.BOPPlants;
import biomesoplenty.common.enums.BOPTrees;
import biomesoplenty.common.world.BOPWorldSettings;
import biomesoplenty.common.world.feature.GeneratorDoubleFlora;
import biomesoplenty.common.world.feature.GeneratorFlora;
import biomesoplenty.common.world.feature.GeneratorGrass;
import biomesoplenty.common.world.feature.GeneratorOreSingle;
import biomesoplenty.common.world.feature.GeneratorWaterside;
import biomesoplenty.common.world.feature.tree.GeneratorBasicTree;
import biomesoplenty.common.world.feature.tree.GeneratorBush;
import biomesoplenty.common.world.feature.tree.GeneratorTaigaTree;
public class BiomeGenBorealForest extends BOPBiome
{
// TODO: this is very poorly named, boreal forests are cold, this is a mixed forest
public BiomeGenBorealForest()
{
// terrain
this.terrainSettings.avgHeight(70).heightVariation(15, 30);
this.setColor(0x9FB771);
this.setTemperatureRainfall(0.5F, 0.6F);
this.addWeight(BOPClimates.COOL_TEMPERATE, 10);
this.spawnableCreatureList.add(new SpawnListEntry(EntityWolf.class, 5, 4, 4));
// gravel
this.addGenerator("gravel", GeneratorStage.SAND_PASS2, (new GeneratorWaterside.Builder()).amountPerChunk(6).maxRadius(7).with(Blocks.gravel.getDefaultState()).create());
// trees & logs
GeneratorWeighted treeGenerator = new GeneratorWeighted(20);
this.addGenerator("trees", GeneratorStage.TREE, treeGenerator);
treeGenerator.add("small_oak", 2, (new GeneratorBasicTree.Builder()).create());
treeGenerator.add("oak", 3, (new GeneratorBasicTree.Builder()).minHeight(8).maxHeight(12).create());
treeGenerator.add("oak_bush", 3, (new GeneratorBush.Builder()).amountPerChunk(3).create());
treeGenerator.add("yellow_autumn", 4, (new GeneratorBasicTree.Builder()).log(BlockPlanks.EnumType.BIRCH).leaves(BOPTrees.YELLOW_AUTUMN).minHeight(5).maxHeight(8).create());
treeGenerator.add("spruce", 4, (new GeneratorTaigaTree.Builder()).minHeight(10).maxHeight(19).create()); // TODO: implement pine cones
// grasses
GeneratorWeighted grassGenerator = new GeneratorWeighted(10.0F);
this.addGenerator("grass", GeneratorStage.GRASS, grassGenerator);
grassGenerator.add("wheatgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.WHEATGRASS).create());
grassGenerator.add("dampgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.DAMPGRASS).create());
grassGenerator.add("tallgrass", 2, (new GeneratorGrass.Builder()).with(BlockTallGrass.EnumType.GRASS).create());
grassGenerator.add("fern", 4, (new GeneratorGrass.Builder()).with(BlockTallGrass.EnumType.FERN).create());
// flowers
GeneratorWeighted flowerGenerator = new GeneratorWeighted(0.5F);
this.addGenerator("flowers", GeneratorStage.GRASS, flowerGenerator);
flowerGenerator.add("rose", 2, (new GeneratorDoubleFlora.Builder().with(BlockDoublePlant.EnumPlantType.ROSE).create()));
// other plants
this.addGenerator("shrubs", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(1.0F).with(BOPPlants.SHRUB).create());
this.addGenerator("dead_leaf_piles", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(1.0F).with(BOPPlants.DEADLEAFPILE).create());
this.addGenerator("flax", GeneratorStage.FLOWERS, (new GeneratorDoubleFlora.Builder()).amountPerChunk(0.2F).with(BlockBOPDoublePlant.DoublePlantType.FLAX).create());
// water plants
this.addGenerator("duckweed", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(1.0F).with(BlockBOPLilypad.LilypadType.DUCKWEED).generationAttempts(32).create());
this.addGenerator("water_reeds", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(2.0F).with(BOPPlants.REED).generationAttempts(32).create());
// gem
this.addGenerator("amber", GeneratorStage.SAND, (new GeneratorOreSingle.Builder()).amountPerChunk(12).with(BOPGems.AMBER).create());
}
@Override
public void applySettings(BOPWorldSettings settings)
{
if (!settings.generateBopGems) {this.removeGenerator("amber");}
}
@Override
public int getGrassColorAtPos(BlockPos pos)
{
return 0x9FB771;
}
@Override
public int getFoliageColorAtPos(BlockPos pos)
{
return 0xC9CE65;
}
}

View File

@ -0,0 +1,86 @@
package biomesoplenty.common.biome.overworld;
import net.minecraft.block.BlockFlower;
import net.minecraft.block.BlockPlanks;
import net.minecraft.block.BlockTallGrass;
import net.minecraft.block.material.Material;
import net.minecraft.util.BlockPos;
import biomesoplenty.api.biome.BOPBiome;
import biomesoplenty.api.biome.generation.GeneratorStage;
import biomesoplenty.api.biome.generation.GeneratorWeighted;
import biomesoplenty.api.block.BOPBlocks;
import biomesoplenty.common.block.BlockBOPSand;
import biomesoplenty.common.enums.BOPClimates;
import biomesoplenty.common.enums.BOPGems;
import biomesoplenty.common.enums.BOPPlants;
import biomesoplenty.common.util.biome.GeneratorUtils.ScatterYMethod;
import biomesoplenty.common.world.BOPWorldSettings;
import biomesoplenty.common.world.feature.GeneratorFlora;
import biomesoplenty.common.world.feature.GeneratorGrass;
import biomesoplenty.common.world.feature.GeneratorOreSingle;
import biomesoplenty.common.world.feature.GeneratorSplotches;
import biomesoplenty.common.world.feature.tree.GeneratorBasicTree;
import biomesoplenty.common.world.feature.tree.GeneratorTwigletTree;
public class BiomeGenBrushland extends BOPBiome
{
public BiomeGenBrushland()
{
// terrain
this.terrainSettings.avgHeight(66).heightVariation(3, 20);
this.setColor(0xC9C17F);
this.setTemperatureRainfall(1.2F, 0.1F);
this.addWeight(BOPClimates.MEDITERANEAN, 10);
// quicksand
this.addGenerator("quicksand_patches", GeneratorStage.SAND, (new GeneratorSplotches.Builder()).amountPerChunk(0.6F).splotchSize(16).with(BOPBlocks.sand.getDefaultState().withProperty(BlockBOPSand.VARIANT, BlockBOPSand.SandType.QUICKSAND)).splotchSize(20).scatterYMethod(ScatterYMethod.AT_SURFACE).create());
// trees & logs
GeneratorWeighted treeGenerator = new GeneratorWeighted(2.4F);
this.addGenerator("trees", GeneratorStage.TREE, treeGenerator);
treeGenerator.add("brush", 1, (new GeneratorBasicTree.Builder()).log(BlockPlanks.EnumType.JUNGLE).leaves(BlockPlanks.EnumType.OAK).minHeight(3).maxHeight(5).leafLayers(2).create());
treeGenerator.add("brush_twiglet", 2, (new GeneratorTwigletTree.Builder()).minHeight(2).maxHeight(2).log(BlockPlanks.EnumType.JUNGLE).leaves(BlockPlanks.EnumType.OAK).create());
treeGenerator.add("brush_bush", 1, (new GeneratorFlora.Builder()).placeOn(this.topBlock).replace(Material.air).withNonDecayingLeaf(BlockPlanks.EnumType.OAK).generationAttempts(8).create());
// flowers
GeneratorWeighted flowerGenerator = new GeneratorWeighted(0.6F);
this.addGenerator("flowers", GeneratorStage.GRASS, flowerGenerator);
flowerGenerator.add("allium", 2, (new GeneratorFlora.Builder().with(BlockFlower.EnumFlowerType.ALLIUM).create()));
// grasses
GeneratorWeighted grassGenerator = new GeneratorWeighted(2.4F);
this.addGenerator("grass", GeneratorStage.GRASS, grassGenerator);
grassGenerator.add("wheatgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.WHEATGRASS).create());
grassGenerator.add("tallgrass", 2, (new GeneratorGrass.Builder()).with(BlockTallGrass.EnumType.GRASS).create());
// other plants
this.addGenerator("shrubs", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(2.0F).with(BOPPlants.SHRUB).create());
this.addGenerator("thorns", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(1.0F).with(BOPPlants.THORN).create());
this.addGenerator("water_reeds", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(3.0F).with(BOPPlants.REED).generationAttempts(32).create());
// gem
this.addGenerator("ruby", GeneratorStage.SAND, (new GeneratorOreSingle.Builder()).amountPerChunk(12).with(BOPGems.RUBY).create());
}
@Override
public void applySettings(BOPWorldSettings settings)
{
if (!settings.generateBopGems) {this.removeGenerator("ruby");}
}
@Override
public int getGrassColorAtPos(BlockPos pos)
{
return 0xC9C17F;
}
@Override
public int getFoliageColorAtPos(BlockPos pos)
{
return 0xB2C67F;
}
}

View File

@ -0,0 +1,99 @@
package biomesoplenty.common.biome.overworld;
import net.minecraft.block.BlockPlanks;
import net.minecraft.block.BlockTallGrass;
import net.minecraft.init.Blocks;
import net.minecraft.util.BlockPos;
import biomesoplenty.api.biome.BOPBiome;
import biomesoplenty.api.biome.generation.GeneratorStage;
import biomesoplenty.api.biome.generation.GeneratorWeighted;
import biomesoplenty.api.block.BOPBlocks;
import biomesoplenty.common.enums.BOPClimates;
import biomesoplenty.common.enums.BOPFlowers;
import biomesoplenty.common.enums.BOPGems;
import biomesoplenty.common.enums.BOPPlants;
import biomesoplenty.common.util.block.BlockQuery;
import biomesoplenty.common.util.block.BlockQuery.IBlockPosQuery;
import biomesoplenty.common.world.BOPWorldSettings;
import biomesoplenty.common.world.feature.GeneratorFlora;
import biomesoplenty.common.world.feature.GeneratorGrass;
import biomesoplenty.common.world.feature.GeneratorOreSingle;
import biomesoplenty.common.world.feature.GeneratorSplatter;
import biomesoplenty.common.world.feature.tree.GeneratorBush;
import biomesoplenty.common.world.feature.tree.GeneratorPineTree;
public class BiomeGenCanyon extends BOPBiome
{
public static enum CanyonType {PLATEAU, RAVINE}
// TODO: placement of ravine is not ideal - out to be tied to the rivers layer somehow, instead of being a subbiome
public BiomeGenCanyon(CanyonType type)
{
// terrain
if (type == CanyonType.PLATEAU)
{
this.terrainSettings.avgHeight(140).heightVariation(10, 10);
this.addWeight(BOPClimates.MEDITERANEAN, 5);
}
else
{
this.terrainSettings.avgHeight(63).heightVariation(9, 40);
}
this.setColor(0xB49C70);
this.setTemperatureRainfall(1.0F, 0.3F);
this.spawnableCreatureList.clear();
this.topBlock = BOPBlocks.hard_dirt.getDefaultState();
this.fillerBlock = BOPBlocks.hard_dirt.getDefaultState();
// splatter top blocks
IBlockPosQuery emptyHardDirt = BlockQuery.buildAnd().withAirAbove().states(this.topBlock).create();
this.addGenerator("grass_splatter", GeneratorStage.SAND, (new GeneratorSplatter.Builder()).amountPerChunk(4.0F).generationAttempts(128).replace(emptyHardDirt).with(Blocks.grass.getDefaultState()).create());
// trees and logs
GeneratorWeighted treeGenerator = new GeneratorWeighted(5);
this.addGenerator("trees", GeneratorStage.TREE, treeGenerator);
treeGenerator.add("pine", 1, (new GeneratorPineTree.Builder()).minHeight(6).maxHeight(18).placeOn(emptyHardDirt).create());
treeGenerator.add("brush", 2, (new GeneratorBush.Builder()).log(BlockPlanks.EnumType.ACACIA).leaves(BlockPlanks.EnumType.ACACIA).placeOn(emptyHardDirt).create());
// flowers
GeneratorWeighted flowerGenerator = new GeneratorWeighted(0.5F);
this.addGenerator("flowers", GeneratorStage.GRASS, flowerGenerator);
flowerGenerator.add("bromeliad", 2, (new GeneratorFlora.Builder().with(BOPFlowers.BROMELIAD).create()));
// water plants
this.addGenerator("water_reeds", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(2.0F).with(BOPPlants.REED).generationAttempts(32).create());
// grasses (note weighting must be quite high as the grasses will only grow on the splattered grass blocks)
GeneratorWeighted grassGenerator = new GeneratorWeighted(12.0F);
this.addGenerator("grass", GeneratorStage.GRASS, grassGenerator);
grassGenerator.add("mediumgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.MEDIUMGRASS).create());
grassGenerator.add("tallgrass", 2, (new GeneratorGrass.Builder()).with(BlockTallGrass.EnumType.GRASS).create());
// gem
this.addGenerator("ruby", GeneratorStage.SAND, (new GeneratorOreSingle.Builder()).amountPerChunk(12).with(BOPGems.RUBY).create());
}
@Override
public void applySettings(BOPWorldSettings settings)
{
if (!settings.generateBopGems) {this.removeGenerator("ruby");}
}
@Override
public int getGrassColorAtPos(BlockPos pos)
{
return 0xA9BA64;
}
@Override
public int getFoliageColorAtPos(BlockPos pos)
{
return 0xA9BA64;
}
}

View File

@ -0,0 +1,96 @@
/*******************************************************************************
* Copyright 2015, 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 net.minecraft.block.BlockDoublePlant;
import net.minecraft.block.BlockTallGrass;
import net.minecraft.entity.passive.EntityHorse;
import net.minecraft.init.Blocks;
import net.minecraft.util.BlockPos;
import biomesoplenty.api.biome.BOPBiome;
import biomesoplenty.api.biome.generation.GeneratorStage;
import biomesoplenty.api.biome.generation.GeneratorWeighted;
import biomesoplenty.common.enums.BOPClimates;
import biomesoplenty.common.enums.BOPGems;
import biomesoplenty.common.enums.BOPPlants;
import biomesoplenty.common.util.biome.GeneratorUtils.ScatterYMethod;
import biomesoplenty.common.world.BOPWorldSettings;
import biomesoplenty.common.world.feature.GeneratorDoubleFlora;
import biomesoplenty.common.world.feature.GeneratorFlora;
import biomesoplenty.common.world.feature.GeneratorGrass;
import biomesoplenty.common.world.feature.GeneratorOreSingle;
import biomesoplenty.common.world.feature.GeneratorSplotches;
import biomesoplenty.common.world.feature.tree.GeneratorBush;
public class BiomeGenChaparral extends BOPBiome
{
public BiomeGenChaparral()
{
// terrain
this.terrainSettings.avgHeight(70).heightVariation(10, 30).sidewaysNoise(0.1D).octaves(1, 4, 3, 1, 1, 0);
this.setColor(0xC0D85D);
this.setTemperatureRainfall(0.8F, 0.6F);
this.addWeight(BOPClimates.WARM_TEMPERATE, 10);
this.spawnableCreatureList.clear(); // none of your regular farmyard critters here
this.spawnableCreatureList.add(new SpawnListEntry(EntityHorse.class, 1, 2, 6));
// stone patches
this.addGenerator("stone_patches", GeneratorStage.SAND, (new GeneratorSplotches.Builder()).amountPerChunk(2).splotchSize(15).replace(this.topBlock).with(Blocks.stone.getDefaultState()).scatterYMethod(ScatterYMethod.AT_SURFACE).create());
// flowers
GeneratorWeighted flowerGenerator = new GeneratorWeighted(0.5F);
this.addGenerator("flowers", GeneratorStage.GRASS, flowerGenerator);
flowerGenerator.add("rose", 8, (new GeneratorDoubleFlora.Builder()).amountPerChunk(1).with(BlockDoublePlant.EnumPlantType.ROSE).create());
flowerGenerator.add("syringa", 4, (new GeneratorDoubleFlora.Builder()).amountPerChunk(1).with(BlockDoublePlant.EnumPlantType.SYRINGA).create());
// grasses
GeneratorWeighted grassGenerator = new GeneratorWeighted(2.0F);
this.addGenerator("grass", GeneratorStage.GRASS, grassGenerator);
grassGenerator.add("tallgrass", 2, (new GeneratorGrass.Builder()).with(BlockTallGrass.EnumType.GRASS).create());
grassGenerator.add("mediumgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.MEDIUMGRASS).create());
grassGenerator.add("wheatgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.WHEATGRASS).create());
grassGenerator.add("dampgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.DAMPGRASS).create());
// trees
this.addGenerator("trees", GeneratorStage.TREE, (new GeneratorBush.Builder()).amountPerChunk(8).create());
// other plants
this.addGenerator("berry_bushes", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.2F).with(BOPPlants.BERRYBUSH).create());
this.addGenerator("bushes", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(1.0F).with(BOPPlants.BUSH).create());
this.addGenerator("shrubs", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.2F).with(BOPPlants.SHRUB).create());
this.addGenerator("wild_carrots", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.1F).with(BOPPlants.WILDCARROT).create());
this.addGenerator("leaf_piles", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(1.0F).with(BOPPlants.LEAFPILE).create());
this.addGenerator("dead_leaf_piles", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.5F).with(BOPPlants.DEADLEAFPILE).create());
// water plants
this.addGenerator("water_reeds", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(0.2F).with(BOPPlants.REED).generationAttempts(32).create());
// gem
this.addGenerator("peridot", GeneratorStage.SAND, (new GeneratorOreSingle.Builder()).amountPerChunk(12).with(BOPGems.PERIDOT).create());
}
@Override
public void applySettings(BOPWorldSettings settings)
{
if (!settings.generateBopGems) {this.removeGenerator("peridot");}
}
@Override
public int getGrassColorAtPos(BlockPos pos)
{
return 0xC0D85D;
}
}

View File

@ -0,0 +1,104 @@
/*******************************************************************************
* Copyright 2015, 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 net.minecraft.block.BlockDoublePlant;
import net.minecraft.block.BlockTallGrass;
import net.minecraft.init.Blocks;
import net.minecraft.util.BlockPos;
import biomesoplenty.api.biome.BOPBiome;
import biomesoplenty.api.biome.generation.GeneratorStage;
import biomesoplenty.api.biome.generation.GeneratorWeighted;
import biomesoplenty.common.block.BlockBOPDoublePlant;
import biomesoplenty.common.block.BlockBOPLilypad;
import biomesoplenty.common.enums.BOPClimates;
import biomesoplenty.common.enums.BOPFlowers;
import biomesoplenty.common.enums.BOPGems;
import biomesoplenty.common.enums.BOPPlants;
import biomesoplenty.common.enums.BOPTrees;
import biomesoplenty.common.enums.BOPWoods;
import biomesoplenty.common.util.biome.GeneratorUtils.ScatterYMethod;
import biomesoplenty.common.world.BOPWorldSettings;
import biomesoplenty.common.world.feature.GeneratorBlobs;
import biomesoplenty.common.world.feature.GeneratorDoubleFlora;
import biomesoplenty.common.world.feature.GeneratorFlora;
import biomesoplenty.common.world.feature.GeneratorGrass;
import biomesoplenty.common.world.feature.GeneratorOreSingle;
import biomesoplenty.common.world.feature.tree.GeneratorBasicTree;
import biomesoplenty.common.world.feature.tree.GeneratorBigTree;
public class BiomeGenCherryBlossomGrove extends BOPBiome
{
public BiomeGenCherryBlossomGrove()
{
// terrain
this.terrainSettings.avgHeight(63).heightVariation(5, 25).sidewaysNoise(0.8F);
this.setColor(0xF88F8F);
this.setTemperatureRainfall(0.6F, 0.8F);
this.addWeight(BOPClimates.COOL_TEMPERATE, 3);
// boulders
this.addGenerator("boulders", GeneratorStage.SAND, (new GeneratorBlobs.Builder()).amountPerChunk(0.5F).placeOn(Blocks.grass).with(Blocks.stone.getDefaultState()).minRadius(0.3F).maxRadius(1.2F).numBalls(1).scatterYMethod(ScatterYMethod.AT_SURFACE).create());
this.addGenerator("big_boulders", GeneratorStage.SAND, (new GeneratorBlobs.Builder()).amountPerChunk(0.1F).placeOn(Blocks.grass).with(Blocks.stone.getDefaultState()).minRadius(0.3F).maxRadius(4.0F).numBalls(3).scatterYMethod(ScatterYMethod.AT_SURFACE).create());
// flowers
GeneratorWeighted flowerGenerator = new GeneratorWeighted(6.0F);
this.addGenerator("flowers", GeneratorStage.GRASS, flowerGenerator);
flowerGenerator.add("pink_daffodil", 4, (new GeneratorFlora.Builder().with(BOPFlowers.PINK_DAFFODIL).create()));
flowerGenerator.add("white_anemone", 3, (new GeneratorFlora.Builder().with(BOPFlowers.WHITE_ANEMONE).create()));
flowerGenerator.add("clover", 2, (new GeneratorFlora.Builder().with(BOPFlowers.CLOVER).create()));
flowerGenerator.add("syringa", 2, (new GeneratorDoubleFlora.Builder().with(BlockDoublePlant.EnumPlantType.SYRINGA).create()));
// trees
GeneratorWeighted treeGenerator = new GeneratorWeighted(3.0F);
this.addGenerator("trees", GeneratorStage.TREE, treeGenerator);
treeGenerator.add("pink_cherry", 3, (new GeneratorBasicTree.Builder()).log(BOPWoods.CHERRY).leaves(BOPTrees.PINK_CHERRY).create());
treeGenerator.add("white_cherry", 3, (new GeneratorBasicTree.Builder()).log(BOPWoods.CHERRY).leaves(BOPTrees.WHITE_CHERRY).create());
treeGenerator.add("large_pink_cherry", 1, (new GeneratorBigTree.Builder()).log(BOPWoods.CHERRY).leaves(BOPTrees.PINK_CHERRY).create());
treeGenerator.add("large_white_cherry", 1, (new GeneratorBigTree.Builder()).log(BOPWoods.CHERRY).leaves(BOPTrees.WHITE_CHERRY).create());
// other plants
this.addGenerator("flax", GeneratorStage.FLOWERS,(new GeneratorDoubleFlora.Builder()).amountPerChunk(0.2F).with(BlockBOPDoublePlant.DoublePlantType.FLAX).generationAttempts(6).create());
this.addGenerator("leaf_piles", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(1.5F).with(BOPPlants.LEAFPILE).create());
this.addGenerator("clover_patches", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(2.5F).with(BOPPlants.CLOVERPATCH).create());
// water plants
this.addGenerator("duckweed", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(1.5F).with(BlockBOPLilypad.LilypadType.DUCKWEED).generationAttempts(32).create());
// grasses
GeneratorWeighted grassGenerator = new GeneratorWeighted(2.0F);
this.addGenerator("grass", GeneratorStage.GRASS, grassGenerator);
grassGenerator.add("wheatgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.WHEATGRASS).create());
grassGenerator.add("dampgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.DAMPGRASS).create());
grassGenerator.add("tallgrass", 2, (new GeneratorGrass.Builder()).with(BlockTallGrass.EnumType.GRASS).create());
// gem
this.addGenerator("topaz", GeneratorStage.SAND, (new GeneratorOreSingle.Builder()).amountPerChunk(12).with(BOPGems.TOPAZ).create());
}
@Override
public void applySettings(BOPWorldSettings settings)
{
if (!settings.generateBopGems) {this.removeGenerator("topaz");}
}
@Override
public int getGrassColorAtPos(BlockPos pos)
{
return 0xA3FFAA;
}
@Override
public int getFoliageColorAtPos(BlockPos pos)
{
return 0xA3FFAA;
}
}

View File

@ -0,0 +1,79 @@
/*******************************************************************************
* Copyright 2015, 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 net.minecraft.init.Blocks;
import biomesoplenty.api.biome.BOPBiome;
import biomesoplenty.api.biome.generation.GeneratorStage;
import biomesoplenty.api.block.BOPBlocks;
import biomesoplenty.common.enums.BOPClimates;
import biomesoplenty.common.enums.BOPGems;
import biomesoplenty.common.util.biome.GeneratorUtils.ScatterYMethod;
import biomesoplenty.common.util.block.BlockQuery.BlockQueryBlock;
import biomesoplenty.common.util.block.BlockQuery.IBlockPosQuery;
import biomesoplenty.common.world.BOPWorldSettings;
import biomesoplenty.common.world.feature.GeneratorBlobs;
import biomesoplenty.common.world.feature.GeneratorOreSingle;
import biomesoplenty.common.world.feature.GeneratorSplotches;
public class BiomeGenColdDesert extends BOPBiome
{
public static enum ColdDesertType {FROZEN, COLD;}
public BiomeGenColdDesert(ColdDesertType type)
{
// terrain
this.terrainSettings.avgHeight(70).heightVariation(10, 25).sidewaysNoise(0.7D);
this.topBlock = Blocks.gravel.getDefaultState();
this.fillerBlock = Blocks.stone.getDefaultState();
this.enableRain = false;
this.enableSnow = false;
if (type == ColdDesertType.FROZEN)
{
this.setTemperatureRainfall(0.0F, 0.0F);
this.addWeight(BOPClimates.FROZEN_DESERT, 20);
this.setColor(0xB3D7E3);
}
else
{
this.setTemperatureRainfall(0.2F, 0.0F);
this.addWeight(BOPClimates.COLD_DESERT, 20);
this.setColor(0xB3AF9B);
}
this.spawnableCreatureList.clear();
// gravel, stone and boulders
IBlockPosQuery surface = new BlockQueryBlock(Blocks.stone, Blocks.gravel, BOPBlocks.hard_ice);
if (type == ColdDesertType.FROZEN)
{
this.addGenerator("hard_ice_patches", GeneratorStage.SAND, (new GeneratorSplotches.Builder()).amountPerChunk(6).splotchSize(24).placeOn(surface).replace(surface).with(BOPBlocks.hard_ice.getDefaultState()).scatterYMethod(ScatterYMethod.AT_SURFACE).create());
this.addGenerator("stone_patches", GeneratorStage.SAND, (new GeneratorSplotches.Builder()).amountPerChunk(3).splotchSize(16).placeOn(surface).replace(surface).with(Blocks.stone.getDefaultState()).scatterYMethod(ScatterYMethod.AT_SURFACE).create());
}
else
{
this.addGenerator("stone_patches", GeneratorStage.SAND, (new GeneratorSplotches.Builder()).amountPerChunk(6).splotchSize(24).placeOn(surface).replace(surface).with(Blocks.stone.getDefaultState()).scatterYMethod(ScatterYMethod.AT_SURFACE).create());
}
this.addGenerator("boulders", GeneratorStage.SAND_PASS2, (new GeneratorBlobs.Builder()).amountPerChunk(0.5F).placeOn(surface).with(Blocks.stone.getDefaultState()).minRadius(0.3F).maxRadius(3.2F).numBalls(4).scatterYMethod(ScatterYMethod.AT_SURFACE).create());
// gem
this.addGenerator("tanzanite", GeneratorStage.SAND, (new GeneratorOreSingle.Builder()).amountPerChunk(12).with(BOPGems.TANZANITE).create());
}
@Override
public void applySettings(BOPWorldSettings settings)
{
if (!settings.generateBopGems) {this.removeGenerator("tanzanite");}
}
}

View File

@ -0,0 +1,102 @@
package biomesoplenty.common.biome.overworld;
import net.minecraft.block.BlockTallGrass;
import net.minecraft.entity.passive.EntityWolf;
import net.minecraft.init.Blocks;
import biomesoplenty.api.biome.BOPBiome;
import biomesoplenty.api.biome.generation.GeneratorStage;
import biomesoplenty.api.biome.generation.GeneratorWeighted;
import biomesoplenty.api.block.BOPBlocks;
import biomesoplenty.common.block.BlockBOPDirt;
import biomesoplenty.common.block.BlockBOPDoublePlant;
import biomesoplenty.common.block.BlockBOPGrass;
import biomesoplenty.common.block.BlockBOPLilypad;
import biomesoplenty.common.block.BlockBOPMushroom;
import biomesoplenty.common.enums.BOPClimates;
import biomesoplenty.common.enums.BOPFlowers;
import biomesoplenty.common.enums.BOPGems;
import biomesoplenty.common.enums.BOPPlants;
import biomesoplenty.common.enums.BOPTrees;
import biomesoplenty.common.enums.BOPWoods;
import biomesoplenty.common.world.BOPWorldSettings;
import biomesoplenty.common.world.feature.GeneratorDoubleFlora;
import biomesoplenty.common.world.feature.GeneratorFlora;
import biomesoplenty.common.world.feature.GeneratorGrass;
import biomesoplenty.common.world.feature.GeneratorOreSingle;
import biomesoplenty.common.world.feature.GeneratorWaterside;
import biomesoplenty.common.world.feature.tree.GeneratorTaigaTree;
public class BiomeGenConiferousForest extends BOPBiome
{
public BiomeGenConiferousForest()
{
// terrain
this.terrainSettings.avgHeight(68).heightVariation(10, 20);
this.setColor(0x528F60);
this.setTemperatureRainfall(0.5F, 0.5F);
this.addWeight(BOPClimates.COOL_TEMPERATE, 10);
this.topBlock = BOPBlocks.grass.getDefaultState().withProperty(BlockBOPGrass.VARIANT, BlockBOPGrass.BOPGrassType.LOAMY);
this.fillerBlock = BOPBlocks.dirt.getDefaultState().withProperty(BlockBOPDirt.VARIANT, BlockBOPDirt.BOPDirtType.LOAMY);
this.spawnableCreatureList.add(new SpawnListEntry(EntityWolf.class, 8, 4, 4));
// gravel
this.addGenerator("gravel", GeneratorStage.SAND_PASS2, (new GeneratorWaterside.Builder()).amountPerChunk(4).maxRadius(7).with(Blocks.gravel.getDefaultState()).create());
// trees
//
GeneratorWeighted treeGenerator = new GeneratorWeighted(8.0F);
this.addGenerator("trees", GeneratorStage.TREE, treeGenerator);
treeGenerator.add("fir", 5, (new GeneratorTaigaTree.Builder()).log(BOPWoods.FIR).leaves(BOPTrees.FIR).minHeight(5).maxHeight(28).create());
treeGenerator.add("mega_fir", 3, (new GeneratorTaigaTree.Builder()).log(BOPWoods.FIR).leaves(BOPTrees.FIR).minHeight(20).maxHeight(40).trunkWidth(2).create());
// other plants
this.addGenerator("shrubs", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(1.0F).with(BOPPlants.SHRUB).create());
this.addGenerator("dead_leaf_piles", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(1.0F).with(BOPPlants.DEADLEAFPILE).create());
this.addGenerator("leaf_piles", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.5F).with(BOPPlants.LEAFPILE).generationAttempts(64).create());
this.addGenerator("flax", GeneratorStage.FLOWERS, (new GeneratorDoubleFlora.Builder()).amountPerChunk(0.2F).with(BlockBOPDoublePlant.DoublePlantType.FLAX).create());
this.addGenerator("clover_patches", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(1.0F).with(BOPPlants.CLOVERPATCH).create());
this.addGenerator("berry_bushes", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.5F).with(BOPPlants.BERRYBUSH).create());
this.addGenerator("poison_ivy", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.5F).with(BOPPlants.POISONIVY).create());
// shrooms
this.addGenerator("toadstools", GeneratorStage.SHROOM,(new GeneratorFlora.Builder()).amountPerChunk(0.4F).with(BlockBOPMushroom.MushroomType.TOADSTOOL).create());
this.addGenerator("blue_milk_caps", GeneratorStage.SHROOM,(new GeneratorFlora.Builder()).amountPerChunk(0.1F).with(BlockBOPMushroom.MushroomType.BLUE_MILK_CAP).create());
this.addGenerator("brown_mushrooms", GeneratorStage.SHROOM,(new GeneratorFlora.Builder()).amountPerChunk(0.2F).with(Blocks.brown_mushroom.getDefaultState()).create());
this.addGenerator("red_mushrooms", GeneratorStage.SHROOM,(new GeneratorFlora.Builder()).amountPerChunk(0.1F).with(Blocks.red_mushroom.getDefaultState()).create());
// water plants
this.addGenerator("duckweed", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(1.0F).with(BlockBOPLilypad.LilypadType.DUCKWEED).generationAttempts(32).create());
this.addGenerator("water_reeds", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(0.5F).with(BOPPlants.REED).generationAttempts(32).create());
// flowers
GeneratorWeighted flowerGenerator = new GeneratorWeighted(0.6F);
this.addGenerator("flowers", GeneratorStage.GRASS, flowerGenerator);
flowerGenerator.add("bluebells", 1, (new GeneratorFlora.Builder().with(BOPFlowers.BLUEBELLS)).generationAttempts(128).create());
// grasses
GeneratorWeighted grassGenerator = new GeneratorWeighted(10.0F);
this.addGenerator("grass", GeneratorStage.GRASS, grassGenerator);
grassGenerator.add("tallgrass", 2, (new GeneratorGrass.Builder()).with(BlockTallGrass.EnumType.GRASS).generationAttempts(128).create());
grassGenerator.add("mediumgrass", 2, (new GeneratorGrass.Builder()).with(BOPPlants.MEDIUMGRASS).generationAttempts(128).create());
grassGenerator.add("wheatgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.WHEATGRASS).generationAttempts(128).create());
grassGenerator.add("dampgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.DAMPGRASS).generationAttempts(128).create());
grassGenerator.add("fern", 4, (new GeneratorGrass.Builder()).with(BlockTallGrass.EnumType.FERN).create());
// gem
this.addGenerator("amber", GeneratorStage.SAND, (new GeneratorOreSingle.Builder()).amountPerChunk(12).with(BOPGems.AMBER).create());
}
@Override
public void applySettings(BOPWorldSettings settings)
{
if (!settings.generateBopGems) {this.removeGenerator("amber");}
}
}

View File

@ -0,0 +1,50 @@
/*******************************************************************************
* Copyright 2015, 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 net.minecraft.init.Blocks;
import biomesoplenty.api.biome.BOPBiome;
import biomesoplenty.api.biome.generation.GeneratorStage;
import biomesoplenty.api.block.BOPBlocks;
import biomesoplenty.common.enums.BOPClimates;
import biomesoplenty.common.world.BOPWorldSettings;
import biomesoplenty.common.world.feature.GeneratorOreSingle;
public class BiomeGenCrag extends BOPBiome
{
public BiomeGenCrag()
{
// terrain
this.terrainSettings.avgHeight(80).heightVariation(80, 200).minHeight(40).sidewaysNoise(0.7F);
this.setColor(5209457);
this.setTemperatureRainfall(1.0F, 0.0F);
this.addWeight(BOPClimates.WET_TEMPERATE, 3);
this.spawnableCreatureList.clear();
this.spawnableWaterCreatureList.clear();
this.topBlock = BOPBlocks.crag_rock.getDefaultState();
this.fillerBlock = BOPBlocks.crag_rock.getDefaultState();
this.waterColorMultiplier = 944693;
this.skyColor = 4944498;
// gem
this.addGenerator("emeralds", GeneratorStage.SAND, (new GeneratorOreSingle.Builder()).amountPerChunk(12).with(Blocks.emerald_ore.getDefaultState()).create());
}
@Override
public void applySettings(BOPWorldSettings settings)
{
if (!settings.generateBopGems) {this.removeGenerator("emeralds");}
}
}

View File

@ -0,0 +1,91 @@
/*******************************************************************************
* Copyright 2015, 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 net.minecraft.block.BlockTallGrass;
import net.minecraft.init.Blocks;
import net.minecraft.util.BlockPos;
import biomesoplenty.api.biome.BOPBiome;
import biomesoplenty.api.biome.generation.GeneratorStage;
import biomesoplenty.api.biome.generation.GeneratorWeighted;
import biomesoplenty.common.enums.BOPClimates;
import biomesoplenty.common.enums.BOPGems;
import biomesoplenty.common.enums.BOPPlants;
import biomesoplenty.common.enums.BOPTrees;
import biomesoplenty.common.enums.BOPWoods;
import biomesoplenty.common.world.BOPWorldSettings;
import biomesoplenty.common.world.feature.GeneratorFlora;
import biomesoplenty.common.world.feature.GeneratorGrass;
import biomesoplenty.common.world.feature.GeneratorOreSingle;
import biomesoplenty.common.world.feature.GeneratorWaterside;
import biomesoplenty.common.world.feature.tree.GeneratorBasicTree;
import biomesoplenty.common.world.feature.tree.GeneratorBigTree;
import biomesoplenty.common.world.feature.tree.GeneratorTaigaTree;
public class BiomeGenDeadForest extends BOPBiome
{
public BiomeGenDeadForest()
{
// terrain
this.terrainSettings.avgHeight(68).heightVariation(8, 25);
this.setColor(0xBCA165);
this.setTemperatureRainfall(0.4F, 0.3F);
this.addWeight(BOPClimates.COOL_TEMPERATE, 5);
// gravel
this.addGenerator("gravel", GeneratorStage.SAND_PASS2, (new GeneratorWaterside.Builder()).amountPerChunk(4).maxRadius(7).with(Blocks.gravel.getDefaultState()).create());
// trees
GeneratorWeighted treeGenerator = new GeneratorWeighted(3);
this.addGenerator("trees", GeneratorStage.TREE, treeGenerator);
treeGenerator.add("spruce", 3, (new GeneratorTaigaTree.Builder()).minHeight(6).maxHeight(16).create()); // TODO: implement pine cones
treeGenerator.add("dying_tree", 5, (new GeneratorBigTree.Builder()).amountPerChunk(1.0F).minHeight(5).maxHeight(12).foliageHeight(2).leaves(BOPTrees.DEAD).create());
treeGenerator.add("dead_tree", 5, (new GeneratorBigTree.Builder()).amountPerChunk(1.0F).minHeight(5).maxHeight(12).foliageHeight(0).foliageDensity(0.5D).log(BOPWoods.DEAD).leaves(Blocks.air.getDefaultState()).create());
treeGenerator.add("persimmon_tree", 1, (new GeneratorBasicTree.Builder()).create()); // TODO: implement persimmon fruit
// other plants
this.addGenerator("thorns", GeneratorStage.FLOWERS, (new GeneratorFlora.Builder()).amountPerChunk(0.3F).with(BOPPlants.THORN).create());
this.addGenerator("shrubs", GeneratorStage.FLOWERS, (new GeneratorFlora.Builder()).amountPerChunk(0.3F).with(BOPPlants.SHRUB).create());
this.addGenerator("water_reeds", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(0.8F).with(BOPPlants.REED).generationAttempts(32).create());
this.addGenerator("dead_leaf_piles", GeneratorStage.FLOWERS, (new GeneratorFlora.Builder()).amountPerChunk(3.0F).with(BOPPlants.DEADLEAFPILE).generationAttempts(64).create());
// grasses
GeneratorWeighted grassGenerator = new GeneratorWeighted(2.0F);
this.addGenerator("grass", GeneratorStage.GRASS, grassGenerator);
grassGenerator.add("tallgrass", 2, (new GeneratorGrass.Builder()).with(BlockTallGrass.EnumType.GRASS).create());
grassGenerator.add("dead_bushes", 1, (new GeneratorGrass.Builder()).with(BlockTallGrass.EnumType.DEAD_BUSH).create());
grassGenerator.add("wheatgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.WHEATGRASS).create());
grassGenerator.add("dampgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.DAMPGRASS).create());
// gem
this.addGenerator("tanzanite", GeneratorStage.SAND, (new GeneratorOreSingle.Builder()).amountPerChunk(12).with(BOPGems.TANZANITE).create());
}
@Override
public void applySettings(BOPWorldSettings settings)
{
if (!settings.generateBopGems) {this.removeGenerator("tanzanite");}
}
@Override
public int getGrassColorAtPos(BlockPos pos)
{
return 0xBCA165;
}
@Override
public int getFoliageColorAtPos(BlockPos pos)
{
return 0xBCA165;
}
}

View File

@ -0,0 +1,126 @@
/*******************************************************************************
* Copyright 2015, 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 net.minecraft.block.BlockDoublePlant;
import net.minecraft.block.BlockTallGrass;
import net.minecraft.init.Blocks;
import net.minecraft.util.BlockPos;
import biomesoplenty.api.biome.BOPBiome;
import biomesoplenty.api.biome.generation.GeneratorStage;
import biomesoplenty.api.biome.generation.GeneratorWeighted;
import biomesoplenty.api.block.BOPBlocks;
import biomesoplenty.api.block.BlockQueries;
import biomesoplenty.common.block.BlockBOPCoral;
import biomesoplenty.common.block.BlockBOPDirt;
import biomesoplenty.common.block.BlockBOPGrass;
import biomesoplenty.common.block.BlockBOPPlant;
import biomesoplenty.common.enums.BOPClimates;
import biomesoplenty.common.enums.BOPGems;
import biomesoplenty.common.enums.BOPPlants;
import biomesoplenty.common.enums.BOPWoods;
import biomesoplenty.common.util.biome.GeneratorUtils.ScatterYMethod;
import biomesoplenty.common.world.BOPWorldSettings;
import biomesoplenty.common.world.feature.GeneratorColumns;
import biomesoplenty.common.world.feature.GeneratorDoubleFlora;
import biomesoplenty.common.world.feature.GeneratorFlora;
import biomesoplenty.common.world.feature.GeneratorGrass;
import biomesoplenty.common.world.feature.GeneratorOreSingle;
import biomesoplenty.common.world.feature.GeneratorSplotches;
import biomesoplenty.common.world.feature.GeneratorWaterside;
import biomesoplenty.common.world.feature.tree.GeneratorBigTree;
public class BiomeGenDeadSwamp extends BOPBiome
{
public BiomeGenDeadSwamp()
{
// terrain
this.terrainSettings.avgHeight(63).heightVariation(4, 4).octaves(2, 2, 1, 0, 1, 1).sidewaysNoise(0.5D);
this.setTemperatureRainfall(0.7F, 0.9F);
this.setColor(0x8BAF48);
this.waterColorMultiplier = 0xA2AD51;
this.skyColor = 0x627268;
this.topBlock = BOPBlocks.grass.getDefaultState().withProperty(BlockBOPGrass.VARIANT, BlockBOPGrass.BOPGrassType.LOAMY);
this.fillerBlock = BOPBlocks.dirt.getDefaultState().withProperty(BlockBOPDirt.VARIANT, BlockBOPDirt.BOPDirtType.LOAMY);
this.addWeight(BOPClimates.COLD_SWAMP, 5);
this.spawnableCreatureList.clear();
this.spawnableWaterCreatureList.clear();
// mud
this.addGenerator("mud", GeneratorStage.SAND_PASS2, (new GeneratorWaterside.Builder()).amountPerChunk(8).maxRadius(7).with(BOPBlocks.mud.getDefaultState()).create());
this.addGenerator("mud_patches", GeneratorStage.SAND_PASS2, (new GeneratorSplotches.Builder()).amountPerChunk(1).splotchSize(12).replace(this.topBlock).with(BOPBlocks.mud.getDefaultState()).scatterYMethod(ScatterYMethod.AT_SURFACE).create());
// trees
GeneratorWeighted treeGenerator = new GeneratorWeighted(1.0F);
this.addGenerator("trees", GeneratorStage.TREE, treeGenerator);
treeGenerator.add("dead_tree", 1, (new GeneratorBigTree.Builder()).amountPerChunk(1.0F).minHeight(5).maxHeight(16).log(BOPWoods.DEAD).leaves(Blocks.air.getDefaultState()).create());
// other plants
this.addGenerator("koru", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.1F).with(BOPPlants.KORU).create());
// water plants
this.addGenerator("river_cane", GeneratorStage.FLOWERS,(new GeneratorColumns.Builder()).amountPerChunk(0.3F).generationAttempts(24).placeOn(BlockQueries.litFertileWaterside).with(BlockBOPPlant.paging.getVariantState(BOPPlants.RIVERCANE)).minHeight(1).maxHeight(3).create());
this.addGenerator("water_reeds", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(0.5F).with(BOPPlants.REED).generationAttempts(32).create());
this.addGenerator("algae", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(0.5F).replace(Blocks.water).with(BOPBlocks.coral.getDefaultState().withProperty(BlockBOPCoral.VARIANT, BlockBOPCoral.CoralType.ALGAE)).generationAttempts(32).scatterYMethod(ScatterYMethod.AT_GROUND).create());
// grasses
GeneratorWeighted grassGenerator = new GeneratorWeighted(10.0F);
this.addGenerator("grass", GeneratorStage.GRASS, grassGenerator);
grassGenerator.add("tallgrass", 2, (new GeneratorGrass.Builder()).with(BlockTallGrass.EnumType.GRASS).create());
grassGenerator.add("mediumgrass", 4, (new GeneratorGrass.Builder()).with(BOPPlants.MEDIUMGRASS).create());
grassGenerator.add("wheatgrass", 2, (new GeneratorGrass.Builder()).with(BOPPlants.WHEATGRASS).create());
grassGenerator.add("dampgrass", 2, (new GeneratorGrass.Builder()).with(BOPPlants.DAMPGRASS).create());
grassGenerator.add("doublegrass", 1, (new GeneratorDoubleFlora.Builder()).with(BlockDoublePlant.EnumPlantType.GRASS).create());
// gem
this.addGenerator("malachite", GeneratorStage.SAND, (new GeneratorOreSingle.Builder()).amountPerChunk(12).with(BOPGems.MALACHITE).create());
}
@Override
public void applySettings(BOPWorldSettings settings)
{
if (!settings.generateBopGems) {this.removeGenerator("malachite");}
}
@Override
public int getGrassColorAtPos(BlockPos pos)
{
return 0x66704C;
}
@Override
public int getFoliageColorAtPos(BlockPos pos)
{
return 0x66704C;
}
/* TODO
@Override
public int getFogColour(int x, int y, int z)
{
return 9219993;
}
@Override
public float getFogDensity(int x, int y, int z)
{
// TODO Auto-generated method stub
return 0.6F;
}
*/
}

View File

@ -0,0 +1,89 @@
package biomesoplenty.common.biome.overworld;
import net.minecraft.block.BlockPlanks;
import net.minecraft.block.BlockTallGrass;
import net.minecraft.util.BlockPos;
import biomesoplenty.api.biome.BOPBiome;
import biomesoplenty.api.biome.generation.GeneratorStage;
import biomesoplenty.api.biome.generation.GeneratorWeighted;
import biomesoplenty.common.block.BlockBOPDoublePlant;
import biomesoplenty.common.block.BlockBOPLilypad;
import biomesoplenty.common.block.BlockBOPMushroom;
import biomesoplenty.common.enums.BOPClimates;
import biomesoplenty.common.enums.BOPGems;
import biomesoplenty.common.enums.BOPPlants;
import biomesoplenty.common.world.BOPWorldSettings;
import biomesoplenty.common.world.feature.GeneratorDoubleFlora;
import biomesoplenty.common.world.feature.GeneratorFlora;
import biomesoplenty.common.world.feature.GeneratorGrass;
import biomesoplenty.common.world.feature.GeneratorOreSingle;
import biomesoplenty.common.world.feature.tree.GeneratorBulbTree;
import biomesoplenty.common.world.feature.tree.GeneratorBush;
public class BiomeGenDeciduousForest extends BOPBiome
{
public BiomeGenDeciduousForest()
{
// terrain
this.terrainSettings.avgHeight(64);
this.setColor(0xC1B749);
this.setTemperatureRainfall(0.6F, 0.8F);
this.addWeight(BOPClimates.WARM_TEMPERATE, 10);
// trees & logs
GeneratorWeighted treeGenerator = new GeneratorWeighted(18);
this.addGenerator("trees", GeneratorStage.TREE, treeGenerator);
treeGenerator.add("birch_bush", 2, (new GeneratorBush.Builder()).log(BlockPlanks.EnumType.BIRCH).leaves(BlockPlanks.EnumType.BIRCH).create());
treeGenerator.add("oak_bush", 3, (new GeneratorBush.Builder()).create());
treeGenerator.add("tall_oak", 6, (new GeneratorBulbTree.Builder()).minHeight(10).maxHeight(15).vine(null).create());
// grasses
GeneratorWeighted grassGenerator = new GeneratorWeighted(10.0F);
this.addGenerator("grass", GeneratorStage.GRASS, grassGenerator);
grassGenerator.add("wheatgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.WHEATGRASS).create());
grassGenerator.add("dampgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.DAMPGRASS).create());
grassGenerator.add("tallgrass", 2, (new GeneratorGrass.Builder()).with(BlockTallGrass.EnumType.GRASS).create());
grassGenerator.add("fern", 4, (new GeneratorGrass.Builder()).with(BlockTallGrass.EnumType.FERN).create());
// shrooms
this.addGenerator("toadstools", GeneratorStage.SHROOM,(new GeneratorFlora.Builder()).amountPerChunk(0.2F).with(BlockBOPMushroom.MushroomType.TOADSTOOL).create());
this.addGenerator("blue_milk_caps", GeneratorStage.SHROOM,(new GeneratorFlora.Builder()).amountPerChunk(0.4F).with(BlockBOPMushroom.MushroomType.BLUE_MILK_CAP).create());
// other plants
this.addGenerator("bushes", GeneratorStage.FLOWERS, (new GeneratorFlora.Builder()).amountPerChunk(0.8F).with(BOPPlants.BUSH).create());
this.addGenerator("berry_bushes", GeneratorStage.FLOWERS, (new GeneratorFlora.Builder()).amountPerChunk(0.2F).with(BOPPlants.BERRYBUSH).create());
this.addGenerator("shrubs", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(1.0F).with(BOPPlants.SHRUB).create());
this.addGenerator("leaf_piles", GeneratorStage.FLOWERS, (new GeneratorFlora.Builder()).amountPerChunk(1.5F).with(BOPPlants.LEAFPILE).generationAttempts(64).create());
this.addGenerator("dead_leaf_piles", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(1.0F).with(BOPPlants.DEADLEAFPILE).create());
this.addGenerator("flax", GeneratorStage.FLOWERS, (new GeneratorDoubleFlora.Builder()).amountPerChunk(0.1F).with(BlockBOPDoublePlant.DoublePlantType.FLAX).create());
// water plants
this.addGenerator("duckweed", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(0.5F).with(BlockBOPLilypad.LilypadType.DUCKWEED).generationAttempts(32).create());
this.addGenerator("water_reeds", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(1.0F).with(BOPPlants.REED).generationAttempts(32).create());
// gem
this.addGenerator("amber", GeneratorStage.SAND, (new GeneratorOreSingle.Builder()).amountPerChunk(12).with(BOPGems.AMBER).create());
}
@Override
public void applySettings(BOPWorldSettings settings)
{
if (!settings.generateBopGems) {this.removeGenerator("amber");}
}
@Override
public int getGrassColorAtPos(BlockPos pos)
{
double noise = field_180281_af.func_151601_a((double)pos.getX() * 0.0225D, (double)pos.getZ() * 0.0225D);
return noise < -0.1D ? 0xC1B749 : 0xAD8E41;
}
@Override
public int getFoliageColorAtPos(BlockPos pos)
{
double noise = field_180281_af.func_151601_a((double)pos.getX() * 0.0225D, (double)pos.getZ() * 0.0225D);
return noise < -0.1D ? 0xC4C93A : 0xAFA248;
}
}

View File

@ -0,0 +1,109 @@
/*******************************************************************************
* Copyright 2015, 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 java.util.Random;
import biomesoplenty.api.biome.BOPBiome;
import biomesoplenty.api.biome.generation.GeneratorStage;
import biomesoplenty.api.biome.generation.GeneratorWeighted;
import biomesoplenty.common.enums.BOPClimates;
import biomesoplenty.common.enums.BOPGems;
import biomesoplenty.common.enums.BOPPlants;
import biomesoplenty.common.util.config.BOPConfig.IConfigObj;
import biomesoplenty.common.world.BOPWorldSettings;
import biomesoplenty.common.world.feature.GeneratorFlora;
import biomesoplenty.common.world.feature.GeneratorGrass;
import biomesoplenty.common.world.feature.GeneratorOreSingle;
import biomesoplenty.common.world.feature.tree.GeneratorBigTree;
import biomesoplenty.common.world.feature.tree.GeneratorBush;
import net.minecraft.block.BlockDirt;
import net.minecraft.block.BlockTallGrass;
import net.minecraft.block.state.IBlockState;
import net.minecraft.init.Blocks;
import net.minecraft.util.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.chunk.ChunkPrimer;
public class BiomeGenDenseForest extends BOPBiome
{
public IBlockState usualTopBlock;
public IBlockState alternateTopBlock;
public BiomeGenDenseForest()
{
// terrain
this.terrainSettings.avgHeight(64).heightVariation(4, 12);
this.setColor(8246897);
this.setTemperatureRainfall(0.7F, 0.7F);
this.addWeight(BOPClimates.WARM_TEMPERATE, 7);
this.topBlock = Blocks.grass.getDefaultState();
this.fillerBlock = Blocks.dirt.getDefaultState();
this.usualTopBlock = this.topBlock;
this.alternateTopBlock = Blocks.dirt.getDefaultState().withProperty(BlockDirt.VARIANT, BlockDirt.DirtType.COARSE_DIRT);
// other plants
this.addGenerator("bushes", GeneratorStage.FLOWERS, (new GeneratorFlora.Builder()).amountPerChunk(0.1F).with(BOPPlants.BUSH).create());
this.addGenerator("berry_bushes", GeneratorStage.FLOWERS, (new GeneratorFlora.Builder()).amountPerChunk(0.1F).with(BOPPlants.BERRYBUSH).create());
this.addGenerator("shrubs", GeneratorStage.FLOWERS, (new GeneratorFlora.Builder()).amountPerChunk(0.1F).with(BOPPlants.SHRUB).create());
this.addGenerator("water_reeds", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(0.2F).with(BOPPlants.REED).generationAttempts(32).create());
this.addGenerator("leaf_piles", GeneratorStage.FLOWERS, (new GeneratorFlora.Builder()).amountPerChunk(1.5F).with(BOPPlants.LEAFPILE).generationAttempts(64).create());
this.addGenerator("huge_trees", GeneratorStage.TREE, (new GeneratorBigTree.Builder()).amountPerChunk(1.0F).minHeight(15).maxHeight(25).create());
this.addGenerator("leaves_clusters", GeneratorStage.POST, (new GeneratorBush.Builder()).amountPerChunk(0.7F).create());
// grasses
GeneratorWeighted grassGenerator = new GeneratorWeighted(2.0F);
this.addGenerator("grass", GeneratorStage.GRASS, grassGenerator);
grassGenerator.add("tallgrass", 2, (new GeneratorGrass.Builder()).with(BlockTallGrass.EnumType.GRASS).create());
grassGenerator.add("fern", 1, (new GeneratorGrass.Builder()).with(BlockTallGrass.EnumType.FERN).create());
grassGenerator.add("wheatgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.WHEATGRASS).create());
grassGenerator.add("dampgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.DAMPGRASS).create());
// gem
this.addGenerator("amber", GeneratorStage.SAND, (new GeneratorOreSingle.Builder()).amountPerChunk(12).with(BOPGems.AMBER).create());
}
@Override
public void applySettings(BOPWorldSettings settings)
{
if (!settings.generateBopGems) {this.removeGenerator("amber");}
}
@Override
public void configure(IConfigObj conf)
{
super.configure(conf);
this.usualTopBlock = this.topBlock;
this.alternateTopBlock = conf.getBlockState("alternateTopBlock", this.alternateTopBlock);
}
@Override
public void genTerrainBlocks(World world, Random rand, ChunkPrimer primer, int x, int z, double noise)
{
this.topBlock = (noise > 1.75D) ? this.alternateTopBlock : this.usualTopBlock;
super.genTerrainBlocks(world, rand, primer, x, z, noise);
}
@Override
public int getGrassColorAtPos(BlockPos pos)
{
return 8246897;
}
@Override
public int getFoliageColorAtPos(BlockPos pos)
{
return 10022742;
}
}

View File

@ -0,0 +1,198 @@
/*******************************************************************************
* Copyright 2015, 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 net.minecraft.block.BlockDoublePlant;
import net.minecraft.block.BlockTallGrass;
import net.minecraft.block.BlockFlower.EnumFlowerType;
import net.minecraft.init.Blocks;
import net.minecraft.util.BlockPos;
import biomesoplenty.api.biome.BOPBiome;
import biomesoplenty.api.biome.generation.GeneratorStage;
import biomesoplenty.api.biome.generation.GeneratorWeighted;
import biomesoplenty.api.block.BOPBlocks;
import biomesoplenty.api.block.BlockQueries;
import biomesoplenty.common.block.BlockBOPCoral;
import biomesoplenty.common.block.BlockBOPDoublePlant;
import biomesoplenty.common.block.BlockBOPLilypad;
import biomesoplenty.common.block.BlockBOPMushroom;
import biomesoplenty.common.block.BlockBOPPlant;
import biomesoplenty.common.enums.BOPClimates;
import biomesoplenty.common.enums.BOPFlowers;
import biomesoplenty.common.enums.BOPGems;
import biomesoplenty.common.enums.BOPPlants;
import biomesoplenty.common.util.biome.GeneratorUtils.ScatterYMethod;
import biomesoplenty.common.world.BOPWorldSettings;
import biomesoplenty.common.world.feature.GeneratorBigMushroom;
import biomesoplenty.common.world.feature.GeneratorColumns;
import biomesoplenty.common.world.feature.GeneratorDoubleFlora;
import biomesoplenty.common.world.feature.GeneratorFlora;
import biomesoplenty.common.world.feature.GeneratorGrass;
import biomesoplenty.common.world.feature.GeneratorMixedLily;
import biomesoplenty.common.world.feature.GeneratorOreSingle;
import biomesoplenty.common.world.feature.GeneratorWaterside;
// This class is not intended to be used in the game
// It just contains one of every common generator, so it can be used as a template when creating new biomes - just delete lines you don't want and adjust weightings
public class BiomeGenDummyTemplate extends BOPBiome
{
public BiomeGenDummyTemplate()
{
// terrain
this.terrainSettings.avgHeight(64).heightVariation(6, 21).octaves(1, 1, 1, 1, 1, 1);
this.setColor(0xFFFFFF);
this.skyColor = 0xFFFFFF;
this.setEnableSnow();
this.setTemperatureRainfall(0.5F, 0.5F);
this.addWeight(BOPClimates.COOL_TEMPERATE, 10);
// gravel
this.addGenerator("gravel", GeneratorStage.SAND_PASS2, (new GeneratorWaterside.Builder()).amountPerChunk(4).maxRadius(7).with(Blocks.gravel.getDefaultState()).create());
// mud
this.addGenerator("mud", GeneratorStage.SAND_PASS2, (new GeneratorWaterside.Builder()).amountPerChunk(3).maxRadius(7).with(BOPBlocks.mud.getDefaultState()).create());
// trees
GeneratorWeighted treeGenerator = new GeneratorWeighted(9);
this.addGenerator("trees", GeneratorStage.TREE, treeGenerator);
// TODO: standard trees here? Is there such a thing as standard trees?
// grasses
GeneratorWeighted grassGenerator = new GeneratorWeighted(2.0F);
this.addGenerator("grass", GeneratorStage.GRASS, grassGenerator);
grassGenerator.add("deadgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.DEADGRASS).create());
grassGenerator.add("desertgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.DESERTGRASS).create());
grassGenerator.add("dunegrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.DUNEGRASS).create());
grassGenerator.add("shortgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.SHORTGRASS).create());
grassGenerator.add("mediumgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.MEDIUMGRASS).create());
grassGenerator.add("tallgrass", 1, (new GeneratorGrass.Builder()).with(BlockTallGrass.EnumType.GRASS).create());
grassGenerator.add("ferns", 1, (new GeneratorGrass.Builder()).with(BlockTallGrass.EnumType.FERN).create());
grassGenerator.add("wheatgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.WHEATGRASS).create());
grassGenerator.add("dampgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.DAMPGRASS).create());
grassGenerator.add("doublegrass", 1, (new GeneratorDoubleFlora.Builder()).with(BlockDoublePlant.EnumPlantType.GRASS).create());
// other plants
this.addGenerator("berry_bushes", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.5F).with(BOPPlants.BERRYBUSH).create());
this.addGenerator("bushes", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.5F).with(BOPPlants.BUSH).create());
this.addGenerator("cattails", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.5F).with(BOPPlants.CATTAIL).create());
this.addGenerator("clover_patches", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.5F).with(BOPPlants.CLOVERPATCH).create());
this.addGenerator("dead_leaf_piles", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.5F).with(BOPPlants.DEADLEAFPILE).create());
this.addGenerator("desert_sprouts", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.5F).with(BOPPlants.DESERTSPROUTS).create());
this.addGenerator("koru", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.5F).with(BOPPlants.KORU).create());
this.addGenerator("leaf_piles", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.5F).with(BOPPlants.LEAFPILE).create());
this.addGenerator("poison_ivy", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.5F).with(BOPPlants.POISONIVY).create());
this.addGenerator("shrubs", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.5F).with(BOPPlants.SHRUB).create());
this.addGenerator("spectral_ferns", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.5F).with(BOPPlants.SPECTRALFERN).create());
this.addGenerator("sprouts", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.5F).with(BOPPlants.SPROUT).create());
this.addGenerator("thorns", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.5F).with(BOPPlants.THORN).create());
this.addGenerator("tiny_cacti", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.5F).with(BOPPlants.TINYCACTUS).create());
this.addGenerator("wild_carrots", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.5F).with(BOPPlants.WILDCARROT).create());
this.addGenerator("wild_rice", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.5F).with(BOPPlants.WILDRICE).create());
this.addGenerator("witherwart", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.5F).with(BOPPlants.WITHERWART).create());
this.addGenerator("dead_bushes", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.5F).with(BlockTallGrass.EnumType.DEAD_BUSH).create());
this.addGenerator("eyebulbs", GeneratorStage.FLOWERS, (new GeneratorDoubleFlora.Builder()).amountPerChunk(0.5F).with(BlockBOPDoublePlant.DoublePlantType.EYEBULB).create());
this.addGenerator("flax", GeneratorStage.FLOWERS, (new GeneratorDoubleFlora.Builder()).amountPerChunk(0.5F).with(BlockBOPDoublePlant.DoublePlantType.FLAX).create());
this.addGenerator("tall_cattails", GeneratorStage.FLOWERS, (new GeneratorDoubleFlora.Builder()).amountPerChunk(0.5F).with(BlockBOPDoublePlant.DoublePlantType.TALL_CATTAIL).create());
this.addGenerator("tall_ferns", GeneratorStage.FLOWERS, (new GeneratorDoubleFlora.Builder()).amountPerChunk(0.5F).with(BlockDoublePlant.EnumPlantType.FERN).create());
this.addGenerator("river_cane", GeneratorStage.FLOWERS,(new GeneratorColumns.Builder()).amountPerChunk(0.5F).placeOn(BlockQueries.litFertileWaterside).with(BlockBOPPlant.paging.getVariantState(BOPPlants.RIVERCANE)).minHeight(1).maxHeight(3).create());
this.addGenerator("sugar_cane", GeneratorStage.FLOWERS,(new GeneratorColumns.Builder()).amountPerChunk(0.5F).placeOn(BlockQueries.litFertileWaterside).with(Blocks.reeds.getDefaultState()).minHeight(1).maxHeight(3).create());
// TODO root
// water plants
this.addGenerator("duckweed", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(0.5F).with(BlockBOPLilypad.LilypadType.DUCKWEED).create());
this.addGenerator("water_reeds", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(0.5F).with(BOPPlants.REED).generationAttempts(32).create());
this.addGenerator("mixed_lily", GeneratorStage.LILYPAD, (new GeneratorMixedLily.Builder()).amountPerChunk(0.5F).create());
this.addGenerator("algae", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(0.5F).replace(Blocks.water).with(BOPBlocks.coral.getDefaultState().withProperty(BlockBOPCoral.VARIANT, BlockBOPCoral.CoralType.ALGAE)).scatterYMethod(ScatterYMethod.AT_GROUND).create());
// flowers
GeneratorWeighted flowerGenerator = new GeneratorWeighted(1.0F);
this.addGenerator("flowers", GeneratorStage.GRASS, flowerGenerator);
flowerGenerator.add("alliums", 1, (new GeneratorFlora.Builder().with(EnumFlowerType.ALLIUM).create()));
flowerGenerator.add("blue_orchids", 1, (new GeneratorFlora.Builder().with(EnumFlowerType.BLUE_ORCHID).create()));
flowerGenerator.add("dandelions", 1, (new GeneratorFlora.Builder().with(EnumFlowerType.DANDELION).create()));
flowerGenerator.add("houstonias", 1, (new GeneratorFlora.Builder().with(EnumFlowerType.HOUSTONIA).create()));
flowerGenerator.add("orange_tulips", 1, (new GeneratorFlora.Builder().with(EnumFlowerType.ORANGE_TULIP).create()));
flowerGenerator.add("oxeye_daisies", 1, (new GeneratorFlora.Builder().with(EnumFlowerType.OXEYE_DAISY).create()));
flowerGenerator.add("pink_tulips", 1, (new GeneratorFlora.Builder().with(EnumFlowerType.PINK_TULIP).create()));
flowerGenerator.add("poppies", 1, (new GeneratorFlora.Builder().with(EnumFlowerType.POPPY).create()));
flowerGenerator.add("red_tulips", 1, (new GeneratorFlora.Builder().with(EnumFlowerType.RED_TULIP).create()));
flowerGenerator.add("white_tulips", 1, (new GeneratorFlora.Builder().with(EnumFlowerType.WHITE_TULIP).create()));
flowerGenerator.add("blue_hydrangeas", 1, (new GeneratorFlora.Builder().with(BOPFlowers.BLUE_HYDRANGEA).create()));
flowerGenerator.add("bluebells", 1, (new GeneratorFlora.Builder().with(BOPFlowers.BLUEBELLS).create()));
flowerGenerator.add("bromeliads", 1, (new GeneratorFlora.Builder().with(BOPFlowers.BROMELIAD).create()));
flowerGenerator.add("burning_blossoms", 1, (new GeneratorFlora.Builder().with(BOPFlowers.BURNING_BLOSSOM).create()));
flowerGenerator.add("clover", 1, (new GeneratorFlora.Builder().with(BOPFlowers.CLOVER).create()));
flowerGenerator.add("dandelions", 1, (new GeneratorFlora.Builder().with(BOPFlowers.DANDELION).create()));
flowerGenerator.add("deathblooms", 1, (new GeneratorFlora.Builder().with(BOPFlowers.DEATHBLOOM).create()));
flowerGenerator.add("enterlotuses", 1, (new GeneratorFlora.Builder().with(BOPFlowers.ENDERLOTUS).create()));
flowerGenerator.add("glowflowers", 1, (new GeneratorFlora.Builder().with(BOPFlowers.GLOWFLOWER).create()));
flowerGenerator.add("goldenrods", 1, (new GeneratorFlora.Builder().with(BOPFlowers.GOLDENROD).create()));
flowerGenerator.add("icy_irises", 1, (new GeneratorFlora.Builder().with(BOPFlowers.ICY_IRIS).create()));
flowerGenerator.add("lavender", 1, (new GeneratorFlora.Builder().with(BOPFlowers.LAVENDER).create()));
flowerGenerator.add("lilies_of_the_valley", 1, (new GeneratorFlora.Builder().with(BOPFlowers.LILY_OF_THE_VALLEY).create()));
flowerGenerator.add("miners_delights", 1, (new GeneratorFlora.Builder().with(BOPFlowers.MINERS_DELIGHT).create()));
flowerGenerator.add("orange_cosmoses", 1, (new GeneratorFlora.Builder().with(BOPFlowers.ORANGE_COSMOS).create()));
flowerGenerator.add("pink_daffodils", 1, (new GeneratorFlora.Builder().with(BOPFlowers.PINK_DAFFODIL).create()));
flowerGenerator.add("pink_hibiscuses", 1, (new GeneratorFlora.Builder().with(BOPFlowers.PINK_HIBISCUS).create()));
flowerGenerator.add("roses", 1, (new GeneratorFlora.Builder().with(BOPFlowers.ROSE).create()));
flowerGenerator.add("swampflowers", 1, (new GeneratorFlora.Builder().with(BOPFlowers.SWAMPFLOWER).create()));
flowerGenerator.add("violets", 1, (new GeneratorFlora.Builder().with(BOPFlowers.VIOLET).create()));
flowerGenerator.add("white_anemones", 1, (new GeneratorFlora.Builder().with(BOPFlowers.WHITE_ANEMONE).create()));
flowerGenerator.add("wildflowers", 1, (new GeneratorFlora.Builder().with(BOPFlowers.WILDFLOWER).create()));
flowerGenerator.add("paeonias", 1, (new GeneratorDoubleFlora.Builder()).with(BlockDoublePlant.EnumPlantType.PAEONIA).create());
flowerGenerator.add("tall_roses", 1, (new GeneratorDoubleFlora.Builder()).with(BlockDoublePlant.EnumPlantType.ROSE).create());
flowerGenerator.add("sunflowers", 1, (new GeneratorDoubleFlora.Builder()).with(BlockDoublePlant.EnumPlantType.SUNFLOWER).create());
flowerGenerator.add("syringas", 1, (new GeneratorDoubleFlora.Builder()).with(BlockDoublePlant.EnumPlantType.SYRINGA).create());
// shrooms
this.addGenerator("brown_mushrooms", GeneratorStage.SHROOM,(new GeneratorFlora.Builder()).amountPerChunk(0.2F).with(Blocks.brown_mushroom.getDefaultState()).create());
this.addGenerator("red_mushrooms", GeneratorStage.SHROOM,(new GeneratorFlora.Builder()).amountPerChunk(0.2F).with(Blocks.red_mushroom.getDefaultState()).create());
this.addGenerator("blue_milk_caps", GeneratorStage.SHROOM,(new GeneratorFlora.Builder()).amountPerChunk(0.2F).with(BlockBOPMushroom.MushroomType.BLUE_MILK_CAP).create());
this.addGenerator("flat_mushrooms", GeneratorStage.SHROOM,(new GeneratorFlora.Builder()).amountPerChunk(0.2F).with(BlockBOPMushroom.MushroomType.FLAT_MUSHROOM).create());
this.addGenerator("glowshrooms", GeneratorStage.SHROOM,(new GeneratorFlora.Builder()).amountPerChunk(0.2F).with(BlockBOPMushroom.MushroomType.GLOWSHROOM).create());
this.addGenerator("portobellos", GeneratorStage.SHROOM,(new GeneratorFlora.Builder()).amountPerChunk(0.2F).with(BlockBOPMushroom.MushroomType.PORTOBELLO).create());
this.addGenerator("shadow_shrooms", GeneratorStage.SHROOM,(new GeneratorFlora.Builder()).amountPerChunk(0.2F).with(BlockBOPMushroom.MushroomType.SHADOW_SHROOM).create());
this.addGenerator("toadstools", GeneratorStage.SHROOM,(new GeneratorFlora.Builder()).amountPerChunk(0.2F).with(BlockBOPMushroom.MushroomType.TOADSTOOL).create());
// big mushrooms
GeneratorWeighted mushroomGenerator = new GeneratorWeighted(0.5F);
this.addGenerator("big_mushrooms", GeneratorStage.BIG_SHROOM, mushroomGenerator);
mushroomGenerator.add("brown_mushroom", 1, (new GeneratorBigMushroom.Builder()).mushroomType(GeneratorBigMushroom.BigMushroomType.BROWN).create());
mushroomGenerator.add("red_mushroom", 1, (new GeneratorBigMushroom.Builder()).mushroomType(GeneratorBigMushroom.BigMushroomType.RED).create());
// gem
this.addGenerator("amber", GeneratorStage.SAND, (new GeneratorOreSingle.Builder()).amountPerChunk(12).with(BOPGems.AMBER).create());
}
@Override
public void applySettings(BOPWorldSettings settings)
{
if (!settings.generateBopGems) {this.removeGenerator("amber");}
}
@Override
public int getGrassColorAtPos(BlockPos pos)
{
return 0xFFFFFF;
}
@Override
public int getFoliageColorAtPos(BlockPos pos)
{
return 0xFFFFFF;
}
}

View File

@ -0,0 +1,95 @@
/*******************************************************************************
* Copyright 2015, 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 net.minecraft.block.BlockPlanks;
import net.minecraft.block.BlockTallGrass;
import net.minecraft.util.BlockPos;
import biomesoplenty.api.biome.BOPBiome;
import biomesoplenty.api.biome.generation.GeneratorStage;
import biomesoplenty.api.biome.generation.GeneratorWeighted;
import biomesoplenty.common.enums.BOPClimates;
import biomesoplenty.common.enums.BOPGems;
import biomesoplenty.common.enums.BOPPlants;
import biomesoplenty.common.world.BOPWorldSettings;
import biomesoplenty.common.world.feature.GeneratorFlora;
import biomesoplenty.common.world.feature.GeneratorGrass;
import biomesoplenty.common.world.feature.GeneratorMixedLily;
import biomesoplenty.common.world.feature.GeneratorOreSingle;
import biomesoplenty.common.world.feature.tree.GeneratorBulbTree;
import biomesoplenty.common.world.feature.tree.GeneratorBush;
public class BiomeGenEucalyptusForest extends BOPBiome
{
public BiomeGenEucalyptusForest()
{
// terrain
this.terrainSettings.avgHeight(64).heightVariation(10, 20);
this.setColor(0x9DCC70);
this.setTemperatureRainfall(0.9F, 0.1F);
this.addWeight(BOPClimates.SAVANNA, 7);
// trees
GeneratorWeighted treeGenerator = new GeneratorWeighted(5);
this.addGenerator("trees", GeneratorStage.TREE, treeGenerator);
treeGenerator.add("eucalyptus_bush", 1, (new GeneratorBush.Builder()).log(BlockPlanks.EnumType.BIRCH).leaves(BlockPlanks.EnumType.BIRCH).create());
treeGenerator.add("tall_eucalyptus", 4, (new GeneratorBulbTree.Builder()).minHeight(10).maxHeight(25).log(BlockPlanks.EnumType.BIRCH).leaves(BlockPlanks.EnumType.BIRCH).vine(null).create());
// TODO: Add Eucalyptus wood as a new wood type - the bark is quite special
// grasses
GeneratorWeighted grassGenerator = new GeneratorWeighted(1.4F);
this.addGenerator("grass", GeneratorStage.GRASS, grassGenerator);
grassGenerator.add("shortgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.SHORTGRASS).create());
grassGenerator.add("mediumgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.MEDIUMGRASS).create());
grassGenerator.add("wheatgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.WHEATGRASS).create());
grassGenerator.add("tallgrass", 2, (new GeneratorGrass.Builder()).with(BlockTallGrass.EnumType.GRASS).create());
grassGenerator.add("fern", 4, (new GeneratorGrass.Builder()).with(BlockTallGrass.EnumType.FERN).create());
// other plants
this.addGenerator("sprouts", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.2F).with(BOPPlants.SPROUT).create());
this.addGenerator("bushes", GeneratorStage.FLOWERS, (new GeneratorFlora.Builder()).amountPerChunk(0.1F).with(BOPPlants.BUSH).create());
this.addGenerator("shrubs", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.1F).with(BOPPlants.SHRUB).create());
// water plants
this.addGenerator("mixed_lily", GeneratorStage.LILYPAD, (new GeneratorMixedLily.Builder()).amountPerChunk(0.8F).create());
// gem
this.addGenerator("topaz", GeneratorStage.SAND, (new GeneratorOreSingle.Builder()).amountPerChunk(12).with(BOPGems.TOPAZ).create());
}
@Override
public void applySettings(BOPWorldSettings settings)
{
if (!settings.generateBopGems) {this.removeGenerator("topaz");}
}
@Override
public int getGrassColorAtPos(BlockPos pos)
{
return 0x9DCC70;
}
@Override
public int getFoliageColorAtPos(BlockPos pos)
{
return 0x71CE52;
}
/*
public int getFogColour(int x, int y, int z)
{
return 14805212;
}
*/
}

View File

@ -0,0 +1,145 @@
/*******************************************************************************
* Copyright 2015, 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 net.minecraft.block.BlockDoublePlant;
import net.minecraft.block.BlockFlower;
import net.minecraft.block.BlockPlanks;
import net.minecraft.block.BlockTallGrass;
import net.minecraft.init.Blocks;
import net.minecraft.util.BlockPos;
import biomesoplenty.api.biome.BOPBiome;
import biomesoplenty.api.biome.generation.GeneratorStage;
import biomesoplenty.api.biome.generation.GeneratorWeighted;
import biomesoplenty.api.block.BOPBlocks;
import biomesoplenty.api.block.BlockQueries;
import biomesoplenty.common.block.BlockBOPCoral;
import biomesoplenty.common.block.BlockBOPDoublePlant;
import biomesoplenty.common.block.BlockBOPMushroom;
import biomesoplenty.common.block.BlockBOPPlant;
import biomesoplenty.common.enums.BOPClimates;
import biomesoplenty.common.enums.BOPGems;
import biomesoplenty.common.enums.BOPPlants;
import biomesoplenty.common.enums.BOPTrees;
import biomesoplenty.common.enums.BOPWoods;
import biomesoplenty.common.util.biome.GeneratorUtils.ScatterYMethod;
import biomesoplenty.common.world.BOPWorldSettings;
import biomesoplenty.common.world.feature.GeneratorColumns;
import biomesoplenty.common.world.feature.GeneratorDoubleFlora;
import biomesoplenty.common.world.feature.GeneratorFlora;
import biomesoplenty.common.world.feature.GeneratorGrass;
import biomesoplenty.common.world.feature.GeneratorMixedLily;
import biomesoplenty.common.world.feature.GeneratorOreSingle;
import biomesoplenty.common.world.feature.GeneratorWaterside;
import biomesoplenty.common.world.feature.tree.GeneratorBigTree;
import biomesoplenty.common.world.feature.tree.GeneratorTaigaTree;
public class BiomeGenFen extends BOPBiome
{
public BiomeGenFen()
{
// terrain
this.terrainSettings.avgHeight(64).heightVariation(8, 15);
this.setColor(0xBAC481);
this.setTemperatureRainfall(0.4F, 0.4F);
this.addWeight(BOPClimates.WET_TEMPERATE, 10);
// TODO: this.theBiomeDecorator.bopFeatures.waterSpringsPerChunk = 99;
// gravel
this.addGenerator("gravel", GeneratorStage.SAND_PASS2, (new GeneratorWaterside.Builder()).amountPerChunk(4).maxRadius(7).with(Blocks.gravel.getDefaultState()).create());
// mud
this.addGenerator("mud", GeneratorStage.SAND_PASS2, (new GeneratorWaterside.Builder()).amountPerChunk(3).maxRadius(7).with(BOPBlocks.mud.getDefaultState()).create());
// trees and logs
GeneratorWeighted treeGenerator = new GeneratorWeighted(9);
this.addGenerator("trees", GeneratorStage.TREE, treeGenerator);
treeGenerator.add("dark_oak_taiga", 5, (new GeneratorTaigaTree.Builder()).log(BlockPlanks.EnumType.DARK_OAK).maxHeight(14).leaves(BlockPlanks.EnumType.DARK_OAK).create());
treeGenerator.add("dying", 10, (new GeneratorTaigaTree.Builder()).log(BlockPlanks.EnumType.DARK_OAK).maxHeight(14).leaves(BOPTrees.DEAD).create());
treeGenerator.add("dead", 1, (new GeneratorBigTree.Builder()).log(BOPWoods.DEAD).leaves(Blocks.air.getDefaultState()).maxHeight(14).create());
// grasses
GeneratorWeighted grassGenerator = new GeneratorWeighted(2.5F);
this.addGenerator("grass", GeneratorStage.GRASS, grassGenerator);
grassGenerator.add("shortgrass", 4, (new GeneratorGrass.Builder()).with(BOPPlants.SHORTGRASS).create());
grassGenerator.add("mediumgrass", 2, (new GeneratorGrass.Builder()).with(BOPPlants.MEDIUMGRASS).create());
grassGenerator.add("wheatgrass", 2, (new GeneratorGrass.Builder()).with(BOPPlants.WHEATGRASS).create());
grassGenerator.add("dampgrass", 2, (new GeneratorGrass.Builder()).with(BOPPlants.DAMPGRASS).create());
grassGenerator.add("tallgrass", 2, (new GeneratorGrass.Builder()).with(BlockTallGrass.EnumType.GRASS).create());
grassGenerator.add("doublegrass", 1, (new GeneratorDoubleFlora.Builder()).with(BlockDoublePlant.EnumPlantType.GRASS).create());
// flowers
GeneratorWeighted flowerGenerator = new GeneratorWeighted(0.5F);
this.addGenerator("flowers", GeneratorStage.GRASS, flowerGenerator);
flowerGenerator.add("poppy", 1, (new GeneratorFlora.Builder()).with(BlockFlower.EnumFlowerType.POPPY).create());
// other plants
this.addGenerator("cattails", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.1F).with(BOPPlants.CATTAIL).create());
this.addGenerator("double_cattails", GeneratorStage.FLOWERS,(new GeneratorDoubleFlora.Builder()).amountPerChunk(0.1F).with(BlockBOPDoublePlant.DoublePlantType.TALL_CATTAIL).create());
this.addGenerator("river_cane", GeneratorStage.FLOWERS,(new GeneratorColumns.Builder()).amountPerChunk(1.0F).generationAttempts(24).placeOn(BlockQueries.litFertileWaterside).with(BlockBOPPlant.paging.getVariantState(BOPPlants.RIVERCANE)).minHeight(1).maxHeight(3).create());
this.addGenerator("koru", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.1F).with(BOPPlants.KORU).create());
this.addGenerator("shrubs", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.7F).with(BOPPlants.SHRUB).create());
this.addGenerator("dead_leaf_piles", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(1.0F).with(BOPPlants.DEADLEAFPILE).generationAttempts(64).create());
// water plants
this.addGenerator("water_reeds", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(1.0F).with(BOPPlants.REED).generationAttempts(32).create());
this.addGenerator("mixed_lily", GeneratorStage.LILYPAD, (new GeneratorMixedLily.Builder()).amountPerChunk(2.0F).generationAttempts(96).create());
this.addGenerator("algae", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(3.0F).replace(Blocks.water).with(BOPBlocks.coral.getDefaultState().withProperty(BlockBOPCoral.VARIANT, BlockBOPCoral.CoralType.ALGAE)).generationAttempts(32).scatterYMethod(ScatterYMethod.AT_GROUND).create());
// shrooms
this.addGenerator("toadstools", GeneratorStage.SHROOM,(new GeneratorFlora.Builder()).amountPerChunk(0.2F).with(BlockBOPMushroom.MushroomType.TOADSTOOL).create());
this.addGenerator("portobellos", GeneratorStage.SHROOM,(new GeneratorFlora.Builder()).amountPerChunk(0.1F).with(BlockBOPMushroom.MushroomType.PORTOBELLO).create());
this.addGenerator("brown_mushrooms", GeneratorStage.SHROOM,(new GeneratorFlora.Builder()).amountPerChunk(0.4F).with(Blocks.brown_mushroom.getDefaultState()).create());
this.addGenerator("red_mushrooms", GeneratorStage.SHROOM,(new GeneratorFlora.Builder()).amountPerChunk(0.4F).with(Blocks.red_mushroom.getDefaultState()).create());
// gem
this.addGenerator("amber", GeneratorStage.SAND, (new GeneratorOreSingle.Builder()).amountPerChunk(12).with(BOPGems.AMBER).create());
}
@Override
public void applySettings(BOPWorldSettings settings)
{
if (!settings.generateBopGems) {this.removeGenerator("amber");}
}
@Override
public int getGrassColorAtPos(BlockPos pos)
{
return 0xBAC481;
}
@Override
public int getFoliageColorAtPos(BlockPos pos)
{
return 0xCEB979;
}
/* TODO
@Override
public int getFogColour(int x, int y, int z)
{
return 12638463;
}
@Override
public float getFogDensity(int x, int y, int z)
{
// TODO Auto-generated method stub
return 0.8F;
}
*/
}

View File

@ -0,0 +1,75 @@
/*******************************************************************************
* Copyright 2015, 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 net.minecraft.block.BlockFlower.EnumFlowerType;
import net.minecraft.block.BlockTallGrass;
import net.minecraft.util.BlockPos;
import biomesoplenty.api.biome.BOPBiome;
import biomesoplenty.api.biome.generation.GeneratorStage;
import biomesoplenty.api.biome.generation.GeneratorWeighted;
import biomesoplenty.common.enums.BOPClimates;
import biomesoplenty.common.enums.BOPGems;
import biomesoplenty.common.enums.BOPPlants;
import biomesoplenty.common.world.BOPWorldSettings;
import biomesoplenty.common.world.feature.GeneratorFlora;
import biomesoplenty.common.world.feature.GeneratorGrass;
import biomesoplenty.common.world.feature.GeneratorOreSingle;
public class BiomeGenFlowerField extends BOPBiome
{
public BiomeGenFlowerField()
{
// terrain
this.terrainSettings.avgHeight(64).heightVariation(4, 12);
this.setColor(4044093);
this.setTemperatureRainfall(0.6F, 0.7F);
this.addWeight(BOPClimates.COOL_TEMPERATE, 3);
// flowers
GeneratorWeighted flowerGenerator = new GeneratorWeighted(99);
this.addGenerator("flowers", GeneratorStage.GRASS, flowerGenerator);
flowerGenerator.add("pink_tulip", 2, (new GeneratorFlora.Builder().with(EnumFlowerType.PINK_TULIP).create()));
flowerGenerator.add("white_tulip", 5, (new GeneratorFlora.Builder().with(EnumFlowerType.WHITE_TULIP).create()));
flowerGenerator.add("orange_tulip", 7, (new GeneratorFlora.Builder().with(EnumFlowerType.ORANGE_TULIP).create()));
flowerGenerator.add("red_tulip", 10, (new GeneratorFlora.Builder().with(EnumFlowerType.RED_TULIP).create()));
// grasses
GeneratorWeighted grassGenerator = new GeneratorWeighted(0.2F);
this.addGenerator("grass", GeneratorStage.GRASS, grassGenerator);
grassGenerator.add("wheatgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.WHEATGRASS).create());
grassGenerator.add("dampgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.DAMPGRASS).create());
grassGenerator.add("tallgrass", 2, (new GeneratorGrass.Builder()).with(BlockTallGrass.EnumType.GRASS).create());
// gem
this.addGenerator("peridot", GeneratorStage.SAND, (new GeneratorOreSingle.Builder()).amountPerChunk(12).with(BOPGems.PERIDOT).create());
}
@Override
public void applySettings(BOPWorldSettings settings)
{
if (!settings.generateBopGems) {this.removeGenerator("peridot");}
}
@Override
public int getGrassColorAtPos(BlockPos pos)
{
return 7390273;
}
@Override
public int getFoliageColorAtPos(BlockPos pos)
{
return 7390273;
}
}

View File

@ -0,0 +1,103 @@
/*******************************************************************************
* Copyright 2015, 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 net.minecraft.block.BlockTallGrass;
import net.minecraft.util.BlockPos;
import biomesoplenty.api.biome.BOPBiome;
import biomesoplenty.api.biome.generation.GeneratorStage;
import biomesoplenty.api.biome.generation.GeneratorWeighted;
import biomesoplenty.common.enums.BOPClimates;
import biomesoplenty.common.enums.BOPFlowers;
import biomesoplenty.common.enums.BOPGems;
import biomesoplenty.common.enums.BOPPlants;
import biomesoplenty.common.world.BOPWorldSettings;
import biomesoplenty.common.world.feature.GeneratorFlora;
import biomesoplenty.common.world.feature.GeneratorGrass;
import biomesoplenty.common.world.feature.GeneratorOreSingle;
import biomesoplenty.common.world.feature.tree.GeneratorBasicTree;
public class BiomeGenFrostForest extends BOPBiome
{
public BiomeGenFrostForest()
{
// terrain
this.terrainSettings.avgHeight(66).heightVariation(6, 21);
this.setColor(0xABD6BC);
this.skyColor = 0xCEE0EA;
this.setEnableSnow();
this.setTemperatureRainfall(0.0F, 0.5F);
this.addWeight(BOPClimates.TUNDRA, 10);
// trees
GeneratorWeighted treeGenerator = new GeneratorWeighted(3);
this.addGenerator("trees", GeneratorStage.TREE, treeGenerator);
treeGenerator.add("oak", 1, (new GeneratorBasicTree.Builder()).create());
// grasses
GeneratorWeighted grassGenerator = new GeneratorWeighted(2.0F);
this.addGenerator("grass", GeneratorStage.GRASS, grassGenerator);
grassGenerator.add("tallgrass", 2, (new GeneratorGrass.Builder()).with(BlockTallGrass.EnumType.GRASS).create());
grassGenerator.add("wheatgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.WHEATGRASS).create());
grassGenerator.add("dampgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.DAMPGRASS).create());
// other plants
this.addGenerator("shrubs", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.1F).with(BOPPlants.SHRUB).create());
this.addGenerator("leaf_piles", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.2F).with(BOPPlants.LEAFPILE).create());
this.addGenerator("dead_leaf_piles", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.4F).with(BOPPlants.DEADLEAFPILE).create());
// flowers
GeneratorWeighted flowerGenerator = new GeneratorWeighted(0.3F);
this.addGenerator("flowers", GeneratorStage.GRASS, flowerGenerator);
flowerGenerator.add("icy_irises", 1, (new GeneratorFlora.Builder().with(BOPFlowers.ICY_IRIS).create()));
flowerGenerator.add("violets", 1, (new GeneratorFlora.Builder().with(BOPFlowers.VIOLET).create()));
// gem
this.addGenerator("tanzanite", GeneratorStage.SAND, (new GeneratorOreSingle.Builder()).amountPerChunk(12).with(BOPGems.TANZANITE).create());
}
@Override
public void applySettings(BOPWorldSettings settings)
{
if (!settings.generateBopGems) {this.removeGenerator("tanzanite");}
}
@Override
public int getGrassColorAtPos(BlockPos pos)
{
return 0xABD6BC;
}
@Override
public int getFoliageColorAtPos(BlockPos pos)
{
return 0xABD6BC;
}
/* TODO
@Override
public int getFogColour(int x, int y, int z)
{
return 12239814;
}
@Override
public float getFogDensity(int x, int y, int z)
{
// TODO Auto-generated method stub
return 0.6F;
}
*/
}

View File

@ -0,0 +1,142 @@
/*******************************************************************************
* Copyright 2015, 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 net.minecraft.block.BlockPlanks;
import net.minecraft.block.BlockTallGrass;
import net.minecraft.entity.passive.EntityMooshroom;
import net.minecraft.init.Blocks;
import net.minecraft.util.BlockPos;
import biomesoplenty.api.biome.BOPBiome;
import biomesoplenty.api.biome.generation.GeneratorStage;
import biomesoplenty.api.biome.generation.GeneratorWeighted;
import biomesoplenty.api.block.BOPBlocks;
import biomesoplenty.api.block.BlockQueries;
import biomesoplenty.common.block.BlockBOPMushroom;
import biomesoplenty.common.block.BlockBOPPlant;
import biomesoplenty.common.enums.BOPClimates;
import biomesoplenty.common.enums.BOPFlowers;
import biomesoplenty.common.enums.BOPGems;
import biomesoplenty.common.enums.BOPPlants;
import biomesoplenty.common.util.biome.GeneratorUtils.ScatterYMethod;
import biomesoplenty.common.world.BOPWorldSettings;
import biomesoplenty.common.world.feature.GeneratorBigMushroom;
import biomesoplenty.common.world.feature.GeneratorColumns;
import biomesoplenty.common.world.feature.GeneratorFlora;
import biomesoplenty.common.world.feature.GeneratorGrass;
import biomesoplenty.common.world.feature.GeneratorMixedLily;
import biomesoplenty.common.world.feature.GeneratorOreSingle;
import biomesoplenty.common.world.feature.GeneratorSplotches;
import biomesoplenty.common.world.feature.tree.GeneratorBush;
import biomesoplenty.common.world.feature.tree.GeneratorMegaJungleTree;
public class BiomeGenFungiForest extends BOPBiome
{
public BiomeGenFungiForest()
{
// terrain
this.terrainSettings.avgHeight(66).heightVariation(10, 28);
this.setColor(0xF0F970);
this.skyColor = 0x73C69E;
this.waterColorMultiplier = 0x00FF2E;
this.setTemperatureRainfall(0.5F, 0.5F);
this.addWeight(BOPClimates.WARM_TEMPERATE, 3);
this.spawnableCreatureList.clear();
this.spawnableWaterCreatureList.clear();
this.spawnableCreatureList.add(new SpawnListEntry(EntityMooshroom.class, 3, 4, 8));
// mycelium
this.addGenerator("mycelium", GeneratorStage.SAND, (new GeneratorSplotches.Builder()).replace(Blocks.grass).with(Blocks.mycelium.getDefaultState()).scatterYMethod(ScatterYMethod.AT_GROUND).splotchSize(32).create());
// trees
GeneratorWeighted treeGenerator = new GeneratorWeighted(12);
this.addGenerator("trees", GeneratorStage.TREE, treeGenerator);
treeGenerator.add("mega_oak", 1, (new GeneratorMegaJungleTree.Builder()).log(BlockPlanks.EnumType.OAK).leaves(BlockPlanks.EnumType.OAK).vine(BOPBlocks.ivy.getDefaultState()).create());
treeGenerator.add("oak_bush", 1, (new GeneratorBush.Builder()).create());
// grasses
GeneratorWeighted grassGenerator = new GeneratorWeighted(5.0F);
this.addGenerator("grass", GeneratorStage.GRASS, grassGenerator);
grassGenerator.add("tallgrass", 2, (new GeneratorGrass.Builder()).with(BlockTallGrass.EnumType.GRASS).create());
grassGenerator.add("ferns", 4, (new GeneratorGrass.Builder()).with(BlockTallGrass.EnumType.FERN).create());
grassGenerator.add("shortgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.SHORTGRASS).create());
grassGenerator.add("mediumgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.MEDIUMGRASS).create());
grassGenerator.add("wheatgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.WHEATGRASS).create());
// other plants
this.addGenerator("sprouts", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.4F).with(BOPPlants.SPROUT).create());
this.addGenerator("bushes", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.7F).with(BOPPlants.BUSH).create());
this.addGenerator("river_cane", GeneratorStage.FLOWERS,(new GeneratorColumns.Builder()).amountPerChunk(0.4F).placeOn(BlockQueries.litFertileWaterside).with(BlockBOPPlant.paging.getVariantState(BOPPlants.RIVERCANE)).minHeight(1).maxHeight(3).create());
this.addGenerator("shrubs", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.1F).with(BOPPlants.SHRUB).create());
this.addGenerator("clover_patches", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(2.0F).with(BOPPlants.CLOVERPATCH).create());
// water plants
this.addGenerator("mixed_lily", GeneratorStage.LILYPAD, (new GeneratorMixedLily.Builder()).amountPerChunk(1.2F).create());
// flowers
GeneratorWeighted flowerGenerator = new GeneratorWeighted(1.0F);
this.addGenerator("flowers", GeneratorStage.GRASS, flowerGenerator);
flowerGenerator.add("swampflowers", 1, (new GeneratorFlora.Builder().with(BOPFlowers.SWAMPFLOWER).create()));
// shrooms
GeneratorWeighted mushroomGenerator = new GeneratorWeighted(4.0F);
this.addGenerator("mushrooms", GeneratorStage.SHROOM, mushroomGenerator);
mushroomGenerator.add("brown_mushrooms", 4, (new GeneratorFlora.Builder()).with(Blocks.brown_mushroom.getDefaultState()).create());
mushroomGenerator.add("red_mushrooms", 4, (new GeneratorFlora.Builder()).with(Blocks.red_mushroom.getDefaultState()).create());
mushroomGenerator.add("blue_milk_caps", 2, (new GeneratorFlora.Builder()).with(BlockBOPMushroom.MushroomType.BLUE_MILK_CAP).create());
mushroomGenerator.add("flat_mushrooms", 2, (new GeneratorFlora.Builder()).with(BlockBOPMushroom.MushroomType.FLAT_MUSHROOM).create());
mushroomGenerator.add("glowshrooms", 1, (new GeneratorFlora.Builder()).with(BlockBOPMushroom.MushroomType.GLOWSHROOM).create());
mushroomGenerator.add("portobellos", 6, (new GeneratorFlora.Builder()).with(BlockBOPMushroom.MushroomType.PORTOBELLO).create());
mushroomGenerator.add("toadstools", 4, (new GeneratorFlora.Builder()).with(BlockBOPMushroom.MushroomType.TOADSTOOL).create());
// big mushrooms
GeneratorWeighted bigMushroomGenerator = new GeneratorWeighted(6);
this.addGenerator("big_mushrooms", GeneratorStage.BIG_SHROOM, bigMushroomGenerator);
bigMushroomGenerator.add("brown_mushroom", 1, (new GeneratorBigMushroom.Builder()).mushroomType(GeneratorBigMushroom.BigMushroomType.BROWN).create());
bigMushroomGenerator.add("red_mushroom", 1, (new GeneratorBigMushroom.Builder()).mushroomType(GeneratorBigMushroom.BigMushroomType.RED).create());
// gem
this.addGenerator("amber", GeneratorStage.SAND, (new GeneratorOreSingle.Builder()).amountPerChunk(12).with(BOPGems.AMBER).create());
}
@Override
public void applySettings(BOPWorldSettings settings)
{
if (!settings.generateBopGems) {this.removeGenerator("amber");}
}
@Override
public int getGrassColorAtPos(BlockPos pos)
{
return 0x57ED64;
}
@Override
public int getFoliageColorAtPos(BlockPos pos)
{
return 0x57ED64;
}
/*
@Override
public float getFogDensity(int x, int y, int z)
{
// TODO Auto-generated method stub
return 0.6F;
}
*/
}

View File

@ -0,0 +1,106 @@
/*******************************************************************************
* Copyright 2015, 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 net.minecraft.block.BlockDoublePlant;
import net.minecraft.block.BlockFlower.EnumFlowerType;
import net.minecraft.block.BlockTallGrass;
import net.minecraft.init.Blocks;
import net.minecraft.util.BlockPos;
import biomesoplenty.api.biome.BOPBiome;
import biomesoplenty.api.biome.generation.GeneratorStage;
import biomesoplenty.api.biome.generation.GeneratorWeighted;
import biomesoplenty.api.block.BOPBlocks;
import biomesoplenty.common.block.BlockBOPGrass;
import biomesoplenty.common.enums.BOPClimates;
import biomesoplenty.common.enums.BOPFlowers;
import biomesoplenty.common.enums.BOPGems;
import biomesoplenty.common.enums.BOPPlants;
import biomesoplenty.common.world.BOPWorldSettings;
import biomesoplenty.common.world.feature.GeneratorBigFlower;
import biomesoplenty.common.world.feature.GeneratorDoubleFlora;
import biomesoplenty.common.world.feature.GeneratorFlora;
import biomesoplenty.common.world.feature.GeneratorGrass;
import biomesoplenty.common.world.feature.GeneratorOreSingle;
import biomesoplenty.common.world.feature.GeneratorSplatter;
import biomesoplenty.common.world.feature.tree.GeneratorBush;
public class BiomeGenGarden extends BOPBiome
{
public BiomeGenGarden()
{
// terrain
this.terrainSettings.avgHeight(66).heightVariation(6, 14).octaves(0, 0, 1, 1, 2, 2);
this.setColor(0x74D374);
this.setTemperatureRainfall(0.7F, 0.8F);
this.topBlock = BOPBlocks.grass.getDefaultState().withProperty(BlockBOPGrass.VARIANT, BlockBOPGrass.BOPGrassType.DAISY);
this.addWeight(BOPClimates.COOL_TEMPERATE, 3);
this.spawnableCreatureList.clear();
// TODO: implement rosester? this.spawnableCreatureList.add(new SpawnListEntry(EntityRosester.class, 10, 4, 4));
// trees
GeneratorWeighted treeGenerator = new GeneratorWeighted(2);
this.addGenerator("trees", GeneratorStage.TREE, treeGenerator);
treeGenerator.add("red_big_flowers", 1, (new GeneratorBigFlower.Builder()).flowerType(GeneratorBigFlower.BigFlowerType.RED).create());
treeGenerator.add("yellow_big_flowers", 1, (new GeneratorBigFlower.Builder()).flowerType(GeneratorBigFlower.BigFlowerType.YELLOW).create());
treeGenerator.add("oak_bush", 3, (new GeneratorBush.Builder()).create());
// grasses
GeneratorWeighted grassGenerator = new GeneratorWeighted(6.0F);
this.addGenerator("grass", GeneratorStage.GRASS, grassGenerator);
grassGenerator.add("tallgrass", 4, (new GeneratorGrass.Builder()).with(BlockTallGrass.EnumType.GRASS).create());
grassGenerator.add("shortgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.SHORTGRASS).create());
grassGenerator.add("mediumgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.MEDIUMGRASS).create());
grassGenerator.add("dampgrass", 2, (new GeneratorGrass.Builder()).with(BOPPlants.DAMPGRASS).create());
grassGenerator.add("doublegrass", 3, (new GeneratorDoubleFlora.Builder()).with(BlockDoublePlant.EnumPlantType.GRASS).create());
// other plants
this.addGenerator("sprouts", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.3F).with(BOPPlants.SPROUT).create());
this.addGenerator("shrubs", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(1.2F).with(BOPPlants.SHRUB).create());
this.addGenerator("melons", GeneratorStage.FLOWERS, (new GeneratorSplatter.Builder()).amountPerChunk(0.05F).placeOn(this.topBlock).with(Blocks.melon_block.getDefaultState()).generationAttempts(8).create());
// water plants
this.addGenerator("water_reeds", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(0.5F).with(BOPPlants.REED).generationAttempts(32).create());
// flowers
GeneratorWeighted flowerGenerator = new GeneratorWeighted(3.0F);
this.addGenerator("flowers", GeneratorStage.GRASS, flowerGenerator);
flowerGenerator.add("poppies", 5, (new GeneratorFlora.Builder().with(EnumFlowerType.POPPY).create()));
flowerGenerator.add("white_anemones", 6, (new GeneratorFlora.Builder().with(BOPFlowers.WHITE_ANEMONE).create()));
flowerGenerator.add("blue_hydrangeas", 3, (new GeneratorFlora.Builder().with(BOPFlowers.BLUE_HYDRANGEA).create()));
flowerGenerator.add("sunflowers", 1, (new GeneratorDoubleFlora.Builder()).with(BlockDoublePlant.EnumPlantType.SUNFLOWER).create());
// gem
this.addGenerator("peridot", GeneratorStage.SAND, (new GeneratorOreSingle.Builder()).amountPerChunk(12).with(BOPGems.PERIDOT).create());
}
@Override
public void applySettings(BOPWorldSettings settings)
{
if (!settings.generateBopGems) {this.removeGenerator("peridot");}
}
@Override
public int getGrassColorAtPos(BlockPos pos)
{
return 0x74D374;
}
@Override
public int getFoliageColorAtPos(BlockPos pos)
{
return 0x66E266;
}
}

View File

@ -0,0 +1,32 @@
/*******************************************************************************
* Copyright 2015, 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.block.BOPBlocks;
public class BiomeGenGlacier extends BiomeGenArctic
{
public BiomeGenGlacier()
{
super();
// clear weights - this biome shouldn't spawn except as arctic sub-biome
clearWeights();
// terrain - higher than arctic
this.terrainSettings.avgHeight(88).heightVariation(6, 6).octaves(1, 1, 3, 1, 1, 0);
this.avgDirtDepth = 16;
this.setColor(0xB0BBD9);
this.topBlock = BOPBlocks.hard_ice.getDefaultState();
this.fillerBlock = BOPBlocks.hard_ice.getDefaultState();
}
}

View File

@ -0,0 +1,103 @@
/*******************************************************************************
* Copyright 2015, 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 net.minecraft.block.BlockTallGrass;
import net.minecraft.block.BlockFlower.EnumFlowerType;
import net.minecraft.entity.passive.EntityHorse;
import net.minecraft.init.Blocks;
import net.minecraft.util.BlockPos;
import biomesoplenty.api.biome.BOPBiome;
import biomesoplenty.api.biome.generation.GeneratorStage;
import biomesoplenty.api.biome.generation.GeneratorWeighted;
import biomesoplenty.api.block.BlockQueries;
import biomesoplenty.common.block.BlockBOPDoublePlant;
import biomesoplenty.common.block.BlockBOPMushroom;
import biomesoplenty.common.block.BlockBOPPlant;
import biomesoplenty.common.enums.BOPClimates;
import biomesoplenty.common.enums.BOPGems;
import biomesoplenty.common.enums.BOPPlants;
import biomesoplenty.common.world.BOPWorldSettings;
import biomesoplenty.common.world.feature.GeneratorColumns;
import biomesoplenty.common.world.feature.GeneratorDoubleFlora;
import biomesoplenty.common.world.feature.GeneratorFlora;
import biomesoplenty.common.world.feature.GeneratorGrass;
import biomesoplenty.common.world.feature.GeneratorLakes;
import biomesoplenty.common.world.feature.GeneratorOreSingle;
import biomesoplenty.common.world.feature.GeneratorWaterside;
public class BiomeGenGrassland extends BOPBiome {
public BiomeGenGrassland() {
// terrain
this.terrainSettings.avgHeight(64).heightVariation(6, 25).octaves(0, 1, 2, 2, 1, 0).sidewaysNoise(0.1D);
this.setColor(0x7FDB7D);
this.setTemperatureRainfall(0.6F, 0.7F);
this.addWeight(BOPClimates.COOL_TEMPERATE, 7);
this.addWeight(BOPClimates.DRY_TEMPERATE, 7);
this.spawnableCreatureList.add(new SpawnListEntry(EntityHorse.class, 5, 2, 6));
// lakes
this.addGenerator("lakes", GeneratorStage.SAND, (new GeneratorLakes.Builder()).amountPerChunk(0.2F).waterLakeForBiome(this).create());
// gravel
this.addGenerator("gravel", GeneratorStage.SAND_PASS2, (new GeneratorWaterside.Builder()).amountPerChunk(4).maxRadius(7).with(Blocks.gravel.getDefaultState()).create());
// other plants
this.addGenerator("river_cane", GeneratorStage.FLOWERS,(new GeneratorColumns.Builder()).amountPerChunk(1.0F).generationAttempts(24).placeOn(BlockQueries.litFertileWaterside).with(BlockBOPPlant.paging.getVariantState(BOPPlants.RIVERCANE)).minHeight(1).maxHeight(3).create());
this.addGenerator("sugar_cane", GeneratorStage.FLOWERS,(new GeneratorColumns.Builder()).amountPerChunk(4.0F).generationAttempts(24).placeOn(BlockQueries.litFertileWaterside).with(Blocks.reeds.getDefaultState()).minHeight(1).maxHeight(3).create());
this.addGenerator("flax", GeneratorStage.FLOWERS,(new GeneratorDoubleFlora.Builder()).amountPerChunk(0.1F).with(BlockBOPDoublePlant.DoublePlantType.FLAX).generationAttempts(6).create());
// water plants
this.addGenerator("water_reeds", GeneratorStage.LILYPAD,(new GeneratorFlora.Builder()).amountPerChunk(0.3F).with(BOPPlants.REED).generationAttempts(32).create());
// flowers
this.addGenerator("flowers", GeneratorStage.FLOWERS, (new GeneratorFlora.Builder()).amountPerChunk(0.5F).with(EnumFlowerType.ALLIUM).create());
// shrooms
this.addGenerator("portobellos", GeneratorStage.SHROOM,(new GeneratorFlora.Builder()).amountPerChunk(0.3F).with(BlockBOPMushroom.MushroomType.PORTOBELLO).create());
// grasses
GeneratorWeighted grassGenerator = new GeneratorWeighted(0.6F);
this.addGenerator("grass", GeneratorStage.GRASS, grassGenerator);
grassGenerator.add("shortgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.SHORTGRASS).create());
grassGenerator.add("mediumgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.MEDIUMGRASS).create());
grassGenerator.add("wheatgrass", 2, (new GeneratorGrass.Builder()).with(BOPPlants.WHEATGRASS).create());
grassGenerator.add("dampgrass", 2, (new GeneratorGrass.Builder()).with(BOPPlants.DAMPGRASS).create());
grassGenerator.add("tallgrass", 4, (new GeneratorGrass.Builder()).with(BlockTallGrass.EnumType.GRASS).create());
// gem
this.addGenerator("peridot", GeneratorStage.SAND, (new GeneratorOreSingle.Builder()).amountPerChunk(12).with(BOPGems.PERIDOT).create());
}
@Override
public void applySettings(BOPWorldSettings settings)
{
if (!settings.generateBopGems) {this.removeGenerator("peridot");}
}
@Override
public int getGrassColorAtPos(BlockPos pos)
{
return 0x7FDB7D;
}
@Override
public int getFoliageColorAtPos(BlockPos pos)
{
return 0x7FDB7D;
}
}

View File

@ -0,0 +1,98 @@
/*******************************************************************************
* Copyright 2015, 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 net.minecraft.block.BlockDoublePlant;
import net.minecraft.block.BlockPlanks;
import net.minecraft.block.BlockTallGrass;
import net.minecraft.util.BlockPos;
import biomesoplenty.api.biome.BOPBiome;
import biomesoplenty.api.biome.generation.GeneratorStage;
import biomesoplenty.api.biome.generation.GeneratorWeighted;
import biomesoplenty.common.enums.BOPClimates;
import biomesoplenty.common.enums.BOPFlowers;
import biomesoplenty.common.enums.BOPGems;
import biomesoplenty.common.enums.BOPPlants;
import biomesoplenty.common.world.BOPWorldSettings;
import biomesoplenty.common.world.feature.GeneratorDoubleFlora;
import biomesoplenty.common.world.feature.GeneratorFlora;
import biomesoplenty.common.world.feature.GeneratorGrass;
import biomesoplenty.common.world.feature.GeneratorOreSingle;
import biomesoplenty.common.world.feature.tree.GeneratorBush;
import biomesoplenty.common.world.feature.tree.GeneratorProfileTree;
public class BiomeGenGrove extends BOPBiome
{
public BiomeGenGrove()
{
// terrain
this.terrainSettings.avgHeight(66).heightVariation(8, 20).octaves(0, 1, 2, 2, 1, 0).sidewaysNoise(0.1D);
this.setColor(0x517F51);
this.setTemperatureRainfall(0.7F, 0.8F);
this.addWeight(BOPClimates.WET_TEMPERATE, 10);
// other plants
this.addGenerator("sprouts", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.1F).with(BOPPlants.SPROUT).create());
this.addGenerator("berry_bushes", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.2F).with(BOPPlants.BERRYBUSH).create());
this.addGenerator("shrubs", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.3F).with(BOPPlants.SHRUB).create());
this.addGenerator("clover_patches", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(3.0F).with(BOPPlants.CLOVERPATCH).create());
this.addGenerator("leaf_piles", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.5F).with(BOPPlants.LEAFPILE).create());
// trees
GeneratorWeighted treeGenerator = new GeneratorWeighted(3);
this.addGenerator("trees", GeneratorStage.TREE, treeGenerator);
treeGenerator.add("dark_poplar", 1, (new GeneratorProfileTree.Builder()).minHeight(6).maxHeight(14).log(BlockPlanks.EnumType.DARK_OAK).leaves(BlockPlanks.EnumType.DARK_OAK).profile(GeneratorProfileTree.TreeProfile.POPLAR).create());
treeGenerator.add("poplar", 1, (new GeneratorProfileTree.Builder()).minHeight(8).maxHeight(18).log(BlockPlanks.EnumType.BIRCH).leaves(BlockPlanks.EnumType.BIRCH).profile(GeneratorProfileTree.TreeProfile.POPLAR).create());
treeGenerator.add("bush", 1, (new GeneratorBush.Builder()).create());
// flowers
GeneratorWeighted flowerGenerator = new GeneratorWeighted(5.0F);
this.addGenerator("flowers", GeneratorStage.GRASS, flowerGenerator);
flowerGenerator.add("clover", 4, (new GeneratorFlora.Builder().with(BOPFlowers.CLOVER).create()));
flowerGenerator.add("white_anemones", 2, (new GeneratorFlora.Builder().with(BOPFlowers.WHITE_ANEMONE).create()));
flowerGenerator.add("paeonias", 1, (new GeneratorDoubleFlora.Builder()).with(BlockDoublePlant.EnumPlantType.PAEONIA).create());
// grasses
GeneratorWeighted grassGenerator = new GeneratorWeighted(2.0F);
this.addGenerator("grass", GeneratorStage.GRASS, grassGenerator);
grassGenerator.add("mediumgrass", 2, (new GeneratorGrass.Builder()).with(BOPPlants.MEDIUMGRASS).create());
grassGenerator.add("wheatgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.WHEATGRASS).create());
grassGenerator.add("dampgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.DAMPGRASS).create());
grassGenerator.add("tallgrass", 1, (new GeneratorGrass.Builder()).with(BlockTallGrass.EnumType.GRASS).create());
// gem
this.addGenerator("amber", GeneratorStage.SAND, (new GeneratorOreSingle.Builder()).amountPerChunk(12).with(BOPGems.AMBER).create());
}
@Override
public void applySettings(BOPWorldSettings settings)
{
if (!settings.generateBopGems) {this.removeGenerator("amber");}
}
@Override
public int getGrassColorAtPos(BlockPos pos)
{
double noise = field_180281_af.func_151601_a((double)pos.getX() * 0.0225D, (double)pos.getZ() * 0.0225D);
return noise < -0.1D ? 0x517F51 : 0x609E58;
}
@Override
public int getFoliageColorAtPos(BlockPos pos)
{
double noise = field_180281_af.func_151601_a((double)pos.getX() * 0.0225D, (double)pos.getZ() * 0.0225D);
return noise < -0.1D ? 0x619961 : 0x75B569;
}
}

View File

@ -0,0 +1,108 @@
/*******************************************************************************
* Copyright 2015, 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 net.minecraft.block.BlockDoublePlant;
import net.minecraft.block.BlockFlower;
import net.minecraft.block.BlockTallGrass;
import net.minecraft.entity.passive.EntityHorse;
import net.minecraft.init.Blocks;
import net.minecraft.util.BlockPos;
import biomesoplenty.api.biome.BOPBiome;
import biomesoplenty.api.biome.generation.GeneratorStage;
import biomesoplenty.api.biome.generation.GeneratorWeighted;
import biomesoplenty.common.enums.BOPClimates;
import biomesoplenty.common.enums.BOPFlowers;
import biomesoplenty.common.enums.BOPGems;
import biomesoplenty.common.enums.BOPPlants;
import biomesoplenty.common.enums.BOPTrees;
import biomesoplenty.common.enums.BOPWoods;
import biomesoplenty.common.world.BOPWorldSettings;
import biomesoplenty.common.world.feature.GeneratorDoubleFlora;
import biomesoplenty.common.world.feature.GeneratorFlora;
import biomesoplenty.common.world.feature.GeneratorGrass;
import biomesoplenty.common.world.feature.GeneratorOreSingle;
import biomesoplenty.common.world.feature.GeneratorWaterside;
import biomesoplenty.common.world.feature.tree.GeneratorBasicTree;
import biomesoplenty.common.world.feature.tree.GeneratorBush;
public class BiomeGenHeathland extends BOPBiome
{
public BiomeGenHeathland()
{
// terrain
this.terrainSettings.avgHeight(64).heightVariation(6, 21);
this.setColor(0xCEC577);
this.setTemperatureRainfall(0.8F, 0.2F);
this.addWeight(BOPClimates.WARM_TEMPERATE, 10);
this.spawnableCreatureList.clear(); // none of your regular farmyard critters here
// TODO: why is there SO many horses?
this.spawnableCreatureList.add(new SpawnListEntry(EntityHorse.class, 1, 2, 6));
// gravel
this.addGenerator("gravel", GeneratorStage.SAND_PASS2, (new GeneratorWaterside.Builder()).amountPerChunk(4).maxRadius(7).with(Blocks.gravel.getDefaultState()).create());
// flowers
GeneratorWeighted flowerGenerator = new GeneratorWeighted(2.0F);
this.addGenerator("flowers", GeneratorStage.GRASS, flowerGenerator);
flowerGenerator.add("wildflower", 4, (new GeneratorFlora.Builder()).with(BOPFlowers.WILDFLOWER).create());
flowerGenerator.add("poppy", 3, (new GeneratorFlora.Builder()).with(BlockFlower.EnumFlowerType.POPPY).create());
flowerGenerator.add("syringa", 2, (new GeneratorDoubleFlora.Builder()).with(BlockDoublePlant.EnumPlantType.SYRINGA).create());
// grasses
GeneratorWeighted grassGenerator = new GeneratorWeighted(2.0F);
this.addGenerator("grass", GeneratorStage.GRASS, grassGenerator);
grassGenerator.add("tallgrass", 2, (new GeneratorGrass.Builder()).with(BlockTallGrass.EnumType.GRASS).create());
grassGenerator.add("mediumgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.MEDIUMGRASS).create());
grassGenerator.add("wheatgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.WHEATGRASS).create());
grassGenerator.add("dampgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.DAMPGRASS).create());
// trees
GeneratorWeighted treeGenerator = new GeneratorWeighted(3);
this.addGenerator("trees", GeneratorStage.TREE, treeGenerator);
treeGenerator.add("jacaranda_bush", 1, (new GeneratorBush.Builder()).log(BOPWoods.JACARANDA).leaves(BOPTrees.JACARANDA).create());
treeGenerator.add("oak_bush", 1, (new GeneratorBush.Builder()).create());
treeGenerator.add("oak", 1, (new GeneratorBasicTree.Builder()).create());
// other plants
this.addGenerator("berry_bushes", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.1F).with(BOPPlants.BERRYBUSH).create());
this.addGenerator("bushes", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.2F).with(BOPPlants.BUSH).create());
this.addGenerator("shrubs", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.5F).with(BOPPlants.SHRUB).create());
this.addGenerator("leaf_piles", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(1.0F).with(BOPPlants.LEAFPILE).create());
this.addGenerator("dead_leaf_piles", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.5F).with(BOPPlants.DEADLEAFPILE).create());
// gem
this.addGenerator("peridot", GeneratorStage.SAND, (new GeneratorOreSingle.Builder()).amountPerChunk(12).with(BOPGems.PERIDOT).create());
}
@Override
public void applySettings(BOPWorldSettings settings)
{
if (!settings.generateBopGems) {this.removeGenerator("peridot");}
}
@Override
public int getGrassColorAtPos(BlockPos pos)
{
return 0xCEC577;
}
@Override
public int getFoliageColorAtPos(BlockPos pos)
{
return 0xAEC681;
}
}

View File

@ -0,0 +1,66 @@
/*******************************************************************************
* Copyright 2015, 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 net.minecraft.block.BlockDoublePlant;
import net.minecraft.block.BlockTallGrass;
import net.minecraft.init.Blocks;
import biomesoplenty.api.biome.BOPBiome;
import biomesoplenty.api.biome.generation.GeneratorStage;
import biomesoplenty.api.biome.generation.GeneratorWeighted;
import biomesoplenty.common.enums.BOPClimates;
import biomesoplenty.common.enums.BOPPlants;
import biomesoplenty.common.util.biome.GeneratorUtils.ScatterYMethod;
import biomesoplenty.common.world.BOPWorldSettings;
import biomesoplenty.common.world.feature.GeneratorBlobs;
import biomesoplenty.common.world.feature.GeneratorDoubleFlora;
import biomesoplenty.common.world.feature.GeneratorFlora;
import biomesoplenty.common.world.feature.GeneratorGrass;
import biomesoplenty.common.world.feature.GeneratorOreSingle;
public class BiomeGenHighland extends BOPBiome
{
public BiomeGenHighland()
{
// terrain
this.terrainSettings.avgHeight(120).heightVariation(25, 25);
this.setColor(0x7CAD66);
this.setTemperatureRainfall(0.5F, 0.8F);
this.addWeight(BOPClimates.COOL_TEMPERATE, 7);
// other plants
this.addGenerator("wild_carrots", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.1F).with(BOPPlants.WILDCARROT).create());
// boulders
this.addGenerator("boulders", GeneratorStage.SAND, (new GeneratorBlobs.Builder()).amountPerChunk(0.5F).placeOn(Blocks.grass).with(Blocks.cobblestone.getDefaultState()).minRadius(0.3F).maxRadius(1.2F).numBalls(1).scatterYMethod(ScatterYMethod.AT_SURFACE).create());
this.addGenerator("big_boulders", GeneratorStage.SAND, (new GeneratorBlobs.Builder()).amountPerChunk(0.1F).placeOn(Blocks.grass).with(Blocks.cobblestone.getDefaultState()).minRadius(0.3F).maxRadius(4.0F).numBalls(3).scatterYMethod(ScatterYMethod.AT_SURFACE).create());
// grasses
GeneratorWeighted grassGenerator = new GeneratorWeighted(10);
this.addGenerator("grass", GeneratorStage.GRASS, grassGenerator);
grassGenerator.add("wheatgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.WHEATGRASS).create());
grassGenerator.add("dampgrass", 1, (new GeneratorGrass.Builder()).with(BOPPlants.DAMPGRASS).create());
grassGenerator.add("tallgrass", 1, (new GeneratorGrass.Builder()).with(BlockTallGrass.EnumType.GRASS).create());
grassGenerator.add("doublegrass", 4, (new GeneratorDoubleFlora.Builder()).with(BlockDoublePlant.EnumPlantType.GRASS).create());
// gem
this.addGenerator("peridot", GeneratorStage.SAND, (new GeneratorOreSingle.Builder()).amountPerChunk(12).with(Blocks.emerald_ore.getDefaultState()).create());
}
@Override
public void applySettings(BOPWorldSettings settings)
{
if (!settings.generateBopGems) {this.removeGenerator("peridot");}
}
}

Some files were not shown because too many files have changed in this diff Show More