Initial sanctuary sources
@@ -0,0 +1,15 @@
|
||||
.gradle/
|
||||
build/
|
||||
out/
|
||||
run/
|
||||
|
||||
*.class
|
||||
*.log
|
||||
|
||||
.idea/
|
||||
*.iml
|
||||
.vscode/
|
||||
.codex-cache/
|
||||
|
||||
*.jar
|
||||
!gradle/wrapper/gradle-wrapper.jar
|
||||
@@ -0,0 +1,165 @@
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
|
||||
This version of the GNU Lesser General Public License incorporates
|
||||
the terms and conditions of version 3 of the GNU General Public
|
||||
License, supplemented by the additional permissions listed below.
|
||||
|
||||
0. Additional Definitions.
|
||||
|
||||
As used herein, "this License" refers to version 3 of the GNU Lesser
|
||||
General Public License, and the "GNU GPL" refers to version 3 of the GNU
|
||||
General Public License.
|
||||
|
||||
"The Library" refers to a covered work governed by this License,
|
||||
other than an Application or a Combined Work as defined below.
|
||||
|
||||
An "Application" is any work that makes use of an interface provided
|
||||
by the Library, but which is not otherwise based on the Library.
|
||||
Defining a subclass of a class defined by the Library is deemed a mode
|
||||
of using an interface provided by the Library.
|
||||
|
||||
A "Combined Work" is a work produced by combining or linking an
|
||||
Application with the Library. The particular version of the Library
|
||||
with which the Combined Work was made is also called the "Linked
|
||||
Version".
|
||||
|
||||
The "Minimal Corresponding Source" for a Combined Work means the
|
||||
Corresponding Source for the Combined Work, excluding any source code
|
||||
for portions of the Combined Work that, considered in isolation, are
|
||||
based on the Application, and not on the Linked Version.
|
||||
|
||||
The "Corresponding Application Code" for a Combined Work means the
|
||||
object code and/or source code for the Application, including any data
|
||||
and utility programs needed for reproducing the Combined Work from the
|
||||
Application, but excluding the System Libraries of the Combined Work.
|
||||
|
||||
1. Exception to Section 3 of the GNU GPL.
|
||||
|
||||
You may convey a covered work under sections 3 and 4 of this License
|
||||
without being bound by section 3 of the GNU GPL.
|
||||
|
||||
2. Conveying Modified Versions.
|
||||
|
||||
If you modify a copy of the Library, and, in your modifications, a
|
||||
facility refers to a function or data to be supplied by an Application
|
||||
that uses the facility (other than as an argument passed when the
|
||||
facility is invoked), then you may convey a copy of the modified
|
||||
version:
|
||||
|
||||
a) under this License, provided that you make a good faith effort to
|
||||
ensure that, in the event an Application does not supply the
|
||||
function or data, the facility still operates, and performs
|
||||
whatever part of its purpose remains meaningful, or
|
||||
|
||||
b) under the GNU GPL, with none of the additional permissions of
|
||||
this License applicable to that copy.
|
||||
|
||||
3. Object Code Incorporating Material from Library Header Files.
|
||||
|
||||
The object code form of an Application may incorporate material from
|
||||
a header file that is part of the Library. You may convey such object
|
||||
code under terms of your choice, provided that, if the incorporated
|
||||
material is not limited to numerical parameters, data structure
|
||||
layouts and accessors, or small macros, inline functions and templates
|
||||
(ten or fewer lines in length), you do both of the following:
|
||||
|
||||
a) Give prominent notice with each copy of the object code that the
|
||||
Library is used in it and that the Library and its use are
|
||||
covered by this License.
|
||||
|
||||
b) Accompany the object code with a copy of the GNU GPL and this license
|
||||
document.
|
||||
|
||||
4. Combined Works.
|
||||
|
||||
You may convey a Combined Work under terms of your choice that,
|
||||
taken together, effectively do not restrict modification of the
|
||||
portions of the Library contained in the Combined Work and reverse
|
||||
engineering for debugging such modifications, if you also do each of
|
||||
the following:
|
||||
|
||||
a) Give prominent notice with each copy of the Combined Work that
|
||||
the Library is used in it and that the Library and its use are
|
||||
covered by this License.
|
||||
|
||||
b) Accompany the Combined Work with a copy of the GNU GPL and this license
|
||||
document.
|
||||
|
||||
c) For a Combined Work that displays copyright notices during
|
||||
execution, include the copyright notice for the Library among
|
||||
these notices, as well as a reference directing the user to the
|
||||
copies of the GNU GPL and this license document.
|
||||
|
||||
d) Do one of the following:
|
||||
|
||||
0) Convey the Minimal Corresponding Source under the terms of this
|
||||
License, and the Corresponding Application Code in a form
|
||||
suitable for, and under terms that permit, the user to
|
||||
recombine or relink the Application with a modified version of
|
||||
the Linked Version to produce a modified Combined Work, in the
|
||||
manner specified by section 6 of the GNU GPL for conveying
|
||||
Corresponding Source.
|
||||
|
||||
1) Use a suitable shared library mechanism for linking with the
|
||||
Library. A suitable mechanism is one that (a) uses at run time
|
||||
a copy of the Library already present on the user's computer
|
||||
system, and (b) will operate properly with a modified version
|
||||
of the Library that is interface-compatible with the Linked
|
||||
Version.
|
||||
|
||||
e) Provide Installation Information, but only if you would otherwise
|
||||
be required to provide such information under section 6 of the
|
||||
GNU GPL, and only to the extent that such information is
|
||||
necessary to install and execute a modified version of the
|
||||
Combined Work produced by recombining or relinking the
|
||||
Application with a modified version of the Linked Version. (If
|
||||
you use option 4d0, the Installation Information must accompany
|
||||
the Minimal Corresponding Source and Corresponding Application
|
||||
Code. If you use option 4d1, you must provide the Installation
|
||||
Information in the manner specified by section 6 of the GNU GPL
|
||||
for conveying Corresponding Source.)
|
||||
|
||||
5. Combined Libraries.
|
||||
|
||||
You may place library facilities that are a work based on the
|
||||
Library side by side in a single library together with other library
|
||||
facilities that are not Applications and are not covered by this
|
||||
License, and convey such a combined library under terms of your
|
||||
choice, if you do both of the following:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work based
|
||||
on the Library, uncombined with any other library facilities,
|
||||
conveyed under the terms of this License.
|
||||
|
||||
b) Give prominent notice with the combined library that part of it
|
||||
is a work based on the Library, and explaining where to find the
|
||||
accompanying uncombined form of the same work.
|
||||
|
||||
6. Revised Versions of the GNU Lesser General Public License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions
|
||||
of the GNU Lesser General Public License from time to time. Such new
|
||||
versions will be similar in spirit to the present version, but may
|
||||
differ in detail to address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Library as you received it specifies that a certain numbered version
|
||||
of the GNU Lesser General Public License "or any later version"
|
||||
applies to it, you have the option of following the terms and
|
||||
conditions either of that published version or of any later version
|
||||
published by the Free Software Foundation. If the Library as you
|
||||
received it does not specify a version number of the GNU Lesser
|
||||
General Public License, you may choose any version of the GNU Lesser
|
||||
General Public License ever published by the Free Software Foundation.
|
||||
|
||||
If the Library as you received it specifies that a proxy can decide
|
||||
whether future versions of the GNU Lesser General Public License shall
|
||||
apply, that proxy's public statement of acceptance of any version is
|
||||
permanent authorization for you to choose that version for the
|
||||
Library.
|
||||
@@ -0,0 +1,36 @@
|
||||
# Portals
|
||||
|
||||
Fabric mod for Minecraft Java `26.1.2`.
|
||||
|
||||
## Description
|
||||
|
||||
Portals adds ritual portals to strange in-world dimensions for Minecraft Java. Build frames from specific blocks, light them with flint and steel, and step into places that feel like they could exist inside Minecraft's own mythology: ore-rich cavern worlds, alternate overworlds, impossible sheep plains, the haunted Skeleton Waste, and sunset-painted canyons.
|
||||
|
||||
Portals ajoute des portails rituels vers des dimensions etranges integrees au monde de Minecraft Java. Construisez des cadres avec des blocs precis, allumez-les au briquet, puis traversez vers des lieux qui semblent appartenir a la mythologie interne de Minecraft : cavernes riches en minerais, overworld alternatif, plaines impossibles remplies de moutons, Skeleton Waste hantee et canyons peints au soleil couchant.
|
||||
|
||||
## Current Content
|
||||
|
||||
- Ore Caves: a dark cave dimension with dense ores, geodes, lush and dripstone cave zones, rare cave trees, and heavier hostile spawning.
|
||||
- Overworld II: a dirt-framed portal to another overworld-style dimension, useful with worldgen mods.
|
||||
- Sheep Land: a white wool portal to a bright rolling world full of naturally colored sheep.
|
||||
- Skeleton Waste: a bone block portal to a dangerous soul-valley wasteland with yellow oceans, basalt spikes, fossils, rare ruined castles, and skeleton-family spawns.
|
||||
- Painted Canyons: a mixed-terracotta portal to a dry sunset badlands dimension with colored terracotta strata, deep ravines, sparse white-leaf oak groves, and no ore generation.
|
||||
- All portals use a 4x5 frame with a 2x3 empty interior, then ignite with flint and steel.
|
||||
|
||||
The portal code is intentionally definition-based so more portal families can be added later, including coded portals that resolve to generated dimensions.
|
||||
|
||||
## Requirements
|
||||
|
||||
- Java 25
|
||||
- Fabric Loader `0.19.2`
|
||||
- Fabric API `0.149.1+26.1.2`
|
||||
|
||||
## Development
|
||||
|
||||
```sh
|
||||
./gradlew build
|
||||
```
|
||||
|
||||
## License
|
||||
|
||||
This project is licensed under `LGPL-3.0-or-later`.
|
||||
@@ -0,0 +1,77 @@
|
||||
plugins {
|
||||
id 'net.fabricmc.fabric-loom' version "${loom_version}"
|
||||
id 'maven-publish'
|
||||
}
|
||||
|
||||
version = project.mod_version
|
||||
group = project.maven_group
|
||||
|
||||
base {
|
||||
archivesName = project.archives_base_name
|
||||
}
|
||||
|
||||
repositories {
|
||||
// Loom adds the core Fabric and Minecraft repositories automatically.
|
||||
}
|
||||
|
||||
loom {
|
||||
splitEnvironmentSourceSets()
|
||||
|
||||
mods {
|
||||
"portals" {
|
||||
sourceSet sourceSets.main
|
||||
sourceSet sourceSets.client
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
minecraft "com.mojang:minecraft:${project.minecraft_version}"
|
||||
implementation "net.fabricmc:fabric-loader:${project.loader_version}"
|
||||
implementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_api_version}"
|
||||
}
|
||||
|
||||
processResources {
|
||||
def properties = [
|
||||
version: project.version,
|
||||
minecraft_version: project.minecraft_version,
|
||||
loader_version: project.loader_version
|
||||
]
|
||||
|
||||
inputs.properties properties
|
||||
|
||||
filesMatching("fabric.mod.json") {
|
||||
expand properties
|
||||
}
|
||||
}
|
||||
|
||||
tasks.withType(JavaCompile).configureEach {
|
||||
options.release = 25
|
||||
}
|
||||
|
||||
java {
|
||||
withSourcesJar()
|
||||
|
||||
toolchain {
|
||||
languageVersion = JavaLanguageVersion.of(25)
|
||||
}
|
||||
}
|
||||
|
||||
jar {
|
||||
from("LICENSE") {
|
||||
rename { "${it}_${project.archives_base_name}" }
|
||||
}
|
||||
}
|
||||
|
||||
publishing {
|
||||
publications {
|
||||
create("mavenJava", MavenPublication) {
|
||||
artifactId = project.archives_base_name
|
||||
from components.java
|
||||
}
|
||||
}
|
||||
|
||||
repositories {
|
||||
// Add a Maven repository here when you are ready to publish.
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
# Gradle
|
||||
org.gradle.jvmargs=-Xmx1G
|
||||
org.gradle.parallel=true
|
||||
|
||||
# IntelliJ IDEA is not yet fully compatible with Fabric Loom configuration cache.
|
||||
org.gradle.configuration-cache=false
|
||||
|
||||
# Fabric
|
||||
minecraft_version=26.1.2
|
||||
loader_version=0.19.2
|
||||
loom_version=1.16.2
|
||||
|
||||
# Mod
|
||||
mod_version=1.0.0
|
||||
maven_group=net.koka99cab
|
||||
archives_base_name=portals
|
||||
|
||||
# Dependencies
|
||||
fabric_api_version=0.149.0+26.1.2
|
||||
@@ -0,0 +1,7 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip
|
||||
networkTimeout=10000
|
||||
validateDistributionUrl=true
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
@@ -0,0 +1,248 @@
|
||||
#!/bin/sh
|
||||
|
||||
#
|
||||
# Copyright © 2015 the original authors.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# https://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
##############################################################################
|
||||
#
|
||||
# Gradle start up script for POSIX generated by Gradle.
|
||||
#
|
||||
# Important for running:
|
||||
#
|
||||
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
|
||||
# noncompliant, but you have some other compliant shell such as ksh or
|
||||
# bash, then to run this script, type that shell name before the whole
|
||||
# command line, like:
|
||||
#
|
||||
# ksh Gradle
|
||||
#
|
||||
# Busybox and similar reduced shells will NOT work, because this script
|
||||
# requires all of these POSIX shell features:
|
||||
# * functions;
|
||||
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
|
||||
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
|
||||
# * compound commands having a testable exit status, especially «case»;
|
||||
# * various built-in commands including «command», «set», and «ulimit».
|
||||
#
|
||||
# Important for patching:
|
||||
#
|
||||
# (2) This script targets any POSIX shell, so it avoids extensions provided
|
||||
# by Bash, Ksh, etc; in particular arrays are avoided.
|
||||
#
|
||||
# The "traditional" practice of packing multiple parameters into a
|
||||
# space-separated string is a well documented source of bugs and security
|
||||
# problems, so this is (mostly) avoided, by progressively accumulating
|
||||
# options in "$@", and eventually passing that to Java.
|
||||
#
|
||||
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
|
||||
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
|
||||
# see the in-line comments for details.
|
||||
#
|
||||
# There are tweaks for specific operating systems such as AIX, CygWin,
|
||||
# Darwin, MinGW, and NonStop.
|
||||
#
|
||||
# (3) This script is generated from the Groovy template
|
||||
# https://github.com/gradle/gradle/blob/2d6327017519d23b96af35865dc997fcb544fb40/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
||||
# within the Gradle project.
|
||||
#
|
||||
# You can find Gradle at https://github.com/gradle/gradle/.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
# Attempt to set APP_HOME
|
||||
|
||||
# Resolve links: $0 may be a link
|
||||
app_path=$0
|
||||
|
||||
# Need this for daisy-chained symlinks.
|
||||
while
|
||||
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
|
||||
[ -h "$app_path" ]
|
||||
do
|
||||
ls=$( ls -ld "$app_path" )
|
||||
link=${ls#*' -> '}
|
||||
case $link in #(
|
||||
/*) app_path=$link ;; #(
|
||||
*) app_path=$APP_HOME$link ;;
|
||||
esac
|
||||
done
|
||||
|
||||
# This is normally unused
|
||||
# shellcheck disable=SC2034
|
||||
APP_BASE_NAME=${0##*/}
|
||||
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
|
||||
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD=maximum
|
||||
|
||||
warn () {
|
||||
echo "$*"
|
||||
} >&2
|
||||
|
||||
die () {
|
||||
echo
|
||||
echo "$*"
|
||||
echo
|
||||
exit 1
|
||||
} >&2
|
||||
|
||||
# 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 ;; #(
|
||||
MSYS* | MINGW* ) msys=true ;; #(
|
||||
NONSTOP* ) nonstop=true ;;
|
||||
esac
|
||||
|
||||
|
||||
|
||||
# Determine the Java command to use to start the JVM.
|
||||
if [ -n "$JAVA_HOME" ] ; then
|
||||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||
# IBM's JDK on AIX uses strange locations for the executables
|
||||
JAVACMD=$JAVA_HOME/jre/sh/java
|
||||
else
|
||||
JAVACMD=$JAVA_HOME/bin/java
|
||||
fi
|
||||
if [ ! -x "$JAVACMD" ] ; then
|
||||
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
else
|
||||
JAVACMD=java
|
||||
if ! command -v java >/dev/null 2>&1
|
||||
then
|
||||
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
fi
|
||||
|
||||
# Increase the maximum file descriptors if we can.
|
||||
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
||||
case $MAX_FD in #(
|
||||
max*)
|
||||
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
|
||||
# shellcheck disable=SC2039,SC3045
|
||||
MAX_FD=$( ulimit -H -n ) ||
|
||||
warn "Could not query maximum file descriptor limit"
|
||||
esac
|
||||
case $MAX_FD in #(
|
||||
'' | soft) :;; #(
|
||||
*)
|
||||
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
|
||||
# shellcheck disable=SC2039,SC3045
|
||||
ulimit -n "$MAX_FD" ||
|
||||
warn "Could not set maximum file descriptor limit to $MAX_FD"
|
||||
esac
|
||||
fi
|
||||
|
||||
# Collect all arguments for the java command, stacking in reverse order:
|
||||
# * args from the command line
|
||||
# * the main class name
|
||||
# * -classpath
|
||||
# * -D...appname settings
|
||||
# * --module-path (only if needed)
|
||||
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
|
||||
|
||||
# For Cygwin or MSYS, switch paths to Windows format before running java
|
||||
if "$cygwin" || "$msys" ; then
|
||||
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
|
||||
|
||||
JAVACMD=$( cygpath --unix "$JAVACMD" )
|
||||
|
||||
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
||||
for arg do
|
||||
if
|
||||
case $arg in #(
|
||||
-*) false ;; # don't mess with options #(
|
||||
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
|
||||
[ -e "$t" ] ;; #(
|
||||
*) false ;;
|
||||
esac
|
||||
then
|
||||
arg=$( cygpath --path --ignore --mixed "$arg" )
|
||||
fi
|
||||
# Roll the args list around exactly as many times as the number of
|
||||
# args, so each arg winds up back in the position where it started, but
|
||||
# possibly modified.
|
||||
#
|
||||
# NB: a `for` loop captures its iteration list before it begins, so
|
||||
# changing the positional parameters here affects neither the number of
|
||||
# iterations, nor the values presented in `arg`.
|
||||
shift # remove old arg
|
||||
set -- "$@" "$arg" # push replacement arg
|
||||
done
|
||||
fi
|
||||
|
||||
|
||||
# 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"'
|
||||
|
||||
# Collect all arguments for the java command:
|
||||
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
|
||||
# and any embedded shellness will be escaped.
|
||||
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
|
||||
# treated as '${Hostname}' itself on the command line.
|
||||
|
||||
set -- \
|
||||
"-Dorg.gradle.appname=$APP_BASE_NAME" \
|
||||
-jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \
|
||||
"$@"
|
||||
|
||||
# Stop when "xargs" is not available.
|
||||
if ! command -v xargs >/dev/null 2>&1
|
||||
then
|
||||
die "xargs is not available"
|
||||
fi
|
||||
|
||||
# Use "xargs" to parse quoted args.
|
||||
#
|
||||
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
|
||||
#
|
||||
# In Bash we could simply go:
|
||||
#
|
||||
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
|
||||
# set -- "${ARGS[@]}" "$@"
|
||||
#
|
||||
# but POSIX shell has neither arrays nor command substitution, so instead we
|
||||
# post-process each arg (as a line of input to sed) to backslash-escape any
|
||||
# character that might be a shell metacharacter, then use eval to reverse
|
||||
# that process (while maintaining the separation between arguments), and wrap
|
||||
# the whole thing up as a single "set" statement.
|
||||
#
|
||||
# This will of course break if any of these variables contains a newline or
|
||||
# an unmatched quote.
|
||||
#
|
||||
|
||||
eval "set -- $(
|
||||
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
|
||||
xargs -n1 |
|
||||
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
|
||||
tr '\n' ' '
|
||||
)" '"$@"'
|
||||
|
||||
exec "$JAVACMD" "$@"
|
||||
@@ -0,0 +1,93 @@
|
||||
@rem
|
||||
@rem Copyright 2015 the original author or authors.
|
||||
@rem
|
||||
@rem Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@rem you may not use this file except in compliance with the License.
|
||||
@rem You may obtain a copy of the License at
|
||||
@rem
|
||||
@rem https://www.apache.org/licenses/LICENSE-2.0
|
||||
@rem
|
||||
@rem Unless required by applicable law or agreed to in writing, software
|
||||
@rem distributed under the License is distributed on an "AS IS" BASIS,
|
||||
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
@rem See the License for the specific language governing permissions and
|
||||
@rem limitations under the License.
|
||||
@rem
|
||||
@rem SPDX-License-Identifier: Apache-2.0
|
||||
@rem
|
||||
|
||||
@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
|
||||
|
||||
set DIRNAME=%~dp0
|
||||
if "%DIRNAME%"=="" set DIRNAME=.
|
||||
@rem This is normally unused
|
||||
set APP_BASE_NAME=%~n0
|
||||
set APP_HOME=%DIRNAME%
|
||||
|
||||
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
|
||||
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
|
||||
|
||||
@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="-Xmx64m" "-Xms64m"
|
||||
|
||||
@rem Find java.exe
|
||||
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||
|
||||
set JAVA_EXE=java.exe
|
||||
%JAVA_EXE% -version >NUL 2>&1
|
||||
if %ERRORLEVEL% equ 0 goto execute
|
||||
|
||||
echo. 1>&2
|
||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
|
||||
echo. 1>&2
|
||||
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
|
||||
echo location of your Java installation. 1>&2
|
||||
|
||||
goto fail
|
||||
|
||||
:findJavaFromJavaHome
|
||||
set JAVA_HOME=%JAVA_HOME:"=%
|
||||
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||
|
||||
if exist "%JAVA_EXE%" goto execute
|
||||
|
||||
echo. 1>&2
|
||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
|
||||
echo. 1>&2
|
||||
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
|
||||
echo location of your Java installation. 1>&2
|
||||
|
||||
goto fail
|
||||
|
||||
:execute
|
||||
@rem Setup the command line
|
||||
|
||||
|
||||
|
||||
@rem Execute Gradle
|
||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
|
||||
|
||||
:end
|
||||
@rem End local scope for the variables with windows NT shell
|
||||
if %ERRORLEVEL% equ 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!
|
||||
set EXIT_CODE=%ERRORLEVEL%
|
||||
if %EXIT_CODE% equ 0 set EXIT_CODE=1
|
||||
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
|
||||
exit /b %EXIT_CODE%
|
||||
|
||||
:mainEnd
|
||||
if "%OS%"=="Windows_NT" endlocal
|
||||
|
||||
:omega
|
||||
|
After Width: | Height: | Size: 31 KiB |
@@ -0,0 +1,12 @@
|
||||
pluginManagement {
|
||||
repositories {
|
||||
maven {
|
||||
name = 'Fabric'
|
||||
url = 'https://maven.fabricmc.net/'
|
||||
}
|
||||
mavenCentral()
|
||||
gradlePluginPortal()
|
||||
}
|
||||
}
|
||||
|
||||
rootProject.name = 'portals'
|
||||
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2026 KOKA99CAB
|
||||
* SPDX-License-Identifier: LGPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package net.koka99cab.portals;
|
||||
|
||||
import net.fabricmc.api.ModInitializer;
|
||||
import net.koka99cab.portals.portal.PortalDefinitions;
|
||||
import net.koka99cab.portals.portal.PortalIgnitionHandler;
|
||||
import net.koka99cab.portals.registry.ModBlocks;
|
||||
import net.koka99cab.portals.world.ModDimensions;
|
||||
import net.koka99cab.portals.world.ModFeatures;
|
||||
import net.koka99cab.portals.world.SkeletonWasteSpawner;
|
||||
import net.minecraft.resources.Identifier;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public final class PortalsMod implements ModInitializer {
|
||||
public static final String MOD_ID = "portals";
|
||||
public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID);
|
||||
|
||||
public static Identifier id(String path) {
|
||||
return Identifier.fromNamespaceAndPath(MOD_ID, path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onInitialize() {
|
||||
ModDimensions.init();
|
||||
ModFeatures.init();
|
||||
ModBlocks.init();
|
||||
PortalDefinitions.init();
|
||||
PortalIgnitionHandler.register();
|
||||
SkeletonWasteSpawner.register();
|
||||
|
||||
LOGGER.info("Portals initialized.");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,180 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2026 KOKA99CAB
|
||||
* SPDX-License-Identifier: LGPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package net.koka99cab.portals.block;
|
||||
|
||||
import com.mojang.serialization.MapCodec;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.function.Predicate;
|
||||
import net.koka99cab.portals.portal.PortalFrame;
|
||||
import net.koka99cab.portals.portal.PortalTeleporter;
|
||||
import net.koka99cab.portals.world.ModDimensions;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.Direction;
|
||||
import net.minecraft.core.particles.ParticleOptions;
|
||||
import net.minecraft.core.particles.ParticleTypes;
|
||||
import net.minecraft.resources.ResourceKey;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.sounds.SoundEvents;
|
||||
import net.minecraft.sounds.SoundSource;
|
||||
import net.minecraft.util.RandomSource;
|
||||
import net.minecraft.world.entity.Entity;
|
||||
import net.minecraft.world.entity.InsideBlockEffectApplier;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.level.BlockGetter;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.LevelReader;
|
||||
import net.minecraft.world.level.ScheduledTickAccess;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.Blocks;
|
||||
import net.minecraft.world.level.block.Portal;
|
||||
import net.minecraft.world.level.block.Rotation;
|
||||
import net.minecraft.world.level.block.state.BlockBehaviour;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.block.state.StateDefinition;
|
||||
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
|
||||
import net.minecraft.world.level.block.state.properties.EnumProperty;
|
||||
import net.minecraft.world.level.gamerules.GameRules;
|
||||
import net.minecraft.world.level.portal.TeleportTransition;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
import net.minecraft.world.phys.shapes.CollisionContext;
|
||||
import net.minecraft.world.phys.shapes.Shapes;
|
||||
import net.minecraft.world.phys.shapes.VoxelShape;
|
||||
|
||||
public class OrePortalBlock extends Block implements Portal {
|
||||
public static final MapCodec<OrePortalBlock> CODEC = simpleCodec(OrePortalBlock::new);
|
||||
public static final EnumProperty<Direction.Axis> AXIS = BlockStateProperties.HORIZONTAL_AXIS;
|
||||
private static final Map<Direction.Axis, VoxelShape> SHAPES = Shapes.rotateHorizontalAxis(Block.column(4.0, 16.0, 0.0, 16.0));
|
||||
private final ResourceKey<Level> destination;
|
||||
private final Block frameBlock;
|
||||
private final Predicate<BlockState> framePredicate;
|
||||
private final ParticleOptions particle;
|
||||
|
||||
public OrePortalBlock(BlockBehaviour.Properties properties) {
|
||||
this(properties, ModDimensions.ORE_CAVES, Blocks.STONE, ParticleTypes.END_ROD);
|
||||
}
|
||||
|
||||
public OrePortalBlock(BlockBehaviour.Properties properties, ResourceKey<Level> destination, Block frameBlock, ParticleOptions particle) {
|
||||
this(properties, destination, frameBlock, state -> state.is(frameBlock), particle);
|
||||
}
|
||||
|
||||
public OrePortalBlock(BlockBehaviour.Properties properties, ResourceKey<Level> destination, Block frameBlock, Predicate<BlockState> framePredicate, ParticleOptions particle) {
|
||||
super(properties);
|
||||
this.destination = destination;
|
||||
this.frameBlock = frameBlock;
|
||||
this.framePredicate = framePredicate;
|
||||
this.particle = particle;
|
||||
registerDefaultState(stateDefinition.any().setValue(AXIS, Direction.Axis.X));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected MapCodec<? extends Block> codec() {
|
||||
return CODEC;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) {
|
||||
return SHAPES.get(state.getValue(AXIS));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected BlockState updateShape(BlockState state, LevelReader level, ScheduledTickAccess ticks, BlockPos pos, Direction directionToNeighbour, BlockPos neighbourPos, BlockState neighbourState, RandomSource random) {
|
||||
Direction.Axis axis = state.getValue(AXIS);
|
||||
|
||||
if (PortalFrame.findExisting(level, pos, axis, framePredicate, this).isPresent()) {
|
||||
return super.updateShape(state, level, ticks, pos, directionToNeighbour, neighbourPos, neighbourState, random);
|
||||
}
|
||||
|
||||
return Blocks.AIR.defaultBlockState();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier, boolean isPrecise) {
|
||||
if (entity.canUsePortal(false)) {
|
||||
entity.setAsInsidePortal(this, pos);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPortalTransitionTime(ServerLevel level, Entity entity) {
|
||||
if (entity instanceof Player player) {
|
||||
return Math.max(0, level.getGameRules().get(player.getAbilities().invulnerable ? GameRules.PLAYERS_NETHER_PORTAL_CREATIVE_DELAY : GameRules.PLAYERS_NETHER_PORTAL_DEFAULT_DELAY));
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TeleportTransition getPortalDestination(ServerLevel currentLevel, Entity entity, BlockPos portalEntryPos) {
|
||||
ServerLevel targetLevel = currentLevel.getServer().getLevel(currentLevel.dimension().equals(destination) ? Level.OVERWORLD : destination);
|
||||
|
||||
if (targetLevel == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
Direction.Axis axis = currentLevel.getBlockState(portalEntryPos).getOptionalValue(AXIS).orElse(Direction.Axis.X);
|
||||
Optional<Vec3> exit = PortalTeleporter.findOrCreateExit(targetLevel, entity, portalEntryPos, axis, frameBlock, framePredicate, this);
|
||||
|
||||
if (exit.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return new TeleportTransition(
|
||||
targetLevel,
|
||||
exit.get(),
|
||||
Vec3.ZERO,
|
||||
entity.getYRot(),
|
||||
entity.getXRot(),
|
||||
TeleportTransition.PLAY_PORTAL_SOUND
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Transition getLocalTransition() {
|
||||
return Transition.CONFUSION;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void animateTick(BlockState state, Level level, BlockPos pos, RandomSource random) {
|
||||
if (random.nextInt(100) == 0) {
|
||||
level.playLocalSound(pos, SoundEvents.PORTAL_AMBIENT, SoundSource.BLOCKS, 0.35F, random.nextFloat() * 0.4F + 0.8F, false);
|
||||
}
|
||||
|
||||
for (int i = 0; i < 4; i++) {
|
||||
double x = pos.getX() + random.nextDouble();
|
||||
double y = pos.getY() + random.nextDouble();
|
||||
double z = pos.getZ() + random.nextDouble();
|
||||
double velocityX = (random.nextFloat() - 0.5D) * 0.5D;
|
||||
double velocityY = (random.nextFloat() - 0.5D) * 0.5D;
|
||||
double velocityZ = (random.nextFloat() - 0.5D) * 0.5D;
|
||||
|
||||
level.addParticle(particle, x, y, z, velocityX * 0.25D, velocityY * 0.25D, velocityZ * 0.25D);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ItemStack getCloneItemStack(LevelReader level, BlockPos pos, BlockState state, boolean includeData) {
|
||||
return ItemStack.EMPTY;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected BlockState rotate(BlockState state, Rotation rotation) {
|
||||
return switch (rotation) {
|
||||
case CLOCKWISE_90, COUNTERCLOCKWISE_90 -> switch (state.getValue(AXIS)) {
|
||||
case X -> state.setValue(AXIS, Direction.Axis.Z);
|
||||
case Z -> state.setValue(AXIS, Direction.Axis.X);
|
||||
default -> state;
|
||||
};
|
||||
default -> state;
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
|
||||
builder.add(AXIS);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2026 KOKA99CAB
|
||||
* SPDX-License-Identifier: LGPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package net.koka99cab.portals.mixin;
|
||||
|
||||
import net.koka99cab.portals.world.ModDimensions;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.util.Mth;
|
||||
import net.minecraft.world.DifficultyInstance;
|
||||
import net.minecraft.world.entity.EntitySpawnReason;
|
||||
import net.minecraft.world.entity.SpawnGroupData;
|
||||
import net.minecraft.world.entity.animal.sheep.Sheep;
|
||||
import net.minecraft.world.item.DyeColor;
|
||||
import net.minecraft.world.level.ServerLevelAccessor;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||
|
||||
@Mixin(Sheep.class)
|
||||
public abstract class SheepColorMixin {
|
||||
@Inject(method = "finalizeSpawn", at = @At("RETURN"))
|
||||
private void portals$randomizeSheepLandColor(ServerLevelAccessor level, DifficultyInstance difficulty, EntitySpawnReason spawnReason, SpawnGroupData groupData, CallbackInfoReturnable<SpawnGroupData> callbackInfo) {
|
||||
ServerLevel serverLevel = level.getLevel();
|
||||
|
||||
if (serverLevel.dimension() != ModDimensions.SHEEP_LAND) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (spawnReason != EntitySpawnReason.NATURAL && spawnReason != EntitySpawnReason.CHUNK_GENERATION) {
|
||||
return;
|
||||
}
|
||||
|
||||
Sheep sheep = (Sheep)(Object)this;
|
||||
long seed = sheep.getUUID().getMostSignificantBits() ^ sheep.getUUID().getLeastSignificantBits() ^ sheep.blockPosition().asLong();
|
||||
int colorIndex = Mth.positiveModulo(Mth.murmurHash3Mixer((int)(seed ^ seed >>> 32)), DyeColor.VALUES.size());
|
||||
sheep.setColor(DyeColor.VALUES.get(colorIndex));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2026 KOKA99CAB
|
||||
* SPDX-License-Identifier: LGPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package net.koka99cab.portals.portal;
|
||||
|
||||
import java.util.function.Predicate;
|
||||
|
||||
import net.minecraft.resources.Identifier;
|
||||
import net.minecraft.resources.ResourceKey;
|
||||
import net.minecraft.world.item.Item;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
|
||||
public record PortalDefinition(
|
||||
Identifier id,
|
||||
Block frameBlock,
|
||||
Item activationItem,
|
||||
Block portalBlock,
|
||||
ResourceKey<Level> destination,
|
||||
Predicate<BlockState> framePredicate
|
||||
) {
|
||||
public PortalDefinition(Identifier id, Block frameBlock, Item activationItem, Block portalBlock, ResourceKey<Level> destination) {
|
||||
this(id, frameBlock, activationItem, portalBlock, destination, state -> state.is(frameBlock));
|
||||
}
|
||||
|
||||
public boolean matchesFrame(BlockState state) {
|
||||
return framePredicate.test(state);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2026 KOKA99CAB
|
||||
* SPDX-License-Identifier: LGPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package net.koka99cab.portals.portal;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
import net.koka99cab.portals.PortalsMod;
|
||||
import net.koka99cab.portals.registry.ModBlocks;
|
||||
import net.koka99cab.portals.world.ModDimensions;
|
||||
import net.minecraft.world.item.Item;
|
||||
import net.minecraft.world.item.Items;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.Blocks;
|
||||
|
||||
public final class PortalDefinitions {
|
||||
private static final List<PortalDefinition> DEFINITIONS = new ArrayList<>();
|
||||
|
||||
public static final PortalDefinition ORE_CAVES = register(new PortalDefinition(
|
||||
PortalsMod.id("ore_caves"),
|
||||
Blocks.STONE,
|
||||
Items.FLINT_AND_STEEL,
|
||||
ModBlocks.ORE_PORTAL,
|
||||
ModDimensions.ORE_CAVES
|
||||
));
|
||||
public static final PortalDefinition OVERWORLD2 = register(new PortalDefinition(
|
||||
PortalsMod.id("overworld2"),
|
||||
Blocks.DIRT,
|
||||
Items.FLINT_AND_STEEL,
|
||||
ModBlocks.OVERWORLD2_PORTAL,
|
||||
ModDimensions.OVERWORLD2,
|
||||
state -> state.is(Blocks.DIRT) || state.is(Blocks.GRASS_BLOCK)
|
||||
));
|
||||
public static final PortalDefinition SHEEP_LAND = register(new PortalDefinition(
|
||||
PortalsMod.id("sheep_land"),
|
||||
Blocks.WHITE_WOOL,
|
||||
Items.FLINT_AND_STEEL,
|
||||
ModBlocks.SHEEP_LAND_PORTAL,
|
||||
ModDimensions.SHEEP_LAND
|
||||
));
|
||||
public static final PortalDefinition SKELETON_WASTE = register(new PortalDefinition(
|
||||
PortalsMod.id("skeleton_waste"),
|
||||
Blocks.BONE_BLOCK,
|
||||
Items.FLINT_AND_STEEL,
|
||||
ModBlocks.SKELETON_WASTE_PORTAL,
|
||||
ModDimensions.SKELETON_WASTE
|
||||
));
|
||||
public static final PortalDefinition PAINTED_CANYONS = register(new PortalDefinition(
|
||||
PortalsMod.id("painted_canyons"),
|
||||
Blocks.TERRACOTTA,
|
||||
Items.FLINT_AND_STEEL,
|
||||
ModBlocks.PAINTED_CANYONS_PORTAL,
|
||||
ModDimensions.PAINTED_CANYONS,
|
||||
PortalFramePredicates.TERRACOTTA
|
||||
));
|
||||
|
||||
private PortalDefinitions() {
|
||||
}
|
||||
|
||||
public static void init() {
|
||||
PortalsMod.LOGGER.debug("Registered {} portal definitions", DEFINITIONS.size());
|
||||
}
|
||||
|
||||
public static Optional<PortalDefinition> find(Item activationItem, net.minecraft.world.level.block.state.BlockState frameState) {
|
||||
return DEFINITIONS.stream()
|
||||
.filter(definition -> definition.activationItem() == activationItem)
|
||||
.filter(definition -> definition.matchesFrame(frameState))
|
||||
.findFirst();
|
||||
}
|
||||
|
||||
private static PortalDefinition register(PortalDefinition definition) {
|
||||
DEFINITIONS.add(definition);
|
||||
return definition;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2026 KOKA99CAB
|
||||
* SPDX-License-Identifier: LGPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package net.koka99cab.portals.portal;
|
||||
|
||||
import java.util.Optional;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
import net.koka99cab.portals.block.OrePortalBlock;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.Direction;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.LevelReader;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
|
||||
public record PortalFrame(Direction.Axis axis, BlockPos origin) {
|
||||
public static final int INTERIOR_WIDTH = 2;
|
||||
public static final int INTERIOR_HEIGHT = 3;
|
||||
public static final int OUTER_WIDTH = INTERIOR_WIDTH + 2;
|
||||
public static final int OUTER_HEIGHT = INTERIOR_HEIGHT + 2;
|
||||
|
||||
public static Optional<PortalFrame> findForIgnition(LevelReader level, BlockPos interiorPos, Predicate<BlockState> framePredicate) {
|
||||
return find(level, interiorPos, framePredicate, state -> state.isAir() || state.canBeReplaced());
|
||||
}
|
||||
|
||||
public static Optional<PortalFrame> findExisting(LevelReader level, BlockPos portalPos, Direction.Axis axis, Block frameBlock, Block portalBlock) {
|
||||
return findExisting(level, portalPos, axis, state -> state.is(frameBlock), portalBlock);
|
||||
}
|
||||
|
||||
public static Optional<PortalFrame> findExisting(LevelReader level, BlockPos portalPos, Direction.Axis axis, Predicate<BlockState> framePredicate, Block portalBlock) {
|
||||
return find(level, portalPos, axis, framePredicate, state -> state.is(portalBlock));
|
||||
}
|
||||
|
||||
public void fill(Level level, BlockState portalState) {
|
||||
BlockState orientedState = portalState.setValue(OrePortalBlock.AXIS, axis);
|
||||
|
||||
for (int horizontal = 1; horizontal <= INTERIOR_WIDTH; horizontal++) {
|
||||
for (int vertical = 1; vertical <= INTERIOR_HEIGHT; vertical++) {
|
||||
level.setBlock(at(horizontal, vertical), orientedState, Block.UPDATE_CLIENTS | Block.UPDATE_KNOWN_SHAPE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public BlockPos center() {
|
||||
return at(1, 1);
|
||||
}
|
||||
|
||||
private static Optional<PortalFrame> find(LevelReader level, BlockPos interiorPos, Predicate<BlockState> framePredicate, Predicate<BlockState> interiorPredicate) {
|
||||
Optional<PortalFrame> xFrame = find(level, interiorPos, Direction.Axis.X, framePredicate, interiorPredicate);
|
||||
|
||||
if (xFrame.isPresent()) {
|
||||
return xFrame;
|
||||
}
|
||||
|
||||
return find(level, interiorPos, Direction.Axis.Z, framePredicate, interiorPredicate);
|
||||
}
|
||||
|
||||
private static Optional<PortalFrame> find(LevelReader level, BlockPos interiorPos, Direction.Axis axis, Predicate<BlockState> framePredicate, Predicate<BlockState> interiorPredicate) {
|
||||
for (int horizontalOffset = 1; horizontalOffset <= INTERIOR_WIDTH; horizontalOffset++) {
|
||||
for (int verticalOffset = 1; verticalOffset <= INTERIOR_HEIGHT; verticalOffset++) {
|
||||
BlockPos origin = offset(interiorPos, axis, -horizontalOffset, -verticalOffset);
|
||||
PortalFrame frame = new PortalFrame(axis, origin);
|
||||
|
||||
if (frame.isValid(level, framePredicate, interiorPredicate)) {
|
||||
return Optional.of(frame);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
private boolean isValid(LevelReader level, Predicate<BlockState> framePredicate, Predicate<BlockState> interiorPredicate) {
|
||||
for (int horizontal = 0; horizontal < OUTER_WIDTH; horizontal++) {
|
||||
for (int vertical = 0; vertical < OUTER_HEIGHT; vertical++) {
|
||||
BlockState state = level.getBlockState(at(horizontal, vertical));
|
||||
boolean border = horizontal == 0 || horizontal == OUTER_WIDTH - 1 || vertical == 0 || vertical == OUTER_HEIGHT - 1;
|
||||
|
||||
if (border) {
|
||||
if (!framePredicate.test(state)) {
|
||||
return false;
|
||||
}
|
||||
} else if (!interiorPredicate.test(state)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private BlockPos at(int horizontal, int vertical) {
|
||||
return offset(origin, axis, horizontal, vertical);
|
||||
}
|
||||
|
||||
private static BlockPos offset(BlockPos pos, Direction.Axis axis, int horizontal, int vertical) {
|
||||
return switch (axis) {
|
||||
case X -> pos.east(horizontal).above(vertical);
|
||||
case Z -> pos.south(horizontal).above(vertical);
|
||||
default -> throw new IllegalArgumentException("Portal frame axis must be horizontal");
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2026 KOKA99CAB
|
||||
* SPDX-License-Identifier: LGPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package net.koka99cab.portals.portal;
|
||||
|
||||
import java.util.Set;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.Blocks;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
|
||||
public final class PortalFramePredicates {
|
||||
private static final Set<Block> TERRACOTTA_BLOCKS = Set.of(
|
||||
Blocks.TERRACOTTA,
|
||||
Blocks.WHITE_TERRACOTTA,
|
||||
Blocks.ORANGE_TERRACOTTA,
|
||||
Blocks.MAGENTA_TERRACOTTA,
|
||||
Blocks.LIGHT_BLUE_TERRACOTTA,
|
||||
Blocks.YELLOW_TERRACOTTA,
|
||||
Blocks.LIME_TERRACOTTA,
|
||||
Blocks.PINK_TERRACOTTA,
|
||||
Blocks.GRAY_TERRACOTTA,
|
||||
Blocks.LIGHT_GRAY_TERRACOTTA,
|
||||
Blocks.CYAN_TERRACOTTA,
|
||||
Blocks.PURPLE_TERRACOTTA,
|
||||
Blocks.BLUE_TERRACOTTA,
|
||||
Blocks.BROWN_TERRACOTTA,
|
||||
Blocks.GREEN_TERRACOTTA,
|
||||
Blocks.RED_TERRACOTTA,
|
||||
Blocks.BLACK_TERRACOTTA
|
||||
);
|
||||
|
||||
public static final Predicate<BlockState> TERRACOTTA = state -> TERRACOTTA_BLOCKS.contains(state.getBlock());
|
||||
|
||||
private PortalFramePredicates() {
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2026 KOKA99CAB
|
||||
* SPDX-License-Identifier: LGPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package net.koka99cab.portals.portal;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
import net.fabricmc.fabric.api.event.player.UseBlockCallback;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.sounds.SoundEvents;
|
||||
import net.minecraft.sounds.SoundSource;
|
||||
import net.minecraft.world.InteractionResult;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
|
||||
public final class PortalIgnitionHandler {
|
||||
private PortalIgnitionHandler() {
|
||||
}
|
||||
|
||||
public static void register() {
|
||||
UseBlockCallback.EVENT.register((player, level, hand, hitResult) -> {
|
||||
ItemStack stack = player.getItemInHand(hand);
|
||||
BlockPos clickedPos = hitResult.getBlockPos();
|
||||
|
||||
Optional<PortalDefinition> definition = PortalDefinitions.find(stack.getItem(), level.getBlockState(clickedPos));
|
||||
|
||||
if (definition.isEmpty()) {
|
||||
return InteractionResult.PASS;
|
||||
}
|
||||
|
||||
BlockPos interiorPos = clickedPos.relative(hitResult.getDirection());
|
||||
Optional<PortalFrame> frame = PortalFrame.findForIgnition(level, interiorPos, definition.get().framePredicate());
|
||||
|
||||
if (frame.isEmpty()) {
|
||||
return InteractionResult.PASS;
|
||||
}
|
||||
|
||||
if (level.isClientSide()) {
|
||||
return InteractionResult.SUCCESS;
|
||||
}
|
||||
|
||||
if (!level.mayInteract(player, clickedPos) || !level.mayInteract(player, interiorPos)) {
|
||||
return InteractionResult.FAIL;
|
||||
}
|
||||
|
||||
frame.get().fill(level, definition.get().portalBlock().defaultBlockState());
|
||||
level.playSound(
|
||||
player,
|
||||
interiorPos,
|
||||
SoundEvents.FLINTANDSTEEL_USE,
|
||||
SoundSource.BLOCKS,
|
||||
1.0F,
|
||||
level.getRandom().nextFloat() * 0.4F + 0.8F
|
||||
);
|
||||
stack.hurtAndBreak(1, player, hand);
|
||||
|
||||
return InteractionResult.SUCCESS;
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,304 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2026 KOKA99CAB
|
||||
* SPDX-License-Identifier: LGPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package net.koka99cab.portals.portal;
|
||||
|
||||
import java.util.Optional;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
import net.koka99cab.portals.block.OrePortalBlock;
|
||||
import net.koka99cab.portals.world.ModDimensions;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.Direction;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.util.Mth;
|
||||
import net.minecraft.world.entity.Entity;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.Blocks;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.levelgen.Heightmap;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
|
||||
public final class PortalTeleporter {
|
||||
private static final int PORTAL_SEARCH_RADIUS = 32;
|
||||
private static final int SAFE_SEARCH_RADIUS = 48;
|
||||
|
||||
private PortalTeleporter() {
|
||||
}
|
||||
|
||||
public static Optional<Vec3> findOrCreateExit(ServerLevel targetLevel, Entity entity, BlockPos entryPos, Direction.Axis axis, Block frameBlock, Predicate<BlockState> framePredicate, Block portalBlock) {
|
||||
BlockPos targetPos = clampedTargetPos(targetLevel, entryPos);
|
||||
Optional<PortalFrame> existingFrame = findNearbyPortal(targetLevel, targetPos, axis, framePredicate, portalBlock);
|
||||
|
||||
if (existingFrame.isPresent()) {
|
||||
return Optional.of(exitPosition(existingFrame.get()));
|
||||
}
|
||||
|
||||
BlockPos safeTargetPos = findSafeTargetPos(targetLevel, targetPos);
|
||||
PortalFrame frame = createExitFrame(targetLevel, safeTargetPos, axis, frameBlock, portalBlock);
|
||||
|
||||
if (!hasClearExitPocket(targetLevel, frame)) {
|
||||
clearExitPocket(targetLevel, frame);
|
||||
}
|
||||
|
||||
return Optional.of(exitPosition(frame));
|
||||
}
|
||||
|
||||
private static Optional<PortalFrame> findNearbyPortal(ServerLevel level, BlockPos center, Direction.Axis axis, Predicate<BlockState> framePredicate, Block portalBlock) {
|
||||
PortalFrame bestFrame = null;
|
||||
double bestDistance = Double.MAX_VALUE;
|
||||
int minY = level.getMinY();
|
||||
int maxY = level.getMaxY() - 1;
|
||||
|
||||
for (BlockPos pos : BlockPos.betweenClosed(center.offset(-PORTAL_SEARCH_RADIUS, 0, -PORTAL_SEARCH_RADIUS).atY(minY), center.offset(PORTAL_SEARCH_RADIUS, 0, PORTAL_SEARCH_RADIUS).atY(maxY))) {
|
||||
BlockState state = level.getBlockState(pos);
|
||||
|
||||
if (!state.is(portalBlock)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
Direction.Axis candidateAxis = state.getOptionalValue(OrePortalBlock.AXIS).orElse(axis);
|
||||
Optional<PortalFrame> frame = PortalFrame.findExisting(level, pos, candidateAxis, framePredicate, portalBlock);
|
||||
|
||||
if (frame.isEmpty()) {
|
||||
frame = PortalFrame.findExisting(level, pos, axis, framePredicate, portalBlock);
|
||||
}
|
||||
|
||||
if (frame.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
double distance = frame.get().center().distSqr(center);
|
||||
|
||||
if (distance < bestDistance) {
|
||||
bestFrame = frame.get();
|
||||
bestDistance = distance;
|
||||
}
|
||||
}
|
||||
|
||||
return Optional.ofNullable(bestFrame);
|
||||
}
|
||||
|
||||
private static PortalFrame createExitFrame(ServerLevel level, BlockPos targetPos, Direction.Axis axis, Block frameBlock, Block portalBlock) {
|
||||
BlockPos origin = switch (axis) {
|
||||
case X -> targetPos.west(1).below(1);
|
||||
case Z -> targetPos.north(1).below(1);
|
||||
default -> targetPos.below(1);
|
||||
};
|
||||
PortalFrame frame = new PortalFrame(axis, origin);
|
||||
|
||||
for (int horizontal = 0; horizontal < PortalFrame.OUTER_WIDTH; horizontal++) {
|
||||
for (int vertical = 0; vertical < PortalFrame.OUTER_HEIGHT; vertical++) {
|
||||
boolean border = horizontal == 0 || horizontal == PortalFrame.OUTER_WIDTH - 1 || vertical == 0 || vertical == PortalFrame.OUTER_HEIGHT - 1;
|
||||
BlockPos pos = portalPos(origin, axis, horizontal, vertical);
|
||||
|
||||
if (border) {
|
||||
level.setBlockAndUpdate(pos, frameBlock.defaultBlockState());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
frame.fill(level, portalBlock.defaultBlockState());
|
||||
|
||||
return frame;
|
||||
}
|
||||
|
||||
private static void clearExitPocket(ServerLevel level, PortalFrame frame) {
|
||||
Direction.Axis axis = frame.axis();
|
||||
|
||||
for (int horizontal = -1; horizontal <= PortalFrame.OUTER_WIDTH; horizontal++) {
|
||||
for (int vertical = 1; vertical <= PortalFrame.OUTER_HEIGHT; vertical++) {
|
||||
for (int depth = -2; depth <= 2; depth++) {
|
||||
if (depth == 0 && horizontal >= 0 && horizontal < PortalFrame.OUTER_WIDTH) {
|
||||
continue;
|
||||
}
|
||||
|
||||
level.setBlockAndUpdate(pocketPos(frame.origin(), axis, horizontal, vertical, depth), Blocks.AIR.defaultBlockState());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean hasClearExitPocket(ServerLevel level, PortalFrame frame) {
|
||||
Direction.Axis axis = frame.axis();
|
||||
|
||||
for (int horizontal = 1; horizontal <= PortalFrame.INTERIOR_WIDTH; horizontal++) {
|
||||
for (int vertical = 1; vertical <= PortalFrame.INTERIOR_HEIGHT; vertical++) {
|
||||
for (int depth = -1; depth <= 1; depth++) {
|
||||
BlockPos pos = pocketPos(frame.origin(), axis, horizontal, vertical, depth);
|
||||
|
||||
if (depth == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
BlockState state = level.getBlockState(pos);
|
||||
|
||||
if (!state.isAir() && !state.canBeReplaced()) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private static Vec3 exitPosition(PortalFrame frame) {
|
||||
BlockPos origin = frame.origin();
|
||||
|
||||
return switch (frame.axis()) {
|
||||
case X -> new Vec3(origin.getX() + 2.0D, origin.getY() + 1.0D, origin.getZ() + 0.5D);
|
||||
case Z -> new Vec3(origin.getX() + 0.5D, origin.getY() + 1.0D, origin.getZ() + 2.0D);
|
||||
default -> origin.getCenter();
|
||||
};
|
||||
}
|
||||
|
||||
private static BlockPos clampedTargetPos(ServerLevel level, BlockPos entryPos) {
|
||||
int x = entryPos.getX();
|
||||
int z = entryPos.getZ();
|
||||
int minY = level.getMinY() + 2;
|
||||
int maxY = level.getMaxY() - PortalFrame.OUTER_HEIGHT - 2;
|
||||
int y = Mth.clamp(entryPos.getY(), minY, maxY);
|
||||
|
||||
if (usesSurfaceExit(level)) {
|
||||
int surfaceY = level.getHeight(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, x, z);
|
||||
|
||||
if (surfaceY > level.getMinY() + 8) {
|
||||
y = Mth.clamp(surfaceY, minY, maxY);
|
||||
}
|
||||
}
|
||||
|
||||
return new BlockPos(x, y, z);
|
||||
}
|
||||
|
||||
private static boolean usesSurfaceExit(ServerLevel level) {
|
||||
return level.dimension().equals(ModDimensions.SKELETON_WASTE) || level.dimensionType().hasSkyLight() && !level.dimensionType().hasCeiling();
|
||||
}
|
||||
|
||||
private static BlockPos findSafeTargetPos(ServerLevel level, BlockPos targetPos) {
|
||||
Optional<BlockPos> safePos = usesSurfaceExit(level) ? findSafeSurfacePos(level, targetPos) : findSafeCavePos(level, targetPos);
|
||||
return safePos.orElseGet(() -> targetPos.atY(Mth.clamp(targetPos.getY(), level.getMinY() + 12, level.getMaxY() - PortalFrame.OUTER_HEIGHT - 2)));
|
||||
}
|
||||
|
||||
private static Optional<BlockPos> findSafeSurfacePos(ServerLevel level, BlockPos targetPos) {
|
||||
BlockPos bestPos = null;
|
||||
double bestDistance = Double.MAX_VALUE;
|
||||
|
||||
for (int radius = 0; radius <= SAFE_SEARCH_RADIUS; radius++) {
|
||||
for (int dx = -radius; dx <= radius; dx++) {
|
||||
for (int dz = -radius; dz <= radius; dz++) {
|
||||
if (Math.abs(dx) != radius && Math.abs(dz) != radius) {
|
||||
continue;
|
||||
}
|
||||
|
||||
int x = targetPos.getX() + dx;
|
||||
int z = targetPos.getZ() + dz;
|
||||
int y = level.getHeight(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, x, z);
|
||||
BlockPos candidate = new BlockPos(x, y, z);
|
||||
|
||||
if (!isSafeStandingPos(level, candidate)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
double distance = candidate.distSqr(targetPos);
|
||||
|
||||
if (distance < bestDistance) {
|
||||
bestPos = candidate;
|
||||
bestDistance = distance;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (bestPos != null) {
|
||||
return Optional.of(bestPos);
|
||||
}
|
||||
}
|
||||
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
private static Optional<BlockPos> findSafeCavePos(ServerLevel level, BlockPos targetPos) {
|
||||
BlockPos bestPos = null;
|
||||
double bestDistance = Double.MAX_VALUE;
|
||||
int minY = level.getMinY() + 10;
|
||||
int maxY = level.getMaxY() - PortalFrame.OUTER_HEIGHT - 2;
|
||||
|
||||
for (int radius = 0; radius <= SAFE_SEARCH_RADIUS / 2; radius += 4) {
|
||||
for (int dx = -radius; dx <= radius; dx += 4) {
|
||||
for (int dz = -radius; dz <= radius; dz += 4) {
|
||||
for (int dy = 0; dy <= 48; dy++) {
|
||||
int upY = targetPos.getY() + dy;
|
||||
int downY = targetPos.getY() - dy;
|
||||
|
||||
if (upY <= maxY) {
|
||||
bestPos = chooseCloserSafePos(level, targetPos, new BlockPos(targetPos.getX() + dx, upY, targetPos.getZ() + dz), bestPos);
|
||||
}
|
||||
|
||||
if (downY >= minY) {
|
||||
bestPos = chooseCloserSafePos(level, targetPos, new BlockPos(targetPos.getX() + dx, downY, targetPos.getZ() + dz), bestPos);
|
||||
}
|
||||
|
||||
if (bestPos != null) {
|
||||
bestDistance = bestPos.distSqr(targetPos);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (bestPos != null && bestDistance <= (radius + 8) * (radius + 8)) {
|
||||
return Optional.of(bestPos);
|
||||
}
|
||||
}
|
||||
|
||||
return Optional.ofNullable(bestPos);
|
||||
}
|
||||
|
||||
private static BlockPos chooseCloserSafePos(ServerLevel level, BlockPos targetPos, BlockPos candidate, BlockPos currentBest) {
|
||||
if (!isSafeStandingPos(level, candidate)) {
|
||||
return currentBest;
|
||||
}
|
||||
|
||||
if (currentBest == null || candidate.distSqr(targetPos) < currentBest.distSqr(targetPos)) {
|
||||
return candidate;
|
||||
}
|
||||
|
||||
return currentBest;
|
||||
}
|
||||
|
||||
private static boolean isSafeStandingPos(ServerLevel level, BlockPos pos) {
|
||||
if (pos.getY() <= level.getMinY() + 8 || pos.getY() >= level.getMaxY() - PortalFrame.OUTER_HEIGHT - 2) {
|
||||
return false;
|
||||
}
|
||||
|
||||
BlockState floor = level.getBlockState(pos.below());
|
||||
|
||||
if (floor.isAir() || floor.liquid()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return isReplaceableAir(level, pos) && isReplaceableAir(level, pos.above()) && isReplaceableAir(level, pos.above(2));
|
||||
}
|
||||
|
||||
private static boolean isReplaceableAir(ServerLevel level, BlockPos pos) {
|
||||
BlockState state = level.getBlockState(pos);
|
||||
return state.isAir() || state.canBeReplaced();
|
||||
}
|
||||
|
||||
private static BlockPos portalPos(BlockPos origin, Direction.Axis axis, int horizontal, int vertical) {
|
||||
return switch (axis) {
|
||||
case X -> origin.east(horizontal).above(vertical);
|
||||
case Z -> origin.south(horizontal).above(vertical);
|
||||
default -> origin;
|
||||
};
|
||||
}
|
||||
|
||||
private static BlockPos pocketPos(BlockPos origin, Direction.Axis axis, int horizontal, int vertical, int depth) {
|
||||
return switch (axis) {
|
||||
case X -> origin.east(horizontal).north(depth).above(vertical);
|
||||
case Z -> origin.south(horizontal).east(depth).above(vertical);
|
||||
default -> origin;
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2026 KOKA99CAB
|
||||
* SPDX-License-Identifier: LGPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package net.koka99cab.portals.registry;
|
||||
|
||||
import net.koka99cab.portals.PortalsMod;
|
||||
import net.koka99cab.portals.block.OrePortalBlock;
|
||||
import net.koka99cab.portals.portal.PortalFramePredicates;
|
||||
import net.koka99cab.portals.world.ModDimensions;
|
||||
import net.minecraft.core.Registry;
|
||||
import net.minecraft.core.particles.ParticleTypes;
|
||||
import net.minecraft.core.registries.BuiltInRegistries;
|
||||
import net.minecraft.core.registries.Registries;
|
||||
import net.minecraft.resources.Identifier;
|
||||
import net.minecraft.resources.ResourceKey;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.Blocks;
|
||||
import net.minecraft.world.level.block.SoundType;
|
||||
import net.minecraft.world.level.block.state.BlockBehaviour;
|
||||
import net.minecraft.world.level.material.PushReaction;
|
||||
|
||||
public final class ModBlocks {
|
||||
public static final OrePortalBlock ORE_PORTAL = register("ore_portal", new OrePortalBlock(
|
||||
portalProperties("ore_portal"),
|
||||
ModDimensions.ORE_CAVES,
|
||||
Blocks.STONE,
|
||||
ParticleTypes.END_ROD
|
||||
));
|
||||
public static final OrePortalBlock OVERWORLD2_PORTAL = register("overworld2_portal", new OrePortalBlock(
|
||||
portalProperties("overworld2_portal"),
|
||||
ModDimensions.OVERWORLD2,
|
||||
Blocks.DIRT,
|
||||
state -> state.is(Blocks.DIRT) || state.is(Blocks.GRASS_BLOCK),
|
||||
ParticleTypes.HAPPY_VILLAGER
|
||||
));
|
||||
public static final OrePortalBlock SHEEP_LAND_PORTAL = register("sheep_land_portal", new OrePortalBlock(
|
||||
portalProperties("sheep_land_portal"),
|
||||
ModDimensions.SHEEP_LAND,
|
||||
Blocks.WHITE_WOOL,
|
||||
ParticleTypes.FIREWORK
|
||||
));
|
||||
public static final OrePortalBlock SKELETON_WASTE_PORTAL = register("skeleton_waste_portal", new OrePortalBlock(
|
||||
portalProperties("skeleton_waste_portal"),
|
||||
ModDimensions.SKELETON_WASTE,
|
||||
Blocks.BONE_BLOCK,
|
||||
ParticleTypes.SOUL_FIRE_FLAME
|
||||
));
|
||||
public static final OrePortalBlock PAINTED_CANYONS_PORTAL = register("painted_canyons_portal", new OrePortalBlock(
|
||||
portalProperties("painted_canyons_portal"),
|
||||
ModDimensions.PAINTED_CANYONS,
|
||||
Blocks.TERRACOTTA,
|
||||
PortalFramePredicates.TERRACOTTA,
|
||||
ParticleTypes.FLAME
|
||||
));
|
||||
|
||||
private ModBlocks() {
|
||||
}
|
||||
|
||||
public static void init() {
|
||||
PortalsMod.LOGGER.debug("Registered mod blocks");
|
||||
}
|
||||
|
||||
private static <T extends Block> T register(String path, T block) {
|
||||
Identifier id = PortalsMod.id(path);
|
||||
return Registry.register(BuiltInRegistries.BLOCK, id, block);
|
||||
}
|
||||
|
||||
private static BlockBehaviour.Properties portalProperties(String path) {
|
||||
return BlockBehaviour.Properties.of()
|
||||
.noCollision()
|
||||
.noOcclusion()
|
||||
.noLootTable()
|
||||
.lightLevel(state -> 8)
|
||||
.strength(-1.0F)
|
||||
.sound(SoundType.GLASS)
|
||||
.pushReaction(PushReaction.BLOCK)
|
||||
.setId(ResourceKey.create(Registries.BLOCK, PortalsMod.id(path)));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2026 KOKA99CAB
|
||||
* SPDX-License-Identifier: LGPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package net.koka99cab.portals.world;
|
||||
|
||||
import net.koka99cab.portals.PortalsMod;
|
||||
import net.minecraft.core.registries.Registries;
|
||||
import net.minecraft.resources.ResourceKey;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.dimension.LevelStem;
|
||||
|
||||
public final class ModDimensions {
|
||||
public static final ResourceKey<Level> ORE_CAVES = ResourceKey.create(Registries.DIMENSION, PortalsMod.id("ore_caves"));
|
||||
public static final ResourceKey<LevelStem> ORE_CAVES_STEM = ResourceKey.create(Registries.LEVEL_STEM, PortalsMod.id("ore_caves"));
|
||||
public static final ResourceKey<Level> OVERWORLD2 = ResourceKey.create(Registries.DIMENSION, PortalsMod.id("overworld2"));
|
||||
public static final ResourceKey<LevelStem> OVERWORLD2_STEM = ResourceKey.create(Registries.LEVEL_STEM, PortalsMod.id("overworld2"));
|
||||
public static final ResourceKey<Level> SHEEP_LAND = ResourceKey.create(Registries.DIMENSION, PortalsMod.id("sheep_land"));
|
||||
public static final ResourceKey<LevelStem> SHEEP_LAND_STEM = ResourceKey.create(Registries.LEVEL_STEM, PortalsMod.id("sheep_land"));
|
||||
public static final ResourceKey<Level> SKELETON_WASTE = ResourceKey.create(Registries.DIMENSION, PortalsMod.id("skeleton_waste"));
|
||||
public static final ResourceKey<LevelStem> SKELETON_WASTE_STEM = ResourceKey.create(Registries.LEVEL_STEM, PortalsMod.id("skeleton_waste"));
|
||||
public static final ResourceKey<Level> PAINTED_CANYONS = ResourceKey.create(Registries.DIMENSION, PortalsMod.id("painted_canyons"));
|
||||
public static final ResourceKey<LevelStem> PAINTED_CANYONS_STEM = ResourceKey.create(Registries.LEVEL_STEM, PortalsMod.id("painted_canyons"));
|
||||
|
||||
private ModDimensions() {
|
||||
}
|
||||
|
||||
public static void init() {
|
||||
PortalsMod.LOGGER.debug("Registered dimension keys for {}, {}, {}, {}, and {}", ORE_CAVES.identifier(), OVERWORLD2.identifier(), SHEEP_LAND.identifier(), SKELETON_WASTE.identifier(), PAINTED_CANYONS.identifier());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2026 KOKA99CAB
|
||||
* SPDX-License-Identifier: LGPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package net.koka99cab.portals.world;
|
||||
|
||||
import net.koka99cab.portals.PortalsMod;
|
||||
import net.koka99cab.portals.world.feature.SkeletonBasaltSpikeFeature;
|
||||
import net.koka99cab.portals.world.feature.SkeletonRuinFeature;
|
||||
import net.minecraft.core.Registry;
|
||||
import net.minecraft.core.registries.BuiltInRegistries;
|
||||
import net.minecraft.resources.Identifier;
|
||||
import net.minecraft.world.level.levelgen.feature.Feature;
|
||||
import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration;
|
||||
|
||||
public final class ModFeatures {
|
||||
public static final Feature<NoneFeatureConfiguration> SKELETON_BASALT_SPIKE = register(
|
||||
"skeleton_basalt_spike",
|
||||
new SkeletonBasaltSpikeFeature(NoneFeatureConfiguration.CODEC)
|
||||
);
|
||||
public static final Feature<NoneFeatureConfiguration> SKELETON_RUIN = register(
|
||||
"skeleton_ruin",
|
||||
new SkeletonRuinFeature(NoneFeatureConfiguration.CODEC)
|
||||
);
|
||||
|
||||
private ModFeatures() {
|
||||
}
|
||||
|
||||
public static void init() {
|
||||
PortalsMod.LOGGER.debug("Registered skeleton waste worldgen features");
|
||||
}
|
||||
|
||||
private static <T extends Feature<?>> T register(String path, T feature) {
|
||||
Identifier id = PortalsMod.id(path);
|
||||
return Registry.register(BuiltInRegistries.FEATURE, id, feature);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,127 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2026 KOKA99CAB
|
||||
* SPDX-License-Identifier: LGPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package net.koka99cab.portals.world;
|
||||
|
||||
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
|
||||
import net.koka99cab.portals.PortalsMod;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.minecraft.util.RandomSource;
|
||||
import net.minecraft.world.Difficulty;
|
||||
import net.minecraft.world.entity.Entity;
|
||||
import net.minecraft.world.entity.EntitySpawnReason;
|
||||
import net.minecraft.world.entity.EntityType;
|
||||
import net.minecraft.world.entity.Mob;
|
||||
import net.minecraft.world.level.levelgen.Heightmap;
|
||||
import net.minecraft.world.phys.AABB;
|
||||
|
||||
public final class SkeletonWasteSpawner {
|
||||
private static final int TICK_INTERVAL = 80;
|
||||
private static final int LOCAL_RADIUS = 64;
|
||||
private static final int LOCAL_LIMIT = 24;
|
||||
|
||||
private SkeletonWasteSpawner() {
|
||||
}
|
||||
|
||||
public static void register() {
|
||||
ServerTickEvents.END_LEVEL_TICK.register(SkeletonWasteSpawner::tick);
|
||||
PortalsMod.LOGGER.debug("Registered skeleton waste spawn support");
|
||||
}
|
||||
|
||||
private static void tick(ServerLevel level) {
|
||||
if (!level.dimension().equals(ModDimensions.SKELETON_WASTE) || level.getDifficulty() == Difficulty.PEACEFUL || level.players().isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (level.getGameTime() % TICK_INTERVAL != 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
RandomSource random = level.getRandom();
|
||||
|
||||
for (ServerPlayer player : level.players()) {
|
||||
if (countSkeletonFamily(level, player.blockPosition()) >= LOCAL_LIMIT) {
|
||||
continue;
|
||||
}
|
||||
|
||||
for (int attempt = 0; attempt < 4; attempt++) {
|
||||
if (trySpawnNear(level, player, random)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean trySpawnNear(ServerLevel level, ServerPlayer player, RandomSource random) {
|
||||
double angle = random.nextDouble() * Math.PI * 2.0D;
|
||||
int distance = 24 + random.nextInt(33);
|
||||
int x = player.blockPosition().getX() + (int) Math.round(Math.cos(angle) * distance);
|
||||
int z = player.blockPosition().getZ() + (int) Math.round(Math.sin(angle) * distance);
|
||||
int y = level.getHeight(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, x, z);
|
||||
BlockPos pos = new BlockPos(x, y, z);
|
||||
EntityType<? extends Mob> type = randomSkeletonType(random);
|
||||
|
||||
if (player.distanceToSqr(x + 0.5D, y, z + 0.5D) < 400.0D || !canSpawnAt(level, pos, type)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return type.spawn(level, pos, EntitySpawnReason.NATURAL) != null;
|
||||
}
|
||||
|
||||
private static EntityType<? extends Mob> randomSkeletonType(RandomSource random) {
|
||||
int roll = random.nextInt(100);
|
||||
|
||||
if (roll < 45) {
|
||||
return EntityType.SKELETON;
|
||||
}
|
||||
|
||||
if (roll < 75) {
|
||||
return EntityType.STRAY;
|
||||
}
|
||||
|
||||
if (roll < 90) {
|
||||
return EntityType.PARCHED;
|
||||
}
|
||||
|
||||
return EntityType.BOGGED;
|
||||
}
|
||||
|
||||
private static boolean canSpawnAt(ServerLevel level, BlockPos pos, EntityType<?> type) {
|
||||
if (pos.getY() <= level.getMinY() + 1 || pos.getY() >= level.getMaxY() - 2) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!level.isEmptyBlock(pos) || !level.isEmptyBlock(pos.above())) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!level.getFluidState(pos).isEmpty() || !level.getFluidState(pos.above()).isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (level.getBlockState(pos.below()).isAir() || level.getBlockState(pos.below()).liquid()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return level.noCollision(type.getSpawnAABB(pos.getX() + 0.5D, pos.getY(), pos.getZ() + 0.5D));
|
||||
}
|
||||
|
||||
private static int countSkeletonFamily(ServerLevel level, BlockPos center) {
|
||||
AABB bounds = new AABB(center).inflate(LOCAL_RADIUS);
|
||||
|
||||
return level.getEntities((Entity) null, bounds, SkeletonWasteSpawner::isSkeletonFamily).size();
|
||||
}
|
||||
|
||||
private static boolean isSkeletonFamily(Entity entity) {
|
||||
EntityType<?> type = entity.getType();
|
||||
return entity.isAlive()
|
||||
&& (type == EntityType.SKELETON
|
||||
|| type == EntityType.STRAY
|
||||
|| type == EntityType.BOGGED
|
||||
|| type == EntityType.PARCHED);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,107 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2026 KOKA99CAB
|
||||
* SPDX-License-Identifier: LGPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package net.koka99cab.portals.world.feature;
|
||||
|
||||
import com.mojang.serialization.Codec;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.util.RandomSource;
|
||||
import net.minecraft.world.level.WorldGenLevel;
|
||||
import net.minecraft.world.level.block.Blocks;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.levelgen.Heightmap;
|
||||
import net.minecraft.world.level.levelgen.feature.Feature;
|
||||
import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext;
|
||||
import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration;
|
||||
|
||||
public final class SkeletonBasaltSpikeFeature extends Feature<NoneFeatureConfiguration> {
|
||||
private static final BlockState BASALT = Blocks.BASALT.defaultBlockState();
|
||||
private static final BlockState SMOOTH_BASALT = Blocks.SMOOTH_BASALT.defaultBlockState();
|
||||
private static final BlockState SOUL_SOIL = Blocks.SOUL_SOIL.defaultBlockState();
|
||||
|
||||
public SkeletonBasaltSpikeFeature(Codec<NoneFeatureConfiguration> codec) {
|
||||
super(codec);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean place(FeaturePlaceContext<NoneFeatureConfiguration> context) {
|
||||
WorldGenLevel level = context.level();
|
||||
RandomSource random = context.random();
|
||||
BlockPos origin = context.origin();
|
||||
int y = level.getHeight(Heightmap.Types.OCEAN_FLOOR_WG, origin.getX(), origin.getZ());
|
||||
|
||||
if (y <= level.getMinY() + 4 || y >= level.getMaxY() - 8) {
|
||||
return false;
|
||||
}
|
||||
|
||||
BlockPos base = new BlockPos(origin.getX(), y - 1, origin.getZ());
|
||||
|
||||
if (level.getBlockState(base).isAir()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
int height = Math.min(10 + random.nextInt(27), level.getMaxY() - y - 2);
|
||||
int baseRadius = 2 + random.nextInt(4);
|
||||
|
||||
if (height < 10) {
|
||||
return false;
|
||||
}
|
||||
|
||||
boolean placed = false;
|
||||
|
||||
for (int dy = 0; dy < height; dy++) {
|
||||
double taper = 1.0D - (double) dy / (double) height;
|
||||
int radius = Math.max(0, (int) Math.ceil(baseRadius * taper + random.nextDouble() * 0.85D - 0.35D));
|
||||
|
||||
for (int dx = -radius; dx <= radius; dx++) {
|
||||
for (int dz = -radius; dz <= radius; dz++) {
|
||||
double distance = Math.sqrt(dx * dx + dz * dz);
|
||||
|
||||
if (distance > radius + random.nextDouble() * 0.8D || dy > 2 && random.nextInt(18) == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
BlockState state = random.nextInt(5) == 0 ? SMOOTH_BASALT : BASALT;
|
||||
placed |= placeBlock(level, base.offset(dx, dy, dz), state);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (int shard = 0; shard < 2 + random.nextInt(4); shard++) {
|
||||
int dx = random.nextInt(baseRadius * 4 + 1) - baseRadius * 2;
|
||||
int dz = random.nextInt(baseRadius * 4 + 1) - baseRadius * 2;
|
||||
int shardHeight = 3 + random.nextInt(Math.max(4, height / 3));
|
||||
|
||||
for (int dy = 0; dy < shardHeight; dy++) {
|
||||
placed |= placeBlock(level, base.offset(dx, dy, dz), random.nextInt(4) == 0 ? SMOOTH_BASALT : BASALT);
|
||||
}
|
||||
}
|
||||
|
||||
for (int dx = -baseRadius - 1; dx <= baseRadius + 1; dx++) {
|
||||
for (int dz = -baseRadius - 1; dz <= baseRadius + 1; dz++) {
|
||||
if (Math.abs(dx) + Math.abs(dz) > baseRadius + 2 || random.nextInt(4) == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
BlockPos scatter = base.offset(dx, -1, dz);
|
||||
|
||||
if (!level.getBlockState(scatter).isAir()) {
|
||||
placed |= placeBlock(level, scatter, SOUL_SOIL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return placed;
|
||||
}
|
||||
|
||||
private static boolean placeBlock(WorldGenLevel level, BlockPos pos, BlockState state) {
|
||||
if (pos.getY() <= level.getMinY() || pos.getY() >= level.getMaxY() || !level.ensureCanWrite(pos)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
level.setBlock(pos, state, 3);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,202 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2026 KOKA99CAB
|
||||
* SPDX-License-Identifier: LGPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package net.koka99cab.portals.world.feature;
|
||||
|
||||
import com.mojang.serialization.Codec;
|
||||
import net.koka99cab.portals.PortalsMod;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.Direction;
|
||||
import net.minecraft.core.registries.Registries;
|
||||
import net.minecraft.resources.ResourceKey;
|
||||
import net.minecraft.util.RandomSource;
|
||||
import net.minecraft.world.level.WorldGenLevel;
|
||||
import net.minecraft.world.level.block.Blocks;
|
||||
import net.minecraft.world.level.block.ChestBlock;
|
||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||
import net.minecraft.world.level.block.entity.ChestBlockEntity;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.levelgen.Heightmap;
|
||||
import net.minecraft.world.level.levelgen.feature.Feature;
|
||||
import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext;
|
||||
import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration;
|
||||
import net.minecraft.world.level.storage.loot.LootTable;
|
||||
|
||||
public final class SkeletonRuinFeature extends Feature<NoneFeatureConfiguration> {
|
||||
private static final ResourceKey<LootTable> LOOT_TABLE = ResourceKey.create(Registries.LOOT_TABLE, PortalsMod.id("chests/skeleton_ruin"));
|
||||
private static final Direction[] HORIZONTAL_DIRECTIONS = new Direction[] {
|
||||
Direction.NORTH,
|
||||
Direction.EAST,
|
||||
Direction.SOUTH,
|
||||
Direction.WEST
|
||||
};
|
||||
|
||||
public SkeletonRuinFeature(Codec<NoneFeatureConfiguration> codec) {
|
||||
super(codec);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean place(FeaturePlaceContext<NoneFeatureConfiguration> context) {
|
||||
WorldGenLevel level = context.level();
|
||||
RandomSource random = context.random();
|
||||
BlockPos origin = context.origin();
|
||||
int y = level.getHeight(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, origin.getX(), origin.getZ());
|
||||
|
||||
if (y <= level.getMinY() + 5 || y >= level.getMaxY() - 10) {
|
||||
return false;
|
||||
}
|
||||
|
||||
BlockPos base = new BlockPos(origin.getX(), y, origin.getZ());
|
||||
|
||||
if (level.getBlockState(base.below()).isAir()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
boolean placed = false;
|
||||
int radius = 13;
|
||||
int keepRadius = 6;
|
||||
|
||||
for (int x = -radius; x <= radius; x++) {
|
||||
for (int z = -radius; z <= radius; z++) {
|
||||
if ((Math.abs(x) == radius && Math.abs(z) == radius && random.nextBoolean()) || random.nextInt(7) == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
placed |= placeBlock(level, base.offset(x, -1, z), foundationBlock(random));
|
||||
}
|
||||
}
|
||||
|
||||
placed |= buildWall(level, random, base, -radius, radius, -radius, -radius);
|
||||
placed |= buildWall(level, random, base, -radius, radius, radius, radius);
|
||||
placed |= buildWall(level, random, base, -radius, -radius, -radius, radius);
|
||||
placed |= buildWall(level, random, base, radius, radius, -radius, radius);
|
||||
placed |= buildWall(level, random, base, -keepRadius, keepRadius, -keepRadius, -keepRadius);
|
||||
placed |= buildWall(level, random, base, -keepRadius, keepRadius, keepRadius, keepRadius);
|
||||
placed |= buildWall(level, random, base, -keepRadius, -keepRadius, -keepRadius, keepRadius);
|
||||
placed |= buildWall(level, random, base, keepRadius, keepRadius, -keepRadius, keepRadius);
|
||||
|
||||
placed |= buildTower(level, random, base.offset(-radius, 0, -radius), 2, 11 + random.nextInt(10));
|
||||
placed |= buildTower(level, random, base.offset(radius, 0, -radius), 2, 9 + random.nextInt(10));
|
||||
placed |= buildTower(level, random, base.offset(-radius, 0, radius), 2, 9 + random.nextInt(10));
|
||||
placed |= buildTower(level, random, base.offset(radius, 0, radius), 2, 11 + random.nextInt(10));
|
||||
placed |= buildTower(level, random, base.offset(0, 0, 0), 3, 13 + random.nextInt(13));
|
||||
|
||||
for (int i = 0; i < 130; i++) {
|
||||
int x = random.nextInt(radius * 2 + 1) - radius;
|
||||
int z = random.nextInt(radius * 2 + 1) - radius;
|
||||
|
||||
if (Math.abs(x) == radius || Math.abs(z) == radius || random.nextInt(5) == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
placed |= placeBlock(level, base.offset(x, random.nextInt(5), z), random.nextBoolean() ? wallBlock(random) : foundationBlock(random));
|
||||
}
|
||||
|
||||
if (random.nextBoolean()) {
|
||||
placed |= placeLootChest(level, random, base.offset(random.nextInt(keepRadius * 2 + 1) - keepRadius, 0, random.nextInt(keepRadius * 2 + 1) - keepRadius));
|
||||
}
|
||||
|
||||
return placed;
|
||||
}
|
||||
|
||||
private static boolean buildWall(WorldGenLevel level, RandomSource random, BlockPos base, int x1, int x2, int z1, int z2) {
|
||||
boolean placed = false;
|
||||
int length = Math.max(Math.abs(x2 - x1), Math.abs(z2 - z1));
|
||||
|
||||
for (int i = 0; i <= length; i++) {
|
||||
int x = x1 == x2 ? x1 : x1 + Integer.signum(x2 - x1) * i;
|
||||
int z = z1 == z2 ? z1 : z1 + Integer.signum(z2 - z1) * i;
|
||||
int height = 5 + random.nextInt(7);
|
||||
|
||||
for (int y = 0; y < height; y++) {
|
||||
if (y > 1 && random.nextInt(4) == 0 || y > 4 && random.nextInt(3) == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
placed |= placeBlock(level, base.offset(x, y, z), wallBlock(random));
|
||||
}
|
||||
}
|
||||
|
||||
return placed;
|
||||
}
|
||||
|
||||
private static boolean buildTower(WorldGenLevel level, RandomSource random, BlockPos base, int towerRadius, int height) {
|
||||
boolean placed = false;
|
||||
|
||||
for (int y = 0; y < height; y++) {
|
||||
for (int x = -towerRadius; x <= towerRadius; x++) {
|
||||
for (int z = -towerRadius; z <= towerRadius; z++) {
|
||||
boolean shell = Math.abs(x) == towerRadius || Math.abs(z) == towerRadius;
|
||||
|
||||
if (!shell || y > 2 && random.nextInt(5) == 0 || y > height / 2 && random.nextInt(4) == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
placed |= placeBlock(level, base.offset(x, y, z), wallBlock(random));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (int x = -towerRadius; x <= towerRadius; x++) {
|
||||
for (int z = -towerRadius; z <= towerRadius; z++) {
|
||||
if (Math.abs(x) + Math.abs(z) < towerRadius + 1 && random.nextBoolean()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
placed |= placeBlock(level, base.offset(x, height, z), wallBlock(random));
|
||||
}
|
||||
}
|
||||
|
||||
return placed;
|
||||
}
|
||||
|
||||
private static boolean placeLootChest(WorldGenLevel level, RandomSource random, BlockPos pos) {
|
||||
if (!placeBlock(level, pos, Blocks.CHEST.defaultBlockState().setValue(ChestBlock.FACING, HORIZONTAL_DIRECTIONS[random.nextInt(HORIZONTAL_DIRECTIONS.length)]))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
BlockEntity blockEntity = level.getBlockEntity(pos);
|
||||
|
||||
if (blockEntity instanceof ChestBlockEntity chest) {
|
||||
chest.setLootTable(LOOT_TABLE);
|
||||
chest.setLootTableSeed(random.nextLong());
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private static BlockState foundationBlock(RandomSource random) {
|
||||
return switch (random.nextInt(8)) {
|
||||
case 0 -> Blocks.SOUL_SOIL.defaultBlockState();
|
||||
case 1 -> Blocks.SOUL_SAND.defaultBlockState();
|
||||
case 2 -> Blocks.GRAVEL.defaultBlockState();
|
||||
case 3 -> Blocks.TUFF.defaultBlockState();
|
||||
case 4 -> Blocks.SMOOTH_BASALT.defaultBlockState();
|
||||
default -> Blocks.BASALT.defaultBlockState();
|
||||
};
|
||||
}
|
||||
|
||||
private static BlockState wallBlock(RandomSource random) {
|
||||
return switch (random.nextInt(10)) {
|
||||
case 0 -> Blocks.POLISHED_BASALT.defaultBlockState();
|
||||
case 1 -> Blocks.SMOOTH_BASALT.defaultBlockState();
|
||||
case 2 -> Blocks.BLACKSTONE.defaultBlockState();
|
||||
case 3 -> Blocks.POLISHED_BLACKSTONE.defaultBlockState();
|
||||
case 4 -> Blocks.POLISHED_BLACKSTONE_BRICKS.defaultBlockState();
|
||||
case 5 -> Blocks.CRACKED_POLISHED_BLACKSTONE_BRICKS.defaultBlockState();
|
||||
case 6 -> Blocks.COBBLED_DEEPSLATE.defaultBlockState();
|
||||
default -> Blocks.BASALT.defaultBlockState();
|
||||
};
|
||||
}
|
||||
|
||||
private static boolean placeBlock(WorldGenLevel level, BlockPos pos, BlockState state) {
|
||||
if (pos.getY() <= level.getMinY() || pos.getY() >= level.getMaxY() || !level.ensureCanWrite(pos)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
level.setBlock(pos, state, 3);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"variants": {
|
||||
"axis=x": {
|
||||
"model": "portals:block/ore_portal"
|
||||
},
|
||||
"axis=z": {
|
||||
"model": "portals:block/ore_portal",
|
||||
"y": 90
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"variants": {
|
||||
"axis=x": {
|
||||
"model": "portals:block/overworld2_portal"
|
||||
},
|
||||
"axis=z": {
|
||||
"model": "portals:block/overworld2_portal",
|
||||
"y": 90
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"variants": {
|
||||
"axis=x": {
|
||||
"model": "portals:block/painted_canyons_portal"
|
||||
},
|
||||
"axis=z": {
|
||||
"model": "portals:block/painted_canyons_portal",
|
||||
"y": 90
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"variants": {
|
||||
"axis=x": {
|
||||
"model": "portals:block/sheep_land_portal"
|
||||
},
|
||||
"axis=z": {
|
||||
"model": "portals:block/sheep_land_portal",
|
||||
"y": 90
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"variants": {
|
||||
"axis=x": {
|
||||
"model": "portals:block/skeleton_waste_portal"
|
||||
},
|
||||
"axis=z": {
|
||||
"model": "portals:block/skeleton_waste_portal",
|
||||
"y": 90
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"block.portals.ore_portal": "Ore Caves Portal",
|
||||
"block.portals.overworld2_portal": "Overworld II Portal",
|
||||
"block.portals.sheep_land_portal": "Sheep Land Portal",
|
||||
"block.portals.skeleton_waste_portal": "Skeleton Waste Portal",
|
||||
"block.portals.painted_canyons_portal": "Painted Canyons Portal",
|
||||
"modmenu.descriptionTranslation.portals": "Ritual portals to strange in-world dimensions: ore-rich caverns, a second overworld, Sheep Land, the haunted Skeleton Waste, and Painted Canyons."
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"block.portals.ore_portal": "Portail des cavernes minerais",
|
||||
"block.portals.overworld2_portal": "Portail Overworld II",
|
||||
"block.portals.sheep_land_portal": "Portail du pays des moutons",
|
||||
"block.portals.skeleton_waste_portal": "Portail Skeleton Waste",
|
||||
"block.portals.painted_canyons_portal": "Portail des canyons peints",
|
||||
"modmenu.descriptionTranslation.portals": "Des portails rituels vers des dimensions etranges integrees au monde : cavernes riches en minerais, Overworld II, pays des moutons, Skeleton Waste hantee et canyons peints."
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"textures": {
|
||||
"portal": "portals:block/portal/ore_portal",
|
||||
"particle": "portals:block/portal/ore_portal"
|
||||
},
|
||||
"elements": [
|
||||
{
|
||||
"from": [
|
||||
0,
|
||||
0,
|
||||
7
|
||||
],
|
||||
"to": [
|
||||
16,
|
||||
16,
|
||||
9
|
||||
],
|
||||
"faces": {
|
||||
"north": {
|
||||
"texture": "#portal"
|
||||
},
|
||||
"south": {
|
||||
"texture": "#portal"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"textures": {
|
||||
"portal": "portals:block/portal/overworld2_portal",
|
||||
"particle": "portals:block/portal/overworld2_portal"
|
||||
},
|
||||
"elements": [
|
||||
{
|
||||
"from": [
|
||||
0,
|
||||
0,
|
||||
7
|
||||
],
|
||||
"to": [
|
||||
16,
|
||||
16,
|
||||
9
|
||||
],
|
||||
"faces": {
|
||||
"north": {
|
||||
"texture": "#portal"
|
||||
},
|
||||
"south": {
|
||||
"texture": "#portal"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"textures": {
|
||||
"portal": "portals:block/portal/painted_canyons_portal",
|
||||
"particle": "portals:block/portal/painted_canyons_portal"
|
||||
},
|
||||
"elements": [
|
||||
{
|
||||
"from": [
|
||||
0,
|
||||
0,
|
||||
7
|
||||
],
|
||||
"to": [
|
||||
16,
|
||||
16,
|
||||
9
|
||||
],
|
||||
"faces": {
|
||||
"north": {
|
||||
"texture": "#portal"
|
||||
},
|
||||
"south": {
|
||||
"texture": "#portal"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"textures": {
|
||||
"portal": "portals:block/portal/sheep_land_portal",
|
||||
"particle": "portals:block/portal/sheep_land_portal"
|
||||
},
|
||||
"elements": [
|
||||
{
|
||||
"from": [
|
||||
0,
|
||||
0,
|
||||
7
|
||||
],
|
||||
"to": [
|
||||
16,
|
||||
16,
|
||||
9
|
||||
],
|
||||
"faces": {
|
||||
"north": {
|
||||
"texture": "#portal"
|
||||
},
|
||||
"south": {
|
||||
"texture": "#portal"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"textures": {
|
||||
"portal": "portals:block/portal/skeleton_waste_portal",
|
||||
"particle": "portals:block/portal/skeleton_waste_portal"
|
||||
},
|
||||
"elements": [
|
||||
{
|
||||
"from": [
|
||||
0,
|
||||
0,
|
||||
7
|
||||
],
|
||||
"to": [
|
||||
16,
|
||||
16,
|
||||
9
|
||||
],
|
||||
"faces": {
|
||||
"north": {
|
||||
"texture": "#portal"
|
||||
},
|
||||
"south": {
|
||||
"texture": "#portal"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 16 KiB |
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"animation": {
|
||||
"frametime": 2
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 17 KiB |
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"animation": {
|
||||
"frametime": 2
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 18 KiB |
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"animation": {
|
||||
"frametime": 2
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 16 KiB |
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"animation": {
|
||||
"frametime": 2
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 22 KiB |
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"animation": {
|
||||
"frametime": 2
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 23 KiB |
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"animation": {
|
||||
"frametime": 2
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,444 @@
|
||||
{
|
||||
"type": "portals:ore_caves",
|
||||
"generator": {
|
||||
"type": "minecraft:noise",
|
||||
"biome_source": {
|
||||
"type": "minecraft:multi_noise",
|
||||
"biomes": [
|
||||
{
|
||||
"biome": "portals:ore_caves_dripstone",
|
||||
"parameters": {
|
||||
"temperature": -0.75,
|
||||
"humidity": -0.75,
|
||||
"continentalness": 0.0,
|
||||
"erosion": 0.0,
|
||||
"depth": 0.0,
|
||||
"weirdness": 0.0,
|
||||
"offset": 0.0
|
||||
}
|
||||
},
|
||||
{
|
||||
"biome": "portals:ore_caves",
|
||||
"parameters": {
|
||||
"temperature": -0.45,
|
||||
"humidity": -0.75,
|
||||
"continentalness": 0.0,
|
||||
"erosion": 0.0,
|
||||
"depth": 0.0,
|
||||
"weirdness": 0.0,
|
||||
"offset": 0.0
|
||||
}
|
||||
},
|
||||
{
|
||||
"biome": "portals:ore_caves_dripstone",
|
||||
"parameters": {
|
||||
"temperature": -0.15,
|
||||
"humidity": -0.75,
|
||||
"continentalness": 0.0,
|
||||
"erosion": 0.0,
|
||||
"depth": 0.0,
|
||||
"weirdness": 0.0,
|
||||
"offset": 0.0
|
||||
}
|
||||
},
|
||||
{
|
||||
"biome": "portals:ore_caves_deep",
|
||||
"parameters": {
|
||||
"temperature": 0.15,
|
||||
"humidity": -0.75,
|
||||
"continentalness": 0.0,
|
||||
"erosion": 0.0,
|
||||
"depth": 0.0,
|
||||
"weirdness": 0.0,
|
||||
"offset": 0.0
|
||||
}
|
||||
},
|
||||
{
|
||||
"biome": "portals:ore_caves_dripstone",
|
||||
"parameters": {
|
||||
"temperature": 0.45,
|
||||
"humidity": -0.75,
|
||||
"continentalness": 0.0,
|
||||
"erosion": 0.0,
|
||||
"depth": 0.0,
|
||||
"weirdness": 0.0,
|
||||
"offset": 0.0
|
||||
}
|
||||
},
|
||||
{
|
||||
"biome": "portals:ore_caves",
|
||||
"parameters": {
|
||||
"temperature": 0.75,
|
||||
"humidity": -0.75,
|
||||
"continentalness": 0.0,
|
||||
"erosion": 0.0,
|
||||
"depth": 0.0,
|
||||
"weirdness": 0.0,
|
||||
"offset": 0.0
|
||||
}
|
||||
},
|
||||
{
|
||||
"biome": "portals:ore_caves",
|
||||
"parameters": {
|
||||
"temperature": -0.75,
|
||||
"humidity": -0.45,
|
||||
"continentalness": 0.0,
|
||||
"erosion": 0.0,
|
||||
"depth": 0.0,
|
||||
"weirdness": 0.0,
|
||||
"offset": 0.0
|
||||
}
|
||||
},
|
||||
{
|
||||
"biome": "portals:ore_caves_dripstone",
|
||||
"parameters": {
|
||||
"temperature": -0.45,
|
||||
"humidity": -0.45,
|
||||
"continentalness": 0.0,
|
||||
"erosion": 0.0,
|
||||
"depth": 0.0,
|
||||
"weirdness": 0.0,
|
||||
"offset": 0.0
|
||||
}
|
||||
},
|
||||
{
|
||||
"biome": "portals:ore_caves_deep",
|
||||
"parameters": {
|
||||
"temperature": -0.15,
|
||||
"humidity": -0.45,
|
||||
"continentalness": 0.0,
|
||||
"erosion": 0.0,
|
||||
"depth": 0.0,
|
||||
"weirdness": 0.0,
|
||||
"offset": 0.0
|
||||
}
|
||||
},
|
||||
{
|
||||
"biome": "portals:ore_caves_dripstone",
|
||||
"parameters": {
|
||||
"temperature": 0.15,
|
||||
"humidity": -0.45,
|
||||
"continentalness": 0.0,
|
||||
"erosion": 0.0,
|
||||
"depth": 0.0,
|
||||
"weirdness": 0.0,
|
||||
"offset": 0.0
|
||||
}
|
||||
},
|
||||
{
|
||||
"biome": "portals:ore_caves",
|
||||
"parameters": {
|
||||
"temperature": 0.45,
|
||||
"humidity": -0.45,
|
||||
"continentalness": 0.0,
|
||||
"erosion": 0.0,
|
||||
"depth": 0.0,
|
||||
"weirdness": 0.0,
|
||||
"offset": 0.0
|
||||
}
|
||||
},
|
||||
{
|
||||
"biome": "portals:ore_caves_dripstone",
|
||||
"parameters": {
|
||||
"temperature": 0.75,
|
||||
"humidity": -0.45,
|
||||
"continentalness": 0.0,
|
||||
"erosion": 0.0,
|
||||
"depth": 0.0,
|
||||
"weirdness": 0.0,
|
||||
"offset": 0.0
|
||||
}
|
||||
},
|
||||
{
|
||||
"biome": "portals:ore_caves_deep",
|
||||
"parameters": {
|
||||
"temperature": -0.75,
|
||||
"humidity": -0.15,
|
||||
"continentalness": 0.0,
|
||||
"erosion": 0.0,
|
||||
"depth": 0.0,
|
||||
"weirdness": 0.0,
|
||||
"offset": 0.0
|
||||
}
|
||||
},
|
||||
{
|
||||
"biome": "portals:ore_caves",
|
||||
"parameters": {
|
||||
"temperature": -0.45,
|
||||
"humidity": -0.15,
|
||||
"continentalness": 0.0,
|
||||
"erosion": 0.0,
|
||||
"depth": 0.0,
|
||||
"weirdness": 0.0,
|
||||
"offset": 0.0
|
||||
}
|
||||
},
|
||||
{
|
||||
"biome": "portals:ore_caves_dripstone",
|
||||
"parameters": {
|
||||
"temperature": -0.15,
|
||||
"humidity": -0.15,
|
||||
"continentalness": 0.0,
|
||||
"erosion": 0.0,
|
||||
"depth": 0.0,
|
||||
"weirdness": 0.0,
|
||||
"offset": 0.0
|
||||
}
|
||||
},
|
||||
{
|
||||
"biome": "portals:ore_caves_lush",
|
||||
"parameters": {
|
||||
"temperature": 0.15,
|
||||
"humidity": -0.15,
|
||||
"continentalness": 0.0,
|
||||
"erosion": 0.0,
|
||||
"depth": 0.0,
|
||||
"weirdness": 0.0,
|
||||
"offset": 0.0
|
||||
}
|
||||
},
|
||||
{
|
||||
"biome": "portals:ore_caves_dripstone",
|
||||
"parameters": {
|
||||
"temperature": 0.45,
|
||||
"humidity": -0.15,
|
||||
"continentalness": 0.0,
|
||||
"erosion": 0.0,
|
||||
"depth": 0.0,
|
||||
"weirdness": 0.0,
|
||||
"offset": 0.0
|
||||
}
|
||||
},
|
||||
{
|
||||
"biome": "portals:ore_caves",
|
||||
"parameters": {
|
||||
"temperature": 0.75,
|
||||
"humidity": -0.15,
|
||||
"continentalness": 0.0,
|
||||
"erosion": 0.0,
|
||||
"depth": 0.0,
|
||||
"weirdness": 0.0,
|
||||
"offset": 0.0
|
||||
}
|
||||
},
|
||||
{
|
||||
"biome": "portals:ore_caves",
|
||||
"parameters": {
|
||||
"temperature": -0.75,
|
||||
"humidity": 0.15,
|
||||
"continentalness": 0.0,
|
||||
"erosion": 0.0,
|
||||
"depth": 0.0,
|
||||
"weirdness": 0.0,
|
||||
"offset": 0.0
|
||||
}
|
||||
},
|
||||
{
|
||||
"biome": "portals:ore_caves_lush",
|
||||
"parameters": {
|
||||
"temperature": -0.45,
|
||||
"humidity": 0.15,
|
||||
"continentalness": 0.0,
|
||||
"erosion": 0.0,
|
||||
"depth": 0.0,
|
||||
"weirdness": 0.0,
|
||||
"offset": 0.0
|
||||
}
|
||||
},
|
||||
{
|
||||
"biome": "portals:ore_caves_deep",
|
||||
"parameters": {
|
||||
"temperature": -0.15,
|
||||
"humidity": 0.15,
|
||||
"continentalness": 0.0,
|
||||
"erosion": 0.0,
|
||||
"depth": 0.0,
|
||||
"weirdness": 0.0,
|
||||
"offset": 0.0
|
||||
}
|
||||
},
|
||||
{
|
||||
"biome": "portals:ore_caves",
|
||||
"parameters": {
|
||||
"temperature": 0.15,
|
||||
"humidity": 0.15,
|
||||
"continentalness": 0.0,
|
||||
"erosion": 0.0,
|
||||
"depth": 0.0,
|
||||
"weirdness": 0.0,
|
||||
"offset": 0.0
|
||||
}
|
||||
},
|
||||
{
|
||||
"biome": "portals:ore_caves_lush",
|
||||
"parameters": {
|
||||
"temperature": 0.45,
|
||||
"humidity": 0.15,
|
||||
"continentalness": 0.0,
|
||||
"erosion": 0.0,
|
||||
"depth": 0.0,
|
||||
"weirdness": 0.0,
|
||||
"offset": 0.0
|
||||
}
|
||||
},
|
||||
{
|
||||
"biome": "portals:ore_caves_dripstone",
|
||||
"parameters": {
|
||||
"temperature": 0.75,
|
||||
"humidity": 0.15,
|
||||
"continentalness": 0.0,
|
||||
"erosion": 0.0,
|
||||
"depth": 0.0,
|
||||
"weirdness": 0.0,
|
||||
"offset": 0.0
|
||||
}
|
||||
},
|
||||
{
|
||||
"biome": "portals:ore_caves_lush",
|
||||
"parameters": {
|
||||
"temperature": -0.75,
|
||||
"humidity": 0.45,
|
||||
"continentalness": 0.0,
|
||||
"erosion": 0.0,
|
||||
"depth": 0.0,
|
||||
"weirdness": 0.0,
|
||||
"offset": 0.0
|
||||
}
|
||||
},
|
||||
{
|
||||
"biome": "portals:ore_caves",
|
||||
"parameters": {
|
||||
"temperature": -0.45,
|
||||
"humidity": 0.45,
|
||||
"continentalness": 0.0,
|
||||
"erosion": 0.0,
|
||||
"depth": 0.0,
|
||||
"weirdness": 0.0,
|
||||
"offset": 0.0
|
||||
}
|
||||
},
|
||||
{
|
||||
"biome": "portals:ore_caves_lush",
|
||||
"parameters": {
|
||||
"temperature": -0.15,
|
||||
"humidity": 0.45,
|
||||
"continentalness": 0.0,
|
||||
"erosion": 0.0,
|
||||
"depth": 0.0,
|
||||
"weirdness": 0.0,
|
||||
"offset": 0.0
|
||||
}
|
||||
},
|
||||
{
|
||||
"biome": "portals:ore_caves_dripstone",
|
||||
"parameters": {
|
||||
"temperature": 0.15,
|
||||
"humidity": 0.45,
|
||||
"continentalness": 0.0,
|
||||
"erosion": 0.0,
|
||||
"depth": 0.0,
|
||||
"weirdness": 0.0,
|
||||
"offset": 0.0
|
||||
}
|
||||
},
|
||||
{
|
||||
"biome": "portals:ore_caves",
|
||||
"parameters": {
|
||||
"temperature": 0.45,
|
||||
"humidity": 0.45,
|
||||
"continentalness": 0.0,
|
||||
"erosion": 0.0,
|
||||
"depth": 0.0,
|
||||
"weirdness": 0.0,
|
||||
"offset": 0.0
|
||||
}
|
||||
},
|
||||
{
|
||||
"biome": "portals:ore_caves_lush",
|
||||
"parameters": {
|
||||
"temperature": 0.75,
|
||||
"humidity": 0.45,
|
||||
"continentalness": 0.0,
|
||||
"erosion": 0.0,
|
||||
"depth": 0.0,
|
||||
"weirdness": 0.0,
|
||||
"offset": 0.0
|
||||
}
|
||||
},
|
||||
{
|
||||
"biome": "portals:ore_caves_lush",
|
||||
"parameters": {
|
||||
"temperature": -0.75,
|
||||
"humidity": 0.75,
|
||||
"continentalness": 0.0,
|
||||
"erosion": 0.0,
|
||||
"depth": 0.0,
|
||||
"weirdness": 0.0,
|
||||
"offset": 0.0
|
||||
}
|
||||
},
|
||||
{
|
||||
"biome": "portals:ore_caves_deep",
|
||||
"parameters": {
|
||||
"temperature": -0.45,
|
||||
"humidity": 0.75,
|
||||
"continentalness": 0.0,
|
||||
"erosion": 0.0,
|
||||
"depth": 0.0,
|
||||
"weirdness": 0.0,
|
||||
"offset": 0.0
|
||||
}
|
||||
},
|
||||
{
|
||||
"biome": "portals:ore_caves_lush",
|
||||
"parameters": {
|
||||
"temperature": -0.15,
|
||||
"humidity": 0.75,
|
||||
"continentalness": 0.0,
|
||||
"erosion": 0.0,
|
||||
"depth": 0.0,
|
||||
"weirdness": 0.0,
|
||||
"offset": 0.0
|
||||
}
|
||||
},
|
||||
{
|
||||
"biome": "portals:ore_caves",
|
||||
"parameters": {
|
||||
"temperature": 0.15,
|
||||
"humidity": 0.75,
|
||||
"continentalness": 0.0,
|
||||
"erosion": 0.0,
|
||||
"depth": 0.0,
|
||||
"weirdness": 0.0,
|
||||
"offset": 0.0
|
||||
}
|
||||
},
|
||||
{
|
||||
"biome": "portals:ore_caves_lush",
|
||||
"parameters": {
|
||||
"temperature": 0.45,
|
||||
"humidity": 0.75,
|
||||
"continentalness": 0.0,
|
||||
"erosion": 0.0,
|
||||
"depth": 0.0,
|
||||
"weirdness": 0.0,
|
||||
"offset": 0.0
|
||||
}
|
||||
},
|
||||
{
|
||||
"biome": "portals:ore_caves_dripstone",
|
||||
"parameters": {
|
||||
"temperature": 0.75,
|
||||
"humidity": 0.75,
|
||||
"continentalness": 0.0,
|
||||
"erosion": 0.0,
|
||||
"depth": 0.0,
|
||||
"weirdness": 0.0,
|
||||
"offset": 0.0
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"settings": "portals:ore_caves"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"type": "minecraft:overworld",
|
||||
"generator": {
|
||||
"type": "minecraft:noise",
|
||||
"biome_source": {
|
||||
"type": "minecraft:multi_noise",
|
||||
"preset": "minecraft:overworld"
|
||||
},
|
||||
"settings": "minecraft:overworld"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"type": "portals:painted_canyons",
|
||||
"generator": {
|
||||
"type": "minecraft:noise",
|
||||
"biome_source": {
|
||||
"type": "minecraft:fixed",
|
||||
"biome": "portals:painted_canyons"
|
||||
},
|
||||
"settings": "portals:painted_canyons"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"type": "portals:sheep_land",
|
||||
"generator": {
|
||||
"type": "minecraft:noise",
|
||||
"biome_source": {
|
||||
"type": "minecraft:fixed",
|
||||
"biome": "portals:sheep_land"
|
||||
},
|
||||
"settings": "portals:sheep_land"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"type": "portals:skeleton_waste",
|
||||
"generator": {
|
||||
"type": "minecraft:noise",
|
||||
"biome_source": {
|
||||
"type": "minecraft:fixed",
|
||||
"biome": "portals:skeleton_waste"
|
||||
},
|
||||
"settings": "portals:skeleton_waste"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
{
|
||||
"ambient_light": 0.025,
|
||||
"attributes": {
|
||||
"minecraft:audio/ambient_sounds": {
|
||||
"mood": {
|
||||
"block_search_extent": 8,
|
||||
"offset": 2.0,
|
||||
"sound": "minecraft:ambient.cave",
|
||||
"tick_delay": 6000
|
||||
}
|
||||
},
|
||||
"minecraft:gameplay/bed_rule": {
|
||||
"can_set_spawn": "never",
|
||||
"can_sleep": "never"
|
||||
},
|
||||
"minecraft:gameplay/can_start_raid": false,
|
||||
"minecraft:gameplay/respawn_anchor_works": false,
|
||||
"minecraft:gameplay/sky_light_level": 0.0,
|
||||
"minecraft:visual/ambient_light_color": "#191b22",
|
||||
"minecraft:visual/default_dripstone_particle": {
|
||||
"type": "minecraft:dripping_dripstone_water"
|
||||
},
|
||||
"minecraft:visual/fog_color": "#1e2028",
|
||||
"minecraft:visual/fog_end_distance": 80.0,
|
||||
"minecraft:visual/fog_start_distance": 12.0,
|
||||
"minecraft:visual/sky_light_color": "#20222a",
|
||||
"minecraft:visual/sky_light_factor": 0.0
|
||||
},
|
||||
"cardinal_light": "nether",
|
||||
"coordinate_scale": 1.0,
|
||||
"has_ceiling": true,
|
||||
"has_ender_dragon_fight": false,
|
||||
"has_fixed_time": true,
|
||||
"has_skylight": false,
|
||||
"height": 128,
|
||||
"infiniburn": "#minecraft:infiniburn_overworld",
|
||||
"logical_height": 128,
|
||||
"min_y": 0,
|
||||
"monster_spawn_block_light_limit": 15,
|
||||
"monster_spawn_light_level": 7,
|
||||
"skybox": "none",
|
||||
"timelines": "#minecraft:in_nether"
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"ambient_light": 0.12,
|
||||
"attributes": {
|
||||
"minecraft:audio/background_music": {
|
||||
"default": {
|
||||
"max_delay": 24000,
|
||||
"min_delay": 12000,
|
||||
"sound": "minecraft:music.overworld.badlands"
|
||||
}
|
||||
},
|
||||
"minecraft:gameplay/bed_rule": {
|
||||
"can_set_spawn": "never",
|
||||
"can_sleep": "never"
|
||||
},
|
||||
"minecraft:gameplay/can_start_raid": false,
|
||||
"minecraft:gameplay/respawn_anchor_works": false,
|
||||
"minecraft:gameplay/sky_light_level": 15.0,
|
||||
"minecraft:visual/ambient_light_color": "#ffb06f",
|
||||
"minecraft:visual/cloud_color": "#ccf28d6d",
|
||||
"minecraft:visual/fog_color": "#cc6046",
|
||||
"minecraft:visual/sky_color": "#82305f",
|
||||
"minecraft:visual/sky_light_color": "#ffc27a",
|
||||
"minecraft:visual/sky_light_factor": 1.0
|
||||
},
|
||||
"cardinal_light": "default",
|
||||
"coordinate_scale": 1.0,
|
||||
"has_ceiling": false,
|
||||
"has_ender_dragon_fight": false,
|
||||
"has_fixed_time": true,
|
||||
"has_skylight": true,
|
||||
"height": 384,
|
||||
"infiniburn": "#minecraft:infiniburn_overworld",
|
||||
"logical_height": 384,
|
||||
"min_y": 0,
|
||||
"monster_spawn_block_light_limit": 0,
|
||||
"monster_spawn_light_level": 7,
|
||||
"skybox": "overworld",
|
||||
"timelines": "#minecraft:in_overworld"
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"ambient_light": 0.2,
|
||||
"attributes": {
|
||||
"minecraft:gameplay/bed_rule": {
|
||||
"can_set_spawn": "never",
|
||||
"can_sleep": "never"
|
||||
},
|
||||
"minecraft:gameplay/can_start_raid": false,
|
||||
"minecraft:gameplay/respawn_anchor_works": false,
|
||||
"minecraft:visual/ambient_light_color": "#fff3d6",
|
||||
"minecraft:visual/cloud_color": "#ccffffff",
|
||||
"minecraft:visual/fog_color": "#d9fff2",
|
||||
"minecraft:visual/sky_color": "#83ddff",
|
||||
"minecraft:visual/sky_light_factor": 1.0,
|
||||
"minecraft:gameplay/sky_light_level": 15.0
|
||||
},
|
||||
"cardinal_light": "default",
|
||||
"coordinate_scale": 1.0,
|
||||
"has_ceiling": false,
|
||||
"has_ender_dragon_fight": false,
|
||||
"has_fixed_time": true,
|
||||
"has_skylight": true,
|
||||
"height": 256,
|
||||
"infiniburn": "#minecraft:infiniburn_overworld",
|
||||
"logical_height": 256,
|
||||
"min_y": 0,
|
||||
"monster_spawn_block_light_limit": 0,
|
||||
"monster_spawn_light_level": 0,
|
||||
"skybox": "overworld",
|
||||
"timelines": "#minecraft:in_overworld"
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
{
|
||||
"ambient_light": 0.08,
|
||||
"attributes": {
|
||||
"minecraft:audio/ambient_sounds": {
|
||||
"additions": {
|
||||
"sound": "minecraft:ambient.soul_sand_valley.additions",
|
||||
"tick_chance": 0.0111
|
||||
},
|
||||
"loop": "minecraft:ambient.soul_sand_valley.loop",
|
||||
"mood": {
|
||||
"block_search_extent": 8,
|
||||
"offset": 2.0,
|
||||
"sound": "minecraft:ambient.soul_sand_valley.mood",
|
||||
"tick_delay": 6000
|
||||
}
|
||||
},
|
||||
"minecraft:gameplay/bed_rule": {
|
||||
"can_set_spawn": "never",
|
||||
"can_sleep": "never",
|
||||
"explodes": true
|
||||
},
|
||||
"minecraft:gameplay/can_start_raid": false,
|
||||
"minecraft:gameplay/fast_lava": true,
|
||||
"minecraft:gameplay/respawn_anchor_works": true,
|
||||
"minecraft:gameplay/sky_light_level": 4.0,
|
||||
"minecraft:gameplay/water_evaporates": false,
|
||||
"minecraft:visual/ambient_light_color": "#1f2830",
|
||||
"minecraft:visual/fog_color": "#153a4d",
|
||||
"minecraft:visual/fog_end_distance": 90.0,
|
||||
"minecraft:visual/fog_start_distance": 8.0,
|
||||
"minecraft:visual/sky_light_color": "#6f8ec8",
|
||||
"minecraft:visual/sky_light_factor": 0.0
|
||||
},
|
||||
"cardinal_light": "nether",
|
||||
"coordinate_scale": 1.0,
|
||||
"has_ceiling": false,
|
||||
"has_ender_dragon_fight": false,
|
||||
"has_fixed_time": true,
|
||||
"has_skylight": false,
|
||||
"height": 128,
|
||||
"infiniburn": "#minecraft:infiniburn_nether",
|
||||
"logical_height": 128,
|
||||
"min_y": 0,
|
||||
"monster_spawn_block_light_limit": 15,
|
||||
"monster_spawn_light_level": 15,
|
||||
"skybox": "none",
|
||||
"timelines": "#minecraft:in_nether"
|
||||
}
|
||||
@@ -0,0 +1,190 @@
|
||||
{
|
||||
"type": "minecraft:chest",
|
||||
"pools": [
|
||||
{
|
||||
"bonus_rolls": 0.0,
|
||||
"entries": [
|
||||
{
|
||||
"type": "minecraft:item",
|
||||
"functions": [
|
||||
{
|
||||
"add": false,
|
||||
"count": {
|
||||
"type": "minecraft:uniform",
|
||||
"max": 14.0,
|
||||
"min": 4.0
|
||||
},
|
||||
"function": "minecraft:set_count"
|
||||
}
|
||||
],
|
||||
"name": "minecraft:bone",
|
||||
"weight": 20
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item",
|
||||
"functions": [
|
||||
{
|
||||
"add": false,
|
||||
"count": {
|
||||
"type": "minecraft:uniform",
|
||||
"max": 18.0,
|
||||
"min": 6.0
|
||||
},
|
||||
"function": "minecraft:set_count"
|
||||
}
|
||||
],
|
||||
"name": "minecraft:arrow",
|
||||
"weight": 18
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item",
|
||||
"functions": [
|
||||
{
|
||||
"add": false,
|
||||
"count": {
|
||||
"type": "minecraft:uniform",
|
||||
"max": 9.0,
|
||||
"min": 3.0
|
||||
},
|
||||
"function": "minecraft:set_count"
|
||||
}
|
||||
],
|
||||
"name": "minecraft:iron_ingot",
|
||||
"weight": 14
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item",
|
||||
"functions": [
|
||||
{
|
||||
"add": false,
|
||||
"count": {
|
||||
"type": "minecraft:uniform",
|
||||
"max": 20.0,
|
||||
"min": 8.0
|
||||
},
|
||||
"function": "minecraft:set_count"
|
||||
}
|
||||
],
|
||||
"name": "minecraft:iron_nugget",
|
||||
"weight": 12
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item",
|
||||
"name": "minecraft:iron_horse_armor",
|
||||
"weight": 4
|
||||
},
|
||||
{
|
||||
"type": "minecraft:empty",
|
||||
"weight": 10
|
||||
}
|
||||
],
|
||||
"rolls": {
|
||||
"type": "minecraft:uniform",
|
||||
"max": 5.0,
|
||||
"min": 2.0
|
||||
}
|
||||
},
|
||||
{
|
||||
"bonus_rolls": 0.0,
|
||||
"entries": [
|
||||
{
|
||||
"type": "minecraft:item",
|
||||
"functions": [
|
||||
{
|
||||
"function": "minecraft:enchant_with_levels",
|
||||
"levels": {
|
||||
"type": "minecraft:uniform",
|
||||
"max": 42.0,
|
||||
"min": 25.0
|
||||
},
|
||||
"options": "#minecraft:on_random_loot"
|
||||
}
|
||||
],
|
||||
"name": "minecraft:iron_sword",
|
||||
"weight": 7
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item",
|
||||
"functions": [
|
||||
{
|
||||
"function": "minecraft:enchant_with_levels",
|
||||
"levels": {
|
||||
"type": "minecraft:uniform",
|
||||
"max": 42.0,
|
||||
"min": 25.0
|
||||
},
|
||||
"options": "#minecraft:on_random_loot"
|
||||
}
|
||||
],
|
||||
"name": "minecraft:bow",
|
||||
"weight": 7
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item",
|
||||
"functions": [
|
||||
{
|
||||
"function": "minecraft:enchant_with_levels",
|
||||
"levels": {
|
||||
"type": "minecraft:uniform",
|
||||
"max": 42.0,
|
||||
"min": 25.0
|
||||
},
|
||||
"options": "#minecraft:on_random_loot"
|
||||
}
|
||||
],
|
||||
"name": "minecraft:iron_pickaxe",
|
||||
"weight": 5
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item",
|
||||
"functions": [
|
||||
{
|
||||
"function": "minecraft:enchant_with_levels",
|
||||
"levels": {
|
||||
"type": "minecraft:uniform",
|
||||
"max": 42.0,
|
||||
"min": 25.0
|
||||
},
|
||||
"options": "#minecraft:on_random_loot"
|
||||
}
|
||||
],
|
||||
"name": "minecraft:iron_chestplate",
|
||||
"weight": 4
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item",
|
||||
"functions": [
|
||||
{
|
||||
"function": "minecraft:enchant_with_levels",
|
||||
"levels": {
|
||||
"type": "minecraft:uniform",
|
||||
"max": 42.0,
|
||||
"min": 25.0
|
||||
},
|
||||
"options": "#minecraft:on_random_loot"
|
||||
}
|
||||
],
|
||||
"name": "minecraft:iron_helmet",
|
||||
"weight": 4
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item",
|
||||
"functions": [
|
||||
{
|
||||
"function": "minecraft:enchant_randomly",
|
||||
"options": "#minecraft:on_random_loot"
|
||||
}
|
||||
],
|
||||
"name": "minecraft:book",
|
||||
"weight": 6
|
||||
},
|
||||
{
|
||||
"type": "minecraft:empty",
|
||||
"weight": 20
|
||||
}
|
||||
],
|
||||
"rolls": 1.0
|
||||
}
|
||||
],
|
||||
"random_sequence": "portals:chests/skeleton_ruin"
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"values": [
|
||||
"#minecraft:base_stone_overworld",
|
||||
"#minecraft:substrate_overworld",
|
||||
"minecraft:gravel",
|
||||
"minecraft:clay",
|
||||
"minecraft:moss_block"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,167 @@
|
||||
{
|
||||
"temperature": 0.5,
|
||||
"downfall": 0.5,
|
||||
"has_precipitation": false,
|
||||
"effects": {
|
||||
"water_color": "#172338",
|
||||
"water_fog_color": "#11151c",
|
||||
"fog_color": "#1e2028",
|
||||
"sky_color": "#1a1c24",
|
||||
"grass_color": "#4b8f5d",
|
||||
"foliage_color": "#5fa66b",
|
||||
"mood_sound": {
|
||||
"sound": "minecraft:ambient.cave",
|
||||
"tick_delay": 6000,
|
||||
"block_search_extent": 8,
|
||||
"offset": 2.0
|
||||
}
|
||||
},
|
||||
"spawners": {
|
||||
"ambient": [
|
||||
{
|
||||
"type": "minecraft:bat",
|
||||
"maxCount": 8,
|
||||
"minCount": 8,
|
||||
"weight": 10
|
||||
}
|
||||
],
|
||||
"axolotls": [
|
||||
{
|
||||
"type": "minecraft:axolotl",
|
||||
"maxCount": 6,
|
||||
"minCount": 4,
|
||||
"weight": 4
|
||||
}
|
||||
],
|
||||
"creature": [],
|
||||
"misc": [],
|
||||
"monster": [
|
||||
{
|
||||
"type": "minecraft:zombie",
|
||||
"maxCount": 6,
|
||||
"minCount": 4,
|
||||
"weight": 120
|
||||
},
|
||||
{
|
||||
"type": "minecraft:skeleton",
|
||||
"maxCount": 6,
|
||||
"minCount": 4,
|
||||
"weight": 120
|
||||
},
|
||||
{
|
||||
"type": "minecraft:spider",
|
||||
"maxCount": 5,
|
||||
"minCount": 4,
|
||||
"weight": 110
|
||||
},
|
||||
{
|
||||
"type": "minecraft:creeper",
|
||||
"maxCount": 5,
|
||||
"minCount": 4,
|
||||
"weight": 95
|
||||
},
|
||||
{
|
||||
"type": "minecraft:witch",
|
||||
"maxCount": 2,
|
||||
"minCount": 1,
|
||||
"weight": 15
|
||||
},
|
||||
{
|
||||
"type": "minecraft:enderman",
|
||||
"maxCount": 4,
|
||||
"minCount": 1,
|
||||
"weight": 15
|
||||
},
|
||||
{
|
||||
"type": "minecraft:slime",
|
||||
"maxCount": 4,
|
||||
"minCount": 2,
|
||||
"weight": 45
|
||||
}
|
||||
],
|
||||
"underground_water_creature": [
|
||||
{
|
||||
"type": "minecraft:glow_squid",
|
||||
"maxCount": 6,
|
||||
"minCount": 4,
|
||||
"weight": 10
|
||||
}
|
||||
],
|
||||
"water_ambient": [],
|
||||
"water_creature": []
|
||||
},
|
||||
"spawn_costs": {},
|
||||
"carvers": [
|
||||
"minecraft:cave",
|
||||
"minecraft:cave_extra_underground",
|
||||
"minecraft:canyon"
|
||||
],
|
||||
"features": [
|
||||
[],
|
||||
[
|
||||
"minecraft:lake_lava_underground",
|
||||
"minecraft:lake_lava_surface"
|
||||
],
|
||||
[
|
||||
"minecraft:amethyst_geode",
|
||||
"portals:amethyst_geode_dense"
|
||||
],
|
||||
[
|
||||
"minecraft:monster_room",
|
||||
"minecraft:monster_room_deep"
|
||||
],
|
||||
[],
|
||||
[],
|
||||
[
|
||||
"minecraft:ore_dirt",
|
||||
"minecraft:ore_gravel",
|
||||
"portals:ore_gravel_dense",
|
||||
"minecraft:ore_granite_upper",
|
||||
"minecraft:ore_granite_lower",
|
||||
"portals:ore_granite_dense",
|
||||
"minecraft:ore_diorite_upper",
|
||||
"minecraft:ore_diorite_lower",
|
||||
"portals:ore_diorite_dense",
|
||||
"minecraft:ore_andesite_upper",
|
||||
"minecraft:ore_andesite_lower",
|
||||
"portals:ore_andesite_dense",
|
||||
"portals:ore_deepslate_dense",
|
||||
"minecraft:ore_tuff",
|
||||
"portals:ore_tuff_dense",
|
||||
"minecraft:ore_coal_upper",
|
||||
"minecraft:ore_coal_lower",
|
||||
"portals:ore_coal_dense",
|
||||
"minecraft:ore_iron_upper",
|
||||
"minecraft:ore_iron_middle",
|
||||
"minecraft:ore_iron_small",
|
||||
"portals:ore_iron_dense",
|
||||
"minecraft:ore_gold",
|
||||
"minecraft:ore_gold_lower",
|
||||
"portals:ore_gold_dense",
|
||||
"minecraft:ore_redstone",
|
||||
"minecraft:ore_redstone_lower",
|
||||
"portals:ore_redstone_dense",
|
||||
"minecraft:ore_lapis",
|
||||
"minecraft:ore_lapis_buried",
|
||||
"portals:ore_lapis_dense",
|
||||
"minecraft:ore_copper",
|
||||
"portals:ore_copper_dense",
|
||||
"minecraft:ore_diamond",
|
||||
"minecraft:ore_diamond_medium",
|
||||
"minecraft:ore_diamond_large",
|
||||
"portals:ore_diamond_dense",
|
||||
"minecraft:disk_gravel"
|
||||
],
|
||||
[],
|
||||
[
|
||||
"minecraft:spring_water",
|
||||
"minecraft:spring_lava"
|
||||
],
|
||||
[
|
||||
"minecraft:glow_lichen",
|
||||
"portals:rare_cave_tree",
|
||||
"minecraft:patch_tall_grass_2"
|
||||
],
|
||||
[]
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,127 @@
|
||||
{
|
||||
"temperature": 0.35,
|
||||
"downfall": 0.0,
|
||||
"has_precipitation": false,
|
||||
"effects": {
|
||||
"water_color": "#101827",
|
||||
"water_fog_color": "#080b10",
|
||||
"fog_color": "#11131a",
|
||||
"sky_color": "#0f1118",
|
||||
"grass_color": "#3f4b45",
|
||||
"foliage_color": "#46524a",
|
||||
"mood_sound": {
|
||||
"sound": "minecraft:ambient.cave",
|
||||
"tick_delay": 6000,
|
||||
"block_search_extent": 8,
|
||||
"offset": 2.0
|
||||
}
|
||||
},
|
||||
"spawners": {
|
||||
"ambient": [
|
||||
{
|
||||
"type": "minecraft:bat",
|
||||
"maxCount": 8,
|
||||
"minCount": 8,
|
||||
"weight": 10
|
||||
}
|
||||
],
|
||||
"creature": [],
|
||||
"misc": [],
|
||||
"monster": [
|
||||
{
|
||||
"type": "minecraft:zombie",
|
||||
"maxCount": 6,
|
||||
"minCount": 4,
|
||||
"weight": 120
|
||||
},
|
||||
{
|
||||
"type": "minecraft:skeleton",
|
||||
"maxCount": 6,
|
||||
"minCount": 4,
|
||||
"weight": 120
|
||||
},
|
||||
{
|
||||
"type": "minecraft:creeper",
|
||||
"maxCount": 5,
|
||||
"minCount": 4,
|
||||
"weight": 100
|
||||
},
|
||||
{
|
||||
"type": "minecraft:spider",
|
||||
"maxCount": 5,
|
||||
"minCount": 4,
|
||||
"weight": 90
|
||||
},
|
||||
{
|
||||
"type": "minecraft:enderman",
|
||||
"maxCount": 4,
|
||||
"minCount": 1,
|
||||
"weight": 25
|
||||
},
|
||||
{
|
||||
"type": "minecraft:witch",
|
||||
"maxCount": 2,
|
||||
"minCount": 1,
|
||||
"weight": 15
|
||||
}
|
||||
],
|
||||
"underground_water_creature": [],
|
||||
"water_ambient": [],
|
||||
"water_creature": []
|
||||
},
|
||||
"spawn_costs": {},
|
||||
"carvers": [
|
||||
"minecraft:cave",
|
||||
"minecraft:cave_extra_underground",
|
||||
"minecraft:canyon"
|
||||
],
|
||||
"features": [
|
||||
[],
|
||||
[
|
||||
"minecraft:lake_lava_underground",
|
||||
"minecraft:lake_lava_surface"
|
||||
],
|
||||
[
|
||||
"minecraft:amethyst_geode",
|
||||
"portals:amethyst_geode_dense"
|
||||
],
|
||||
[
|
||||
"minecraft:monster_room",
|
||||
"minecraft:monster_room_deep"
|
||||
],
|
||||
[],
|
||||
[],
|
||||
[
|
||||
"minecraft:ore_gravel",
|
||||
"portals:ore_gravel_dense",
|
||||
"portals:ore_deepslate_dense",
|
||||
"minecraft:ore_tuff",
|
||||
"portals:ore_tuff_dense",
|
||||
"minecraft:ore_coal_lower",
|
||||
"portals:ore_coal_dense",
|
||||
"minecraft:ore_iron_middle",
|
||||
"minecraft:ore_iron_small",
|
||||
"portals:ore_iron_dense",
|
||||
"minecraft:ore_gold_lower",
|
||||
"portals:ore_gold_dense",
|
||||
"minecraft:ore_redstone",
|
||||
"minecraft:ore_redstone_lower",
|
||||
"portals:ore_redstone_dense",
|
||||
"minecraft:ore_lapis_buried",
|
||||
"portals:ore_lapis_dense",
|
||||
"minecraft:ore_diamond",
|
||||
"minecraft:ore_diamond_medium",
|
||||
"minecraft:ore_diamond_large",
|
||||
"portals:ore_diamond_dense"
|
||||
],
|
||||
[],
|
||||
[
|
||||
"minecraft:spring_lava"
|
||||
],
|
||||
[
|
||||
"minecraft:glow_lichen",
|
||||
"portals:rare_cave_tree"
|
||||
],
|
||||
[]
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,118 @@
|
||||
{
|
||||
"temperature": 0.8,
|
||||
"downfall": 0.0,
|
||||
"has_precipitation": false,
|
||||
"effects": {
|
||||
"water_color": "#1c1b15",
|
||||
"water_fog_color": "#11100d",
|
||||
"fog_color": "#211f18",
|
||||
"sky_color": "#1b1813",
|
||||
"grass_color": "#5f624a",
|
||||
"foliage_color": "#6a6d50",
|
||||
"mood_sound": {
|
||||
"sound": "minecraft:ambient.cave",
|
||||
"tick_delay": 6000,
|
||||
"block_search_extent": 8,
|
||||
"offset": 2.0
|
||||
}
|
||||
},
|
||||
"spawners": {
|
||||
"ambient": [
|
||||
{
|
||||
"type": "minecraft:bat",
|
||||
"maxCount": 8,
|
||||
"minCount": 8,
|
||||
"weight": 10
|
||||
}
|
||||
],
|
||||
"creature": [],
|
||||
"misc": [],
|
||||
"monster": [
|
||||
{
|
||||
"type": "minecraft:zombie",
|
||||
"maxCount": 6,
|
||||
"minCount": 4,
|
||||
"weight": 110
|
||||
},
|
||||
{
|
||||
"type": "minecraft:skeleton",
|
||||
"maxCount": 6,
|
||||
"minCount": 4,
|
||||
"weight": 120
|
||||
},
|
||||
{
|
||||
"type": "minecraft:spider",
|
||||
"maxCount": 5,
|
||||
"minCount": 4,
|
||||
"weight": 95
|
||||
},
|
||||
{
|
||||
"type": "minecraft:creeper",
|
||||
"maxCount": 5,
|
||||
"minCount": 4,
|
||||
"weight": 80
|
||||
},
|
||||
{
|
||||
"type": "minecraft:witch",
|
||||
"maxCount": 2,
|
||||
"minCount": 1,
|
||||
"weight": 20
|
||||
}
|
||||
],
|
||||
"underground_water_creature": [],
|
||||
"water_ambient": [],
|
||||
"water_creature": []
|
||||
},
|
||||
"spawn_costs": {},
|
||||
"carvers": [
|
||||
"minecraft:cave",
|
||||
"minecraft:cave_extra_underground",
|
||||
"minecraft:canyon"
|
||||
],
|
||||
"features": [
|
||||
[],
|
||||
[
|
||||
"minecraft:lake_lava_underground",
|
||||
"minecraft:lake_lava_surface"
|
||||
],
|
||||
[
|
||||
"minecraft:amethyst_geode"
|
||||
],
|
||||
[
|
||||
"minecraft:monster_room",
|
||||
"minecraft:monster_room_deep"
|
||||
],
|
||||
[],
|
||||
[],
|
||||
[
|
||||
"minecraft:ore_gravel",
|
||||
"portals:ore_gravel_dense",
|
||||
"minecraft:ore_tuff",
|
||||
"portals:ore_tuff_dense",
|
||||
"minecraft:ore_iron_upper",
|
||||
"minecraft:ore_iron_middle",
|
||||
"portals:ore_iron_dense",
|
||||
"minecraft:ore_gold",
|
||||
"portals:ore_gold_dense",
|
||||
"minecraft:ore_redstone",
|
||||
"portals:ore_redstone_dense",
|
||||
"minecraft:ore_copper",
|
||||
"portals:ore_copper_dense",
|
||||
"minecraft:ore_diamond_medium",
|
||||
"portals:ore_diamond_dense"
|
||||
],
|
||||
[],
|
||||
[
|
||||
"minecraft:spring_water",
|
||||
"minecraft:spring_lava"
|
||||
],
|
||||
[
|
||||
"minecraft:glow_lichen",
|
||||
"portals:rare_cave_tree",
|
||||
"portals:ore_dripstone_cluster_dense",
|
||||
"portals:ore_large_dripstone_dense",
|
||||
"portals:ore_pointed_dripstone_dense"
|
||||
],
|
||||
[]
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,136 @@
|
||||
{
|
||||
"temperature": 0.7,
|
||||
"downfall": 0.8,
|
||||
"has_precipitation": false,
|
||||
"effects": {
|
||||
"water_color": "#12313a",
|
||||
"water_fog_color": "#0b1b1a",
|
||||
"fog_color": "#13221d",
|
||||
"sky_color": "#101812",
|
||||
"grass_color": "#4b8f5d",
|
||||
"foliage_color": "#5fa66b",
|
||||
"mood_sound": {
|
||||
"sound": "minecraft:ambient.cave",
|
||||
"tick_delay": 6000,
|
||||
"block_search_extent": 8,
|
||||
"offset": 2.0
|
||||
}
|
||||
},
|
||||
"spawners": {
|
||||
"ambient": [
|
||||
{
|
||||
"type": "minecraft:bat",
|
||||
"maxCount": 8,
|
||||
"minCount": 8,
|
||||
"weight": 10
|
||||
}
|
||||
],
|
||||
"axolotls": [
|
||||
{
|
||||
"type": "minecraft:axolotl",
|
||||
"maxCount": 6,
|
||||
"minCount": 4,
|
||||
"weight": 8
|
||||
}
|
||||
],
|
||||
"creature": [],
|
||||
"misc": [],
|
||||
"monster": [
|
||||
{
|
||||
"type": "minecraft:zombie",
|
||||
"maxCount": 5,
|
||||
"minCount": 4,
|
||||
"weight": 95
|
||||
},
|
||||
{
|
||||
"type": "minecraft:skeleton",
|
||||
"maxCount": 5,
|
||||
"minCount": 4,
|
||||
"weight": 95
|
||||
},
|
||||
{
|
||||
"type": "minecraft:spider",
|
||||
"maxCount": 5,
|
||||
"minCount": 4,
|
||||
"weight": 95
|
||||
},
|
||||
{
|
||||
"type": "minecraft:creeper",
|
||||
"maxCount": 5,
|
||||
"minCount": 4,
|
||||
"weight": 70
|
||||
},
|
||||
{
|
||||
"type": "minecraft:slime",
|
||||
"maxCount": 4,
|
||||
"minCount": 2,
|
||||
"weight": 55
|
||||
}
|
||||
],
|
||||
"underground_water_creature": [
|
||||
{
|
||||
"type": "minecraft:glow_squid",
|
||||
"maxCount": 6,
|
||||
"minCount": 4,
|
||||
"weight": 10
|
||||
}
|
||||
],
|
||||
"water_ambient": [],
|
||||
"water_creature": []
|
||||
},
|
||||
"spawn_costs": {},
|
||||
"carvers": [
|
||||
"minecraft:cave",
|
||||
"minecraft:cave_extra_underground",
|
||||
"minecraft:canyon"
|
||||
],
|
||||
"features": [
|
||||
[],
|
||||
[
|
||||
"minecraft:lake_lava_underground"
|
||||
],
|
||||
[
|
||||
"minecraft:amethyst_geode"
|
||||
],
|
||||
[
|
||||
"minecraft:monster_room",
|
||||
"minecraft:monster_room_deep"
|
||||
],
|
||||
[],
|
||||
[],
|
||||
[
|
||||
"minecraft:ore_dirt",
|
||||
"minecraft:ore_gravel",
|
||||
"minecraft:ore_granite_upper",
|
||||
"minecraft:ore_diorite_upper",
|
||||
"minecraft:ore_andesite_upper",
|
||||
"portals:ore_deepslate_dense",
|
||||
"minecraft:ore_tuff",
|
||||
"minecraft:ore_coal_lower",
|
||||
"portals:ore_coal_dense",
|
||||
"minecraft:ore_iron_middle",
|
||||
"portals:ore_iron_dense",
|
||||
"minecraft:ore_lapis",
|
||||
"portals:ore_lapis_dense",
|
||||
"minecraft:ore_diamond",
|
||||
"portals:ore_diamond_dense",
|
||||
"minecraft:disk_gravel"
|
||||
],
|
||||
[],
|
||||
[
|
||||
"minecraft:spring_water",
|
||||
"minecraft:spring_lava"
|
||||
],
|
||||
[
|
||||
"minecraft:glow_lichen",
|
||||
"portals:rare_cave_tree",
|
||||
"minecraft:patch_tall_grass_2",
|
||||
"portals:ore_lush_ceiling_dense",
|
||||
"portals:ore_cave_vines_dense",
|
||||
"portals:ore_lush_clay_dense",
|
||||
"portals:ore_lush_floor_dense",
|
||||
"portals:ore_spore_blossom_dense"
|
||||
],
|
||||
[]
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,142 @@
|
||||
{
|
||||
"temperature": 2.0,
|
||||
"downfall": 0.0,
|
||||
"has_precipitation": false,
|
||||
"attributes": {
|
||||
"minecraft:audio/background_music": {
|
||||
"default": {
|
||||
"max_delay": 24000,
|
||||
"min_delay": 12000,
|
||||
"sound": "minecraft:music.overworld.badlands"
|
||||
}
|
||||
},
|
||||
"minecraft:gameplay/snow_golem_melts": true,
|
||||
"minecraft:visual/sky_color": "#82305f"
|
||||
},
|
||||
"effects": {
|
||||
"water_color": "#cc8a33",
|
||||
"water_fog_color": "#7a3d22",
|
||||
"fog_color": "#cc6046",
|
||||
"sky_color": "#82305f",
|
||||
"grass_color": "#d0b45e",
|
||||
"foliage_color": "#f0ead8"
|
||||
},
|
||||
"creature_spawn_probability": 0.04,
|
||||
"spawners": {
|
||||
"ambient": [
|
||||
{
|
||||
"type": "minecraft:bat",
|
||||
"maxCount": 8,
|
||||
"minCount": 8,
|
||||
"weight": 10
|
||||
}
|
||||
],
|
||||
"axolotls": [],
|
||||
"creature": [
|
||||
{
|
||||
"type": "minecraft:armadillo",
|
||||
"maxCount": 2,
|
||||
"minCount": 1,
|
||||
"weight": 12
|
||||
},
|
||||
{
|
||||
"type": "minecraft:cow",
|
||||
"maxCount": 4,
|
||||
"minCount": 4,
|
||||
"weight": 6
|
||||
},
|
||||
{
|
||||
"type": "minecraft:sheep",
|
||||
"maxCount": 4,
|
||||
"minCount": 4,
|
||||
"weight": 6
|
||||
},
|
||||
{
|
||||
"type": "minecraft:wolf",
|
||||
"maxCount": 4,
|
||||
"minCount": 2,
|
||||
"weight": 2
|
||||
}
|
||||
],
|
||||
"misc": [],
|
||||
"monster": [
|
||||
{
|
||||
"type": "minecraft:spider",
|
||||
"maxCount": 4,
|
||||
"minCount": 4,
|
||||
"weight": 100
|
||||
},
|
||||
{
|
||||
"type": "minecraft:zombie",
|
||||
"maxCount": 4,
|
||||
"minCount": 4,
|
||||
"weight": 95
|
||||
},
|
||||
{
|
||||
"type": "minecraft:zombie_villager",
|
||||
"maxCount": 1,
|
||||
"minCount": 1,
|
||||
"weight": 5
|
||||
},
|
||||
{
|
||||
"type": "minecraft:skeleton",
|
||||
"maxCount": 4,
|
||||
"minCount": 4,
|
||||
"weight": 100
|
||||
},
|
||||
{
|
||||
"type": "minecraft:creeper",
|
||||
"maxCount": 4,
|
||||
"minCount": 4,
|
||||
"weight": 100
|
||||
},
|
||||
{
|
||||
"type": "minecraft:enderman",
|
||||
"maxCount": 4,
|
||||
"minCount": 1,
|
||||
"weight": 10
|
||||
},
|
||||
{
|
||||
"type": "minecraft:witch",
|
||||
"maxCount": 1,
|
||||
"minCount": 1,
|
||||
"weight": 5
|
||||
}
|
||||
],
|
||||
"underground_water_creature": [],
|
||||
"water_ambient": [],
|
||||
"water_creature": []
|
||||
},
|
||||
"spawn_costs": {},
|
||||
"carvers": [
|
||||
"minecraft:canyon",
|
||||
"portals:painted_canyon"
|
||||
],
|
||||
"features": [
|
||||
[],
|
||||
[
|
||||
"minecraft:lake_lava_underground",
|
||||
"minecraft:lake_lava_surface"
|
||||
],
|
||||
[],
|
||||
[
|
||||
"minecraft:monster_room",
|
||||
"minecraft:monster_room_deep"
|
||||
],
|
||||
[],
|
||||
[],
|
||||
[],
|
||||
[],
|
||||
[
|
||||
"minecraft:spring_lava"
|
||||
],
|
||||
[
|
||||
"portals:painted_white_oak",
|
||||
"minecraft:patch_grass_badlands",
|
||||
"minecraft:patch_dry_grass_badlands",
|
||||
"minecraft:patch_dead_bush_badlands",
|
||||
"minecraft:patch_cactus_decorated"
|
||||
],
|
||||
[]
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
{
|
||||
"temperature": 0.8,
|
||||
"downfall": 0.0,
|
||||
"has_precipitation": false,
|
||||
"effects": {
|
||||
"water_color": "#67d7ff",
|
||||
"water_fog_color": "#7fe7ff",
|
||||
"fog_color": "#d9fff2",
|
||||
"sky_color": "#83ddff",
|
||||
"grass_color": "#78d75b",
|
||||
"foliage_color": "#6bd66c"
|
||||
},
|
||||
"creature_spawn_probability": 0.28,
|
||||
"spawners": {
|
||||
"ambient": [],
|
||||
"axolotls": [],
|
||||
"creature": [
|
||||
{
|
||||
"type": "minecraft:sheep",
|
||||
"maxCount": 8,
|
||||
"minCount": 4,
|
||||
"weight": 100
|
||||
}
|
||||
],
|
||||
"misc": [],
|
||||
"monster": [],
|
||||
"underground_water_creature": [],
|
||||
"water_ambient": [],
|
||||
"water_creature": []
|
||||
},
|
||||
"spawn_costs": {},
|
||||
"carvers": [],
|
||||
"features": [
|
||||
[],
|
||||
[],
|
||||
[],
|
||||
[],
|
||||
[],
|
||||
[],
|
||||
[],
|
||||
[],
|
||||
[],
|
||||
[
|
||||
"minecraft:patch_grass_plain",
|
||||
"minecraft:patch_grass_meadow",
|
||||
"portals:sheep_land_flower_mix",
|
||||
"minecraft:wildflowers_meadow",
|
||||
"minecraft:patch_tall_grass_2"
|
||||
],
|
||||
[]
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
{
|
||||
"temperature": 0.4,
|
||||
"downfall": 0.0,
|
||||
"has_precipitation": false,
|
||||
"attributes": {
|
||||
"minecraft:audio/ambient_sounds": {
|
||||
"additions": {
|
||||
"sound": "minecraft:ambient.soul_sand_valley.additions",
|
||||
"tick_chance": 0.0111
|
||||
},
|
||||
"loop": "minecraft:ambient.soul_sand_valley.loop",
|
||||
"mood": {
|
||||
"block_search_extent": 8,
|
||||
"offset": 2.0,
|
||||
"sound": "minecraft:ambient.soul_sand_valley.mood",
|
||||
"tick_delay": 6000
|
||||
}
|
||||
},
|
||||
"minecraft:audio/background_music": {
|
||||
"default": {
|
||||
"max_delay": 24000,
|
||||
"min_delay": 12000,
|
||||
"sound": "minecraft:music.nether.soul_sand_valley"
|
||||
}
|
||||
},
|
||||
"minecraft:visual/ambient_particles": [
|
||||
{
|
||||
"particle": {
|
||||
"type": "minecraft:ash"
|
||||
},
|
||||
"probability": 0.00625
|
||||
}
|
||||
],
|
||||
"minecraft:visual/fog_color": "#153a4d"
|
||||
},
|
||||
"effects": {
|
||||
"water_color": "#d6c133",
|
||||
"water_fog_color": "#8c7f19",
|
||||
"fog_color": "#153a4d",
|
||||
"sky_color": "#263548"
|
||||
},
|
||||
"creature_spawn_probability": 0.0,
|
||||
"spawners": {
|
||||
"ambient": [],
|
||||
"axolotls": [],
|
||||
"creature": [],
|
||||
"misc": [],
|
||||
"monster": [
|
||||
{
|
||||
"type": "minecraft:skeleton",
|
||||
"maxCount": 7,
|
||||
"minCount": 4,
|
||||
"weight": 110
|
||||
},
|
||||
{
|
||||
"type": "minecraft:stray",
|
||||
"maxCount": 5,
|
||||
"minCount": 3,
|
||||
"weight": 80
|
||||
},
|
||||
{
|
||||
"type": "minecraft:bogged",
|
||||
"maxCount": 4,
|
||||
"minCount": 2,
|
||||
"weight": 35
|
||||
},
|
||||
{
|
||||
"type": "minecraft:parched",
|
||||
"maxCount": 5,
|
||||
"minCount": 2,
|
||||
"weight": 60
|
||||
}
|
||||
],
|
||||
"underground_water_creature": [],
|
||||
"water_ambient": [],
|
||||
"water_creature": []
|
||||
},
|
||||
"spawn_costs": {},
|
||||
"carvers": [],
|
||||
"features": [
|
||||
[],
|
||||
[
|
||||
"portals:skeleton_lava_lake",
|
||||
"portals:skeleton_yellow_water_lake"
|
||||
],
|
||||
[
|
||||
"portals:skeleton_basalt_spike"
|
||||
],
|
||||
[
|
||||
"portals:skeleton_fossil"
|
||||
],
|
||||
[
|
||||
"portals:skeleton_ruin"
|
||||
],
|
||||
[],
|
||||
[
|
||||
"portals:skeleton_clay_disk",
|
||||
"portals:skeleton_gravel_disk",
|
||||
"portals:skeleton_concrete_powder_disk"
|
||||
],
|
||||
[],
|
||||
[
|
||||
"minecraft:spring_lava"
|
||||
],
|
||||
[],
|
||||
[]
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
{
|
||||
"type": "minecraft:canyon",
|
||||
"config": {
|
||||
"debug_settings": {
|
||||
"air_state": {
|
||||
"Name": "minecraft:warped_button",
|
||||
"Properties": {
|
||||
"face": "wall",
|
||||
"facing": "north",
|
||||
"powered": "false"
|
||||
}
|
||||
},
|
||||
"barrier_state": {
|
||||
"Name": "minecraft:glass"
|
||||
},
|
||||
"lava_state": {
|
||||
"Name": "minecraft:orange_stained_glass"
|
||||
},
|
||||
"water_state": {
|
||||
"Name": "minecraft:candle",
|
||||
"Properties": {
|
||||
"candles": "1",
|
||||
"lit": "false",
|
||||
"waterlogged": "false"
|
||||
}
|
||||
}
|
||||
},
|
||||
"lava_level": {
|
||||
"above_bottom": 8
|
||||
},
|
||||
"probability": 0.022,
|
||||
"replaceable": "#minecraft:overworld_carver_replaceables",
|
||||
"shape": {
|
||||
"distance_factor": {
|
||||
"type": "minecraft:uniform",
|
||||
"max_exclusive": 1.25,
|
||||
"min_inclusive": 0.8
|
||||
},
|
||||
"horizontal_radius_factor": {
|
||||
"type": "minecraft:uniform",
|
||||
"max_exclusive": 1.6,
|
||||
"min_inclusive": 0.95
|
||||
},
|
||||
"thickness": {
|
||||
"type": "minecraft:trapezoid",
|
||||
"max": 9.0,
|
||||
"min": 1.5,
|
||||
"plateau": 4.0
|
||||
},
|
||||
"vertical_radius_center_factor": 0.0,
|
||||
"vertical_radius_default_factor": 1.45,
|
||||
"width_smoothness": 3
|
||||
},
|
||||
"vertical_rotation": {
|
||||
"type": "minecraft:uniform",
|
||||
"max_exclusive": 0.18,
|
||||
"min_inclusive": -0.18
|
||||
},
|
||||
"y": {
|
||||
"type": "minecraft:uniform",
|
||||
"max_inclusive": {
|
||||
"absolute": 190
|
||||
},
|
||||
"min_inclusive": {
|
||||
"absolute": 18
|
||||
}
|
||||
},
|
||||
"yScale": 5.5
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
{
|
||||
"type": "minecraft:canyon",
|
||||
"config": {
|
||||
"debug_settings": {
|
||||
"air_state": {
|
||||
"Name": "minecraft:warped_button",
|
||||
"Properties": {
|
||||
"face": "wall",
|
||||
"facing": "north",
|
||||
"powered": "false"
|
||||
}
|
||||
},
|
||||
"barrier_state": {
|
||||
"Name": "minecraft:glass"
|
||||
},
|
||||
"lava_state": {
|
||||
"Name": "minecraft:orange_stained_glass"
|
||||
},
|
||||
"water_state": {
|
||||
"Name": "minecraft:candle",
|
||||
"Properties": {
|
||||
"candles": "1",
|
||||
"lit": "false",
|
||||
"waterlogged": "false"
|
||||
}
|
||||
}
|
||||
},
|
||||
"lava_level": {
|
||||
"above_bottom": 8
|
||||
},
|
||||
"probability": 0.03,
|
||||
"replaceable": "#minecraft:overworld_carver_replaceables",
|
||||
"shape": {
|
||||
"distance_factor": {
|
||||
"type": "minecraft:uniform",
|
||||
"max_exclusive": 1.1,
|
||||
"min_inclusive": 0.75
|
||||
},
|
||||
"horizontal_radius_factor": {
|
||||
"type": "minecraft:uniform",
|
||||
"max_exclusive": 1.2,
|
||||
"min_inclusive": 0.7
|
||||
},
|
||||
"thickness": {
|
||||
"type": "minecraft:trapezoid",
|
||||
"max": 5.5,
|
||||
"min": 0.5,
|
||||
"plateau": 2.0
|
||||
},
|
||||
"vertical_radius_center_factor": 0.0,
|
||||
"vertical_radius_default_factor": 1.6,
|
||||
"width_smoothness": 2
|
||||
},
|
||||
"vertical_rotation": {
|
||||
"type": "minecraft:uniform",
|
||||
"max_exclusive": 0.22,
|
||||
"min_inclusive": -0.22
|
||||
},
|
||||
"y": {
|
||||
"type": "minecraft:uniform",
|
||||
"max_inclusive": {
|
||||
"absolute": 310
|
||||
},
|
||||
"min_inclusive": {
|
||||
"absolute": 80
|
||||
}
|
||||
},
|
||||
"yScale": 6.8
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"type": "minecraft:ore",
|
||||
"config": {
|
||||
"size": 48,
|
||||
"discard_chance_on_air_exposure": 0.0,
|
||||
"targets": [
|
||||
{
|
||||
"target": {
|
||||
"predicate_type": "minecraft:tag_match",
|
||||
"tag": "minecraft:base_stone_overworld"
|
||||
},
|
||||
"state": {
|
||||
"Name": "minecraft:andesite"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"type": "minecraft:ore",
|
||||
"config": {
|
||||
"size": 24,
|
||||
"discard_chance_on_air_exposure": 0.0,
|
||||
"targets": [
|
||||
{
|
||||
"target": {
|
||||
"predicate_type": "minecraft:tag_match",
|
||||
"tag": "minecraft:stone_ore_replaceables"
|
||||
},
|
||||
"state": {
|
||||
"Name": "minecraft:coal_ore"
|
||||
}
|
||||
},
|
||||
{
|
||||
"target": {
|
||||
"predicate_type": "minecraft:tag_match",
|
||||
"tag": "minecraft:deepslate_ore_replaceables"
|
||||
},
|
||||
"state": {
|
||||
"Name": "minecraft:deepslate_coal_ore"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"type": "minecraft:ore",
|
||||
"config": {
|
||||
"size": 24,
|
||||
"discard_chance_on_air_exposure": 0.0,
|
||||
"targets": [
|
||||
{
|
||||
"target": {
|
||||
"predicate_type": "minecraft:tag_match",
|
||||
"tag": "minecraft:stone_ore_replaceables"
|
||||
},
|
||||
"state": {
|
||||
"Name": "minecraft:copper_ore"
|
||||
}
|
||||
},
|
||||
{
|
||||
"target": {
|
||||
"predicate_type": "minecraft:tag_match",
|
||||
"tag": "minecraft:deepslate_ore_replaceables"
|
||||
},
|
||||
"state": {
|
||||
"Name": "minecraft:deepslate_copper_ore"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"type": "minecraft:ore",
|
||||
"config": {
|
||||
"size": 64,
|
||||
"discard_chance_on_air_exposure": 0.0,
|
||||
"targets": [
|
||||
{
|
||||
"target": {
|
||||
"predicate_type": "minecraft:tag_match",
|
||||
"tag": "minecraft:base_stone_overworld"
|
||||
},
|
||||
"state": {
|
||||
"Name": "minecraft:deepslate",
|
||||
"Properties": {
|
||||
"axis": "y"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"type": "minecraft:ore",
|
||||
"config": {
|
||||
"size": 10,
|
||||
"discard_chance_on_air_exposure": 0.25,
|
||||
"targets": [
|
||||
{
|
||||
"target": {
|
||||
"predicate_type": "minecraft:tag_match",
|
||||
"tag": "minecraft:stone_ore_replaceables"
|
||||
},
|
||||
"state": {
|
||||
"Name": "minecraft:diamond_ore"
|
||||
}
|
||||
},
|
||||
{
|
||||
"target": {
|
||||
"predicate_type": "minecraft:tag_match",
|
||||
"tag": "minecraft:deepslate_ore_replaceables"
|
||||
},
|
||||
"state": {
|
||||
"Name": "minecraft:deepslate_diamond_ore"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"type": "minecraft:ore",
|
||||
"config": {
|
||||
"size": 48,
|
||||
"discard_chance_on_air_exposure": 0.0,
|
||||
"targets": [
|
||||
{
|
||||
"target": {
|
||||
"predicate_type": "minecraft:tag_match",
|
||||
"tag": "minecraft:base_stone_overworld"
|
||||
},
|
||||
"state": {
|
||||
"Name": "minecraft:diorite"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
{
|
||||
"type": "minecraft:dripstone_cluster",
|
||||
"config": {
|
||||
"chance_of_dripstone_column_at_max_distance_from_center": 0.1,
|
||||
"density": {
|
||||
"type": "minecraft:uniform",
|
||||
"max_exclusive": 0.55,
|
||||
"min_inclusive": 0.2
|
||||
},
|
||||
"dripstone_block_layer_thickness": {
|
||||
"type": "minecraft:uniform",
|
||||
"max_inclusive": 5,
|
||||
"min_inclusive": 2
|
||||
},
|
||||
"floor_to_ceiling_search_range": 48,
|
||||
"height": {
|
||||
"type": "minecraft:uniform",
|
||||
"max_inclusive": 8,
|
||||
"min_inclusive": 3
|
||||
},
|
||||
"height_deviation": 4,
|
||||
"max_distance_from_center_affecting_height_bias": 8,
|
||||
"max_distance_from_edge_affecting_chance_of_dripstone_column": 3,
|
||||
"max_stalagmite_stalactite_height_diff": 2,
|
||||
"radius": {
|
||||
"type": "minecraft:uniform",
|
||||
"max_inclusive": 7,
|
||||
"min_inclusive": 2
|
||||
},
|
||||
"wetness": {
|
||||
"type": "minecraft:clamped_normal",
|
||||
"deviation": 0.3,
|
||||
"max": 0.9,
|
||||
"mean": 0.1,
|
||||
"min": 0.1
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"type": "minecraft:ore",
|
||||
"config": {
|
||||
"size": 14,
|
||||
"discard_chance_on_air_exposure": 0.0,
|
||||
"targets": [
|
||||
{
|
||||
"target": {
|
||||
"predicate_type": "minecraft:tag_match",
|
||||
"tag": "minecraft:stone_ore_replaceables"
|
||||
},
|
||||
"state": {
|
||||
"Name": "minecraft:gold_ore"
|
||||
}
|
||||
},
|
||||
{
|
||||
"target": {
|
||||
"predicate_type": "minecraft:tag_match",
|
||||
"tag": "minecraft:deepslate_ore_replaceables"
|
||||
},
|
||||
"state": {
|
||||
"Name": "minecraft:deepslate_gold_ore"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"type": "minecraft:ore",
|
||||
"config": {
|
||||
"size": 48,
|
||||
"discard_chance_on_air_exposure": 0.0,
|
||||
"targets": [
|
||||
{
|
||||
"target": {
|
||||
"predicate_type": "minecraft:tag_match",
|
||||
"tag": "minecraft:base_stone_overworld"
|
||||
},
|
||||
"state": {
|
||||
"Name": "minecraft:granite"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"type": "minecraft:ore",
|
||||
"config": {
|
||||
"size": 48,
|
||||
"discard_chance_on_air_exposure": 0.0,
|
||||
"targets": [
|
||||
{
|
||||
"target": {
|
||||
"predicate_type": "minecraft:tag_match",
|
||||
"tag": "minecraft:base_stone_overworld"
|
||||
},
|
||||
"state": {
|
||||
"Name": "minecraft:gravel"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"type": "minecraft:ore",
|
||||
"config": {
|
||||
"size": 18,
|
||||
"discard_chance_on_air_exposure": 0.0,
|
||||
"targets": [
|
||||
{
|
||||
"target": {
|
||||
"predicate_type": "minecraft:tag_match",
|
||||
"tag": "minecraft:stone_ore_replaceables"
|
||||
},
|
||||
"state": {
|
||||
"Name": "minecraft:iron_ore"
|
||||
}
|
||||
},
|
||||
{
|
||||
"target": {
|
||||
"predicate_type": "minecraft:tag_match",
|
||||
"tag": "minecraft:deepslate_ore_replaceables"
|
||||
},
|
||||
"state": {
|
||||
"Name": "minecraft:deepslate_iron_ore"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"type": "minecraft:ore",
|
||||
"config": {
|
||||
"size": 10,
|
||||
"discard_chance_on_air_exposure": 0.0,
|
||||
"targets": [
|
||||
{
|
||||
"target": {
|
||||
"predicate_type": "minecraft:tag_match",
|
||||
"tag": "minecraft:stone_ore_replaceables"
|
||||
},
|
||||
"state": {
|
||||
"Name": "minecraft:lapis_ore"
|
||||
}
|
||||
},
|
||||
{
|
||||
"target": {
|
||||
"predicate_type": "minecraft:tag_match",
|
||||
"tag": "minecraft:deepslate_ore_replaceables"
|
||||
},
|
||||
"state": {
|
||||
"Name": "minecraft:deepslate_lapis_ore"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"type": "minecraft:large_dripstone",
|
||||
"config": {
|
||||
"column_radius": {
|
||||
"type": "minecraft:uniform",
|
||||
"max_inclusive": 5,
|
||||
"min_inclusive": 2
|
||||
},
|
||||
"floor_to_ceiling_search_range": 64,
|
||||
"height_scale": {
|
||||
"type": "minecraft:uniform",
|
||||
"max_exclusive": 2.0,
|
||||
"min_inclusive": 0.7
|
||||
},
|
||||
"max_column_radius_to_cave_height_ratio": 0.33,
|
||||
"min_bluntness_for_wind": 0.6,
|
||||
"min_radius_for_wind": 4,
|
||||
"stalactite_bluntness": {
|
||||
"type": "minecraft:uniform",
|
||||
"max_exclusive": 0.9,
|
||||
"min_inclusive": 0.3
|
||||
},
|
||||
"stalagmite_bluntness": {
|
||||
"type": "minecraft:uniform",
|
||||
"max_exclusive": 1.0,
|
||||
"min_inclusive": 0.4
|
||||
},
|
||||
"wind_speed": {
|
||||
"type": "minecraft:uniform",
|
||||
"max_exclusive": 0.15,
|
||||
"min_inclusive": 0.0
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
{
|
||||
"type": "minecraft:simple_random_selector",
|
||||
"config": {
|
||||
"features": [
|
||||
{
|
||||
"feature": {
|
||||
"type": "minecraft:pointed_dripstone",
|
||||
"config": {
|
||||
"chance_of_directional_spread": 0.7,
|
||||
"chance_of_spread_radius2": 0.5,
|
||||
"chance_of_spread_radius3": 0.5,
|
||||
"chance_of_taller_dripstone": 0.25
|
||||
}
|
||||
},
|
||||
"placement": [
|
||||
{
|
||||
"type": "minecraft:environment_scan",
|
||||
"allowed_search_condition": {
|
||||
"type": "minecraft:any_of",
|
||||
"predicates": [
|
||||
{
|
||||
"type": "minecraft:matching_block_tag",
|
||||
"tag": "minecraft:air"
|
||||
},
|
||||
{
|
||||
"type": "minecraft:matching_blocks",
|
||||
"blocks": "minecraft:water"
|
||||
}
|
||||
]
|
||||
},
|
||||
"direction_of_search": "down",
|
||||
"max_steps": 32,
|
||||
"target_condition": {
|
||||
"type": "minecraft:solid"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:random_offset",
|
||||
"xz_spread": 0,
|
||||
"y_spread": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"feature": {
|
||||
"type": "minecraft:pointed_dripstone",
|
||||
"config": {
|
||||
"chance_of_directional_spread": 0.7,
|
||||
"chance_of_spread_radius2": 0.5,
|
||||
"chance_of_spread_radius3": 0.5,
|
||||
"chance_of_taller_dripstone": 0.25
|
||||
}
|
||||
},
|
||||
"placement": [
|
||||
{
|
||||
"type": "minecraft:environment_scan",
|
||||
"allowed_search_condition": {
|
||||
"type": "minecraft:any_of",
|
||||
"predicates": [
|
||||
{
|
||||
"type": "minecraft:matching_block_tag",
|
||||
"tag": "minecraft:air"
|
||||
},
|
||||
{
|
||||
"type": "minecraft:matching_blocks",
|
||||
"blocks": "minecraft:water"
|
||||
}
|
||||
]
|
||||
},
|
||||
"direction_of_search": "up",
|
||||
"max_steps": 32,
|
||||
"target_condition": {
|
||||
"type": "minecraft:solid"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:random_offset",
|
||||
"xz_spread": 0,
|
||||
"y_spread": -1
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"type": "minecraft:ore",
|
||||
"config": {
|
||||
"size": 12,
|
||||
"discard_chance_on_air_exposure": 0.0,
|
||||
"targets": [
|
||||
{
|
||||
"target": {
|
||||
"predicate_type": "minecraft:tag_match",
|
||||
"tag": "minecraft:stone_ore_replaceables"
|
||||
},
|
||||
"state": {
|
||||
"Name": "minecraft:redstone_ore"
|
||||
}
|
||||
},
|
||||
{
|
||||
"target": {
|
||||
"predicate_type": "minecraft:tag_match",
|
||||
"tag": "minecraft:deepslate_ore_replaceables"
|
||||
},
|
||||
"state": {
|
||||
"Name": "minecraft:deepslate_redstone_ore"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"type": "minecraft:ore",
|
||||
"config": {
|
||||
"size": 48,
|
||||
"discard_chance_on_air_exposure": 0.0,
|
||||
"targets": [
|
||||
{
|
||||
"target": {
|
||||
"predicate_type": "minecraft:tag_match",
|
||||
"tag": "minecraft:base_stone_overworld"
|
||||
},
|
||||
"state": {
|
||||
"Name": "minecraft:tuff"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
{
|
||||
"type": "minecraft:tree",
|
||||
"config": {
|
||||
"below_trunk_provider": {
|
||||
"type": "minecraft:simple_state_provider",
|
||||
"state": {
|
||||
"Name": "minecraft:rooted_dirt"
|
||||
}
|
||||
},
|
||||
"decorators": [],
|
||||
"foliage_placer": {
|
||||
"type": "minecraft:random_spread_foliage_placer",
|
||||
"foliage_height": 2,
|
||||
"leaf_placement_attempts": 42,
|
||||
"offset": 0,
|
||||
"radius": 3
|
||||
},
|
||||
"foliage_provider": {
|
||||
"type": "minecraft:weighted_state_provider",
|
||||
"entries": [
|
||||
{
|
||||
"data": {
|
||||
"Name": "minecraft:azalea_leaves",
|
||||
"Properties": {
|
||||
"distance": "7",
|
||||
"persistent": "false",
|
||||
"waterlogged": "false"
|
||||
}
|
||||
},
|
||||
"weight": 4
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"Name": "minecraft:flowering_azalea_leaves",
|
||||
"Properties": {
|
||||
"distance": "7",
|
||||
"persistent": "false",
|
||||
"waterlogged": "false"
|
||||
}
|
||||
},
|
||||
"weight": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
"ignore_vines": true,
|
||||
"minimum_size": {
|
||||
"type": "minecraft:two_layers_feature_size",
|
||||
"limit": 1,
|
||||
"lower_size": 0,
|
||||
"upper_size": 1
|
||||
},
|
||||
"trunk_placer": {
|
||||
"type": "minecraft:straight_trunk_placer",
|
||||
"base_height": 3,
|
||||
"height_rand_a": 2,
|
||||
"height_rand_b": 0
|
||||
},
|
||||
"trunk_provider": {
|
||||
"type": "minecraft:simple_state_provider",
|
||||
"state": {
|
||||
"Name": "minecraft:oak_log",
|
||||
"Properties": {
|
||||
"axis": "y"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,118 @@
|
||||
{
|
||||
"type": "minecraft:simple_block",
|
||||
"config": {
|
||||
"to_place": {
|
||||
"type": "minecraft:weighted_state_provider",
|
||||
"entries": [
|
||||
{
|
||||
"data": {
|
||||
"Name": "minecraft:dandelion"
|
||||
},
|
||||
"weight": 8
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"Name": "minecraft:poppy"
|
||||
},
|
||||
"weight": 8
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"Name": "minecraft:blue_orchid"
|
||||
},
|
||||
"weight": 5
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"Name": "minecraft:allium"
|
||||
},
|
||||
"weight": 5
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"Name": "minecraft:azure_bluet"
|
||||
},
|
||||
"weight": 7
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"Name": "minecraft:red_tulip"
|
||||
},
|
||||
"weight": 5
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"Name": "minecraft:orange_tulip"
|
||||
},
|
||||
"weight": 5
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"Name": "minecraft:white_tulip"
|
||||
},
|
||||
"weight": 5
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"Name": "minecraft:pink_tulip"
|
||||
},
|
||||
"weight": 5
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"Name": "minecraft:oxeye_daisy"
|
||||
},
|
||||
"weight": 7
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"Name": "minecraft:cornflower"
|
||||
},
|
||||
"weight": 7
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"Name": "minecraft:lily_of_the_valley"
|
||||
},
|
||||
"weight": 4
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"Name": "minecraft:sunflower",
|
||||
"Properties": {
|
||||
"half": "lower"
|
||||
}
|
||||
},
|
||||
"weight": 2
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"Name": "minecraft:lilac",
|
||||
"Properties": {
|
||||
"half": "lower"
|
||||
}
|
||||
},
|
||||
"weight": 2
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"Name": "minecraft:rose_bush",
|
||||
"Properties": {
|
||||
"half": "lower"
|
||||
}
|
||||
},
|
||||
"weight": 2
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"Name": "minecraft:peony",
|
||||
"Properties": {
|
||||
"half": "lower"
|
||||
}
|
||||
},
|
||||
"weight": 2
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"type": "portals:skeleton_basalt_spike",
|
||||
"config": {}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"type": "minecraft:disk",
|
||||
"config": {
|
||||
"half_height": 1,
|
||||
"radius": {
|
||||
"type": "minecraft:uniform",
|
||||
"max_inclusive": 5,
|
||||
"min_inclusive": 2
|
||||
},
|
||||
"state_provider": {
|
||||
"type": "minecraft:simple_state_provider",
|
||||
"state": {
|
||||
"Name": "minecraft:clay"
|
||||
}
|
||||
},
|
||||
"target": {
|
||||
"type": "minecraft:matching_blocks",
|
||||
"blocks": [
|
||||
"minecraft:soul_sand",
|
||||
"minecraft:soul_soil",
|
||||
"minecraft:gravel",
|
||||
"minecraft:white_concrete_powder"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"type": "minecraft:disk",
|
||||
"config": {
|
||||
"half_height": 1,
|
||||
"radius": {
|
||||
"type": "minecraft:uniform",
|
||||
"max_inclusive": 5,
|
||||
"min_inclusive": 2
|
||||
},
|
||||
"state_provider": {
|
||||
"type": "minecraft:simple_state_provider",
|
||||
"state": {
|
||||
"Name": "minecraft:white_concrete_powder"
|
||||
}
|
||||
},
|
||||
"target": {
|
||||
"type": "minecraft:matching_blocks",
|
||||
"blocks": [
|
||||
"minecraft:soul_sand",
|
||||
"minecraft:soul_soil",
|
||||
"minecraft:gravel",
|
||||
"minecraft:clay"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"type": "minecraft:disk",
|
||||
"config": {
|
||||
"half_height": 2,
|
||||
"radius": {
|
||||
"type": "minecraft:uniform",
|
||||
"max_inclusive": 6,
|
||||
"min_inclusive": 2
|
||||
},
|
||||
"state_provider": {
|
||||
"type": "minecraft:simple_state_provider",
|
||||
"state": {
|
||||
"Name": "minecraft:gravel"
|
||||
}
|
||||
},
|
||||
"target": {
|
||||
"type": "minecraft:matching_blocks",
|
||||
"blocks": [
|
||||
"minecraft:soul_sand",
|
||||
"minecraft:soul_soil",
|
||||
"minecraft:clay",
|
||||
"minecraft:white_concrete_powder"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"type": "minecraft:lake",
|
||||
"config": {
|
||||
"barrier": {
|
||||
"type": "minecraft:simple_state_provider",
|
||||
"state": {
|
||||
"Name": "minecraft:basalt",
|
||||
"Properties": {
|
||||
"axis": "y"
|
||||
}
|
||||
}
|
||||
},
|
||||
"fluid": {
|
||||
"type": "minecraft:simple_state_provider",
|
||||
"state": {
|
||||
"Name": "minecraft:lava",
|
||||
"Properties": {
|
||||
"level": "0"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"type": "portals:skeleton_ruin",
|
||||
"config": {}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"type": "minecraft:lake",
|
||||
"config": {
|
||||
"barrier": {
|
||||
"type": "minecraft:simple_state_provider",
|
||||
"state": {
|
||||
"Name": "minecraft:clay"
|
||||
}
|
||||
},
|
||||
"fluid": {
|
||||
"type": "minecraft:simple_state_provider",
|
||||
"state": {
|
||||
"Name": "minecraft:water",
|
||||
"Properties": {
|
||||
"level": "0"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,148 @@
|
||||
{
|
||||
"aquifers_enabled": false,
|
||||
"default_block": {
|
||||
"Name": "minecraft:stone"
|
||||
},
|
||||
"default_fluid": {
|
||||
"Name": "minecraft:air"
|
||||
},
|
||||
"disable_mob_generation": false,
|
||||
"legacy_random_source": true,
|
||||
"noise": {
|
||||
"height": 128,
|
||||
"min_y": 0,
|
||||
"size_horizontal": 1,
|
||||
"size_vertical": 2
|
||||
},
|
||||
"noise_router": {
|
||||
"barrier": 0.0,
|
||||
"continents": 0.0,
|
||||
"depth": 0.0,
|
||||
"erosion": 0.0,
|
||||
"final_density": {
|
||||
"type": "minecraft:squeeze",
|
||||
"argument": {
|
||||
"type": "minecraft:mul",
|
||||
"argument1": 0.64,
|
||||
"argument2": {
|
||||
"type": "minecraft:interpolated",
|
||||
"argument": {
|
||||
"type": "minecraft:blend_density",
|
||||
"argument": {
|
||||
"type": "minecraft:add",
|
||||
"argument1": 2.5,
|
||||
"argument2": {
|
||||
"type": "minecraft:mul",
|
||||
"argument1": {
|
||||
"type": "minecraft:y_clamped_gradient",
|
||||
"from_value": 0.0,
|
||||
"from_y": -8,
|
||||
"to_value": 1.0,
|
||||
"to_y": 24
|
||||
},
|
||||
"argument2": {
|
||||
"type": "minecraft:add",
|
||||
"argument1": -2.5,
|
||||
"argument2": {
|
||||
"type": "minecraft:add",
|
||||
"argument1": 0.9375,
|
||||
"argument2": {
|
||||
"type": "minecraft:mul",
|
||||
"argument1": {
|
||||
"type": "minecraft:y_clamped_gradient",
|
||||
"from_value": 1.0,
|
||||
"from_y": 104,
|
||||
"to_value": 0.0,
|
||||
"to_y": 128
|
||||
},
|
||||
"argument2": {
|
||||
"type": "minecraft:add",
|
||||
"argument1": -0.9375,
|
||||
"argument2": "minecraft:nether/base_3d_noise"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"fluid_level_floodedness": 0.0,
|
||||
"fluid_level_spread": 0.0,
|
||||
"lava": 0.0,
|
||||
"preliminary_surface_level": 0.0,
|
||||
"ridges": 0.0,
|
||||
"temperature": {
|
||||
"type": "minecraft:shifted_noise",
|
||||
"noise": "minecraft:nether/temperature",
|
||||
"shift_x": 0.0,
|
||||
"shift_y": 0.0,
|
||||
"shift_z": 0.0,
|
||||
"xz_scale": 0.55,
|
||||
"y_scale": 0.0
|
||||
},
|
||||
"vegetation": {
|
||||
"type": "minecraft:shifted_noise",
|
||||
"noise": "minecraft:nether/vegetation",
|
||||
"shift_x": 0.0,
|
||||
"shift_y": 0.0,
|
||||
"shift_z": 0.0,
|
||||
"xz_scale": 0.55,
|
||||
"y_scale": 0.0
|
||||
},
|
||||
"vein_gap": 0.0,
|
||||
"vein_ridged": 0.0,
|
||||
"vein_toggle": 0.0
|
||||
},
|
||||
"ore_veins_enabled": false,
|
||||
"sea_level": 0,
|
||||
"spawn_target": [],
|
||||
"surface_rule": {
|
||||
"type": "minecraft:sequence",
|
||||
"sequence": [
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:vertical_gradient",
|
||||
"false_at_and_above": {
|
||||
"above_bottom": 5
|
||||
},
|
||||
"random_name": "minecraft:bedrock_floor",
|
||||
"true_at_and_below": {
|
||||
"above_bottom": 0
|
||||
}
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:bedrock"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:not",
|
||||
"invert": {
|
||||
"type": "minecraft:vertical_gradient",
|
||||
"false_at_and_above": {
|
||||
"below_top": 0
|
||||
},
|
||||
"random_name": "minecraft:bedrock_roof",
|
||||
"true_at_and_below": {
|
||||
"below_top": 5
|
||||
}
|
||||
}
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:bedrock"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,943 @@
|
||||
{
|
||||
"aquifers_enabled": false,
|
||||
"default_block": {
|
||||
"Name": "minecraft:orange_terracotta"
|
||||
},
|
||||
"default_fluid": {
|
||||
"Name": "minecraft:air"
|
||||
},
|
||||
"disable_mob_generation": false,
|
||||
"legacy_random_source": false,
|
||||
"noise": {
|
||||
"height": 384,
|
||||
"min_y": 0,
|
||||
"size_horizontal": 1,
|
||||
"size_vertical": 2
|
||||
},
|
||||
"noise_router": {
|
||||
"barrier": 0.0,
|
||||
"continents": 0.0,
|
||||
"depth": 0.0,
|
||||
"erosion": 0.0,
|
||||
"final_density": {
|
||||
"type": "minecraft:squeeze",
|
||||
"argument": {
|
||||
"type": "minecraft:mul",
|
||||
"argument1": 0.64,
|
||||
"argument2": {
|
||||
"type": "minecraft:interpolated",
|
||||
"argument": {
|
||||
"type": "minecraft:blend_density",
|
||||
"argument": {
|
||||
"type": "minecraft:add",
|
||||
"argument1": {
|
||||
"type": "minecraft:y_clamped_gradient",
|
||||
"from_value": 1.28,
|
||||
"from_y": 18,
|
||||
"to_value": -1.18,
|
||||
"to_y": 146
|
||||
},
|
||||
"argument2": {
|
||||
"type": "minecraft:add",
|
||||
"argument1": {
|
||||
"type": "minecraft:mul",
|
||||
"argument1": 1.02,
|
||||
"argument2": {
|
||||
"type": "minecraft:clamp",
|
||||
"input": {
|
||||
"type": "minecraft:noise",
|
||||
"noise": "minecraft:surface",
|
||||
"xz_scale": 0.03,
|
||||
"y_scale": 0.0
|
||||
},
|
||||
"max": 0.85,
|
||||
"min": -0.18
|
||||
}
|
||||
},
|
||||
"argument2": {
|
||||
"type": "minecraft:add",
|
||||
"argument1": {
|
||||
"type": "minecraft:mul",
|
||||
"argument1": -2.18,
|
||||
"argument2": {
|
||||
"type": "minecraft:clamp",
|
||||
"input": {
|
||||
"type": "minecraft:add",
|
||||
"argument1": {
|
||||
"type": "minecraft:mul",
|
||||
"argument1": -1.0,
|
||||
"argument2": {
|
||||
"type": "minecraft:abs",
|
||||
"argument": {
|
||||
"type": "minecraft:noise",
|
||||
"noise": "minecraft:ridge",
|
||||
"xz_scale": 0.054,
|
||||
"y_scale": 0.0
|
||||
}
|
||||
}
|
||||
},
|
||||
"argument2": 0.49
|
||||
},
|
||||
"max": 0.95,
|
||||
"min": 0.0
|
||||
}
|
||||
},
|
||||
"argument2": {
|
||||
"type": "minecraft:add",
|
||||
"argument1": {
|
||||
"type": "minecraft:mul",
|
||||
"argument1": -0.62,
|
||||
"argument2": {
|
||||
"type": "minecraft:clamp",
|
||||
"input": {
|
||||
"type": "minecraft:add",
|
||||
"argument1": {
|
||||
"type": "minecraft:mul",
|
||||
"argument1": -1.0,
|
||||
"argument2": {
|
||||
"type": "minecraft:abs",
|
||||
"argument": {
|
||||
"type": "minecraft:noise",
|
||||
"noise": "minecraft:vegetation",
|
||||
"xz_scale": 0.13,
|
||||
"y_scale": 0.0
|
||||
}
|
||||
}
|
||||
},
|
||||
"argument2": 0.31
|
||||
},
|
||||
"max": 0.62,
|
||||
"min": 0.0
|
||||
}
|
||||
},
|
||||
"argument2": {
|
||||
"type": "minecraft:add",
|
||||
"argument1": {
|
||||
"type": "minecraft:mul",
|
||||
"argument1": 0.2,
|
||||
"argument2": {
|
||||
"type": "minecraft:noise",
|
||||
"noise": "minecraft:netherrack",
|
||||
"xz_scale": 0.42,
|
||||
"y_scale": 0.0
|
||||
}
|
||||
},
|
||||
"argument2": {
|
||||
"type": "minecraft:add",
|
||||
"argument1": {
|
||||
"type": "minecraft:mul",
|
||||
"argument1": 0.08,
|
||||
"argument2": {
|
||||
"type": "minecraft:noise",
|
||||
"noise": "minecraft:gravel",
|
||||
"xz_scale": 1.2,
|
||||
"y_scale": 0.0
|
||||
}
|
||||
},
|
||||
"argument2": {
|
||||
"type": "minecraft:mul",
|
||||
"argument1": 2.75,
|
||||
"argument2": {
|
||||
"type": "minecraft:clamp",
|
||||
"input": {
|
||||
"type": "minecraft:add",
|
||||
"argument1": {
|
||||
"type": "minecraft:add",
|
||||
"argument1": {
|
||||
"type": "minecraft:clamp",
|
||||
"input": {
|
||||
"type": "minecraft:add",
|
||||
"argument1": {
|
||||
"type": "minecraft:abs",
|
||||
"argument": {
|
||||
"type": "minecraft:noise",
|
||||
"noise": "minecraft:ridge",
|
||||
"xz_scale": 0.14,
|
||||
"y_scale": 0.0
|
||||
}
|
||||
},
|
||||
"argument2": -0.36
|
||||
},
|
||||
"max": 0.9,
|
||||
"min": 0.0
|
||||
},
|
||||
"argument2": {
|
||||
"type": "minecraft:clamp",
|
||||
"input": {
|
||||
"type": "minecraft:add",
|
||||
"argument1": {
|
||||
"type": "minecraft:abs",
|
||||
"argument": {
|
||||
"type": "minecraft:noise",
|
||||
"noise": "minecraft:surface",
|
||||
"xz_scale": 0.2,
|
||||
"y_scale": 0.0
|
||||
}
|
||||
},
|
||||
"argument2": -0.42
|
||||
},
|
||||
"max": 0.85,
|
||||
"min": 0.0
|
||||
}
|
||||
},
|
||||
"argument2": {
|
||||
"type": "minecraft:add",
|
||||
"argument1": {
|
||||
"type": "minecraft:mul",
|
||||
"argument1": -0.5,
|
||||
"argument2": {
|
||||
"type": "minecraft:clamp",
|
||||
"input": {
|
||||
"type": "minecraft:add",
|
||||
"argument1": {
|
||||
"type": "minecraft:abs",
|
||||
"argument": {
|
||||
"type": "minecraft:noise",
|
||||
"noise": "minecraft:vegetation",
|
||||
"xz_scale": 0.09,
|
||||
"y_scale": 0.0
|
||||
}
|
||||
},
|
||||
"argument2": -0.46
|
||||
},
|
||||
"max": 0.7,
|
||||
"min": 0.0
|
||||
}
|
||||
},
|
||||
"argument2": {
|
||||
"type": "minecraft:add",
|
||||
"argument1": {
|
||||
"type": "minecraft:mul",
|
||||
"argument1": 0.32,
|
||||
"argument2": {
|
||||
"type": "minecraft:noise",
|
||||
"noise": "minecraft:gravel",
|
||||
"xz_scale": 0.95,
|
||||
"y_scale": 0.45
|
||||
}
|
||||
},
|
||||
"argument2": {
|
||||
"type": "minecraft:y_clamped_gradient",
|
||||
"from_value": 0.5,
|
||||
"from_y": 260,
|
||||
"to_value": -0.92,
|
||||
"to_y": 384
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"max": 1.0,
|
||||
"min": 0.0
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"fluid_level_floodedness": 0.0,
|
||||
"fluid_level_spread": 0.0,
|
||||
"lava": 0.0,
|
||||
"preliminary_surface_level": 72.0,
|
||||
"ridges": 0.0,
|
||||
"temperature": 0.0,
|
||||
"vegetation": {
|
||||
"type": "minecraft:noise",
|
||||
"noise": "minecraft:vegetation",
|
||||
"xz_scale": 0.22,
|
||||
"y_scale": 0.0
|
||||
},
|
||||
"vein_gap": 0.0,
|
||||
"vein_ridged": 0.0,
|
||||
"vein_toggle": 0.0
|
||||
},
|
||||
"ore_veins_enabled": false,
|
||||
"sea_level": 0,
|
||||
"spawn_target": [],
|
||||
"surface_rule": {
|
||||
"type": "minecraft:sequence",
|
||||
"sequence": [
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:vertical_gradient",
|
||||
"false_at_and_above": {
|
||||
"above_bottom": 5
|
||||
},
|
||||
"random_name": "minecraft:bedrock_floor",
|
||||
"true_at_and_below": {
|
||||
"above_bottom": 0
|
||||
}
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:bedrock"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:y_above",
|
||||
"add_stone_depth": false,
|
||||
"anchor": {
|
||||
"absolute": 376
|
||||
},
|
||||
"surface_depth_multiplier": 0
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:purple_terracotta"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:y_above",
|
||||
"add_stone_depth": false,
|
||||
"anchor": {
|
||||
"absolute": 360
|
||||
},
|
||||
"surface_depth_multiplier": 0
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:magenta_terracotta"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:y_above",
|
||||
"add_stone_depth": false,
|
||||
"anchor": {
|
||||
"absolute": 344
|
||||
},
|
||||
"surface_depth_multiplier": 0
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:red_terracotta"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:y_above",
|
||||
"add_stone_depth": false,
|
||||
"anchor": {
|
||||
"absolute": 328
|
||||
},
|
||||
"surface_depth_multiplier": 0
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:orange_terracotta"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:y_above",
|
||||
"add_stone_depth": false,
|
||||
"anchor": {
|
||||
"absolute": 312
|
||||
},
|
||||
"surface_depth_multiplier": 0
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:yellow_terracotta"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:y_above",
|
||||
"add_stone_depth": false,
|
||||
"anchor": {
|
||||
"absolute": 296
|
||||
},
|
||||
"surface_depth_multiplier": 0
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:white_terracotta"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:y_above",
|
||||
"add_stone_depth": false,
|
||||
"anchor": {
|
||||
"absolute": 280
|
||||
},
|
||||
"surface_depth_multiplier": 0
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:light_gray_terracotta"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:y_above",
|
||||
"add_stone_depth": false,
|
||||
"anchor": {
|
||||
"absolute": 264
|
||||
},
|
||||
"surface_depth_multiplier": 0
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:pink_terracotta"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:y_above",
|
||||
"add_stone_depth": false,
|
||||
"anchor": {
|
||||
"absolute": 248
|
||||
},
|
||||
"surface_depth_multiplier": 0
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:brown_terracotta"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:y_above",
|
||||
"add_stone_depth": false,
|
||||
"anchor": {
|
||||
"absolute": 232
|
||||
},
|
||||
"surface_depth_multiplier": 0
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:gray_terracotta"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:y_above",
|
||||
"add_stone_depth": false,
|
||||
"anchor": {
|
||||
"absolute": 216
|
||||
},
|
||||
"surface_depth_multiplier": 0
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:cyan_terracotta"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:y_above",
|
||||
"add_stone_depth": false,
|
||||
"anchor": {
|
||||
"absolute": 200
|
||||
},
|
||||
"surface_depth_multiplier": 0
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:blue_terracotta"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:y_above",
|
||||
"add_stone_depth": false,
|
||||
"anchor": {
|
||||
"absolute": 184
|
||||
},
|
||||
"surface_depth_multiplier": 0
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:light_blue_terracotta"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:y_above",
|
||||
"add_stone_depth": false,
|
||||
"anchor": {
|
||||
"absolute": 168
|
||||
},
|
||||
"surface_depth_multiplier": 0
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:green_terracotta"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:y_above",
|
||||
"add_stone_depth": false,
|
||||
"anchor": {
|
||||
"absolute": 152
|
||||
},
|
||||
"surface_depth_multiplier": 0
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:lime_terracotta"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:stone_depth",
|
||||
"add_surface_depth": false,
|
||||
"offset": 0,
|
||||
"secondary_depth_range": 0,
|
||||
"surface_type": "floor"
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:sequence",
|
||||
"sequence": [
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:y_above",
|
||||
"add_stone_depth": true,
|
||||
"anchor": {
|
||||
"absolute": 76
|
||||
},
|
||||
"surface_depth_multiplier": 1
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:sequence",
|
||||
"sequence": [
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:noise_threshold",
|
||||
"max_threshold": 1.7976931348623157E308,
|
||||
"min_threshold": 0.46,
|
||||
"noise": "minecraft:vegetation"
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:grass_block",
|
||||
"Properties": {
|
||||
"snowy": "false"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:noise_threshold",
|
||||
"max_threshold": 1.7976931348623157E308,
|
||||
"min_threshold": 0.38,
|
||||
"noise": "minecraft:patch"
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:coarse_dirt"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:noise_threshold",
|
||||
"max_threshold": 1.7976931348623157E308,
|
||||
"min_threshold": 0.5,
|
||||
"noise": "minecraft:surface"
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:red_sand"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:y_above",
|
||||
"add_stone_depth": false,
|
||||
"anchor": {
|
||||
"absolute": 136
|
||||
},
|
||||
"surface_depth_multiplier": 0
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:red_terracotta"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:y_above",
|
||||
"add_stone_depth": false,
|
||||
"anchor": {
|
||||
"absolute": 128
|
||||
},
|
||||
"surface_depth_multiplier": 0
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:orange_terracotta"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:y_above",
|
||||
"add_stone_depth": false,
|
||||
"anchor": {
|
||||
"absolute": 120
|
||||
},
|
||||
"surface_depth_multiplier": 0
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:yellow_terracotta"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:y_above",
|
||||
"add_stone_depth": false,
|
||||
"anchor": {
|
||||
"absolute": 112
|
||||
},
|
||||
"surface_depth_multiplier": 0
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:white_terracotta"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:y_above",
|
||||
"add_stone_depth": false,
|
||||
"anchor": {
|
||||
"absolute": 104
|
||||
},
|
||||
"surface_depth_multiplier": 0
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:light_gray_terracotta"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:y_above",
|
||||
"add_stone_depth": false,
|
||||
"anchor": {
|
||||
"absolute": 96
|
||||
},
|
||||
"surface_depth_multiplier": 0
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:pink_terracotta"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:y_above",
|
||||
"add_stone_depth": false,
|
||||
"anchor": {
|
||||
"absolute": 88
|
||||
},
|
||||
"surface_depth_multiplier": 0
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:magenta_terracotta"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:y_above",
|
||||
"add_stone_depth": false,
|
||||
"anchor": {
|
||||
"absolute": 80
|
||||
},
|
||||
"surface_depth_multiplier": 0
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:purple_terracotta"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:y_above",
|
||||
"add_stone_depth": false,
|
||||
"anchor": {
|
||||
"absolute": 72
|
||||
},
|
||||
"surface_depth_multiplier": 0
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:blue_terracotta"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:y_above",
|
||||
"add_stone_depth": false,
|
||||
"anchor": {
|
||||
"absolute": 64
|
||||
},
|
||||
"surface_depth_multiplier": 0
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:light_blue_terracotta"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:y_above",
|
||||
"add_stone_depth": false,
|
||||
"anchor": {
|
||||
"absolute": 56
|
||||
},
|
||||
"surface_depth_multiplier": 0
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:cyan_terracotta"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:y_above",
|
||||
"add_stone_depth": false,
|
||||
"anchor": {
|
||||
"absolute": 48
|
||||
},
|
||||
"surface_depth_multiplier": 0
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:green_terracotta"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:y_above",
|
||||
"add_stone_depth": false,
|
||||
"anchor": {
|
||||
"absolute": 40
|
||||
},
|
||||
"surface_depth_multiplier": 0
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:lime_terracotta"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:y_above",
|
||||
"add_stone_depth": false,
|
||||
"anchor": {
|
||||
"absolute": 32
|
||||
},
|
||||
"surface_depth_multiplier": 0
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:brown_terracotta"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:y_above",
|
||||
"add_stone_depth": false,
|
||||
"anchor": {
|
||||
"absolute": 24
|
||||
},
|
||||
"surface_depth_multiplier": 0
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:gray_terracotta"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:y_above",
|
||||
"add_stone_depth": false,
|
||||
"anchor": {
|
||||
"absolute": 16
|
||||
},
|
||||
"surface_depth_multiplier": 0
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:black_terracotta"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:y_above",
|
||||
"add_stone_depth": false,
|
||||
"anchor": {
|
||||
"absolute": 12
|
||||
},
|
||||
"surface_depth_multiplier": 0
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:orange_terracotta"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:y_above",
|
||||
"add_stone_depth": false,
|
||||
"anchor": {
|
||||
"absolute": 8
|
||||
},
|
||||
"surface_depth_multiplier": 0
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:yellow_terracotta"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:y_above",
|
||||
"add_stone_depth": false,
|
||||
"anchor": {
|
||||
"absolute": 16
|
||||
},
|
||||
"surface_depth_multiplier": 0
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:terracotta"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,130 @@
|
||||
{
|
||||
"aquifers_enabled": false,
|
||||
"default_block": {
|
||||
"Name": "minecraft:dirt"
|
||||
},
|
||||
"default_fluid": {
|
||||
"Name": "minecraft:air"
|
||||
},
|
||||
"disable_mob_generation": false,
|
||||
"legacy_random_source": false,
|
||||
"noise": {
|
||||
"height": 256,
|
||||
"min_y": 0,
|
||||
"size_horizontal": 1,
|
||||
"size_vertical": 2
|
||||
},
|
||||
"noise_router": {
|
||||
"barrier": 0.0,
|
||||
"continents": 0.0,
|
||||
"depth": 0.0,
|
||||
"erosion": 0.0,
|
||||
"final_density": {
|
||||
"type": "minecraft:squeeze",
|
||||
"argument": {
|
||||
"type": "minecraft:mul",
|
||||
"argument1": 0.64,
|
||||
"argument2": {
|
||||
"type": "minecraft:interpolated",
|
||||
"argument": {
|
||||
"type": "minecraft:blend_density",
|
||||
"argument": {
|
||||
"type": "minecraft:add",
|
||||
"argument1": {
|
||||
"type": "minecraft:y_clamped_gradient",
|
||||
"from_value": 1.0,
|
||||
"from_y": 48,
|
||||
"to_value": -1.0,
|
||||
"to_y": 80
|
||||
},
|
||||
"argument2": {
|
||||
"type": "minecraft:add",
|
||||
"argument1": {
|
||||
"type": "minecraft:mul",
|
||||
"argument1": 0.34,
|
||||
"argument2": {
|
||||
"type": "minecraft:noise",
|
||||
"noise": "minecraft:surface",
|
||||
"xz_scale": 0.42,
|
||||
"y_scale": 0.0
|
||||
}
|
||||
},
|
||||
"argument2": {
|
||||
"type": "minecraft:mul",
|
||||
"argument1": 0.16,
|
||||
"argument2": {
|
||||
"type": "minecraft:noise",
|
||||
"noise": "minecraft:vegetation",
|
||||
"xz_scale": 0.2,
|
||||
"y_scale": 0.0
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"fluid_level_floodedness": 0.0,
|
||||
"fluid_level_spread": 0.0,
|
||||
"lava": 0.0,
|
||||
"preliminary_surface_level": 64.0,
|
||||
"ridges": 0.0,
|
||||
"temperature": 0.0,
|
||||
"vegetation": {
|
||||
"type": "minecraft:noise",
|
||||
"noise": "minecraft:vegetation",
|
||||
"xz_scale": 0.25,
|
||||
"y_scale": 0.0
|
||||
},
|
||||
"vein_gap": 0.0,
|
||||
"vein_ridged": 0.0,
|
||||
"vein_toggle": 0.0
|
||||
},
|
||||
"ore_veins_enabled": false,
|
||||
"sea_level": 0,
|
||||
"spawn_target": [],
|
||||
"surface_rule": {
|
||||
"type": "minecraft:sequence",
|
||||
"sequence": [
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:vertical_gradient",
|
||||
"false_at_and_above": {
|
||||
"above_bottom": 5
|
||||
},
|
||||
"random_name": "minecraft:bedrock_floor",
|
||||
"true_at_and_below": {
|
||||
"above_bottom": 0
|
||||
}
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:bedrock"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:stone_depth",
|
||||
"add_surface_depth": false,
|
||||
"offset": 0,
|
||||
"secondary_depth_range": 0,
|
||||
"surface_type": "floor"
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:grass_block",
|
||||
"Properties": {
|
||||
"snowy": "false"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,282 @@
|
||||
{
|
||||
"aquifers_enabled": false,
|
||||
"default_block": {
|
||||
"Name": "minecraft:soul_soil"
|
||||
},
|
||||
"default_fluid": {
|
||||
"Name": "minecraft:water",
|
||||
"Properties": {
|
||||
"level": "0"
|
||||
}
|
||||
},
|
||||
"disable_mob_generation": false,
|
||||
"legacy_random_source": false,
|
||||
"noise": {
|
||||
"height": 128,
|
||||
"min_y": 0,
|
||||
"size_horizontal": 1,
|
||||
"size_vertical": 1
|
||||
},
|
||||
"noise_router": {
|
||||
"barrier": 0.0,
|
||||
"continents": 0.0,
|
||||
"depth": 0.0,
|
||||
"erosion": 0.0,
|
||||
"final_density": {
|
||||
"type": "minecraft:squeeze",
|
||||
"argument": {
|
||||
"type": "minecraft:mul",
|
||||
"argument1": 0.64,
|
||||
"argument2": {
|
||||
"type": "minecraft:interpolated",
|
||||
"argument": {
|
||||
"type": "minecraft:blend_density",
|
||||
"argument": {
|
||||
"type": "minecraft:add",
|
||||
"argument1": {
|
||||
"type": "minecraft:y_clamped_gradient",
|
||||
"from_value": 1.58,
|
||||
"from_y": 8,
|
||||
"to_value": -1.38,
|
||||
"to_y": 120
|
||||
},
|
||||
"argument2": {
|
||||
"type": "minecraft:add",
|
||||
"argument1": {
|
||||
"type": "minecraft:mul",
|
||||
"argument1": 0.9,
|
||||
"argument2": {
|
||||
"type": "minecraft:noise",
|
||||
"noise": "minecraft:surface",
|
||||
"xz_scale": 0.15,
|
||||
"y_scale": 0.0
|
||||
}
|
||||
},
|
||||
"argument2": {
|
||||
"type": "minecraft:add",
|
||||
"argument1": {
|
||||
"type": "minecraft:mul",
|
||||
"argument1": 0.46,
|
||||
"argument2": {
|
||||
"type": "minecraft:noise",
|
||||
"noise": "minecraft:ridge",
|
||||
"xz_scale": 0.28,
|
||||
"y_scale": 0.0
|
||||
}
|
||||
},
|
||||
"argument2": {
|
||||
"type": "minecraft:add",
|
||||
"argument1": {
|
||||
"type": "minecraft:mul",
|
||||
"argument1": -0.42,
|
||||
"argument2": {
|
||||
"type": "minecraft:noise",
|
||||
"noise": "minecraft:vegetation",
|
||||
"xz_scale": 0.055,
|
||||
"y_scale": 0.0
|
||||
}
|
||||
},
|
||||
"argument2": {
|
||||
"type": "minecraft:add",
|
||||
"argument1": {
|
||||
"type": "minecraft:mul",
|
||||
"argument1": 0.28,
|
||||
"argument2": {
|
||||
"type": "minecraft:noise",
|
||||
"noise": "minecraft:netherrack",
|
||||
"xz_scale": 0.95,
|
||||
"y_scale": 0.0
|
||||
}
|
||||
},
|
||||
"argument2": {
|
||||
"type": "minecraft:mul",
|
||||
"argument1": 0.16,
|
||||
"argument2": {
|
||||
"type": "minecraft:noise",
|
||||
"noise": "minecraft:gravel",
|
||||
"xz_scale": 1.25,
|
||||
"y_scale": 0.0
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"fluid_level_floodedness": 0.0,
|
||||
"fluid_level_spread": 0.0,
|
||||
"lava": 0.0,
|
||||
"preliminary_surface_level": 64.0,
|
||||
"ridges": 0.0,
|
||||
"temperature": 0.0,
|
||||
"vegetation": {
|
||||
"type": "minecraft:noise",
|
||||
"noise": "minecraft:vegetation",
|
||||
"xz_scale": 0.25,
|
||||
"y_scale": 0.0
|
||||
},
|
||||
"vein_gap": 0.0,
|
||||
"vein_ridged": 0.0,
|
||||
"vein_toggle": 0.0
|
||||
},
|
||||
"ore_veins_enabled": false,
|
||||
"sea_level": 64,
|
||||
"spawn_target": [],
|
||||
"surface_rule": {
|
||||
"type": "minecraft:sequence",
|
||||
"sequence": [
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:vertical_gradient",
|
||||
"false_at_and_above": {
|
||||
"above_bottom": 5
|
||||
},
|
||||
"random_name": "minecraft:bedrock_floor",
|
||||
"true_at_and_below": {
|
||||
"above_bottom": 0
|
||||
}
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:bedrock"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:stone_depth",
|
||||
"add_surface_depth": true,
|
||||
"offset": 0,
|
||||
"secondary_depth_range": 0,
|
||||
"surface_type": "floor"
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:sequence",
|
||||
"sequence": [
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:noise_threshold",
|
||||
"max_threshold": 1.7976931348623157E308,
|
||||
"min_threshold": 0.55,
|
||||
"noise": "minecraft:ridge"
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:basalt",
|
||||
"Properties": {
|
||||
"axis": "y"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:noise_threshold",
|
||||
"max_threshold": 1.7976931348623157E308,
|
||||
"min_threshold": 0.5,
|
||||
"noise": "minecraft:netherrack"
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:black_concrete_powder"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:noise_threshold",
|
||||
"max_threshold": 1.7976931348623157E308,
|
||||
"min_threshold": 0.35,
|
||||
"noise": "minecraft:patch"
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:gray_concrete_powder"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:noise_threshold",
|
||||
"max_threshold": 1.7976931348623157E308,
|
||||
"min_threshold": 0.34,
|
||||
"noise": "minecraft:surface"
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:white_concrete_powder"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:noise_threshold",
|
||||
"max_threshold": 0.34,
|
||||
"min_threshold": 0.02,
|
||||
"noise": "minecraft:surface"
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:clay"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:noise_threshold",
|
||||
"max_threshold": 1.7976931348623157E308,
|
||||
"min_threshold": 0.18,
|
||||
"noise": "minecraft:gravel"
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:gravel"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:condition",
|
||||
"if_true": {
|
||||
"type": "minecraft:noise_threshold",
|
||||
"max_threshold": 1.7976931348623157E308,
|
||||
"min_threshold": 0.0,
|
||||
"noise": "minecraft:nether_state_selector"
|
||||
},
|
||||
"then_run": {
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:soul_sand"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "minecraft:block",
|
||||
"result_state": {
|
||||
"Name": "minecraft:soul_soil"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||